Skip to content

Commit 0c35b72

Browse files
GeorgNeisCommit Bot
authored andcommitted
[api,modules] Allow GetModuleNamespace on unevaluated modules.
Bug: v8:7217 Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_rel_ng Change-Id: I97b067254355eb91e12b92eba92631cbc3ce8000 Reviewed-on: https://chromium-review.googlesource.com/839280 Commit-Queue: Georg Neis <[email protected]> Reviewed-by: Adam Klein <[email protected]> Cr-Commit-Position: refs/heads/master@{#50395}
1 parent ddfbbc5 commit 0c35b72

2 files changed

Lines changed: 113 additions & 3 deletions

File tree

src/api.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2262,9 +2262,8 @@ Location Module::GetModuleRequestLocation(int i) const {
22622262

22632263
Local<Value> Module::GetModuleNamespace() {
22642264
Utils::ApiCheck(
2265-
GetStatus() == kEvaluated, "v8::Module::GetModuleNamespace",
2266-
"v8::Module::GetModuleNamespace can only be used on a module with "
2267-
"status kEvaluated");
2265+
GetStatus() >= kInstantiated, "v8::Module::GetModuleNamespace",
2266+
"v8::Module::GetModuleNamespace must be used on an instantiated module");
22682267
i::Handle<i::Module> self = Utils::OpenHandle(this);
22692268
i::Handle<i::JSModuleNamespace> module_namespace =
22702269
i::Module::GetModuleNamespace(self);

test/cctest/test-modules.cc

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,4 +360,115 @@ TEST(ModuleEvaluationCompletion2) {
360360
CHECK(!try_catch.HasCaught());
361361
}
362362

363+
TEST(ModuleNamespace) {
364+
Isolate* isolate = CcTest::isolate();
365+
HandleScope scope(isolate);
366+
LocalContext env;
367+
v8::TryCatch try_catch(isolate);
368+
369+
Local<v8::Object> ReferenceError =
370+
CompileRun("ReferenceError")->ToObject(env.local()).ToLocalChecked();
371+
372+
Local<String> source_text = v8_str(
373+
"import {a, b} from 'export var a = 1; export let b = 2';"
374+
"export function geta() {return a};"
375+
"export function getb() {return b};"
376+
"export let radio = 3;"
377+
"export var gaga = 4;");
378+
ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
379+
ScriptCompiler::Source source(source_text, origin);
380+
Local<Module> module =
381+
ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
382+
CHECK_EQ(Module::kUninstantiated, module->GetStatus());
383+
CHECK(module
384+
->InstantiateModule(env.local(),
385+
CompileSpecifierAsModuleResolveCallback)
386+
.FromJust());
387+
CHECK_EQ(Module::kInstantiated, module->GetStatus());
388+
Local<Value> ns = module->GetModuleNamespace();
389+
CHECK_EQ(Module::kInstantiated, module->GetStatus());
390+
Local<v8::Object> nsobj = ns->ToObject(env.local()).ToLocalChecked();
391+
392+
// a, b
393+
CHECK(nsobj->Get(env.local(), v8_str("a")).ToLocalChecked()->IsUndefined());
394+
CHECK(nsobj->Get(env.local(), v8_str("b")).ToLocalChecked()->IsUndefined());
395+
396+
// geta
397+
{
398+
auto geta = nsobj->Get(env.local(), v8_str("geta")).ToLocalChecked();
399+
auto a = geta.As<v8::Function>()
400+
->Call(env.local(), geta, 0, nullptr)
401+
.ToLocalChecked();
402+
CHECK(a->IsUndefined());
403+
}
404+
405+
// getb
406+
{
407+
v8::TryCatch inner_try_catch(isolate);
408+
auto getb = nsobj->Get(env.local(), v8_str("getb")).ToLocalChecked();
409+
CHECK(
410+
getb.As<v8::Function>()->Call(env.local(), getb, 0, nullptr).IsEmpty());
411+
CHECK(inner_try_catch.HasCaught());
412+
CHECK(inner_try_catch.Exception()
413+
->InstanceOf(env.local(), ReferenceError)
414+
.FromJust());
415+
}
416+
417+
// radio
418+
{
419+
v8::TryCatch inner_try_catch(isolate);
420+
// https://bugs.chromium.org/p/v8/issues/detail?id=7235
421+
// CHECK(nsobj->Get(env.local(), v8_str("radio")).IsEmpty());
422+
CHECK(nsobj->Get(env.local(), v8_str("radio"))
423+
.ToLocalChecked()
424+
->IsUndefined());
425+
CHECK(inner_try_catch.HasCaught());
426+
CHECK(inner_try_catch.Exception()
427+
->InstanceOf(env.local(), ReferenceError)
428+
.FromJust());
429+
}
430+
431+
// gaga
432+
{
433+
auto gaga = nsobj->Get(env.local(), v8_str("gaga")).ToLocalChecked();
434+
CHECK(gaga->IsUndefined());
435+
}
436+
437+
CHECK(!try_catch.HasCaught());
438+
CHECK_EQ(Module::kInstantiated, module->GetStatus());
439+
module->Evaluate(env.local()).ToLocalChecked();
440+
CHECK_EQ(Module::kEvaluated, module->GetStatus());
441+
442+
// geta
443+
{
444+
auto geta = nsobj->Get(env.local(), v8_str("geta")).ToLocalChecked();
445+
auto a = geta.As<v8::Function>()
446+
->Call(env.local(), geta, 0, nullptr)
447+
.ToLocalChecked();
448+
CHECK_EQ(1, a->Int32Value(env.local()).FromJust());
449+
}
450+
451+
// getb
452+
{
453+
auto getb = nsobj->Get(env.local(), v8_str("getb")).ToLocalChecked();
454+
auto b = getb.As<v8::Function>()
455+
->Call(env.local(), getb, 0, nullptr)
456+
.ToLocalChecked();
457+
CHECK_EQ(2, b->Int32Value(env.local()).FromJust());
458+
}
459+
460+
// radio
461+
{
462+
auto radio = nsobj->Get(env.local(), v8_str("radio")).ToLocalChecked();
463+
CHECK_EQ(3, radio->Int32Value(env.local()).FromJust());
464+
}
465+
466+
// gaga
467+
{
468+
auto gaga = nsobj->Get(env.local(), v8_str("gaga")).ToLocalChecked();
469+
CHECK_EQ(4, gaga->Int32Value(env.local()).FromJust());
470+
}
471+
472+
CHECK(!try_catch.HasCaught());
473+
}
363474
} // anonymous namespace

0 commit comments

Comments
 (0)