@@ -281,4 +281,115 @@ TEST(ModuleEvaluationCompletion2) {
281
281
CHECK (!try_catch.HasCaught ());
282
282
}
283
283
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
+ }
284
395
} // anonymous namespace
0 commit comments