summaryrefslogtreecommitdiff
path: root/deps/v8
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8')
-rw-r--r--deps/v8/src/heap/factory.cc10
-rw-r--r--deps/v8/test/cctest/test-api.cc25
2 files changed, 31 insertions, 4 deletions
diff --git a/deps/v8/src/heap/factory.cc b/deps/v8/src/heap/factory.cc
index 721682f00f..7e434ea041 100644
--- a/deps/v8/src/heap/factory.cc
+++ b/deps/v8/src/heap/factory.cc
@@ -3070,20 +3070,22 @@ Handle<SyntheticModule> Factory::NewSyntheticModule(
Handle<String> module_name, Handle<FixedArray> export_names,
v8::Module::SyntheticModuleEvaluationSteps evaluation_steps) {
ReadOnlyRoots roots(isolate());
- Handle<SyntheticModule> module(
- SyntheticModule::cast(New(synthetic_module_map(), AllocationType::kOld)),
- isolate());
+
Handle<ObjectHashTable> exports =
ObjectHashTable::New(isolate(), static_cast<int>(export_names->length()));
Handle<Foreign> evaluation_steps_foreign =
NewForeign(reinterpret_cast<i::Address>(evaluation_steps));
- module->set_exports(*exports);
+
+ Handle<SyntheticModule> module(
+ SyntheticModule::cast(New(synthetic_module_map(), AllocationType::kOld)),
+ isolate());
module->set_hash(isolate()->GenerateIdentityHash(Smi::kMaxValue));
module->set_module_namespace(roots.undefined_value());
module->set_status(Module::kUninstantiated);
module->set_exception(roots.the_hole_value());
module->set_name(*module_name);
module->set_export_names(*export_names);
+ module->set_exports(*exports);
module->set_evaluation_steps(*evaluation_steps_foreign);
return module;
}
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc
index 12faaff39c..bafdd6ce3b 100644
--- a/deps/v8/test/cctest/test-api.cc
+++ b/deps/v8/test/cctest/test-api.cc
@@ -23918,6 +23918,31 @@ TEST(CreateSyntheticModule) {
CHECK_EQ(i_module->status(), i::Module::kInstantiated);
}
+TEST(CreateSyntheticModuleGC) {
+ // Try to make sure that CreateSyntheticModule() deals well with a GC
+ // happening during its execution.
+ i::FLAG_gc_interval = 10;
+ i::FLAG_inline_new = false;
+
+ LocalContext env;
+ v8::Isolate* isolate = env->GetIsolate();
+ v8::Isolate::Scope iscope(isolate);
+ v8::HandleScope scope(isolate);
+ v8::Local<v8::Context> context = v8::Context::New(isolate);
+ v8::Context::Scope cscope(context);
+
+ std::vector<v8::Local<v8::String>> export_names{v8_str("default")};
+ v8::Local<v8::String> module_name =
+ v8_str("CreateSyntheticModule-TestSyntheticModuleGC");
+
+ for (int i = 0; i < 200; i++) {
+ Local<Module> module = v8::Module::CreateSyntheticModule(
+ isolate, module_name, export_names,
+ UnexpectedSyntheticModuleEvaluationStepsCallback);
+ USE(module);
+ }
+}
+
TEST(SyntheticModuleSetExports) {
LocalContext env;
v8::Isolate* isolate = env->GetIsolate();