@@ -281,4 +281,115 @@ TEST(ModuleEvaluationCompletion2) {
281281 CHECK (!try_catch.HasCaught ());
282282}
283283
284+ TEST (ModuleNamespace) {
285+ Isolate* isolate = CcTest::isolate ();
286+ HandleScope scope (isolate);
287+ LocalContext env;
288+ v8::TryCatch try_catch (isolate);
289+
290+ Local<v8::Object> ReferenceError =
291+ CompileRun (" ReferenceError" )->ToObject (env.local ()).ToLocalChecked ();
292+
293+ Local<String> source_text = v8_str (
294+ " import {a, b} from 'export var a = 1; export let b = 2';"
295+ " export function geta() {return a};"
296+ " export function getb() {return b};"
297+ " export let radio = 3;"
298+ " export var gaga = 4;" );
299+ ScriptOrigin origin = ModuleOrigin (v8_str (" file.js" ), CcTest::isolate ());
300+ ScriptCompiler::Source source (source_text, origin);
301+ Local<Module> module =
302+ ScriptCompiler::CompileModule (isolate, &source).ToLocalChecked ();
303+ CHECK_EQ (Module::kUninstantiated , module ->GetStatus ());
304+ CHECK (module
305+ ->InstantiateModule (env.local (),
306+ CompileSpecifierAsModuleResolveCallback)
307+ .FromJust ());
308+ CHECK_EQ (Module::kInstantiated , module ->GetStatus ());
309+ Local<Value> ns = module ->GetModuleNamespace ();
310+ CHECK_EQ (Module::kInstantiated , module ->GetStatus ());
311+ Local<v8::Object> nsobj = ns->ToObject (env.local ()).ToLocalChecked ();
312+
313+ // a, b
314+ CHECK (nsobj->Get (env.local (), v8_str (" a" )).ToLocalChecked ()->IsUndefined ());
315+ CHECK (nsobj->Get (env.local (), v8_str (" b" )).ToLocalChecked ()->IsUndefined ());
316+
317+ // geta
318+ {
319+ auto geta = nsobj->Get (env.local (), v8_str (" geta" )).ToLocalChecked ();
320+ auto a = geta.As <v8::Function>()
321+ ->Call (env.local (), geta, 0 , nullptr )
322+ .ToLocalChecked ();
323+ CHECK (a->IsUndefined ());
324+ }
325+
326+ // getb
327+ {
328+ v8::TryCatch inner_try_catch (isolate);
329+ auto getb = nsobj->Get (env.local (), v8_str (" getb" )).ToLocalChecked ();
330+ CHECK (
331+ getb.As <v8::Function>()->Call (env.local (), getb, 0 , nullptr ).IsEmpty ());
332+ CHECK (inner_try_catch.HasCaught ());
333+ CHECK (inner_try_catch.Exception ()
334+ ->InstanceOf (env.local (), ReferenceError)
335+ .FromJust ());
336+ }
337+
338+ // radio
339+ {
340+ v8::TryCatch inner_try_catch (isolate);
341+ // https://bugs.chromium.org/p/v8/issues/detail?id=7235
342+ // CHECK(nsobj->Get(env.local(), v8_str("radio")).IsEmpty());
343+ CHECK (nsobj->Get (env.local (), v8_str (" radio" ))
344+ .ToLocalChecked ()
345+ ->IsUndefined ());
346+ CHECK (inner_try_catch.HasCaught ());
347+ CHECK (inner_try_catch.Exception ()
348+ ->InstanceOf (env.local (), ReferenceError)
349+ .FromJust ());
350+ }
351+
352+ // gaga
353+ {
354+ auto gaga = nsobj->Get (env.local (), v8_str (" gaga" )).ToLocalChecked ();
355+ CHECK (gaga->IsUndefined ());
356+ }
357+
358+ CHECK (!try_catch.HasCaught ());
359+ CHECK_EQ (Module::kInstantiated , module ->GetStatus ());
360+ module ->Evaluate (env.local ()).ToLocalChecked ();
361+ CHECK_EQ (Module::kEvaluated , module ->GetStatus ());
362+
363+ // geta
364+ {
365+ auto geta = nsobj->Get (env.local (), v8_str (" geta" )).ToLocalChecked ();
366+ auto a = geta.As <v8::Function>()
367+ ->Call (env.local (), geta, 0 , nullptr )
368+ .ToLocalChecked ();
369+ CHECK_EQ (1 , a->Int32Value (env.local ()).FromJust ());
370+ }
371+
372+ // getb
373+ {
374+ auto getb = nsobj->Get (env.local (), v8_str (" getb" )).ToLocalChecked ();
375+ auto b = getb.As <v8::Function>()
376+ ->Call (env.local (), getb, 0 , nullptr )
377+ .ToLocalChecked ();
378+ CHECK_EQ (2 , b->Int32Value (env.local ()).FromJust ());
379+ }
380+
381+ // radio
382+ {
383+ auto radio = nsobj->Get (env.local (), v8_str (" radio" )).ToLocalChecked ();
384+ CHECK_EQ (3 , radio->Int32Value (env.local ()).FromJust ());
385+ }
386+
387+ // gaga
388+ {
389+ auto gaga = nsobj->Get (env.local (), v8_str (" gaga" )).ToLocalChecked ();
390+ CHECK_EQ (4 , gaga->Int32Value (env.local ()).FromJust ());
391+ }
392+
393+ CHECK (!try_catch.HasCaught ());
394+ }
284395} // anonymous namespace
0 commit comments