@@ -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