[modules] Move Evaluate from api.cc into internal Module implementation

R=neis@chromium.org
BUG=v8:1569

Review-Url: https://codereview.chromium.org/2376693003
Cr-Commit-Position: refs/heads/master@{#39790}
This commit is contained in:
adamk 2016-09-27 11:32:05 -07:00 committed by Commit bot
parent 4810f41a52
commit 01824e5e96
3 changed files with 26 additions and 22 deletions

View File

@ -1937,29 +1937,8 @@ MaybeLocal<Value> Module::Evaluate(Local<Context> context) {
// It's an API error to call Evaluate before Instantiate.
CHECK(self->code()->IsJSFunction());
// Each module can only be evaluated once.
if (self->evaluated()) return Undefined(reinterpret_cast<Isolate*>(isolate));
self->set_evaluated(true);
i::Handle<i::FixedArray> requested_modules(self->requested_modules(),
isolate);
for (int i = 0, length = requested_modules->length(); i < length; ++i) {
i::Handle<i::Module> import(i::Module::cast(requested_modules->get(i)),
isolate);
MaybeLocal<Value> maybe_result = Utils::ToLocal(import)->Evaluate(context);
if (maybe_result.IsEmpty()) return maybe_result;
}
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);
has_pending_exception = !ToLocal(i::Module::Evaluate(self), &result);
RETURN_ON_FAILED_EXECUTION(Value);
RETURN_ESCAPED(result);
}

View File

@ -19903,5 +19903,27 @@ bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context,
return true;
}
MaybeHandle<Object> Module::Evaluate(Handle<Module> module) {
DCHECK(module->code()->IsJSFunction());
Isolate* isolate = module->GetIsolate();
// Each module can only be evaluated once.
if (module->evaluated()) return isolate->factory()->undefined_value();
module->set_evaluated(true);
Handle<FixedArray> requested_modules(module->requested_modules(), isolate);
for (int i = 0, length = requested_modules->length(); i < length; ++i) {
Handle<Module> import(Module::cast(requested_modules->get(i)), isolate);
RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object);
}
Handle<JSFunction> function(JSFunction::cast(module->code()), isolate);
DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type());
Handle<Object> receiver = isolate->factory()->undefined_value();
Handle<Object> argv[] = {module};
return Execution::Call(isolate, function, receiver, arraysize(argv), argv);
}
} // namespace internal
} // namespace v8

View File

@ -7967,6 +7967,9 @@ class Module : public Struct {
v8::Module::ResolveCallback callback,
v8::Local<v8::Value> callback_data);
// Implementation of spec operation ModuleEvaluation.
static MUST_USE_RESULT MaybeHandle<Object> Evaluate(Handle<Module> module);
static Handle<Object> LoadExport(Handle<Module> module, Handle<String> name);
static void StoreExport(Handle<Module> module, Handle<String> name,
Handle<Object> value);