Index: src/bootstrapper.cc |
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc |
index d18ac94612dd8f4506af645d6e642853373fbc50..dfedc7c9aaae0c562d3444d9619408f2b58d1ed4 100644 |
--- a/src/bootstrapper.cc |
+++ b/src/bootstrapper.cc |
@@ -51,6 +51,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); |
template Handle<String> Bootstrapper::SourceLookup<CodeStubNatives>(int index); |
@@ -121,7 +123,10 @@ void Bootstrapper::TearDown() { |
DeleteNativeSources(Natives::GetSourceCache(isolate_->heap())); |
DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap())); |
DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap())); |
+ DeleteNativeSources( |
+ ExperimentalExtraNatives::GetSourceCache(isolate_->heap())); |
DeleteNativeSources(CodeStubNatives::GetSourceCache(isolate_->heap())); |
+ |
extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical |
} |
@@ -206,6 +211,7 @@ class Genesis BASE_EMBEDDED { |
Handle<JSFunction>* fun); |
bool InstallExperimentalNatives(); |
bool InstallExtraNatives(); |
+ bool InstallExperimentalExtraNatives(); |
bool InstallDebuggerNatives(); |
void InstallBuiltinFunctionIds(); |
void InstallExperimentalBuiltinFunctionIds(); |
@@ -1532,6 +1538,21 @@ bool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) { |
} |
+bool Bootstrapper::CompileExperimentalExtraBuiltin(Isolate* isolate, |
+ int index) { |
+ HandleScope scope(isolate); |
+ Vector<const char> name = ExperimentalExtraNatives::GetScriptName(index); |
+ Handle<String> source_code = |
+ isolate->bootstrapper()->SourceLookup<ExperimentalExtraNatives>(index); |
+ Handle<Object> global = isolate->global_object(); |
+ Handle<Object> binding = isolate->extras_binding_object(); |
+ Handle<Object> args[] = {global, binding}; |
+ return Bootstrapper::CompileNative( |
+ isolate, name, Handle<JSObject>(isolate->native_context()->builtins()), |
+ source_code, arraysize(args), args); |
+} |
+ |
+ |
bool Bootstrapper::CompileCodeStubBuiltin(Isolate* isolate, int index) { |
HandleScope scope(isolate); |
Vector<const char> name = CodeStubNatives::GetScriptName(index); |
@@ -2638,6 +2659,17 @@ bool Genesis::InstallExtraNatives() { |
} |
+bool Genesis::InstallExperimentalExtraNatives() { |
+ for (int i = ExperimentalExtraNatives::GetDebuggerCount(); |
+ i < ExperimentalExtraNatives::GetBuiltinsCount(); i++) { |
+ if (!Bootstrapper::CompileExperimentalExtraBuiltin(isolate(), i)) |
+ return false; |
+ } |
+ |
+ return true; |
+} |
+ |
+ |
bool Genesis::InstallDebuggerNatives() { |
for (int i = 0; i < Natives::GetDebuggerCount(); ++i) { |
if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false; |
@@ -3237,6 +3269,11 @@ Genesis::Genesis(Isolate* isolate, |
if (!isolate->serializer_enabled()) { |
InitializeExperimentalGlobal(); |
if (!InstallExperimentalNatives()) return; |
+ |
+ if (FLAG_experimental_extras) { |
+ if (!InstallExperimentalExtraNatives()) return; |
+ } |
+ |
// By now the utils object is useless and can be removed. |
native_context()->set_natives_utils_object( |
isolate->heap()->undefined_value()); |