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/ieee754.h" | 9 #include "src/base/ieee754.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 DCHECK(source_code->is_short()); | 49 DCHECK(source_code->is_short()); |
50 Source::GetSourceCache(heap)->set(index, *source_code); | 50 Source::GetSourceCache(heap)->set(index, *source_code); |
51 } | 51 } |
52 Handle<Object> cached_source(Source::GetSourceCache(heap)->get(index), | 52 Handle<Object> cached_source(Source::GetSourceCache(heap)->get(index), |
53 isolate_); | 53 isolate_); |
54 return Handle<String>::cast(cached_source); | 54 return Handle<String>::cast(cached_source); |
55 } | 55 } |
56 | 56 |
57 | 57 |
58 template Handle<String> Bootstrapper::SourceLookup<Natives>(int index); | 58 template Handle<String> Bootstrapper::SourceLookup<Natives>(int index); |
59 template Handle<String> Bootstrapper::SourceLookup<ExperimentalNatives>( | |
60 int index); | |
61 template Handle<String> Bootstrapper::SourceLookup<ExperimentalExtraNatives>( | 59 template Handle<String> Bootstrapper::SourceLookup<ExperimentalExtraNatives>( |
62 int index); | 60 int index); |
63 template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index); | 61 template Handle<String> Bootstrapper::SourceLookup<ExtraNatives>(int index); |
64 | 62 |
65 | 63 |
66 void Bootstrapper::Initialize(bool create_heap_objects) { | 64 void Bootstrapper::Initialize(bool create_heap_objects) { |
67 extensions_cache_.Initialize(isolate_, create_heap_objects); | 65 extensions_cache_.Initialize(isolate_, create_heap_objects); |
68 } | 66 } |
69 | 67 |
70 | 68 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 ExternalOneByteString::cast(natives_source)->resource()); | 123 ExternalOneByteString::cast(natives_source)->resource()); |
126 delete resource; | 124 delete resource; |
127 } | 125 } |
128 } | 126 } |
129 } | 127 } |
130 } | 128 } |
131 | 129 |
132 | 130 |
133 void Bootstrapper::TearDown() { | 131 void Bootstrapper::TearDown() { |
134 DeleteNativeSources(Natives::GetSourceCache(isolate_->heap())); | 132 DeleteNativeSources(Natives::GetSourceCache(isolate_->heap())); |
135 DeleteNativeSources(ExperimentalNatives::GetSourceCache(isolate_->heap())); | |
136 DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap())); | 133 DeleteNativeSources(ExtraNatives::GetSourceCache(isolate_->heap())); |
137 DeleteNativeSources( | 134 DeleteNativeSources( |
138 ExperimentalExtraNatives::GetSourceCache(isolate_->heap())); | 135 ExperimentalExtraNatives::GetSourceCache(isolate_->heap())); |
139 | 136 |
140 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical | 137 extensions_cache_.Initialize(isolate_, false); // Yes, symmetrical |
141 } | 138 } |
142 | 139 |
143 | 140 |
144 class Genesis BASE_EMBEDDED { | 141 class Genesis BASE_EMBEDDED { |
145 public: | 142 public: |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 Handle<JSFunction> InstallArrayBuffer(Handle<JSObject> target, | 219 Handle<JSFunction> InstallArrayBuffer(Handle<JSObject> target, |
223 const char* name, Builtins::Name call, | 220 const char* name, Builtins::Name call, |
224 BuiltinFunctionId id); | 221 BuiltinFunctionId id); |
225 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, | 222 Handle<JSFunction> InstallInternalArray(Handle<JSObject> target, |
226 const char* name, | 223 const char* name, |
227 ElementsKind elements_kind); | 224 ElementsKind elements_kind); |
228 bool InstallNatives(GlobalContextType context_type); | 225 bool InstallNatives(GlobalContextType context_type); |
229 | 226 |
230 void InstallTypedArray(const char* name, ElementsKind elements_kind, | 227 void InstallTypedArray(const char* name, ElementsKind elements_kind, |
231 Handle<JSFunction>* fun); | 228 Handle<JSFunction>* fun); |
232 bool InstallExperimentalNatives(); | |
233 bool InstallExtraNatives(); | 229 bool InstallExtraNatives(); |
234 bool InstallExperimentalExtraNatives(); | 230 bool InstallExperimentalExtraNatives(); |
235 bool InstallDebuggerNatives(); | 231 bool InstallDebuggerNatives(); |
236 void InstallBuiltinFunctionIds(); | 232 void InstallBuiltinFunctionIds(); |
237 void InstallExperimentalBuiltinFunctionIds(); | 233 void InstallExperimentalBuiltinFunctionIds(); |
238 void InitializeNormalizedMapCaches(); | 234 void InitializeNormalizedMapCaches(); |
239 | 235 |
240 enum ExtensionTraversalState { | 236 enum ExtensionTraversalState { |
241 UNVISITED, VISITED, INSTALLED | 237 UNVISITED, VISITED, INSTALLED |
242 }; | 238 }; |
(...skipping 2699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2942 Handle<Object> global = isolate->global_object(); | 2938 Handle<Object> global = isolate->global_object(); |
2943 Handle<Object> utils = isolate->natives_utils_object(); | 2939 Handle<Object> utils = isolate->natives_utils_object(); |
2944 Handle<Object> extras_utils = isolate->extras_utils_object(); | 2940 Handle<Object> extras_utils = isolate->extras_utils_object(); |
2945 Handle<Object> args[] = {global, utils, extras_utils}; | 2941 Handle<Object> args[] = {global, utils, extras_utils}; |
2946 | 2942 |
2947 return Bootstrapper::CompileNative(isolate, name, source_code, | 2943 return Bootstrapper::CompileNative(isolate, name, source_code, |
2948 arraysize(args), args, NATIVES_CODE); | 2944 arraysize(args), args, NATIVES_CODE); |
2949 } | 2945 } |
2950 | 2946 |
2951 | 2947 |
2952 bool Bootstrapper::CompileExperimentalBuiltin(Isolate* isolate, int index) { | |
2953 HandleScope scope(isolate); | |
2954 Vector<const char> name = ExperimentalNatives::GetScriptName(index); | |
2955 Handle<String> source_code = | |
2956 isolate->bootstrapper()->SourceLookup<ExperimentalNatives>(index); | |
2957 Handle<Object> global = isolate->global_object(); | |
2958 Handle<Object> utils = isolate->natives_utils_object(); | |
2959 Handle<Object> args[] = {global, utils}; | |
2960 return Bootstrapper::CompileNative(isolate, name, source_code, | |
2961 arraysize(args), args, NATIVES_CODE); | |
2962 } | |
2963 | |
2964 | |
2965 bool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) { | 2948 bool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) { |
2966 HandleScope scope(isolate); | 2949 HandleScope scope(isolate); |
2967 Vector<const char> name = ExtraNatives::GetScriptName(index); | 2950 Vector<const char> name = ExtraNatives::GetScriptName(index); |
2968 Handle<String> source_code = | 2951 Handle<String> source_code = |
2969 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index); | 2952 isolate->bootstrapper()->SourceLookup<ExtraNatives>(index); |
2970 Handle<Object> global = isolate->global_object(); | 2953 Handle<Object> global = isolate->global_object(); |
2971 Handle<Object> binding = isolate->extras_binding_object(); | 2954 Handle<Object> binding = isolate->extras_binding_object(); |
2972 Handle<Object> extras_utils = isolate->extras_utils_object(); | 2955 Handle<Object> extras_utils = isolate->extras_utils_object(); |
2973 Handle<Object> args[] = {global, binding, extras_utils}; | 2956 Handle<Object> args[] = {global, binding, extras_utils}; |
2974 return Bootstrapper::CompileNative(isolate, name, source_code, | 2957 return Bootstrapper::CompileNative(isolate, name, source_code, |
(...skipping 1236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4211 Handle<Map> map(native_context()->strict_arguments_map()); | 4194 Handle<Map> map(native_context()->strict_arguments_map()); |
4212 Map::EnsureDescriptorSlack(map, 1); | 4195 Map::EnsureDescriptorSlack(map, 1); |
4213 map->AppendDescriptor(&d); | 4196 map->AppendDescriptor(&d); |
4214 } | 4197 } |
4215 } | 4198 } |
4216 | 4199 |
4217 return true; | 4200 return true; |
4218 } | 4201 } |
4219 | 4202 |
4220 | 4203 |
4221 bool Genesis::InstallExperimentalNatives() { | |
4222 static const char* harmony_tailcalls_natives[] = {nullptr}; | |
4223 static const char* harmony_sharedarraybuffer_natives[] = {nullptr}; | |
4224 static const char* harmony_do_expressions_natives[] = {nullptr}; | |
4225 static const char* harmony_regexp_lookbehind_natives[] = {nullptr}; | |
4226 static const char* harmony_regexp_named_captures_natives[] = {nullptr}; | |
4227 static const char* harmony_regexp_property_natives[] = {nullptr}; | |
4228 static const char* harmony_function_sent_natives[] = {nullptr}; | |
4229 static const char* harmony_array_prototype_values_natives[] = {nullptr}; | |
4230 #ifdef V8_I18N_SUPPORT | |
4231 static const char* icu_case_mapping_natives[] = {nullptr}; | |
4232 static const char* datetime_format_to_parts_natives[] = {nullptr}; | |
4233 #endif | |
4234 static const char* harmony_restrictive_generators_natives[] = {nullptr}; | |
4235 static const char* harmony_trailing_commas_natives[] = {nullptr}; | |
4236 static const char* harmony_function_tostring_natives[] = {nullptr}; | |
4237 static const char* harmony_class_fields_natives[] = {nullptr}; | |
4238 static const char* harmony_object_rest_spread_natives[] = {nullptr}; | |
4239 static const char* harmony_async_iteration_natives[] = {nullptr}; | |
4240 static const char* harmony_dynamic_import_natives[] = {nullptr}; | |
4241 static const char* harmony_promise_finally_natives[] = {nullptr}; | |
4242 | |
4243 for (int i = ExperimentalNatives::GetDebuggerCount(); | |
4244 i < ExperimentalNatives::GetBuiltinsCount(); i++) { | |
4245 #define INSTALL_EXPERIMENTAL_NATIVES(id, desc) \ | |
4246 if (FLAG_##id) { \ | |
4247 for (size_t j = 0; id##_natives[j] != NULL; j++) { \ | |
4248 Vector<const char> script_name = ExperimentalNatives::GetScriptName(i); \ | |
4249 if (strncmp(script_name.start(), id##_natives[j], \ | |
4250 script_name.length()) == 0) { \ | |
4251 if (!Bootstrapper::CompileExperimentalBuiltin(isolate(), i)) { \ | |
4252 return false; \ | |
4253 } \ | |
4254 } \ | |
4255 } \ | |
4256 } | |
4257 HARMONY_INPROGRESS(INSTALL_EXPERIMENTAL_NATIVES); | |
4258 HARMONY_STAGED(INSTALL_EXPERIMENTAL_NATIVES); | |
4259 HARMONY_SHIPPING(INSTALL_EXPERIMENTAL_NATIVES); | |
4260 #undef INSTALL_EXPERIMENTAL_NATIVES | |
4261 } | |
4262 | |
4263 if (!CallUtilsFunction(isolate(), "PostExperimentals")) return false; | |
4264 | |
4265 InstallExperimentalBuiltinFunctionIds(); | |
4266 return true; | |
4267 } | |
4268 | |
4269 | |
4270 bool Genesis::InstallExtraNatives() { | 4204 bool Genesis::InstallExtraNatives() { |
4271 HandleScope scope(isolate()); | 4205 HandleScope scope(isolate()); |
4272 | 4206 |
4273 Handle<JSObject> extras_binding = | 4207 Handle<JSObject> extras_binding = |
4274 factory()->NewJSObject(isolate()->object_function()); | 4208 factory()->NewJSObject(isolate()->object_function()); |
4275 native_context()->set_extras_binding_object(*extras_binding); | 4209 native_context()->set_extras_binding_object(*extras_binding); |
4276 | 4210 |
4277 for (int i = ExtraNatives::GetDebuggerCount(); | 4211 for (int i = ExtraNatives::GetDebuggerCount(); |
4278 i < ExtraNatives::GetBuiltinsCount(); i++) { | 4212 i < ExtraNatives::GetBuiltinsCount(); i++) { |
4279 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false; | 4213 if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4329 const BuiltinFunctionIds builtins[] = { | 4263 const BuiltinFunctionIds builtins[] = { |
4330 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)}; | 4264 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)}; |
4331 | 4265 |
4332 for (const BuiltinFunctionIds& builtin : builtins) { | 4266 for (const BuiltinFunctionIds& builtin : builtins) { |
4333 Handle<JSObject> holder = | 4267 Handle<JSObject> holder = |
4334 ResolveBuiltinIdHolder(native_context(), builtin.holder_expr); | 4268 ResolveBuiltinIdHolder(native_context(), builtin.holder_expr); |
4335 InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id); | 4269 InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id); |
4336 } | 4270 } |
4337 } | 4271 } |
4338 | 4272 |
4339 | |
4340 void Genesis::InstallExperimentalBuiltinFunctionIds() { | |
4341 if (FLAG_harmony_sharedarraybuffer) { | |
4342 struct BuiltinFunctionIds { | |
4343 const char* holder_expr; | |
4344 const char* fun_name; | |
4345 BuiltinFunctionId id; | |
4346 }; | |
4347 | |
4348 const BuiltinFunctionIds atomic_builtins[] = { | |
4349 ATOMIC_FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)}; | |
4350 | |
4351 for (const BuiltinFunctionIds& builtin : atomic_builtins) { | |
4352 Handle<JSObject> holder = | |
4353 ResolveBuiltinIdHolder(native_context(), builtin.holder_expr); | |
4354 InstallBuiltinFunctionId(holder, builtin.fun_name, builtin.id); | |
4355 } | |
4356 } | |
4357 } | |
4358 | |
4359 #undef INSTALL_BUILTIN_ID | 4273 #undef INSTALL_BUILTIN_ID |
4360 | 4274 |
4361 | 4275 |
4362 void Genesis::InitializeNormalizedMapCaches() { | 4276 void Genesis::InitializeNormalizedMapCaches() { |
4363 Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate()); | 4277 Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate()); |
4364 native_context()->set_normalized_map_cache(*cache); | 4278 native_context()->set_normalized_map_cache(*cache); |
4365 } | 4279 } |
4366 | 4280 |
4367 | 4281 |
4368 bool Bootstrapper::InstallExtensions(Handle<Context> native_context, | 4282 bool Bootstrapper::InstallExtensions(Handle<Context> native_context, |
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4858 | 4772 |
4859 isolate->counters()->contexts_created_from_scratch()->Increment(); | 4773 isolate->counters()->contexts_created_from_scratch()->Increment(); |
4860 } | 4774 } |
4861 | 4775 |
4862 // Install experimental natives. Do not include them into the | 4776 // Install experimental natives. Do not include them into the |
4863 // snapshot as we should be able to turn them off at runtime. Re-installing | 4777 // snapshot as we should be able to turn them off at runtime. Re-installing |
4864 // them after they have already been deserialized would also fail. | 4778 // them after they have already been deserialized would also fail. |
4865 if (context_type == FULL_CONTEXT) { | 4779 if (context_type == FULL_CONTEXT) { |
4866 if (!isolate->serializer_enabled()) { | 4780 if (!isolate->serializer_enabled()) { |
4867 InitializeExperimentalGlobal(); | 4781 InitializeExperimentalGlobal(); |
4868 if (!InstallExperimentalNatives()) return; | |
4869 | 4782 |
4870 if (FLAG_experimental_extras) { | 4783 if (FLAG_experimental_extras) { |
4871 if (!InstallExperimentalExtraNatives()) return; | 4784 if (!InstallExperimentalExtraNatives()) return; |
4872 } | 4785 } |
4873 | 4786 |
4874 // Store String.prototype's map again in case it has been changed by | 4787 // Store String.prototype's map again in case it has been changed by |
4875 // experimental natives. | 4788 // experimental natives. |
4876 Handle<JSFunction> string_function(native_context()->string_function()); | 4789 Handle<JSFunction> string_function(native_context()->string_function()); |
4877 JSObject* string_function_prototype = | 4790 JSObject* string_function_prototype = |
4878 JSObject::cast(string_function->initial_map()->prototype()); | 4791 JSObject::cast(string_function->initial_map()->prototype()); |
4879 DCHECK(string_function_prototype->HasFastProperties()); | 4792 DCHECK(string_function_prototype->HasFastProperties()); |
4880 native_context()->set_string_function_prototype_map( | 4793 native_context()->set_string_function_prototype_map( |
4881 string_function_prototype->map()); | 4794 string_function_prototype->map()); |
4882 } | 4795 } |
4883 // The serializer cannot serialize typed arrays. Reset those typed arrays | |
4884 // for each new context. | |
4885 } else if (context_type == DEBUG_CONTEXT) { | 4796 } else if (context_type == DEBUG_CONTEXT) { |
4886 DCHECK(!isolate->serializer_enabled()); | 4797 DCHECK(!isolate->serializer_enabled()); |
4887 InitializeExperimentalGlobal(); | 4798 InitializeExperimentalGlobal(); |
4888 if (!InstallDebuggerNatives()) return; | 4799 if (!InstallDebuggerNatives()) return; |
4889 } | 4800 } |
4890 | 4801 |
4891 ConfigureUtilsObject(context_type); | 4802 ConfigureUtilsObject(context_type); |
4892 | 4803 |
4893 // Check that the script context table is empty except for the 'this' binding. | 4804 // Check that the script context table is empty except for the 'this' binding. |
4894 // We do not need script contexts for native scripts. | 4805 // We do not need script contexts for native scripts. |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4987 } | 4898 } |
4988 | 4899 |
4989 | 4900 |
4990 // Called when the top-level V8 mutex is destroyed. | 4901 // Called when the top-level V8 mutex is destroyed. |
4991 void Bootstrapper::FreeThreadResources() { | 4902 void Bootstrapper::FreeThreadResources() { |
4992 DCHECK(!IsActive()); | 4903 DCHECK(!IsActive()); |
4993 } | 4904 } |
4994 | 4905 |
4995 } // namespace internal | 4906 } // namespace internal |
4996 } // namespace v8 | 4907 } // namespace v8 |
OLD | NEW |