| 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/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/extensions/externalize-string-extension.h" | 9 #include "src/extensions/externalize-string-extension.h" |
| 10 #include "src/extensions/free-buffer-extension.h" | 10 #include "src/extensions/free-buffer-extension.h" |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 CreateFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE); | 473 CreateFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE); |
| 474 | 474 |
| 475 Factory* factory = isolate->factory(); | 475 Factory* factory = isolate->factory(); |
| 476 | 476 |
| 477 Handle<String> object_name = factory->Object_string(); | 477 Handle<String> object_name = factory->Object_string(); |
| 478 | 478 |
| 479 { // --- O b j e c t --- | 479 { // --- O b j e c t --- |
| 480 Handle<JSFunction> object_fun = factory->NewFunction(object_name); | 480 Handle<JSFunction> object_fun = factory->NewFunction(object_name); |
| 481 Handle<Map> object_function_map = | 481 Handle<Map> object_function_map = |
| 482 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 482 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 483 JSFunction::SetInitialMap(object_fun, object_function_map); | 483 JSFunction::SetInitialMap(object_fun, object_function_map, |
| 484 isolate->factory()->null_value()); |
| 484 object_function_map->set_unused_property_fields( | 485 object_function_map->set_unused_property_fields( |
| 485 JSObject::kInitialGlobalObjectUnusedPropertiesCount); | 486 JSObject::kInitialGlobalObjectUnusedPropertiesCount); |
| 486 | 487 |
| 487 native_context()->set_object_function(*object_fun); | 488 native_context()->set_object_function(*object_fun); |
| 488 | 489 |
| 489 // Allocate a new prototype for the object function. | 490 // Allocate a new prototype for the object function. |
| 490 Handle<JSObject> prototype = factory->NewJSObject( | 491 Handle<JSObject> prototype = factory->NewJSObject( |
| 491 isolate->object_function(), | 492 isolate->object_function(), |
| 492 TENURED); | 493 TENURED); |
| 494 Handle<Map> map = Map::Copy(handle(prototype->map())); |
| 495 map->set_is_prototype_map(true); |
| 496 prototype->set_map(*map); |
| 493 | 497 |
| 494 native_context()->set_initial_object_prototype(*prototype); | 498 native_context()->set_initial_object_prototype(*prototype); |
| 495 // For bootstrapping set the array prototype to be the same as the object | 499 // For bootstrapping set the array prototype to be the same as the object |
| 496 // prototype, otherwise the missing initial_array_prototype will cause | 500 // prototype, otherwise the missing initial_array_prototype will cause |
| 497 // assertions during startup. | 501 // assertions during startup. |
| 498 native_context()->set_initial_array_prototype(*prototype); | 502 native_context()->set_initial_array_prototype(*prototype); |
| 499 Accessors::FunctionSetPrototype(object_fun, prototype); | 503 Accessors::FunctionSetPrototype(object_fun, prototype); |
| 500 } | 504 } |
| 501 | 505 |
| 502 // Allocate the empty function as the prototype for function ECMAScript | 506 // Allocate the empty function as the prototype for function ECMAScript |
| 503 // 262 15.3.4. | 507 // 262 15.3.4. |
| 504 Handle<String> empty_string = | 508 Handle<String> empty_string = |
| 505 factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty")); | 509 factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty")); |
| 506 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); | 510 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); |
| 507 Handle<JSFunction> empty_function = factory->NewFunctionWithoutPrototype( | 511 Handle<JSFunction> empty_function = factory->NewFunctionWithoutPrototype( |
| 508 empty_string, code); | 512 empty_string, code); |
| 509 | 513 |
| 514 // Allocate the function map first and then patch the prototype later |
| 515 Handle<Map> empty_function_map = |
| 516 CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); |
| 517 DCHECK(!empty_function_map->is_dictionary_map()); |
| 518 empty_function_map->set_prototype( |
| 519 native_context()->object_function()->prototype()); |
| 520 empty_function_map->set_is_prototype_map(true); |
| 521 empty_function->set_map(*empty_function_map); |
| 522 |
| 510 // --- E m p t y --- | 523 // --- E m p t y --- |
| 511 Handle<String> source = factory->NewStringFromStaticAscii("() {}"); | 524 Handle<String> source = factory->NewStringFromStaticAscii("() {}"); |
| 512 Handle<Script> script = factory->NewScript(source); | 525 Handle<Script> script = factory->NewScript(source); |
| 513 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 526 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
| 514 empty_function->shared()->set_script(*script); | 527 empty_function->shared()->set_script(*script); |
| 515 empty_function->shared()->set_start_position(0); | 528 empty_function->shared()->set_start_position(0); |
| 516 empty_function->shared()->set_end_position(source->length()); | 529 empty_function->shared()->set_end_position(source->length()); |
| 517 empty_function->shared()->DontAdaptArguments(); | 530 empty_function->shared()->DontAdaptArguments(); |
| 518 | 531 |
| 519 // Set prototypes for the function maps. | 532 // Set prototypes for the function maps. |
| 520 native_context()->sloppy_function_map()->set_prototype(*empty_function); | 533 native_context()->sloppy_function_map()->set_prototype(*empty_function); |
| 521 native_context()->sloppy_function_without_prototype_map()-> | 534 native_context()->sloppy_function_without_prototype_map()-> |
| 522 set_prototype(*empty_function); | 535 set_prototype(*empty_function); |
| 523 sloppy_function_map_writable_prototype_->set_prototype(*empty_function); | 536 sloppy_function_map_writable_prototype_->set_prototype(*empty_function); |
| 524 | |
| 525 // Allocate the function map first and then patch the prototype later | |
| 526 Handle<Map> empty_function_map = | |
| 527 CreateFunctionMap(FUNCTION_WITHOUT_PROTOTYPE); | |
| 528 empty_function_map->set_prototype( | |
| 529 native_context()->object_function()->prototype()); | |
| 530 empty_function->set_map(*empty_function_map); | |
| 531 return empty_function; | 537 return empty_function; |
| 532 } | 538 } |
| 533 | 539 |
| 534 | 540 |
| 535 void Genesis::SetStrictFunctionInstanceDescriptor( | 541 void Genesis::SetStrictFunctionInstanceDescriptor( |
| 536 Handle<Map> map, FunctionMode function_mode) { | 542 Handle<Map> map, FunctionMode function_mode) { |
| 537 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; | 543 int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; |
| 538 Map::EnsureDescriptorSlack(map, size); | 544 Map::EnsureDescriptorSlack(map, size); |
| 539 | 545 |
| 540 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); | 546 Handle<AccessorPair> arguments(factory()->NewAccessorPair()); |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1075 heap->query_colon_string()); | 1081 heap->query_colon_string()); |
| 1076 proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, | 1082 proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, |
| 1077 heap->false_value()); | 1083 heap->false_value()); |
| 1078 proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, | 1084 proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, |
| 1079 heap->false_value()); | 1085 heap->false_value()); |
| 1080 proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, | 1086 proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, |
| 1081 heap->false_value()); | 1087 heap->false_value()); |
| 1082 proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, | 1088 proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, |
| 1083 Smi::FromInt(0), | 1089 Smi::FromInt(0), |
| 1084 SKIP_WRITE_BARRIER); // It's a Smi. | 1090 SKIP_WRITE_BARRIER); // It's a Smi. |
| 1091 proto_map->set_is_prototype_map(true); |
| 1085 initial_map->set_prototype(*proto); | 1092 initial_map->set_prototype(*proto); |
| 1086 factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), | 1093 factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto), |
| 1087 JSRegExp::IRREGEXP, factory->empty_string(), | 1094 JSRegExp::IRREGEXP, factory->empty_string(), |
| 1088 JSRegExp::Flags(0), 0); | 1095 JSRegExp::Flags(0), 0); |
| 1089 } | 1096 } |
| 1090 | 1097 |
| 1091 { // -- J S O N | 1098 { // -- J S O N |
| 1092 Handle<String> name = factory->InternalizeUtf8String("JSON"); | 1099 Handle<String> name = factory->InternalizeUtf8String("JSON"); |
| 1093 Handle<JSFunction> cons = factory->NewFunction(name); | 1100 Handle<JSFunction> cons = factory->NewFunction(name); |
| 1094 JSFunction::SetInstancePrototype(cons, | 1101 JSFunction::SetInstancePrototype(cons, |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1197 DONT_ENUM, Representation::Tagged()); | 1204 DONT_ENUM, Representation::Tagged()); |
| 1198 map->AppendDescriptor(&d); | 1205 map->AppendDescriptor(&d); |
| 1199 } | 1206 } |
| 1200 { // callee | 1207 { // callee |
| 1201 FieldDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, | 1208 FieldDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, |
| 1202 DONT_ENUM, Representation::Tagged()); | 1209 DONT_ENUM, Representation::Tagged()); |
| 1203 map->AppendDescriptor(&d); | 1210 map->AppendDescriptor(&d); |
| 1204 } | 1211 } |
| 1205 | 1212 |
| 1206 map->set_function_with_prototype(true); | 1213 map->set_function_with_prototype(true); |
| 1207 map->set_prototype(native_context()->object_function()->prototype()); | |
| 1208 map->set_pre_allocated_property_fields(2); | 1214 map->set_pre_allocated_property_fields(2); |
| 1209 map->set_inobject_properties(2); | 1215 map->set_inobject_properties(2); |
| 1210 native_context()->set_sloppy_arguments_map(*map); | 1216 native_context()->set_sloppy_arguments_map(*map); |
| 1211 | 1217 |
| 1212 DCHECK(!function->has_initial_map()); | 1218 DCHECK(!function->has_initial_map()); |
| 1213 JSFunction::SetInitialMap(function, map); | 1219 JSFunction::SetInitialMap(function, map, |
| 1220 isolate->initial_object_prototype()); |
| 1214 | 1221 |
| 1215 DCHECK(map->inobject_properties() > Heap::kArgumentsCalleeIndex); | 1222 DCHECK(map->inobject_properties() > Heap::kArgumentsCalleeIndex); |
| 1216 DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); | 1223 DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); |
| 1217 DCHECK(!map->is_dictionary_map()); | 1224 DCHECK(!map->is_dictionary_map()); |
| 1218 DCHECK(IsFastObjectElementsKind(map->elements_kind())); | 1225 DCHECK(IsFastObjectElementsKind(map->elements_kind())); |
| 1219 } | 1226 } |
| 1220 | 1227 |
| 1221 { // --- aliased arguments map | 1228 { // --- aliased arguments map |
| 1222 Handle<Map> map = Map::Copy(isolate->sloppy_arguments_map()); | 1229 Handle<Map> map = Map::Copy(isolate->sloppy_arguments_map()); |
| 1223 map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); | 1230 map->set_elements_kind(SLOPPY_ARGUMENTS_ELEMENTS); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1327 Handle<Map>* external_map) { | 1334 Handle<Map>* external_map) { |
| 1328 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); | 1335 Handle<JSObject> global = Handle<JSObject>(native_context()->global_object()); |
| 1329 Handle<JSFunction> result = InstallFunction( | 1336 Handle<JSFunction> result = InstallFunction( |
| 1330 global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, | 1337 global, name, JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, |
| 1331 isolate()->initial_object_prototype(), Builtins::kIllegal); | 1338 isolate()->initial_object_prototype(), Builtins::kIllegal); |
| 1332 | 1339 |
| 1333 Handle<Map> initial_map = isolate()->factory()->NewMap( | 1340 Handle<Map> initial_map = isolate()->factory()->NewMap( |
| 1334 JS_TYPED_ARRAY_TYPE, | 1341 JS_TYPED_ARRAY_TYPE, |
| 1335 JSTypedArray::kSizeWithInternalFields, | 1342 JSTypedArray::kSizeWithInternalFields, |
| 1336 elements_kind); | 1343 elements_kind); |
| 1337 JSFunction::SetInitialMap(result, initial_map); | 1344 JSFunction::SetInitialMap(result, initial_map, |
| 1345 handle(initial_map->prototype(), isolate())); |
| 1338 *fun = result; | 1346 *fun = result; |
| 1339 | 1347 |
| 1340 ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind); | 1348 ElementsKind external_kind = GetNextTransitionElementsKind(elements_kind); |
| 1341 *external_map = Map::AsElementsKind(initial_map, external_kind); | 1349 *external_map = Map::AsElementsKind(initial_map, external_kind); |
| 1342 } | 1350 } |
| 1343 | 1351 |
| 1344 | 1352 |
| 1345 void Genesis::InitializeExperimentalGlobal() { | 1353 void Genesis::InitializeExperimentalGlobal() { |
| 1346 // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no | 1354 // TODO(mstarzinger): Move this into Genesis::InitializeGlobal once we no |
| 1347 // longer need to live behind flags, so functions get added to the snapshot. | 1355 // longer need to live behind flags, so functions get added to the snapshot. |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1645 prototype, Builtins::kInternalArrayCode); | 1653 prototype, Builtins::kInternalArrayCode); |
| 1646 | 1654 |
| 1647 InternalArrayConstructorStub internal_array_constructor_stub(isolate()); | 1655 InternalArrayConstructorStub internal_array_constructor_stub(isolate()); |
| 1648 Handle<Code> code = internal_array_constructor_stub.GetCode(); | 1656 Handle<Code> code = internal_array_constructor_stub.GetCode(); |
| 1649 array_function->shared()->set_construct_stub(*code); | 1657 array_function->shared()->set_construct_stub(*code); |
| 1650 array_function->shared()->DontAdaptArguments(); | 1658 array_function->shared()->DontAdaptArguments(); |
| 1651 | 1659 |
| 1652 Handle<Map> original_map(array_function->initial_map()); | 1660 Handle<Map> original_map(array_function->initial_map()); |
| 1653 Handle<Map> initial_map = Map::Copy(original_map); | 1661 Handle<Map> initial_map = Map::Copy(original_map); |
| 1654 initial_map->set_elements_kind(elements_kind); | 1662 initial_map->set_elements_kind(elements_kind); |
| 1655 JSFunction::SetInitialMap(array_function, initial_map); | 1663 JSFunction::SetInitialMap(array_function, initial_map, prototype); |
| 1656 | 1664 |
| 1657 // Make "length" magic on instances. | 1665 // Make "length" magic on instances. |
| 1658 Map::EnsureDescriptorSlack(initial_map, 1); | 1666 Map::EnsureDescriptorSlack(initial_map, 1); |
| 1659 | 1667 |
| 1660 PropertyAttributes attribs = static_cast<PropertyAttributes>( | 1668 PropertyAttributes attribs = static_cast<PropertyAttributes>( |
| 1661 DONT_ENUM | DONT_DELETE); | 1669 DONT_ENUM | DONT_DELETE); |
| 1662 | 1670 |
| 1663 Handle<AccessorInfo> array_length = | 1671 Handle<AccessorInfo> array_length = |
| 1664 Accessors::ArrayLengthInfo(isolate(), attribs); | 1672 Accessors::ArrayLengthInfo(isolate(), attribs); |
| 1665 { // Add length. | 1673 { // Add length. |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2689 return from + sizeof(NestingCounterType); | 2697 return from + sizeof(NestingCounterType); |
| 2690 } | 2698 } |
| 2691 | 2699 |
| 2692 | 2700 |
| 2693 // Called when the top-level V8 mutex is destroyed. | 2701 // Called when the top-level V8 mutex is destroyed. |
| 2694 void Bootstrapper::FreeThreadResources() { | 2702 void Bootstrapper::FreeThreadResources() { |
| 2695 DCHECK(!IsActive()); | 2703 DCHECK(!IsActive()); |
| 2696 } | 2704 } |
| 2697 | 2705 |
| 2698 } } // namespace v8::internal | 2706 } } // namespace v8::internal |
| OLD | NEW |