| 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 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 Handle<String> object_name = factory->Object_string(); | 526 Handle<String> object_name = factory->Object_string(); |
| 527 | 527 |
| 528 Handle<JSObject> object_function_prototype; | 528 Handle<JSObject> object_function_prototype; |
| 529 | 529 |
| 530 { // --- O b j e c t --- | 530 { // --- O b j e c t --- |
| 531 Handle<JSFunction> object_fun = factory->NewFunction(object_name); | 531 Handle<JSFunction> object_fun = factory->NewFunction(object_name); |
| 532 int unused = JSObject::kInitialGlobalObjectUnusedPropertiesCount; | 532 int unused = JSObject::kInitialGlobalObjectUnusedPropertiesCount; |
| 533 int instance_size = JSObject::kHeaderSize + kPointerSize * unused; | 533 int instance_size = JSObject::kHeaderSize + kPointerSize * unused; |
| 534 Handle<Map> object_function_map = | 534 Handle<Map> object_function_map = |
| 535 factory->NewMap(JS_OBJECT_TYPE, instance_size); | 535 factory->NewMap(JS_OBJECT_TYPE, instance_size); |
| 536 object_function_map->set_inobject_properties(unused); | 536 object_function_map->SetInObjectProperties(unused); |
| 537 JSFunction::SetInitialMap(object_fun, object_function_map, | 537 JSFunction::SetInitialMap(object_fun, object_function_map, |
| 538 isolate->factory()->null_value()); | 538 isolate->factory()->null_value()); |
| 539 object_function_map->set_unused_property_fields(unused); | 539 object_function_map->set_unused_property_fields(unused); |
| 540 | 540 |
| 541 native_context()->set_object_function(*object_fun); | 541 native_context()->set_object_function(*object_fun); |
| 542 | 542 |
| 543 // Allocate a new prototype for the object function. | 543 // Allocate a new prototype for the object function. |
| 544 object_function_prototype = | 544 object_function_prototype = |
| 545 factory->NewJSObject(isolate->object_function(), TENURED); | 545 factory->NewJSObject(isolate->object_function(), TENURED); |
| 546 Handle<Map> map = Map::Copy(handle(object_function_prototype->map()), | 546 Handle<Map> map = Map::Copy(handle(object_function_prototype->map()), |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1165 // Builtin functions for RegExp.prototype. | 1165 // Builtin functions for RegExp.prototype. |
| 1166 Handle<JSFunction> regexp_fun = | 1166 Handle<JSFunction> regexp_fun = |
| 1167 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, | 1167 InstallFunction(global, "RegExp", JS_REGEXP_TYPE, JSRegExp::kSize, |
| 1168 isolate->initial_object_prototype(), | 1168 isolate->initial_object_prototype(), |
| 1169 Builtins::kIllegal); | 1169 Builtins::kIllegal); |
| 1170 native_context()->set_regexp_function(*regexp_fun); | 1170 native_context()->set_regexp_function(*regexp_fun); |
| 1171 | 1171 |
| 1172 DCHECK(regexp_fun->has_initial_map()); | 1172 DCHECK(regexp_fun->has_initial_map()); |
| 1173 Handle<Map> initial_map(regexp_fun->initial_map()); | 1173 Handle<Map> initial_map(regexp_fun->initial_map()); |
| 1174 | 1174 |
| 1175 DCHECK_EQ(0, initial_map->inobject_properties()); | 1175 DCHECK_EQ(0, initial_map->GetInObjectProperties()); |
| 1176 | 1176 |
| 1177 PropertyAttributes final = | 1177 PropertyAttributes final = |
| 1178 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1178 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 1179 Map::EnsureDescriptorSlack(initial_map, 5); | 1179 Map::EnsureDescriptorSlack(initial_map, 5); |
| 1180 | 1180 |
| 1181 { | 1181 { |
| 1182 // ECMA-262, section 15.10.7.1. | 1182 // ECMA-262, section 15.10.7.1. |
| 1183 DataDescriptor field(factory->source_string(), | 1183 DataDescriptor field(factory->source_string(), |
| 1184 JSRegExp::kSourceFieldIndex, final, | 1184 JSRegExp::kSourceFieldIndex, final, |
| 1185 Representation::Tagged()); | 1185 Representation::Tagged()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1210 // ECMA-262, section 15.10.7.5. | 1210 // ECMA-262, section 15.10.7.5. |
| 1211 PropertyAttributes writable = | 1211 PropertyAttributes writable = |
| 1212 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 1212 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
| 1213 DataDescriptor field(factory->last_index_string(), | 1213 DataDescriptor field(factory->last_index_string(), |
| 1214 JSRegExp::kLastIndexFieldIndex, writable, | 1214 JSRegExp::kLastIndexFieldIndex, writable, |
| 1215 Representation::Tagged()); | 1215 Representation::Tagged()); |
| 1216 initial_map->AppendDescriptor(&field); | 1216 initial_map->AppendDescriptor(&field); |
| 1217 } | 1217 } |
| 1218 | 1218 |
| 1219 static const int num_fields = JSRegExp::kInObjectFieldCount; | 1219 static const int num_fields = JSRegExp::kInObjectFieldCount; |
| 1220 initial_map->set_inobject_properties(num_fields); | 1220 initial_map->SetInObjectProperties(num_fields); |
| 1221 initial_map->set_unused_property_fields(0); | 1221 initial_map->set_unused_property_fields(0); |
| 1222 initial_map->set_instance_size(initial_map->instance_size() + | 1222 initial_map->set_instance_size(initial_map->instance_size() + |
| 1223 num_fields * kPointerSize); | 1223 num_fields * kPointerSize); |
| 1224 | 1224 |
| 1225 // RegExp prototype object is itself a RegExp. | 1225 // RegExp prototype object is itself a RegExp. |
| 1226 Handle<Map> proto_map = Map::Copy(initial_map, "RegExpPrototype"); | 1226 Handle<Map> proto_map = Map::Copy(initial_map, "RegExpPrototype"); |
| 1227 DCHECK(proto_map->prototype() == *isolate->initial_object_prototype()); | 1227 DCHECK(proto_map->prototype() == *isolate->initial_object_prototype()); |
| 1228 Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map); | 1228 Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map); |
| 1229 proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex, | 1229 proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex, |
| 1230 heap->query_colon_string()); | 1230 heap->query_colon_string()); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 } | 1306 } |
| 1307 | 1307 |
| 1308 { // Set up the iterator result object | 1308 { // Set up the iterator result object |
| 1309 STATIC_ASSERT(JSGeneratorObject::kResultPropertyCount == 2); | 1309 STATIC_ASSERT(JSGeneratorObject::kResultPropertyCount == 2); |
| 1310 Handle<JSFunction> object_function(native_context()->object_function()); | 1310 Handle<JSFunction> object_function(native_context()->object_function()); |
| 1311 Handle<Map> iterator_result_map = | 1311 Handle<Map> iterator_result_map = |
| 1312 Map::Create(isolate, JSGeneratorObject::kResultPropertyCount); | 1312 Map::Create(isolate, JSGeneratorObject::kResultPropertyCount); |
| 1313 DCHECK_EQ(JSGeneratorObject::kResultSize, | 1313 DCHECK_EQ(JSGeneratorObject::kResultSize, |
| 1314 iterator_result_map->instance_size()); | 1314 iterator_result_map->instance_size()); |
| 1315 DCHECK_EQ(JSGeneratorObject::kResultPropertyCount, | 1315 DCHECK_EQ(JSGeneratorObject::kResultPropertyCount, |
| 1316 iterator_result_map->inobject_properties()); | 1316 iterator_result_map->GetInObjectProperties()); |
| 1317 Map::EnsureDescriptorSlack(iterator_result_map, | 1317 Map::EnsureDescriptorSlack(iterator_result_map, |
| 1318 JSGeneratorObject::kResultPropertyCount); | 1318 JSGeneratorObject::kResultPropertyCount); |
| 1319 | 1319 |
| 1320 DataDescriptor value_descr(factory->value_string(), | 1320 DataDescriptor value_descr(factory->value_string(), |
| 1321 JSGeneratorObject::kResultValuePropertyIndex, | 1321 JSGeneratorObject::kResultValuePropertyIndex, |
| 1322 NONE, Representation::Tagged()); | 1322 NONE, Representation::Tagged()); |
| 1323 iterator_result_map->AppendDescriptor(&value_descr); | 1323 iterator_result_map->AppendDescriptor(&value_descr); |
| 1324 | 1324 |
| 1325 DataDescriptor done_descr(factory->done_string(), | 1325 DataDescriptor done_descr(factory->done_string(), |
| 1326 JSGeneratorObject::kResultDonePropertyIndex, NONE, | 1326 JSGeneratorObject::kResultDonePropertyIndex, NONE, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 map->AppendDescriptor(&d); | 1361 map->AppendDescriptor(&d); |
| 1362 } | 1362 } |
| 1363 { // callee | 1363 { // callee |
| 1364 DataDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, | 1364 DataDescriptor d(factory->callee_string(), Heap::kArgumentsCalleeIndex, |
| 1365 DONT_ENUM, Representation::Tagged()); | 1365 DONT_ENUM, Representation::Tagged()); |
| 1366 map->AppendDescriptor(&d); | 1366 map->AppendDescriptor(&d); |
| 1367 } | 1367 } |
| 1368 // @@iterator method is added later. | 1368 // @@iterator method is added later. |
| 1369 | 1369 |
| 1370 map->set_function_with_prototype(true); | 1370 map->set_function_with_prototype(true); |
| 1371 map->set_inobject_properties(2); | 1371 map->SetInObjectProperties(2); |
| 1372 native_context()->set_sloppy_arguments_map(*map); | 1372 native_context()->set_sloppy_arguments_map(*map); |
| 1373 | 1373 |
| 1374 DCHECK(!function->has_initial_map()); | 1374 DCHECK(!function->has_initial_map()); |
| 1375 JSFunction::SetInitialMap(function, map, | 1375 JSFunction::SetInitialMap(function, map, |
| 1376 isolate->initial_object_prototype()); | 1376 isolate->initial_object_prototype()); |
| 1377 | 1377 |
| 1378 DCHECK(map->inobject_properties() > Heap::kArgumentsCalleeIndex); | 1378 DCHECK(map->GetInObjectProperties() > Heap::kArgumentsCalleeIndex); |
| 1379 DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); | 1379 DCHECK(map->GetInObjectProperties() > Heap::kArgumentsLengthIndex); |
| 1380 DCHECK(!map->is_dictionary_map()); | 1380 DCHECK(!map->is_dictionary_map()); |
| 1381 DCHECK(IsFastObjectElementsKind(map->elements_kind())); | 1381 DCHECK(IsFastObjectElementsKind(map->elements_kind())); |
| 1382 } | 1382 } |
| 1383 | 1383 |
| 1384 { // --- fast and slow aliased arguments map | 1384 { // --- fast and slow aliased arguments map |
| 1385 Handle<Map> map = isolate->sloppy_arguments_map(); | 1385 Handle<Map> map = isolate->sloppy_arguments_map(); |
| 1386 map = Map::Copy(map, "FastAliasedArguments"); | 1386 map = Map::Copy(map, "FastAliasedArguments"); |
| 1387 map->set_elements_kind(FAST_SLOPPY_ARGUMENTS_ELEMENTS); | 1387 map->set_elements_kind(FAST_SLOPPY_ARGUMENTS_ELEMENTS); |
| 1388 DCHECK_EQ(2, map->inobject_properties()); | 1388 DCHECK_EQ(2, map->GetInObjectProperties()); |
| 1389 native_context()->set_fast_aliased_arguments_map(*map); | 1389 native_context()->set_fast_aliased_arguments_map(*map); |
| 1390 | 1390 |
| 1391 map = Map::Copy(map, "SlowAliasedArguments"); | 1391 map = Map::Copy(map, "SlowAliasedArguments"); |
| 1392 map->set_elements_kind(SLOW_SLOPPY_ARGUMENTS_ELEMENTS); | 1392 map->set_elements_kind(SLOW_SLOPPY_ARGUMENTS_ELEMENTS); |
| 1393 DCHECK_EQ(2, map->inobject_properties()); | 1393 DCHECK_EQ(2, map->GetInObjectProperties()); |
| 1394 native_context()->set_slow_aliased_arguments_map(*map); | 1394 native_context()->set_slow_aliased_arguments_map(*map); |
| 1395 } | 1395 } |
| 1396 | 1396 |
| 1397 { // --- strict mode arguments map | 1397 { // --- strict mode arguments map |
| 1398 const PropertyAttributes attributes = | 1398 const PropertyAttributes attributes = |
| 1399 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1399 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
| 1400 | 1400 |
| 1401 // Create the ThrowTypeError functions. | 1401 // Create the ThrowTypeError functions. |
| 1402 Handle<AccessorPair> callee = factory->NewAccessorPair(); | 1402 Handle<AccessorPair> callee = factory->NewAccessorPair(); |
| 1403 Handle<AccessorPair> caller = factory->NewAccessorPair(); | 1403 Handle<AccessorPair> caller = factory->NewAccessorPair(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1430 AccessorConstantDescriptor d(factory->caller_string(), caller, | 1430 AccessorConstantDescriptor d(factory->caller_string(), caller, |
| 1431 attributes); | 1431 attributes); |
| 1432 map->AppendDescriptor(&d); | 1432 map->AppendDescriptor(&d); |
| 1433 } | 1433 } |
| 1434 // @@iterator method is added later. | 1434 // @@iterator method is added later. |
| 1435 | 1435 |
| 1436 map->set_function_with_prototype(true); | 1436 map->set_function_with_prototype(true); |
| 1437 DCHECK_EQ(native_context()->object_function()->prototype(), | 1437 DCHECK_EQ(native_context()->object_function()->prototype(), |
| 1438 *isolate->initial_object_prototype()); | 1438 *isolate->initial_object_prototype()); |
| 1439 Map::SetPrototype(map, isolate->initial_object_prototype()); | 1439 Map::SetPrototype(map, isolate->initial_object_prototype()); |
| 1440 map->set_inobject_properties(1); | 1440 map->SetInObjectProperties(1); |
| 1441 | 1441 |
| 1442 // Copy constructor from the sloppy arguments boilerplate. | 1442 // Copy constructor from the sloppy arguments boilerplate. |
| 1443 map->SetConstructor( | 1443 map->SetConstructor( |
| 1444 native_context()->sloppy_arguments_map()->GetConstructor()); | 1444 native_context()->sloppy_arguments_map()->GetConstructor()); |
| 1445 | 1445 |
| 1446 native_context()->set_strict_arguments_map(*map); | 1446 native_context()->set_strict_arguments_map(*map); |
| 1447 | 1447 |
| 1448 DCHECK(map->inobject_properties() > Heap::kArgumentsLengthIndex); | 1448 DCHECK(map->GetInObjectProperties() > Heap::kArgumentsLengthIndex); |
| 1449 DCHECK(!map->is_dictionary_map()); | 1449 DCHECK(!map->is_dictionary_map()); |
| 1450 DCHECK(IsFastObjectElementsKind(map->elements_kind())); | 1450 DCHECK(IsFastObjectElementsKind(map->elements_kind())); |
| 1451 } | 1451 } |
| 1452 | 1452 |
| 1453 { // --- context extension | 1453 { // --- context extension |
| 1454 // Create a function for the context extension objects. | 1454 // Create a function for the context extension objects. |
| 1455 Handle<Code> code = Handle<Code>( | 1455 Handle<Code> code = Handle<Code>( |
| 1456 isolate->builtins()->builtin(Builtins::kIllegal)); | 1456 isolate->builtins()->builtin(Builtins::kIllegal)); |
| 1457 Handle<JSFunction> context_extension_fun = factory->NewFunction( | 1457 Handle<JSFunction> context_extension_fun = factory->NewFunction( |
| 1458 factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, | 1458 factory->empty_string(), code, JS_CONTEXT_EXTENSION_OBJECT_TYPE, |
| (...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2489 initial_map->AppendDescriptor(&index_field); | 2489 initial_map->AppendDescriptor(&index_field); |
| 2490 } | 2490 } |
| 2491 | 2491 |
| 2492 { | 2492 { |
| 2493 DataDescriptor input_field(factory()->input_string(), | 2493 DataDescriptor input_field(factory()->input_string(), |
| 2494 JSRegExpResult::kInputIndex, NONE, | 2494 JSRegExpResult::kInputIndex, NONE, |
| 2495 Representation::Tagged()); | 2495 Representation::Tagged()); |
| 2496 initial_map->AppendDescriptor(&input_field); | 2496 initial_map->AppendDescriptor(&input_field); |
| 2497 } | 2497 } |
| 2498 | 2498 |
| 2499 initial_map->set_inobject_properties(2); | 2499 initial_map->SetInObjectProperties(2); |
| 2500 initial_map->set_unused_property_fields(0); | 2500 initial_map->set_unused_property_fields(0); |
| 2501 | 2501 |
| 2502 native_context()->set_regexp_result_map(*initial_map); | 2502 native_context()->set_regexp_result_map(*initial_map); |
| 2503 } | 2503 } |
| 2504 | 2504 |
| 2505 // Add @@iterator method to the arguments object maps. | 2505 // Add @@iterator method to the arguments object maps. |
| 2506 { | 2506 { |
| 2507 PropertyAttributes attribs = DONT_ENUM; | 2507 PropertyAttributes attribs = DONT_ENUM; |
| 2508 Handle<AccessorInfo> arguments_iterator = | 2508 Handle<AccessorInfo> arguments_iterator = |
| 2509 Accessors::ArgumentsIteratorInfo(isolate(), attribs); | 2509 Accessors::ArgumentsIteratorInfo(isolate(), attribs); |
| (...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3260 } | 3260 } |
| 3261 | 3261 |
| 3262 | 3262 |
| 3263 // Called when the top-level V8 mutex is destroyed. | 3263 // Called when the top-level V8 mutex is destroyed. |
| 3264 void Bootstrapper::FreeThreadResources() { | 3264 void Bootstrapper::FreeThreadResources() { |
| 3265 DCHECK(!IsActive()); | 3265 DCHECK(!IsActive()); |
| 3266 } | 3266 } |
| 3267 | 3267 |
| 3268 } // namespace internal | 3268 } // namespace internal |
| 3269 } // namespace v8 | 3269 } // namespace v8 |
| OLD | NEW |