| Index: src/bootstrapper.cc
|
| diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
|
| index 9eca9e8dddd2a057b446046875468a9503d1f1be..9512a9c0d1eee1a4766493a3b8d2840890363376 100644
|
| --- a/src/bootstrapper.cc
|
| +++ b/src/bootstrapper.cc
|
| @@ -42,6 +42,12 @@ FixedArray* GetCache<ExperimentalNatives>(Heap* heap) {
|
| }
|
|
|
|
|
| +template <>
|
| +FixedArray* GetCache<ExtraNatives>(Heap* heap) {
|
| + return heap->extra_natives_source_cache();
|
| +}
|
| +
|
| +
|
| template <class Source>
|
| Handle<String> Bootstrapper::SourceLookup(int index) {
|
| DCHECK(0 <= index && index < Source::GetBuiltinsCount());
|
| @@ -67,6 +73,7 @@ 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<ExtraNatives>(int index);
|
|
|
|
|
| void Bootstrapper::Initialize(bool create_heap_objects) {
|
| @@ -134,6 +141,7 @@ void DeleteNativeSources(Object* maybe_array) {
|
| void Bootstrapper::TearDown() {
|
| DeleteNativeSources(isolate_->heap()->natives_source_cache());
|
| DeleteNativeSources(isolate_->heap()->experimental_natives_source_cache());
|
| + DeleteNativeSources(isolate_->heap()->extra_natives_source_cache());
|
| extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical
|
| }
|
|
|
| @@ -220,6 +228,7 @@ class Genesis BASE_EMBEDDED {
|
| Handle<JSFunction>* fun,
|
| Handle<Map>* external_map);
|
| bool InstallExperimentalNatives();
|
| + bool InstallExtraNatives();
|
| void InstallBuiltinFunctionIds();
|
| void InstallJSFunctionResultCaches();
|
| void InitializeNormalizedMapCaches();
|
| @@ -300,6 +309,7 @@ class Genesis BASE_EMBEDDED {
|
|
|
| static bool CompileBuiltin(Isolate* isolate, int index);
|
| static bool CompileExperimentalBuiltin(Isolate* isolate, int index);
|
| + static bool CompileExtraBuiltin(Isolate* isolate, int index);
|
| static bool CompileNative(Isolate* isolate,
|
| Vector<const char> name,
|
| Handle<String> source);
|
| @@ -1447,6 +1457,14 @@ bool Genesis::CompileExperimentalBuiltin(Isolate* isolate, int index) {
|
| }
|
|
|
|
|
| +bool Genesis::CompileExtraBuiltin(Isolate* isolate, int index) {
|
| + Vector<const char> name = ExtraNatives::GetScriptName(index);
|
| + Handle<String> source_code =
|
| + isolate->bootstrapper()->SourceLookup<ExtraNatives>(index);
|
| + return CompileNative(isolate, name, source_code);
|
| +}
|
| +
|
| +
|
| bool Genesis::CompileNative(Isolate* isolate,
|
| Vector<const char> name,
|
| Handle<String> source) {
|
| @@ -2356,6 +2374,16 @@ bool Genesis::InstallExperimentalNatives() {
|
| }
|
|
|
|
|
| +bool Genesis::InstallExtraNatives() {
|
| + for (int i = ExtraNatives::GetDebuggerCount();
|
| + i < ExtraNatives::GetBuiltinsCount(); i++) {
|
| + if (!CompileExtraBuiltin(isolate(), i)) return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +
|
| static void InstallBuiltinFunctionId(Handle<JSObject> holder,
|
| const char* function_name,
|
| BuiltinFunctionId id) {
|
| @@ -2929,12 +2957,13 @@ Genesis::Genesis(Isolate* isolate,
|
| isolate->counters()->contexts_created_from_scratch()->Increment();
|
| }
|
|
|
| - // Install experimental natives. Do not include them into the snapshot as we
|
| - // should be able to turn them off at runtime. Re-installing them after
|
| - // they have already been deserialized would also fail.
|
| + // Install experimental and extra natives. Do not include them into the
|
| + // snapshot as we should be able to turn them off at runtime. Re-installing
|
| + // them after they have already been deserialized would also fail.
|
| if (!isolate->serializer_enabled()) {
|
| InitializeExperimentalGlobal();
|
| if (!InstallExperimentalNatives()) return;
|
| + if (!InstallExtraNatives()) return;
|
| }
|
|
|
| // The serializer cannot serialize typed arrays. Reset those typed arrays
|
|
|