Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index c487961fe4a1ebf9bbaf80153ef979c403d3df33..29d0a7e4cdae2fd95ba600c7db45863eff80c73c 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -57,6 +57,8 @@ Handle<String> Bootstrapper::SourceLookup(int index) { |
template Handle<String> Bootstrapper::SourceLookup<Natives>(int index); |
+template Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>( |
+ int index); |
template Handle<String> Bootstrapper::SourceLookup<ExperimentalExtraNatives>( |
int index); |
template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index); |
@@ -131,6 +133,7 @@ void DeleteNativeSources(Object* maybe_array) { |
void Bootstrapper::TearDown() { |
DeleteNativeSources(Natives::GetSourceCache(isolate_->heap())); |
+ DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap())); |
DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap())); |
DeleteNativeSources( |
ExperimentalExtraNatives::GetSourceCache(isolate_->heap())); |
@@ -228,6 +231,7 @@ class Genesis BASE_EMBEDDED { |
void InstallTypedArray(const char* name, ElementsKind elements_kind, |
Handle<JSFunction>* fun); |
+ bool InstallExperimentalNatives(); |
bool InstallExtraNatives(); |
bool InstallExperimentalExtraNatives(); |
bool InstallDebuggerNatives(); |
@@ -3056,6 +3060,19 @@ bool Bootstrapper::CompileBuiltin(Isolate* isolate, int index) { |
} |
+bool Bootstrapper::CompileExperimentalBuiltin(Isolate* isolate, int index) { |
+ HandleScope scope(isolate); |
+ Vector<const char> name = ExperimentalNatives::GetScriptName(index); |
+ Handle<String> source_code = |
+ isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index); |
+ Handle<Object> global = isolate->global_object(); |
+ Handle<Object> utils = isolate->natives_utils_object(); |
+ Handle<Object> args[] = {global, utils}; |
+ return Bootstrapper::CompileNative(isolate, name, source_code, |
+ arraysize(args), args, NATIVES_CODE); |
+} |
+ |
+ |
bool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) { |
HandleScope scope(isolate); |
Vector<const char> name = ExtraNatives::GetScriptName(index); |
@@ -3682,36 +3699,11 @@ void Genesis::InitializeGlobal_harmony_sharedarraybuffer() { |
Handle<JSObject> atomics_object = factory->NewJSObject(cons, TENURED); |
DCHECK(atomics_object->IsJSObject()); |
JSObject::AddProperty(global, name, atomics_object, DONT_ENUM); |
- JSObject::AddProperty(atomics_object, factory->to_string_tag_symbol(), name, |
- static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("load"), |
Builtins::kAtomicsLoad, 2, true); |
SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("store"), |
Builtins::kAtomicsStore, 3, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("add"), |
- Builtins::kAtomicsAdd, 3, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("sub"), |
- Builtins::kAtomicsSub, 3, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("and"), |
- Builtins::kAtomicsAnd, 3, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("or"), |
- Builtins::kAtomicsOr, 3, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("xor"), |
- Builtins::kAtomicsXor, 3, true); |
- SimpleInstallFunction(atomics_object, |
- factory->InternalizeUtf8String("exchange"), |
- Builtins::kAtomicsExchange, 3, true); |
- SimpleInstallFunction(atomics_object, |
- factory->InternalizeUtf8String("compareExchange"), |
- Builtins::kAtomicsCompareExchange, 4, true); |
- SimpleInstallFunction(atomics_object, |
- factory->InternalizeUtf8String("isLockFree"), |
- Builtins::kAtomicsIsLockFree, 1, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("wait"), |
- Builtins::kAtomicsWait, 4, true); |
- SimpleInstallFunction(atomics_object, factory->InternalizeUtf8String("wake"), |
- Builtins::kAtomicsWake, 3, true); |
} |
void Genesis::InitializeGlobal_harmony_array_prototype_values() { |
@@ -4315,6 +4307,58 @@ bool Genesis::InstallNatives(GlobalContextType context_type) { |
return true; |
} |
+ |
+bool Genesis::InstallExperimentalNatives() { |
+ static const char* harmony_tailcalls_natives[] = {nullptr}; |
+ static const char* harmony_sharedarraybuffer_natives[] = { |
+ "native harmony-atomics.js", NULL}; |
+ static const char* harmony_do_expressions_natives[] = {nullptr}; |
+ static const char* harmony_regexp_lookbehind_natives[] = {nullptr}; |
+ static const char* harmony_regexp_named_captures_natives[] = {nullptr}; |
+ static const char* harmony_regexp_property_natives[] = {nullptr}; |
+ static const char* harmony_function_sent_natives[] = {nullptr}; |
+ static const char* harmony_array_prototype_values_natives[] = {nullptr}; |
+#ifdef V8_I18N_SUPPORT |
+ static const char* icu_case_mapping_natives[] = {nullptr}; |
+ static const char* datetime_format_to_parts_natives[] = {nullptr}; |
+#endif |
+ static const char* harmony_restrictive_generators_natives[] = {nullptr}; |
+ static const char* harmony_trailing_commas_natives[] = {nullptr}; |
+ static const char* harmony_function_tostring_natives[] = {nullptr}; |
+ static const char* harmony_class_fields_natives[] = {nullptr}; |
+ static const char* harmony_object_rest_spread_natives[] = {nullptr}; |
+ static const char* harmony_async_iteration_natives[] = {nullptr}; |
+ static const char* harmony_dynamic_import_natives[] = {nullptr}; |
+ static const char* harmony_promise_finally_natives[] = {nullptr}; |
+ static const char* harmony_template_escapes_natives[] = {nullptr}; |
+ |
+ for (int i = ExperimentalNatives::GetDebuggerCount(); |
+ i < ExperimentalNatives::GetBuiltinsCount(); i++) { |
+#define INSTALL_EXPERIMENTAL_NATIVES(id, desc) \ |
+ if (FLAG_##id) { \ |
+ for (size_t j = 0; id##_natives[j] != NULL; j++) { \ |
+ Vector<const char> script_name = ExperimentalNatives::GetScriptName(i); \ |
+ if (strncmp(script_name.start(), id##_natives[j], \ |
+ script_name.length()) == 0) { \ |
+ if (!Bootstrapper::CompileExperimentalBuiltin(isolate(), i)) { \ |
+ return false; \ |
+ } \ |
+ } \ |
+ } \ |
+ } |
+ HARMONY_INPROGRESS(INSTALL_EXPERIMENTAL_NATIVES); |
+ HARMONY_STAGED(INSTALL_EXPERIMENTAL_NATIVES); |
+ HARMONY_SHIPPING(INSTALL_EXPERIMENTAL_NATIVES); |
+#undef INSTALL_EXPERIMENTAL_NATIVES |
+ } |
+ |
+ if (!CallUtilsFunction(isolate(), "PostExperimentals")) return false; |
+ |
+ InstallExperimentalBuiltinFunctionIds(); |
+ return true; |
+} |
+ |
+ |
bool Genesis::InstallExtraNatives() { |
HandleScope scope(isolate()); |
@@ -4346,7 +4390,7 @@ bool Genesis::InstallDebuggerNatives() { |
for (int i = 0; i < Natives::GetDebuggerCount(); ++i) { |
if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false; |
} |
- return true; |
+ return CallUtilsFunction(isolate(), "PostDebug"); |
} |
@@ -4384,6 +4428,26 @@ void Genesis::InstallBuiltinFunctionIds() { |
} |
} |
+ |
+void Genesis::InstallExperimentalBuiltinFunctionIds() { |
+ if (FLAG_harmony_sharedarraybuffer) { |
+ struct BuiltinFunctionIds { |
+ const char* holder_expr; |
+ const char* fun_name; |
+ BuiltinFunctionId id; |
+ }; |
+ |
+ const BuiltinFunctionIds atomic_builtins[] = { |
+ ATOMIC_FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)}; |
+ |
+ for (const BuiltinFunctionIds& builtin : atomic_builtins) { |
+ Handle<JSObject> holder = |
+ ResolveBuiltinIdHolder(native_context(), builtin.holder_expr); |
+ InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id); |
+ } |
+ } |
+} |
+ |
#undef INSTALL_BUILTIN_ID |
@@ -4894,6 +4958,7 @@ Genesis::Genesis( |
if (context_type == FULL_CONTEXT) { |
if (!isolate->serializer_enabled()) { |
InitializeExperimentalGlobal(); |
+ if (!InstallExperimentalNatives()) return; |
if (FLAG_experimental_extras) { |
if (!InstallExperimentalExtraNatives()) return; |
@@ -4908,6 +4973,8 @@ Genesis::Genesis( |
native_context()->set_string_function_prototype_map( |
string_function_prototype->map()); |
} |
+ // The serializer cannot serialize typed arrays. Reset those typed arrays |
+ // for each new context. |
} else if (context_type == DEBUG_CONTEXT) { |
DCHECK(!isolate->serializer_enabled()); |
InitializeExperimentalGlobal(); |