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/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/extensions/externalize-string-extension.h" | 10 #include "src/extensions/externalize-string-extension.h" |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 // Creates some basic objects. Used for creating a context from scratch. | 150 // Creates some basic objects. Used for creating a context from scratch. |
151 void CreateRoots(); | 151 void CreateRoots(); |
152 // Creates the empty function. Used for creating a context from scratch. | 152 // Creates the empty function. Used for creating a context from scratch. |
153 Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); | 153 Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); |
154 // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 | 154 // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 |
155 Handle<JSFunction> GetRestrictedFunctionPropertiesThrower(); | 155 Handle<JSFunction> GetRestrictedFunctionPropertiesThrower(); |
156 Handle<JSFunction> GetStrictArgumentsPoisonFunction(); | 156 Handle<JSFunction> GetStrictArgumentsPoisonFunction(); |
157 Handle<JSFunction> GetThrowTypeErrorIntrinsic(Builtins::Name builtin_name); | 157 Handle<JSFunction> GetThrowTypeErrorIntrinsic(Builtins::Name builtin_name); |
158 | 158 |
159 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); | 159 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); |
160 void CreateIteratorMaps(); | 160 void CreateIteratorMaps(Handle<JSFunction> empty); |
161 void CreateJSProxyMaps(); | 161 void CreateJSProxyMaps(); |
162 | 162 |
163 // Make the "arguments" and "caller" properties throw a TypeError on access. | 163 // Make the "arguments" and "caller" properties throw a TypeError on access. |
164 void AddRestrictedFunctionProperties(Handle<Map> map); | 164 void AddRestrictedFunctionProperties(Handle<Map> map); |
165 | 165 |
166 // Creates the global objects using the global proxy and the template passed | 166 // Creates the global objects using the global proxy and the template passed |
167 // in through the API. We call this regardless of whether we are building a | 167 // in through the API. We call this regardless of whether we are building a |
168 // context from scratch or using a deserialized one from the partial snapshot | 168 // context from scratch or using a deserialized one from the partial snapshot |
169 // but in the latter case we don't use the objects it produces directly, as | 169 // but in the latter case we don't use the objects it produces directly, as |
170 // we have to used the deserialized ones that are linked together with the | 170 // we have to used the deserialized ones that are linked together with the |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 Factory* factory = env->GetIsolate()->factory(); | 347 Factory* factory = env->GetIsolate()->factory(); |
348 Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy())); | 348 Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy())); |
349 global_proxy->set_native_context(*factory->null_value()); | 349 global_proxy->set_native_context(*factory->null_value()); |
350 SetObjectPrototype(global_proxy, factory->null_value()); | 350 SetObjectPrototype(global_proxy, factory->null_value()); |
351 global_proxy->map()->SetConstructor(*factory->null_value()); | 351 global_proxy->map()->SetConstructor(*factory->null_value()); |
352 if (FLAG_track_detached_contexts) { | 352 if (FLAG_track_detached_contexts) { |
353 env->GetIsolate()->AddDetachedContext(env); | 353 env->GetIsolate()->AddDetachedContext(env); |
354 } | 354 } |
355 } | 355 } |
356 | 356 |
357 | |
358 namespace { | 357 namespace { |
359 | 358 |
360 void InstallFunction(Handle<JSObject> target, Handle<Name> property_name, | 359 void InstallFunction(Handle<JSObject> target, Handle<Name> property_name, |
361 Handle<JSFunction> function, Handle<String> function_name, | 360 Handle<JSFunction> function, Handle<String> function_name, |
362 PropertyAttributes attributes = DONT_ENUM) { | 361 PropertyAttributes attributes = DONT_ENUM) { |
363 JSObject::AddProperty(target, property_name, function, attributes); | 362 JSObject::AddProperty(target, property_name, function, attributes); |
364 if (target->IsJSGlobalObject()) { | 363 if (target->IsJSGlobalObject()) { |
365 function->shared()->set_instance_class_name(*function_name); | 364 function->shared()->set_instance_class_name(*function_name); |
366 } | 365 } |
367 function->shared()->set_native(true); | 366 function->shared()->set_native(true); |
368 } | 367 } |
369 | 368 |
370 | 369 void InstallFunction(Handle<JSObject> target, Handle<JSFunction> function, |
371 static void InstallFunction(Handle<JSObject> target, | 370 Handle<Name> name, |
372 Handle<JSFunction> function, Handle<Name> name, | 371 PropertyAttributes attributes = DONT_ENUM) { |
373 PropertyAttributes attributes = DONT_ENUM) { | |
374 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); | 372 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); |
375 InstallFunction(target, name, function, name_string, attributes); | 373 InstallFunction(target, name, function, name_string, attributes); |
376 } | 374 } |
377 | 375 |
378 | 376 Handle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name, |
379 static Handle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name, | 377 InstanceType type, int instance_size, |
380 InstanceType type, int instance_size, | 378 MaybeHandle<JSObject> maybe_prototype, |
381 MaybeHandle<JSObject> maybe_prototype, | 379 Builtins::Name call, |
382 Builtins::Name call, | 380 bool strict_function_map = false) { |
383 bool strict_function_map = false) { | |
384 Factory* factory = isolate->factory(); | 381 Factory* factory = isolate->factory(); |
385 Handle<Code> call_code(isolate->builtins()->builtin(call)); | 382 Handle<Code> call_code(isolate->builtins()->builtin(call)); |
386 Handle<JSObject> prototype; | 383 Handle<JSObject> prototype; |
387 static const bool kReadOnlyPrototype = false; | 384 static const bool kReadOnlyPrototype = false; |
388 static const bool kInstallConstructor = false; | 385 static const bool kInstallConstructor = false; |
389 return maybe_prototype.ToHandle(&prototype) | 386 return maybe_prototype.ToHandle(&prototype) |
390 ? factory->NewFunction(name, call_code, prototype, type, | 387 ? factory->NewFunction(name, call_code, prototype, type, |
391 instance_size, kReadOnlyPrototype, | 388 instance_size, kReadOnlyPrototype, |
392 kInstallConstructor, strict_function_map) | 389 kInstallConstructor, strict_function_map) |
393 : factory->NewFunctionWithoutPrototype(name, call_code, | 390 : factory->NewFunctionWithoutPrototype(name, call_code, |
394 strict_function_map); | 391 strict_function_map); |
395 } | 392 } |
396 | 393 |
397 | |
398 Handle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name, | 394 Handle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name, |
399 InstanceType type, int instance_size, | 395 InstanceType type, int instance_size, |
400 MaybeHandle<JSObject> maybe_prototype, | 396 MaybeHandle<JSObject> maybe_prototype, |
401 Builtins::Name call, | 397 Builtins::Name call, |
402 PropertyAttributes attributes, | 398 PropertyAttributes attributes, |
403 bool strict_function_map = false) { | 399 bool strict_function_map = false) { |
404 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); | 400 Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked(); |
405 Handle<JSFunction> function = | 401 Handle<JSFunction> function = |
406 CreateFunction(target->GetIsolate(), name_string, type, instance_size, | 402 CreateFunction(target->GetIsolate(), name_string, type, instance_size, |
407 maybe_prototype, call, strict_function_map); | 403 maybe_prototype, call, strict_function_map); |
408 InstallFunction(target, name, function, name_string, attributes); | 404 InstallFunction(target, name, function, name_string, attributes); |
409 return function; | 405 return function; |
410 } | 406 } |
411 | 407 |
412 | |
413 Handle<JSFunction> InstallFunction(Handle<JSObject> target, const char* name, | 408 Handle<JSFunction> InstallFunction(Handle<JSObject> target, const char* name, |
414 InstanceType type, int instance_size, | 409 InstanceType type, int instance_size, |
415 MaybeHandle<JSObject> maybe_prototype, | 410 MaybeHandle<JSObject> maybe_prototype, |
416 Builtins::Name call, | 411 Builtins::Name call, |
417 bool strict_function_map = false) { | 412 bool strict_function_map = false) { |
418 Factory* const factory = target->GetIsolate()->factory(); | 413 Factory* const factory = target->GetIsolate()->factory(); |
419 PropertyAttributes attributes = DONT_ENUM; | 414 PropertyAttributes attributes = DONT_ENUM; |
420 return InstallFunction(target, factory->InternalizeUtf8String(name), type, | 415 return InstallFunction(target, factory->InternalizeUtf8String(name), type, |
421 instance_size, maybe_prototype, call, attributes, | 416 instance_size, maybe_prototype, call, attributes, |
422 strict_function_map); | 417 strict_function_map); |
423 } | 418 } |
424 | 419 |
| 420 Handle<JSFunction> SimpleCreateFunction(Isolate* isolate, Handle<String> name, |
| 421 Builtins::Name call, int len, |
| 422 bool adapt) { |
| 423 Handle<JSFunction> fun = |
| 424 CreateFunction(isolate, name, JS_OBJECT_TYPE, JSObject::kHeaderSize, |
| 425 MaybeHandle<JSObject>(), call); |
| 426 if (adapt) { |
| 427 fun->shared()->set_internal_formal_parameter_count(len); |
| 428 } else { |
| 429 fun->shared()->DontAdaptArguments(); |
| 430 } |
| 431 fun->shared()->set_length(len); |
| 432 return fun; |
| 433 } |
| 434 |
| 435 Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base, |
| 436 Handle<String> name, |
| 437 Builtins::Name call, int len, |
| 438 bool adapt) { |
| 439 Handle<JSFunction> fun = |
| 440 SimpleCreateFunction(base->GetIsolate(), name, call, len, adapt); |
| 441 InstallFunction(base, fun, name, DONT_ENUM); |
| 442 return fun; |
| 443 } |
| 444 |
| 445 Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base, |
| 446 const char* name, Builtins::Name call, |
| 447 int len, bool adapt) { |
| 448 Factory* const factory = base->GetIsolate()->factory(); |
| 449 return SimpleInstallFunction(base, factory->InternalizeUtf8String(name), call, |
| 450 len, adapt); |
| 451 } |
| 452 |
425 } // namespace | 453 } // namespace |
426 | 454 |
427 | |
428 void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map, | 455 void Genesis::SetFunctionInstanceDescriptor(Handle<Map> map, |
429 FunctionMode function_mode) { | 456 FunctionMode function_mode) { |
430 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; | 457 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; |
431 Map::EnsureDescriptorSlack(map, size); | 458 Map::EnsureDescriptorSlack(map, size); |
432 | 459 |
433 PropertyAttributes ro_attribs = | 460 PropertyAttributes ro_attribs = |
434 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 461 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
435 PropertyAttributes roc_attribs = | 462 PropertyAttributes roc_attribs = |
436 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); | 463 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); |
437 | 464 |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 Handle<Map> strict_function_map = | 729 Handle<Map> strict_function_map = |
703 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); | 730 CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty); |
704 native_context()->set_strict_function_map(*strict_function_map); | 731 native_context()->set_strict_function_map(*strict_function_map); |
705 | 732 |
706 // The final map for the strict mode functions. Writeable prototype. | 733 // The final map for the strict mode functions. Writeable prototype. |
707 // This map is installed in MakeFunctionInstancePrototypeWritable. | 734 // This map is installed in MakeFunctionInstancePrototypeWritable. |
708 strict_function_map_writable_prototype_ = | 735 strict_function_map_writable_prototype_ = |
709 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); | 736 CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE, empty); |
710 } | 737 } |
711 | 738 |
712 | 739 void Genesis::CreateIteratorMaps(Handle<JSFunction> empty) { |
713 void Genesis::CreateIteratorMaps() { | |
714 // Create iterator-related meta-objects. | 740 // Create iterator-related meta-objects. |
715 Handle<JSObject> iterator_prototype = | 741 Handle<JSObject> iterator_prototype = |
716 factory()->NewJSObject(isolate()->object_function(), TENURED); | 742 factory()->NewJSObject(isolate()->object_function(), TENURED); |
717 Handle<JSObject> generator_object_prototype = | 743 Handle<JSObject> generator_object_prototype = |
718 factory()->NewJSObject(isolate()->object_function(), TENURED); | 744 factory()->NewJSObject(isolate()->object_function(), TENURED); |
| 745 SetObjectPrototype(generator_object_prototype, iterator_prototype); |
719 Handle<JSObject> generator_function_prototype = | 746 Handle<JSObject> generator_function_prototype = |
720 factory()->NewJSObject(isolate()->object_function(), TENURED); | 747 factory()->NewJSObject(isolate()->object_function(), TENURED); |
721 SetObjectPrototype(generator_object_prototype, iterator_prototype); | 748 SetObjectPrototype(generator_function_prototype, empty); |
722 | 749 |
| 750 JSObject::AddProperty( |
| 751 generator_function_prototype, factory()->to_string_tag_symbol(), |
| 752 factory()->NewStringFromAsciiChecked("GeneratorFunction"), |
| 753 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
723 JSObject::AddProperty(generator_function_prototype, | 754 JSObject::AddProperty(generator_function_prototype, |
724 factory()->InternalizeUtf8String("prototype"), | 755 factory()->prototype_string(), |
725 generator_object_prototype, | 756 generator_object_prototype, |
726 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); | 757 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
727 | 758 |
| 759 JSObject::AddProperty(generator_object_prototype, |
| 760 factory()->constructor_string(), |
| 761 generator_function_prototype, |
| 762 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
| 763 JSObject::AddProperty(generator_object_prototype, |
| 764 factory()->to_string_tag_symbol(), |
| 765 factory()->NewStringFromAsciiChecked("Generator"), |
| 766 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
| 767 SimpleInstallFunction(generator_object_prototype, "next", |
| 768 Builtins::kGeneratorPrototypeNext, 1, true); |
| 769 SimpleInstallFunction(generator_object_prototype, "return", |
| 770 Builtins::kGeneratorPrototypeReturn, 1, true); |
| 771 SimpleInstallFunction(generator_object_prototype, "throw", |
| 772 Builtins::kGeneratorPrototypeThrow, 1, true); |
| 773 |
728 // Create maps for generator functions and their prototypes. Store those | 774 // Create maps for generator functions and their prototypes. Store those |
729 // maps in the native context. The "prototype" property descriptor is | 775 // maps in the native context. The "prototype" property descriptor is |
730 // writable, non-enumerable, and non-configurable (as per ES6 draft | 776 // writable, non-enumerable, and non-configurable (as per ES6 draft |
731 // 04-14-15, section 25.2.4.3). | 777 // 04-14-15, section 25.2.4.3). |
732 Handle<Map> strict_function_map(strict_function_map_writable_prototype_); | 778 Handle<Map> strict_function_map(strict_function_map_writable_prototype_); |
733 // Generator functions do not have "caller" or "arguments" accessors. | 779 // Generator functions do not have "caller" or "arguments" accessors. |
734 Handle<Map> sloppy_generator_function_map = | 780 Handle<Map> sloppy_generator_function_map = |
735 Map::Copy(strict_function_map, "SloppyGeneratorFunction"); | 781 Map::Copy(strict_function_map, "SloppyGeneratorFunction"); |
736 sloppy_generator_function_map->set_is_constructor(false); | 782 sloppy_generator_function_map->set_is_constructor(false); |
737 Map::SetPrototype(sloppy_generator_function_map, | 783 Map::SetPrototype(sloppy_generator_function_map, |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 void Genesis::HookUpGlobalObject(Handle<JSGlobalObject> global_object) { | 1010 void Genesis::HookUpGlobalObject(Handle<JSGlobalObject> global_object) { |
965 Handle<JSGlobalObject> global_object_from_snapshot( | 1011 Handle<JSGlobalObject> global_object_from_snapshot( |
966 JSGlobalObject::cast(native_context()->extension())); | 1012 JSGlobalObject::cast(native_context()->extension())); |
967 native_context()->set_extension(*global_object); | 1013 native_context()->set_extension(*global_object); |
968 native_context()->set_security_token(*global_object); | 1014 native_context()->set_security_token(*global_object); |
969 | 1015 |
970 TransferNamedProperties(global_object_from_snapshot, global_object); | 1016 TransferNamedProperties(global_object_from_snapshot, global_object); |
971 TransferIndexedProperties(global_object_from_snapshot, global_object); | 1017 TransferIndexedProperties(global_object_from_snapshot, global_object); |
972 } | 1018 } |
973 | 1019 |
974 | |
975 static Handle<JSFunction> SimpleCreateFunction(Isolate* isolate, | |
976 Handle<String> name, | |
977 Builtins::Name call, int len, | |
978 bool adapt) { | |
979 Handle<JSFunction> fun = | |
980 CreateFunction(isolate, name, JS_OBJECT_TYPE, JSObject::kHeaderSize, | |
981 MaybeHandle<JSObject>(), call); | |
982 if (adapt) { | |
983 fun->shared()->set_internal_formal_parameter_count(len); | |
984 } else { | |
985 fun->shared()->DontAdaptArguments(); | |
986 } | |
987 fun->shared()->set_length(len); | |
988 return fun; | |
989 } | |
990 | |
991 | |
992 static Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base, | |
993 Handle<String> name, | |
994 Builtins::Name call, int len, | |
995 bool adapt) { | |
996 Handle<JSFunction> fun = | |
997 SimpleCreateFunction(base->GetIsolate(), name, call, len, adapt); | |
998 InstallFunction(base, fun, name, DONT_ENUM); | |
999 return fun; | |
1000 } | |
1001 | |
1002 | |
1003 static Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base, | |
1004 const char* name, | |
1005 Builtins::Name call, int len, | |
1006 bool adapt) { | |
1007 Factory* const factory = base->GetIsolate()->factory(); | |
1008 return SimpleInstallFunction(base, factory->InternalizeUtf8String(name), call, | |
1009 len, adapt); | |
1010 } | |
1011 | |
1012 | |
1013 static void InstallWithIntrinsicDefaultProto(Isolate* isolate, | 1020 static void InstallWithIntrinsicDefaultProto(Isolate* isolate, |
1014 Handle<JSFunction> function, | 1021 Handle<JSFunction> function, |
1015 int context_index) { | 1022 int context_index) { |
1016 Handle<Smi> index(Smi::FromInt(context_index), isolate); | 1023 Handle<Smi> index(Smi::FromInt(context_index), isolate); |
1017 JSObject::AddProperty( | 1024 JSObject::AddProperty( |
1018 function, isolate->factory()->native_context_index_symbol(), index, NONE); | 1025 function, isolate->factory()->native_context_index_symbol(), index, NONE); |
1019 isolate->native_context()->set(context_index, *function); | 1026 isolate->native_context()->set(context_index, *function); |
1020 } | 1027 } |
1021 | 1028 |
1022 | 1029 |
(...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2158 generator_function_function->set_prototype_or_initial_map( | 2165 generator_function_function->set_prototype_or_initial_map( |
2159 native_context->sloppy_generator_function_map()); | 2166 native_context->sloppy_generator_function_map()); |
2160 generator_function_function->shared()->DontAdaptArguments(); | 2167 generator_function_function->shared()->DontAdaptArguments(); |
2161 generator_function_function->shared()->set_construct_stub( | 2168 generator_function_function->shared()->set_construct_stub( |
2162 *isolate->builtins()->GeneratorFunctionConstructor()); | 2169 *isolate->builtins()->GeneratorFunctionConstructor()); |
2163 generator_function_function->shared()->set_length(1); | 2170 generator_function_function->shared()->set_length(1); |
2164 InstallWithIntrinsicDefaultProto( | 2171 InstallWithIntrinsicDefaultProto( |
2165 isolate, generator_function_function, | 2172 isolate, generator_function_function, |
2166 Context::GENERATOR_FUNCTION_FUNCTION_INDEX); | 2173 Context::GENERATOR_FUNCTION_FUNCTION_INDEX); |
2167 | 2174 |
| 2175 SetObjectPrototype(generator_function_function, |
| 2176 isolate->function_function()); |
| 2177 JSObject::AddProperty( |
| 2178 generator_function_prototype, factory->constructor_string(), |
| 2179 generator_function_function, |
| 2180 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); |
| 2181 |
2168 native_context->sloppy_generator_function_map()->SetConstructor( | 2182 native_context->sloppy_generator_function_map()->SetConstructor( |
2169 *generator_function_function); | 2183 *generator_function_function); |
2170 native_context->strict_generator_function_map()->SetConstructor( | 2184 native_context->strict_generator_function_map()->SetConstructor( |
2171 *generator_function_function); | 2185 *generator_function_function); |
2172 } | 2186 } |
2173 | 2187 |
2174 { // -- S e t I t e r a t o r | 2188 { // -- S e t I t e r a t o r |
2175 Handle<JSObject> set_iterator_prototype = | 2189 Handle<JSObject> set_iterator_prototype = |
2176 isolate->factory()->NewJSObject(isolate->object_function(), TENURED); | 2190 isolate->factory()->NewJSObject(isolate->object_function(), TENURED); |
2177 SetObjectPrototype(set_iterator_prototype, iterator_prototype); | 2191 SetObjectPrototype(set_iterator_prototype, iterator_prototype); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2713 JSFunction::EnsureHasInitialMap(function); | 2727 JSFunction::EnsureHasInitialMap(function); |
2714 function->initial_map()->set_instance_type(JS_PROMISE_TYPE); | 2728 function->initial_map()->set_instance_type(JS_PROMISE_TYPE); |
2715 function->shared()->set_construct_stub( | 2729 function->shared()->set_construct_stub( |
2716 *isolate()->builtins()->JSBuiltinsConstructStub()); | 2730 *isolate()->builtins()->JSBuiltinsConstructStub()); |
2717 InstallWithIntrinsicDefaultProto(isolate(), function, | 2731 InstallWithIntrinsicDefaultProto(isolate(), function, |
2718 Context::PROMISE_FUNCTION_INDEX); | 2732 Context::PROMISE_FUNCTION_INDEX); |
2719 } | 2733 } |
2720 | 2734 |
2721 InstallBuiltinFunctionIds(); | 2735 InstallBuiltinFunctionIds(); |
2722 | 2736 |
2723 // Also install builtin function ids to some generator object methods. These | |
2724 // three methods use the three resume operations (Runtime_GeneratorNext, | |
2725 // Runtime_GeneratorReturn, Runtime_GeneratorThrow) respectively. Those | |
2726 // operations are not supported by Crankshaft, TurboFan, nor Ignition. | |
2727 { | |
2728 Handle<JSObject> generator_object_prototype(JSObject::cast( | |
2729 native_context()->generator_object_prototype_map()->prototype())); | |
2730 | |
2731 { // GeneratorObject.prototype.next | |
2732 Handle<String> key = factory()->next_string(); | |
2733 Handle<JSFunction> function = Handle<JSFunction>::cast( | |
2734 JSReceiver::GetProperty(generator_object_prototype, key) | |
2735 .ToHandleChecked()); | |
2736 function->shared()->set_builtin_function_id(kGeneratorObjectNext); | |
2737 } | |
2738 { // GeneratorObject.prototype.return | |
2739 Handle<String> key = factory()->NewStringFromAsciiChecked("return"); | |
2740 Handle<JSFunction> function = Handle<JSFunction>::cast( | |
2741 JSReceiver::GetProperty(generator_object_prototype, key) | |
2742 .ToHandleChecked()); | |
2743 function->shared()->set_builtin_function_id(kGeneratorObjectReturn); | |
2744 } | |
2745 { // GeneratorObject.prototype.throw | |
2746 Handle<String> key = factory()->throw_string(); | |
2747 Handle<JSFunction> function = Handle<JSFunction>::cast( | |
2748 JSReceiver::GetProperty(generator_object_prototype, key) | |
2749 .ToHandleChecked()); | |
2750 function->shared()->set_builtin_function_id(kGeneratorObjectThrow); | |
2751 } | |
2752 } | |
2753 | |
2754 // Create a map for accessor property descriptors (a variant of JSObject | 2737 // Create a map for accessor property descriptors (a variant of JSObject |
2755 // that predefines four properties get, set, configurable and enumerable). | 2738 // that predefines four properties get, set, configurable and enumerable). |
2756 { | 2739 { |
2757 // AccessorPropertyDescriptor initial map. | 2740 // AccessorPropertyDescriptor initial map. |
2758 Handle<Map> map = | 2741 Handle<Map> map = |
2759 factory()->NewMap(JS_OBJECT_TYPE, JSAccessorPropertyDescriptor::kSize); | 2742 factory()->NewMap(JS_OBJECT_TYPE, JSAccessorPropertyDescriptor::kSize); |
2760 // Create the descriptor array for the property descriptor object. | 2743 // Create the descriptor array for the property descriptor object. |
2761 Map::EnsureDescriptorSlack(map, 4); | 2744 Map::EnsureDescriptorSlack(map, 4); |
2762 | 2745 |
2763 { // get | 2746 { // get |
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3548 | 3531 |
3549 HookUpGlobalProxy(global_object, global_proxy); | 3532 HookUpGlobalProxy(global_object, global_proxy); |
3550 HookUpGlobalObject(global_object); | 3533 HookUpGlobalObject(global_object); |
3551 | 3534 |
3552 if (!ConfigureGlobalObjects(global_proxy_template)) return; | 3535 if (!ConfigureGlobalObjects(global_proxy_template)) return; |
3553 } else { | 3536 } else { |
3554 // We get here if there was no context snapshot. | 3537 // We get here if there was no context snapshot. |
3555 CreateRoots(); | 3538 CreateRoots(); |
3556 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); | 3539 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); |
3557 CreateStrictModeFunctionMaps(empty_function); | 3540 CreateStrictModeFunctionMaps(empty_function); |
3558 CreateIteratorMaps(); | 3541 CreateIteratorMaps(empty_function); |
3559 Handle<JSGlobalObject> global_object = | 3542 Handle<JSGlobalObject> global_object = |
3560 CreateNewGlobals(global_proxy_template, global_proxy); | 3543 CreateNewGlobals(global_proxy_template, global_proxy); |
3561 HookUpGlobalProxy(global_object, global_proxy); | 3544 HookUpGlobalProxy(global_object, global_proxy); |
3562 InitializeGlobal(global_object, empty_function, context_type); | 3545 InitializeGlobal(global_object, empty_function, context_type); |
3563 InitializeNormalizedMapCaches(); | 3546 InitializeNormalizedMapCaches(); |
3564 | 3547 |
3565 if (!InstallNatives(context_type)) return; | 3548 if (!InstallNatives(context_type)) return; |
3566 | 3549 |
3567 MakeFunctionInstancePrototypeWritable(); | 3550 MakeFunctionInstancePrototypeWritable(); |
3568 | 3551 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3631 } | 3614 } |
3632 | 3615 |
3633 | 3616 |
3634 // Called when the top-level V8 mutex is destroyed. | 3617 // Called when the top-level V8 mutex is destroyed. |
3635 void Bootstrapper::FreeThreadResources() { | 3618 void Bootstrapper::FreeThreadResources() { |
3636 DCHECK(!IsActive()); | 3619 DCHECK(!IsActive()); |
3637 } | 3620 } |
3638 | 3621 |
3639 } // namespace internal | 3622 } // namespace internal |
3640 } // namespace v8 | 3623 } // namespace v8 |
OLD | NEW |