From ba023b4c206d85404c15a1b33a51425fa599572b Mon Sep 17 00:00:00 2001 From: Bradley Farias Date: Tue, 17 Oct 2017 11:25:48 -0500 Subject: [PATCH] src: use V8 function to get Module Namespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/16261 Reviewed-By: Anna Henningsen Reviewed-By: Ben Noordhuis Reviewed-By: James M Snell Reviewed-By: Benjamin Gruenbaum Reviewed-By: Michaƫl Zasso --- lib/internal/loader/Loader.js | 7 ++----- lib/internal/loader/ModuleWrap.js | 8 -------- src/module_wrap.cc | 24 ++++++++++++++++++++++++ src/module_wrap.h | 1 + 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/internal/loader/Loader.js b/lib/internal/loader/Loader.js index b1b99814f4f76a..f2c7fa0cfffc47 100644 --- a/lib/internal/loader/Loader.js +++ b/lib/internal/loader/Loader.js @@ -2,10 +2,7 @@ const { getURLFromFilePath } = require('internal/url'); -const { - getNamespaceOfModuleWrap, - createDynamicModule -} = require('internal/loader/ModuleWrap'); +const { createDynamicModule } = require('internal/loader/ModuleWrap'); const ModuleMap = require('internal/loader/ModuleMap'); const ModuleJob = require('internal/loader/ModuleJob'); @@ -100,7 +97,7 @@ class Loader { async import(specifier, parentURL = this.base) { const job = await this.getModuleJob(specifier, parentURL); const module = await job.run(); - return getNamespaceOfModuleWrap(module); + return module.namespace(); } } Object.setPrototypeOf(Loader.prototype, null); diff --git a/lib/internal/loader/ModuleWrap.js b/lib/internal/loader/ModuleWrap.js index 8766041d94e251..c97b4888ea22ce 100644 --- a/lib/internal/loader/ModuleWrap.js +++ b/lib/internal/loader/ModuleWrap.js @@ -6,13 +6,6 @@ const debug = require('util').debuglog('esm'); const ArrayJoin = Function.call.bind(Array.prototype.join); const ArrayMap = Function.call.bind(Array.prototype.map); -const getNamespaceOfModuleWrap = (m) => { - const tmp = new ModuleWrap('import * as _ from "";_;', ''); - tmp.link(async () => m); - tmp.instantiate(); - return tmp.evaluate(); -}; - const createDynamicModule = (exports, url = '', evaluate) => { debug( `creating ESM facade for ${url} with exports: ${ArrayJoin(exports, ', ')}` @@ -57,6 +50,5 @@ const createDynamicModule = (exports, url = '', evaluate) => { module.exports = { createDynamicModule, - getNamespaceOfModuleWrap, ModuleWrap }; diff --git a/src/module_wrap.cc b/src/module_wrap.cc index bda760369e9b5c..92dc9cf917934f 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -207,6 +207,29 @@ void ModuleWrap::Evaluate(const FunctionCallbackInfo& args) { args.GetReturnValue().Set(ret); } +void ModuleWrap::Namespace(const FunctionCallbackInfo& args) { + Environment* env = Environment::GetCurrent(args); + auto isolate = args.GetIsolate(); + auto that = args.This(); + ModuleWrap* obj = Unwrap(that); + CHECK_NE(obj, nullptr); + + auto module = obj->module_.Get(isolate); + + switch (module->GetStatus()) { + default: + return env->ThrowError( + "cannot get namespace, Module has not been instantiated"); + case v8::Module::Status::kInstantiated: + case v8::Module::Status::kEvaluating: + case v8::Module::Status::kEvaluated: + break; + } + + auto result = module->GetModuleNamespace(); + args.GetReturnValue().Set(result); +} + MaybeLocal ModuleWrap::ResolveCallback(Local context, Local specifier, Local referrer) { @@ -520,6 +543,7 @@ void ModuleWrap::Initialize(Local target, env->SetProtoMethod(tpl, "link", Link); env->SetProtoMethod(tpl, "instantiate", Instantiate); env->SetProtoMethod(tpl, "evaluate", Evaluate); + env->SetProtoMethod(tpl, "namespace", Namespace); target->Set(FIXED_ONE_BYTE_STRING(isolate, "ModuleWrap"), tpl->GetFunction()); env->SetMethod(target, "resolve", node::loader::ModuleWrap::Resolve); diff --git a/src/module_wrap.h b/src/module_wrap.h index 82fd1d89ffd547..ac2f90476d5b59 100644 --- a/src/module_wrap.h +++ b/src/module_wrap.h @@ -34,6 +34,7 @@ class ModuleWrap : public BaseObject { static void Link(const v8::FunctionCallbackInfo& args); static void Instantiate(const v8::FunctionCallbackInfo& args); static void Evaluate(const v8::FunctionCallbackInfo& args); + static void Namespace(const v8::FunctionCallbackInfo& args); static void GetUrl(v8::Local property, const v8::PropertyCallbackInfo& info); static void Resolve(const v8::FunctionCallbackInfo& args);