summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/test-modules.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/cctest/test-modules.cc')
-rw-r--r--deps/v8/test/cctest/test-modules.cc185
1 files changed, 132 insertions, 53 deletions
diff --git a/deps/v8/test/cctest/test-modules.cc b/deps/v8/test/cctest/test-modules.cc
index b61b10bcea..2523b83a16 100644
--- a/deps/v8/test/cctest/test-modules.cc
+++ b/deps/v8/test/cctest/test-modules.cc
@@ -27,87 +27,166 @@ ScriptOrigin ModuleOrigin(Local<v8::Value> resource_name, Isolate* isolate) {
return origin;
}
-MaybeLocal<Module> FailAlwaysResolveCallback(Local<Context> context,
- Local<String> specifier,
- Local<Module> referrer) {
- Isolate* isolate = context->GetIsolate();
- isolate->ThrowException(v8_str("boom"));
- return MaybeLocal<Module>();
-}
-
-static int g_count = 0;
-MaybeLocal<Module> FailOnSecondCallResolveCallback(Local<Context> context,
- Local<String> specifier,
- Local<Module> referrer) {
+static Local<Module> dep1;
+static Local<Module> dep2;
+MaybeLocal<Module> ResolveCallback(Local<Context> context,
+ Local<String> specifier,
+ Local<Module> referrer) {
Isolate* isolate = CcTest::isolate();
- if (g_count++ > 0) {
- isolate->ThrowException(v8_str("booom"));
+ if (specifier->StrictEquals(v8_str("./dep1.js"))) {
+ return dep1;
+ } else if (specifier->StrictEquals(v8_str("./dep2.js"))) {
+ return dep2;
+ } else {
+ isolate->ThrowException(v8_str("boom"));
return MaybeLocal<Module>();
}
- Local<String> source_text = v8_str("");
- ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), isolate);
- ScriptCompiler::Source source(source_text, origin);
- return ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
}
-TEST(ModuleInstantiationFailures) {
+TEST(ModuleInstantiationFailures1) {
Isolate* isolate = CcTest::isolate();
HandleScope scope(isolate);
LocalContext env;
v8::TryCatch try_catch(isolate);
- Local<String> source_text = v8_str(
- "import './foo.js';\n"
- "export {} from './bar.js';");
- ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
- ScriptCompiler::Source source(source_text, origin);
- Local<Module> module =
- ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
- CHECK_EQ(Module::kUninstantiated, module->GetStatus());
- CHECK_EQ(2, module->GetModuleRequestsLength());
- CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0)));
- v8::Location loc = module->GetModuleRequestLocation(0);
- CHECK_EQ(0, loc.GetLineNumber());
- CHECK_EQ(7, loc.GetColumnNumber());
-
- CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1)));
- loc = module->GetModuleRequestLocation(1);
- CHECK_EQ(1, loc.GetLineNumber());
- CHECK_EQ(15, loc.GetColumnNumber());
+ Local<Module> module;
+ {
+ Local<String> source_text = v8_str(
+ "import './foo.js';\n"
+ "export {} from './bar.js';");
+ ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ CHECK_EQ(Module::kUninstantiated, module->GetStatus());
+ CHECK_EQ(2, module->GetModuleRequestsLength());
+ CHECK(v8_str("./foo.js")->StrictEquals(module->GetModuleRequest(0)));
+ v8::Location loc = module->GetModuleRequestLocation(0);
+ CHECK_EQ(0, loc.GetLineNumber());
+ CHECK_EQ(7, loc.GetColumnNumber());
+ CHECK(v8_str("./bar.js")->StrictEquals(module->GetModuleRequest(1)));
+ loc = module->GetModuleRequestLocation(1);
+ CHECK_EQ(1, loc.GetLineNumber());
+ CHECK_EQ(15, loc.GetColumnNumber());
+ }
// Instantiation should fail.
{
v8::TryCatch inner_try_catch(isolate);
- CHECK(module->InstantiateModule(env.local(), FailAlwaysResolveCallback)
- .IsNothing());
+ CHECK(module->InstantiateModule(env.local(), ResolveCallback).IsNothing());
CHECK(inner_try_catch.HasCaught());
CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom")));
- CHECK_EQ(Module::kErrored, module->GetStatus());
- Local<Value> exception = module->GetException();
- CHECK(exception->StrictEquals(v8_str("boom")));
- // TODO(neis): Check object identity.
+ CHECK_EQ(Module::kUninstantiated, module->GetStatus());
}
// Start over again...
- module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ {
+ Local<String> source_text = v8_str(
+ "import './dep1.js';\n"
+ "export {} from './bar.js';");
+ ScriptOrigin origin = ModuleOrigin(v8_str("file.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ module = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
+
+ // dep1.js
+ {
+ Local<String> source_text = v8_str("");
+ ScriptOrigin origin = ModuleOrigin(v8_str("dep1.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ dep1 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
- // Instantiation should fail if a sub-module fails to resolve.
- g_count = 0;
+ // Instantiation should fail because a sub-module fails to resolve.
{
v8::TryCatch inner_try_catch(isolate);
- CHECK(
- module->InstantiateModule(env.local(), FailOnSecondCallResolveCallback)
- .IsNothing());
+ CHECK(module->InstantiateModule(env.local(), ResolveCallback).IsNothing());
CHECK(inner_try_catch.HasCaught());
- CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("booom")));
- CHECK_EQ(Module::kErrored, module->GetStatus());
- Local<Value> exception = module->GetException();
- CHECK(exception->StrictEquals(v8_str("booom")));
+ CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom")));
+ CHECK_EQ(Module::kUninstantiated, module->GetStatus());
}
CHECK(!try_catch.HasCaught());
}
+TEST(ModuleInstantiationFailures2) {
+ Isolate* isolate = CcTest::isolate();
+ HandleScope scope(isolate);
+ LocalContext env;
+ v8::TryCatch try_catch(isolate);
+
+ // root1.js
+ Local<Module> root;
+ {
+ Local<String> source_text =
+ v8_str("import './dep1.js'; import './dep2.js'");
+ ScriptOrigin origin = ModuleOrigin(v8_str("root1.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ root = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
+
+ // dep1.js
+ {
+ Local<String> source_text = v8_str("export let x = 42");
+ ScriptOrigin origin = ModuleOrigin(v8_str("dep1.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ dep1 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
+
+ // dep2.js
+ {
+ Local<String> source_text = v8_str("import {foo} from './dep3.js'");
+ ScriptOrigin origin = ModuleOrigin(v8_str("dep2.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ dep2 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
+
+ {
+ v8::TryCatch inner_try_catch(isolate);
+ CHECK(root->InstantiateModule(env.local(), ResolveCallback).IsNothing());
+ CHECK(inner_try_catch.HasCaught());
+ CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom")));
+ CHECK_EQ(Module::kUninstantiated, root->GetStatus());
+ CHECK_EQ(Module::kUninstantiated, dep1->GetStatus());
+ CHECK_EQ(Module::kUninstantiated, dep2->GetStatus());
+ }
+
+ // Change dep2.js
+ {
+ Local<String> source_text = v8_str("import {foo} from './dep2.js'");
+ ScriptOrigin origin = ModuleOrigin(v8_str("dep2.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ dep2 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
+
+ {
+ v8::TryCatch inner_try_catch(isolate);
+ CHECK(root->InstantiateModule(env.local(), ResolveCallback).IsNothing());
+ CHECK(inner_try_catch.HasCaught());
+ CHECK(!inner_try_catch.Exception()->StrictEquals(v8_str("boom")));
+ CHECK_EQ(Module::kUninstantiated, root->GetStatus());
+ CHECK_EQ(Module::kInstantiated, dep1->GetStatus());
+ CHECK_EQ(Module::kUninstantiated, dep2->GetStatus());
+ }
+
+ // Change dep2.js again
+ {
+ Local<String> source_text = v8_str("import {foo} from './dep3.js'");
+ ScriptOrigin origin = ModuleOrigin(v8_str("dep2.js"), CcTest::isolate());
+ ScriptCompiler::Source source(source_text, origin);
+ dep2 = ScriptCompiler::CompileModule(isolate, &source).ToLocalChecked();
+ }
+
+ {
+ v8::TryCatch inner_try_catch(isolate);
+ CHECK(root->InstantiateModule(env.local(), ResolveCallback).IsNothing());
+ CHECK(inner_try_catch.HasCaught());
+ CHECK(inner_try_catch.Exception()->StrictEquals(v8_str("boom")));
+ CHECK_EQ(Module::kUninstantiated, root->GetStatus());
+ CHECK_EQ(Module::kInstantiated, dep1->GetStatus());
+ CHECK_EQ(Module::kUninstantiated, dep2->GetStatus());
+ }
+}
+
static MaybeLocal<Module> CompileSpecifierAsModuleResolveCallback(
Local<Context> context, Local<String> specifier, Local<Module> referrer) {
ScriptOrigin origin = ModuleOrigin(v8_str("module.js"), CcTest::isolate());