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