Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index ed4b89151abe8d83f86c5724125535afb5734a01..8ae8fbb8117a9abba36fa2ab02f41f499a1814af 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -1858,20 +1858,10 @@ MaybeLocal<Value> Script::Run(Local<Context> context) { |
i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
auto fun = i::Handle<i::JSFunction>::cast(Utils::OpenHandle(this)); |
- i::Handle<i::Object> receiver; |
+ i::Handle<i::Object> receiver = isolate->global_proxy(); |
Local<Value> result; |
- |
- if (fun->shared()->scope_info()->scope_type() == i::MODULE_SCOPE) { |
- receiver = isolate->factory()->undefined_value(); |
- i::Handle<i::Object> argv[] = { |
- handle(isolate->native_context()->current_module())}; |
- has_pending_exception = !ToLocal<Value>( |
- i::Execution::Call(isolate, fun, receiver, 1, argv), &result); |
- } else { |
- receiver = isolate->global_proxy(); |
- has_pending_exception = !ToLocal<Value>( |
- i::Execution::Call(isolate, fun, receiver, 0, nullptr), &result); |
- } |
+ has_pending_exception = !ToLocal<Value>( |
+ i::Execution::Call(isolate, fun, receiver, 0, nullptr), &result); |
RETURN_ON_FAILED_EXECUTION(Value); |
RETURN_ESCAPED(result); |
@@ -1894,6 +1884,51 @@ Local<UnboundScript> Script::GetUnboundScript() { |
i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared())); |
} |
+bool Module::Instantiate(Local<Context> v8_context) { |
+ i::Handle<i::Module> self = Utils::OpenHandle(this); |
+ i::Isolate* isolate = self->GetIsolate(); |
+ |
+ // Already instantiated. |
+ if (self->code()->IsJSFunction()) return true; |
+ |
+ i::Handle<i::SharedFunctionInfo> shared( |
+ i::SharedFunctionInfo::cast(self->code()), isolate); |
+ i::Handle<i::Context> context = Utils::OpenHandle(*v8_context); |
+ i::Handle<i::JSFunction> function = |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ shared, handle(context->native_context(), isolate)); |
+ self->set_code(*function); |
+ |
+ // TODO(adamk): This could fail in the future when Instantiate |
+ // does linking. |
+ return true; |
+} |
+ |
+MaybeLocal<Value> Module::Evaluate(Local<Context> context) { |
+ PREPARE_FOR_EXECUTION_WITH_CONTEXT_IN_RUNTIME_CALL_STATS_SCOPE( |
+ "v8", "V8.Execute", context, Script, Run, MaybeLocal<Value>(), |
+ InternalEscapableScope, true); |
+ i::HistogramTimerScope execute_timer(isolate->counters()->execute(), true); |
+ i::AggregatingHistogramTimerScope timer(isolate->counters()->compile_lazy()); |
+ i::TimerEventScope<i::TimerEventExecute> timer_scope(isolate); |
+ |
+ i::Handle<i::Module> self = Utils::OpenHandle(this); |
+ // It's an API error to call Evaluate before Instantiate. |
+ CHECK(self->code()->IsJSFunction()); |
+ |
+ i::Handle<i::JSFunction> function(i::JSFunction::cast(self->code()), isolate); |
+ DCHECK_EQ(i::MODULE_SCOPE, function->shared()->scope_info()->scope_type()); |
+ i::Handle<i::Object> receiver = isolate->factory()->undefined_value(); |
+ |
+ Local<Value> result; |
+ i::Handle<i::Object> argv[] = {self}; |
+ has_pending_exception = !ToLocal<Value>( |
+ i::Execution::Call(isolate, function, receiver, arraysize(argv), argv), |
+ &result); |
+ |
+ RETURN_ON_FAILED_EXECUTION(Value); |
+ RETURN_ESCAPED(result); |
+} |
MaybeLocal<UnboundScript> ScriptCompiler::CompileUnboundInternal( |
Isolate* v8_isolate, Source* source, CompileOptions options, |
@@ -2004,32 +2039,22 @@ Local<Script> ScriptCompiler::Compile( |
RETURN_TO_LOCAL_UNCHECKED(Compile(context, source, options), Script); |
} |
- |
-MaybeLocal<Script> ScriptCompiler::CompileModule(Local<Context> context, |
- Source* source, |
- CompileOptions options) { |
- auto isolate = context->GetIsolate(); |
+MaybeLocal<Module> ScriptCompiler::CompileModule(Isolate* isolate, |
+ Source* source) { |
i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
- auto maybe = CompileUnboundInternal(isolate, source, options, true); |
- Local<UnboundScript> generic; |
- if (!maybe.ToLocal(&generic)) return MaybeLocal<Script>(); |
- v8::Context::Scope scope(context); |
- auto result = generic->BindToCurrentContext(); |
+ auto maybe = CompileUnboundInternal(isolate, source, kNoCompileOptions, true); |
+ Local<UnboundScript> unbound; |
+ if (!maybe.ToLocal(&unbound)) return MaybeLocal<Module>(); |
- i::Handle<i::SharedFunctionInfo> shared = Utils::OpenHandle(*generic); |
+ i::Handle<i::SharedFunctionInfo> shared = Utils::OpenHandle(*unbound); |
i::Handle<i::FixedArray> regular_exports = |
i::handle(shared->scope_info()->ModuleDescriptorInfo()->regular_exports(), |
i_isolate); |
int regular_exports_length = regular_exports->length(); |
i::Handle<i::Module> module = |
- i_isolate->factory()->NewModule(regular_exports_length); |
- |
- // TODO(neis): Storing the module into the native context is a temporary hack |
- // to pass it to the Script::Run function. This will be removed once we |
- // support modules in the API. |
- i_isolate->native_context()->set_current_module(*module); |
+ i_isolate->factory()->NewModule(shared, regular_exports_length); |
// TODO(neis): This will create multiple cells for the same local variable if |
// exported under multiple names, which is wrong but cannot be observed at the |
@@ -2044,7 +2069,7 @@ MaybeLocal<Script> ScriptCompiler::CompileModule(Local<Context> context, |
i::Module::CreateExport(module, export_name); |
} |
- return result; |
+ return ToApiHandle<Module>(module); |
} |