| 64 | } |
| 65 | |
| 66 | void ModuleInternal::Init(Isolate* isolate, const string& baseDir) { |
| 67 | JEnv env; |
| 68 | |
| 69 | if (MODULE_CLASS == nullptr) { |
| 70 | MODULE_CLASS = env.FindClass("com/tns/Module"); |
| 71 | assert(MODULE_CLASS != nullptr); |
| 72 | |
| 73 | RESOLVE_PATH_METHOD_ID = env.GetStaticMethodID(MODULE_CLASS, "resolvePath", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); |
| 74 | assert(RESOLVE_PATH_METHOD_ID != nullptr); |
| 75 | |
| 76 | GET_APPLICATION_FILES_PATH_METHOD_ID = env.GetStaticMethodID(MODULE_CLASS, "getApplicationFilesPath", "()Ljava/lang/String;"); |
| 77 | assert(GET_APPLICATION_FILES_PATH_METHOD_ID != nullptr); |
| 78 | } |
| 79 | |
| 80 | m_isolate = isolate; |
| 81 | |
| 82 | string requireFactoryScript = |
| 83 | "(function () { " |
| 84 | " function require_factory(requireInternal, dirName) { " |
| 85 | " return function require(modulePath) { " |
| 86 | " if(global.__requireOverride) { " |
| 87 | " var result = global.__requireOverride(modulePath, dirName); " |
| 88 | " if(result) { " |
| 89 | " return result; " |
| 90 | " } " |
| 91 | " } " |
| 92 | " return requireInternal(modulePath, dirName); " |
| 93 | " } " |
| 94 | " } " |
| 95 | " return require_factory; " |
| 96 | "})()"; |
| 97 | |
| 98 | auto source = ArgConverter::ConvertToV8String(isolate, requireFactoryScript); |
| 99 | auto context = isolate->GetCurrentContext(); |
| 100 | |
| 101 | auto global = context->Global(); |
| 102 | |
| 103 | Local<Script> script; |
| 104 | auto maybeScript = Script::Compile(context, source).ToLocal(&script); |
| 105 | |
| 106 | assert(!script.IsEmpty()); |
| 107 | |
| 108 | Local<Value> result; |
| 109 | auto maybeResult = script->Run(context).ToLocal(&result); |
| 110 | |
| 111 | assert(!result.IsEmpty() && result->IsFunction()); |
| 112 | |
| 113 | auto requireFactoryFunction = result.As<Function>(); |
| 114 | |
| 115 | m_requireFactoryFunction = new Persistent<Function>(isolate, requireFactoryFunction); |
| 116 | |
| 117 | auto requireFuncTemplate = FunctionTemplate::New(isolate, RequireCallback, External::New(isolate, this)); |
| 118 | auto requireFunc = requireFuncTemplate->GetFunction(context).ToLocalChecked(); |
| 119 | global->Set(context, ArgConverter::ConvertToV8String(isolate, "__nativeRequire"), requireFunc); |
| 120 | m_requireFunction = new Persistent<Function>(isolate, requireFunc); |
| 121 | |
| 122 | Local<Function> globalRequire; |
| 123 |
nothing calls this directly
no test coverage detected