OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/base/utils/random-number-generator.h" | 9 #include "src/base/utils/random-number-generator.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 const char* name, | 234 const char* name, |
235 ElementsKind elements_kind); | 235 ElementsKind elements_kind); |
236 bool InstallNatives(ContextType context_type); | 236 bool InstallNatives(ContextType context_type); |
237 | 237 |
238 void InstallTypedArray(const char* name, ElementsKind elements_kind, | 238 void InstallTypedArray(const char* name, ElementsKind elements_kind, |
239 Handle<JSFunction>* fun); | 239 Handle<JSFunction>* fun); |
240 bool InstallExperimentalNatives(); | 240 bool InstallExperimentalNatives(); |
241 bool InstallExtraNatives(); | 241 bool InstallExtraNatives(); |
242 void InstallBuiltinFunctionIds(); | 242 void InstallBuiltinFunctionIds(); |
243 void InstallExperimentalBuiltinFunctionIds(); | 243 void InstallExperimentalBuiltinFunctionIds(); |
244 void InstallJSFunctionResultCaches(); | |
245 void InitializeNormalizedMapCaches(); | 244 void InitializeNormalizedMapCaches(); |
246 | 245 |
247 enum ExtensionTraversalState { | 246 enum ExtensionTraversalState { |
248 UNVISITED, VISITED, INSTALLED | 247 UNVISITED, VISITED, INSTALLED |
249 }; | 248 }; |
250 | 249 |
251 class ExtensionStates { | 250 class ExtensionStates { |
252 public: | 251 public: |
253 ExtensionStates(); | 252 ExtensionStates(); |
254 ExtensionTraversalState get_state(RegisteredExtension* extension); | 253 ExtensionTraversalState get_state(RegisteredExtension* extension); |
(...skipping 2436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2691 ResolveBuiltinIdHolder(native_context(), builtin.holder_expr); | 2690 ResolveBuiltinIdHolder(native_context(), builtin.holder_expr); |
2692 InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id); | 2691 InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id); |
2693 } | 2692 } |
2694 } | 2693 } |
2695 } | 2694 } |
2696 | 2695 |
2697 | 2696 |
2698 #undef INSTALL_BUILTIN_ID | 2697 #undef INSTALL_BUILTIN_ID |
2699 | 2698 |
2700 | 2699 |
2701 // Do not forget to update macros.py with named constant | |
2702 // of cache id. | |
2703 #define JSFUNCTION_RESULT_CACHE_LIST(F) \ | |
2704 F(16, native_context()->regexp_function()) | |
2705 | |
2706 | |
2707 static FixedArray* CreateCache(int size, Handle<JSFunction> factory_function) { | |
2708 Factory* factory = factory_function->GetIsolate()->factory(); | |
2709 // Caches are supposed to live for a long time, allocate in old space. | |
2710 int array_size = JSFunctionResultCache::kEntriesIndex + 2 * size; | |
2711 // Cannot use cast as object is not fully initialized yet. | |
2712 JSFunctionResultCache* cache = reinterpret_cast<JSFunctionResultCache*>( | |
2713 *factory->NewFixedArrayWithHoles(array_size, TENURED)); | |
2714 cache->set(JSFunctionResultCache::kFactoryIndex, *factory_function); | |
2715 cache->MakeZeroSize(); | |
2716 return cache; | |
2717 } | |
2718 | |
2719 | |
2720 void Genesis::InstallJSFunctionResultCaches() { | |
2721 const int kNumberOfCaches = 0 + | |
2722 #define F(size, func) + 1 | |
2723 JSFUNCTION_RESULT_CACHE_LIST(F) | |
2724 #undef F | |
2725 ; | |
2726 | |
2727 Handle<FixedArray> caches = | |
2728 factory()->NewFixedArray(kNumberOfCaches, TENURED); | |
2729 | |
2730 int index = 0; | |
2731 | |
2732 #define F(size, func) do { \ | |
2733 FixedArray* cache = CreateCache((size), Handle<JSFunction>(func)); \ | |
2734 caches->set(index++, cache); \ | |
2735 } while (false) | |
2736 | |
2737 JSFUNCTION_RESULT_CACHE_LIST(F); | |
2738 | |
2739 #undef F | |
2740 | |
2741 native_context()->set_jsfunction_result_caches(*caches); | |
2742 } | |
2743 | |
2744 | |
2745 void Genesis::InitializeNormalizedMapCaches() { | 2700 void Genesis::InitializeNormalizedMapCaches() { |
2746 Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate()); | 2701 Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate()); |
2747 native_context()->set_normalized_map_cache(*cache); | 2702 native_context()->set_normalized_map_cache(*cache); |
2748 } | 2703 } |
2749 | 2704 |
2750 | 2705 |
2751 bool Bootstrapper::InstallExtensions(Handle<Context> native_context, | 2706 bool Bootstrapper::InstallExtensions(Handle<Context> native_context, |
2752 v8::ExtensionConfiguration* extensions) { | 2707 v8::ExtensionConfiguration* extensions) { |
2753 BootstrapperActive active(this); | 2708 BootstrapperActive active(this); |
2754 SaveContext saved_context(isolate_); | 2709 SaveContext saved_context(isolate_); |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3245 } else { | 3200 } else { |
3246 // We get here if there was no context snapshot. | 3201 // We get here if there was no context snapshot. |
3247 CreateRoots(); | 3202 CreateRoots(); |
3248 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); | 3203 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); |
3249 CreateStrictModeFunctionMaps(empty_function); | 3204 CreateStrictModeFunctionMaps(empty_function); |
3250 CreateStrongModeFunctionMaps(empty_function); | 3205 CreateStrongModeFunctionMaps(empty_function); |
3251 Handle<GlobalObject> global_object = | 3206 Handle<GlobalObject> global_object = |
3252 CreateNewGlobals(global_proxy_template, global_proxy); | 3207 CreateNewGlobals(global_proxy_template, global_proxy); |
3253 HookUpGlobalProxy(global_object, global_proxy); | 3208 HookUpGlobalProxy(global_object, global_proxy); |
3254 InitializeGlobal(global_object, empty_function, context_type); | 3209 InitializeGlobal(global_object, empty_function, context_type); |
3255 InstallJSFunctionResultCaches(); | |
3256 InitializeNormalizedMapCaches(); | 3210 InitializeNormalizedMapCaches(); |
3257 | 3211 |
3258 if (!InstallNatives(context_type)) return; | 3212 if (!InstallNatives(context_type)) return; |
3259 | 3213 |
3260 MakeFunctionInstancePrototypeWritable(); | 3214 MakeFunctionInstancePrototypeWritable(); |
3261 | 3215 |
3262 if (context_type == FULL_CONTEXT) { | 3216 if (context_type == FULL_CONTEXT) { |
3263 if (!ConfigureGlobalObjects(global_proxy_template)) return; | 3217 if (!ConfigureGlobalObjects(global_proxy_template)) return; |
3264 } | 3218 } |
3265 isolate->counters()->contexts_created_from_scratch()->Increment(); | 3219 isolate->counters()->contexts_created_from_scratch()->Increment(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3307 } | 3261 } |
3308 | 3262 |
3309 | 3263 |
3310 // Called when the top-level V8 mutex is destroyed. | 3264 // Called when the top-level V8 mutex is destroyed. |
3311 void Bootstrapper::FreeThreadResources() { | 3265 void Bootstrapper::FreeThreadResources() { |
3312 DCHECK(!IsActive()); | 3266 DCHECK(!IsActive()); |
3313 } | 3267 } |
3314 | 3268 |
3315 } // namespace internal | 3269 } // namespace internal |
3316 } // namespace v8 | 3270 } // namespace v8 |
OLD | NEW |