diff --git a/NativeScript/NativeScript.h b/NativeScript/NativeScript.h index a8912188..d0a2240b 100644 --- a/NativeScript/NativeScript.h +++ b/NativeScript/NativeScript.h @@ -15,6 +15,9 @@ @interface NativeScript : NSObject - (instancetype)initWithConfig:(Config*)config; + +- (void)runScriptString: (NSString*) script runLoop: (BOOL) runLoop; + /** WARNING: this method does not return in most applications. (UIApplicationMain) */ diff --git a/NativeScript/NativeScript.mm b/NativeScript/NativeScript.mm index 29e4e01a..eb681720 100644 --- a/NativeScript/NativeScript.mm +++ b/NativeScript/NativeScript.mm @@ -21,18 +21,28 @@ @implementation Config @implementation NativeScript +extern char defaultStartOfMetadataSection __asm("section$start$__DATA$__TNSMetadata"); + + std::unique_ptr runtime_; - (instancetype)initWithConfig:(Config*)config { if (self = [super init]) { - RuntimeConfig.BaseDir = [config.BaseDir UTF8String]; - if (config.ApplicationPath != nil) { - RuntimeConfig.ApplicationPath = [[config.BaseDir stringByAppendingPathComponent:config.ApplicationPath] UTF8String]; + if (config.BaseDir != nil) { + RuntimeConfig.BaseDir = [config.BaseDir UTF8String]; + if (config.ApplicationPath != nil) { + RuntimeConfig.ApplicationPath = [[config.BaseDir stringByAppendingPathComponent:config.ApplicationPath] UTF8String]; + } else { + RuntimeConfig.ApplicationPath = [[config.BaseDir stringByAppendingPathComponent:@"app"] UTF8String]; + } + } + if (config.MetadataPtr != nil) { + RuntimeConfig.MetadataPtr = [config MetadataPtr]; } else { - RuntimeConfig.ApplicationPath = [[config.BaseDir stringByAppendingPathComponent:@"app"] UTF8String]; + RuntimeConfig.MetadataPtr = &defaultStartOfMetadataSection; + } - RuntimeConfig.MetadataPtr = [config MetadataPtr]; RuntimeConfig.IsDebug = [config IsDebug]; RuntimeConfig.LogToSystemConsole = [config LogToSystemConsole]; @@ -64,6 +74,19 @@ - (instancetype)initWithConfig:(Config*)config { } +- (void)runScriptString: (NSString*) script runLoop: (BOOL) runLoop { + + std::string cppString = std::string([script UTF8String]); + runtime_->RunScript(cppString); + + if (runLoop) { + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true); + } + + tns::Tasks::Drain(); + +} + - (void)runMainApplication { runtime_->RunMainScript(); diff --git a/NativeScript/metadata/metadata-arm64.bin b/NativeScript/metadata/metadata-arm64.bin new file mode 100644 index 00000000..8024377c Binary files /dev/null and b/NativeScript/metadata/metadata-arm64.bin differ diff --git a/NativeScript/metadata/metadata-x86_64.bin b/NativeScript/metadata/metadata-x86_64.bin new file mode 100644 index 00000000..771cf12b Binary files /dev/null and b/NativeScript/metadata/metadata-x86_64.bin differ diff --git a/NativeScript/runtime/ModuleInternal.h b/NativeScript/runtime/ModuleInternal.h index 0b71496c..23d358f0 100644 --- a/NativeScript/runtime/ModuleInternal.h +++ b/NativeScript/runtime/ModuleInternal.h @@ -10,6 +10,8 @@ class ModuleInternal { public: ModuleInternal(v8::Local context); bool RunModule(v8::Isolate* isolate, std::string path); + void RunScript(v8::Isolate* isolate, std::string script); + private: static void RequireCallback(const v8::FunctionCallbackInfo& info); v8::Local GetRequireFunction(v8::Isolate* isolate, const std::string& dirName); @@ -18,6 +20,7 @@ class ModuleInternal { v8::Local WrapModuleContent(v8::Isolate* isolate, const std::string& path); v8::Local LoadModule(v8::Isolate* isolate, const std::string& modulePath, const std::string& cacheKey); v8::Local LoadData(v8::Isolate* isolate, const std::string& modulePath); + v8::MaybeLocal RunScriptString(v8::Isolate* isolate, v8::Local context, const std::string script); std::string ResolvePath(v8::Isolate* isolate, const std::string& baseDir, const std::string& moduleName); std::string ResolvePathFromPackageJson(const std::string& packageJson, bool& error); v8::ScriptCompiler::CachedData* LoadScriptCache(const std::string& path); diff --git a/NativeScript/runtime/ModuleInternal.mm b/NativeScript/runtime/ModuleInternal.mm index ab5890ed..74024e1c 100644 --- a/NativeScript/runtime/ModuleInternal.mm +++ b/NativeScript/runtime/ModuleInternal.mm @@ -63,6 +63,26 @@ return success; } +void ModuleInternal::RunScript(Isolate* isolate, std::string script) { + std::shared_ptr cache = Caches::Get(isolate); + Local context = cache->GetContext(); + Local globalObject = context->Global(); + Local requireObj; + bool success = globalObject->Get(context, ToV8String(isolate, "require")).ToLocal(&requireObj); + tns::Assert(success && requireObj->IsFunction(), isolate); + Local result; + this->RunScriptString(isolate, context, script); +} + +MaybeLocal ModuleInternal::RunScriptString(Isolate* isolate, Local context, const std::string scriptString) { + ScriptCompiler::CompileOptions options = ScriptCompiler::kNoCompileOptions; + ScriptCompiler::Source source(tns::ToV8String(isolate, scriptString)); + TryCatch tc(isolate); + Local