Skip to content

Commit 6591d9f

Browse files
devsnektargos
authored andcommitted
deps: cherry-pick 0c35b72 from upstream V8
Original commit message: [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} PR-URL: #18038 Refs: v8/v8@0c35b72 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Tiancheng "Timothy" Gu <[email protected]>
1 parent fd8c79d commit 6591d9f

File tree

3 files changed

+114
-4
lines changed

3 files changed

+114
-4
lines changed

common.gypi

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
# Reset this number to 0 on major V8 upgrades.
2929
# Increment by one for each non-official patch applied to deps/v8.
30-
'v8_embedder_string': '-node.22',
30+
'v8_embedder_string': '-node.23',
3131

3232
# Enable disassembler for `--print-code` v8 options
3333
'v8_enable_disassembler': 1,

deps/v8/src/api.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -2212,9 +2212,8 @@ Location Module::GetModuleRequestLocation(int i) const {
22122212

22132213
Local<Value> Module::GetModuleNamespace() {
22142214
Utils::ApiCheck(
2215-
GetStatus() == kEvaluated, "v8::Module::GetModuleNamespace",
2216-
"v8::Module::GetModuleNamespace can only be used on a module with "
2217-
"status kEvaluated");
2215+
GetStatus() >= kInstantiated, "v8::Module::GetModuleNamespace",
2216+
"v8::Module::GetModuleNamespace must be used on an instantiated module");
22182217
i::Handle<i::Module> self = Utils::OpenHandle(this);
22192218
i::Handle<i::JSModuleNamespace> module_namespace =
22202219
i::Module::GetModuleNamespace(self);

deps/v8/test/cctest/test-modules.cc

+111
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)