| 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 "factory.h" | 5 #include "factory.h" |
| 6 | 6 |
| 7 #include "isolate-inl.h" | 7 #include "isolate-inl.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| 11 | 11 |
| 12 |
| 13 template<typename T> |
| 14 Handle<T> Factory::New(Handle<Map> map, AllocationSpace space) { |
| 15 CALL_HEAP_FUNCTION( |
| 16 isolate(), |
| 17 isolate()->heap()->Allocate(*map, space), |
| 18 T); |
| 19 } |
| 20 |
| 21 |
| 22 template<typename T> |
| 23 Handle<T> Factory::New(Handle<Map> map, |
| 24 AllocationSpace space, |
| 25 Handle<AllocationSite> allocation_site) { |
| 26 CALL_HEAP_FUNCTION( |
| 27 isolate(), |
| 28 isolate()->heap()->Allocate(*map, space, *allocation_site), |
| 29 T); |
| 30 } |
| 31 |
| 32 |
| 12 Handle<Box> Factory::NewBox(Handle<Object> value) { | 33 Handle<Box> Factory::NewBox(Handle<Object> value) { |
| 13 Handle<Box> result = Handle<Box>::cast(NewStruct(BOX_TYPE)); | 34 Handle<Box> result = Handle<Box>::cast(NewStruct(BOX_TYPE)); |
| 14 result->set_value(*value); | 35 result->set_value(*value); |
| 15 return result; | 36 return result; |
| 16 } | 37 } |
| 17 | 38 |
| 18 | 39 |
| 19 Handle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) { | 40 Handle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) { |
| 20 ASSERT(0 <= size); | 41 ASSERT(0 <= size); |
| 21 CALL_HEAP_FUNCTION( | 42 CALL_HEAP_FUNCTION( |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 SinkChar* sink = result->GetChars(); | 361 SinkChar* sink = result->GetChars(); |
| 341 String::WriteToFlat(*first, sink, 0, first->length()); | 362 String::WriteToFlat(*first, sink, 0, first->length()); |
| 342 String::WriteToFlat(*second, sink + first->length(), 0, second->length()); | 363 String::WriteToFlat(*second, sink + first->length(), 0, second->length()); |
| 343 return result; | 364 return result; |
| 344 } | 365 } |
| 345 | 366 |
| 346 | 367 |
| 347 Handle<ConsString> Factory::NewRawConsString(String::Encoding encoding) { | 368 Handle<ConsString> Factory::NewRawConsString(String::Encoding encoding) { |
| 348 Handle<Map> map = (encoding == String::ONE_BYTE_ENCODING) | 369 Handle<Map> map = (encoding == String::ONE_BYTE_ENCODING) |
| 349 ? cons_ascii_string_map() : cons_string_map(); | 370 ? cons_ascii_string_map() : cons_string_map(); |
| 350 CALL_HEAP_FUNCTION(isolate(), | 371 return New<ConsString>(map, NEW_SPACE); |
| 351 isolate()->heap()->Allocate(*map, NEW_SPACE), | |
| 352 ConsString); | |
| 353 } | 372 } |
| 354 | 373 |
| 355 | 374 |
| 356 MaybeHandle<String> Factory::NewConsString(Handle<String> left, | 375 MaybeHandle<String> Factory::NewConsString(Handle<String> left, |
| 357 Handle<String> right) { | 376 Handle<String> right) { |
| 358 int left_length = left->length(); | 377 int left_length = left->length(); |
| 359 if (left_length == 0) return right; | 378 if (left_length == 0) return right; |
| 360 int right_length = right->length(); | 379 int right_length = right->length(); |
| 361 if (right_length == 0) return left; | 380 if (right_length == 0) return left; |
| 362 | 381 |
| 363 int length = left_length + right_length; | 382 int length = left_length + right_length; |
| 364 | 383 |
| 365 if (length == 2) { | 384 if (length == 2) { |
| 366 uint16_t c1 = left->Get(0); | 385 uint16_t c1 = left->Get(0); |
| 367 uint16_t c2 = right->Get(0); | 386 uint16_t c2 = right->Get(0); |
| 368 return MakeOrFindTwoCharacterString(isolate(), c1, c2); | 387 return MakeOrFindTwoCharacterString(isolate(), c1, c2); |
| 369 } | 388 } |
| 370 | 389 |
| 371 // Make sure that an out of memory exception is thrown if the length | 390 // Make sure that an out of memory exception is thrown if the length |
| 372 // of the new cons string is too large. | 391 // of the new cons string is too large. |
| 373 if (length > String::kMaxLength || length < 0) { | 392 if (length > String::kMaxLength || length < 0) { |
| 374 return isolate()->Throw<String>( | 393 return isolate()->Throw<String>(NewInvalidStringLengthError()); |
| 375 isolate()->factory()->NewInvalidStringLengthError()); | |
| 376 } | 394 } |
| 377 | 395 |
| 378 bool left_is_one_byte = left->IsOneByteRepresentation(); | 396 bool left_is_one_byte = left->IsOneByteRepresentation(); |
| 379 bool right_is_one_byte = right->IsOneByteRepresentation(); | 397 bool right_is_one_byte = right->IsOneByteRepresentation(); |
| 380 bool is_one_byte = left_is_one_byte && right_is_one_byte; | 398 bool is_one_byte = left_is_one_byte && right_is_one_byte; |
| 381 bool is_one_byte_data_in_two_byte_string = false; | 399 bool is_one_byte_data_in_two_byte_string = false; |
| 382 if (!is_one_byte) { | 400 if (!is_one_byte) { |
| 383 // At least one of the strings uses two-byte representation so we | 401 // At least one of the strings uses two-byte representation so we |
| 384 // can't use the fast case code for short ASCII strings below, but | 402 // can't use the fast case code for short ASCII strings below, but |
| 385 // we can try to save memory if all chars actually fit in ASCII. | 403 // we can try to save memory if all chars actually fit in ASCII. |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 } else { | 466 } else { |
| 449 return ConcatStringContent<uc16>( | 467 return ConcatStringContent<uc16>( |
| 450 NewRawTwoByteString(total_length).ToHandleChecked(), first, second); | 468 NewRawTwoByteString(total_length).ToHandleChecked(), first, second); |
| 451 } | 469 } |
| 452 } | 470 } |
| 453 | 471 |
| 454 | 472 |
| 455 Handle<SlicedString> Factory::NewRawSlicedString(String::Encoding encoding) { | 473 Handle<SlicedString> Factory::NewRawSlicedString(String::Encoding encoding) { |
| 456 Handle<Map> map = (encoding == String::ONE_BYTE_ENCODING) | 474 Handle<Map> map = (encoding == String::ONE_BYTE_ENCODING) |
| 457 ? sliced_ascii_string_map() : sliced_string_map(); | 475 ? sliced_ascii_string_map() : sliced_string_map(); |
| 458 CALL_HEAP_FUNCTION(isolate(), | 476 return New<SlicedString>(map, NEW_SPACE); |
| 459 isolate()->heap()->Allocate(*map, NEW_SPACE), | |
| 460 SlicedString); | |
| 461 } | 477 } |
| 462 | 478 |
| 463 | 479 |
| 464 Handle<String> Factory::NewProperSubString(Handle<String> str, | 480 Handle<String> Factory::NewProperSubString(Handle<String> str, |
| 465 int begin, | 481 int begin, |
| 466 int end) { | 482 int end) { |
| 467 #if VERIFY_HEAP | 483 #if VERIFY_HEAP |
| 468 if (FLAG_verify_heap) str->StringVerify(); | 484 if (FLAG_verify_heap) str->StringVerify(); |
| 469 #endif | 485 #endif |
| 470 ASSERT(begin > 0 || end < str->length()); | 486 ASSERT(begin > 0 || end < str->length()); |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedDoubleArray); | 905 CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedDoubleArray); |
| 890 } | 906 } |
| 891 | 907 |
| 892 | 908 |
| 893 Handle<ConstantPoolArray> Factory::CopyConstantPoolArray( | 909 Handle<ConstantPoolArray> Factory::CopyConstantPoolArray( |
| 894 Handle<ConstantPoolArray> array) { | 910 Handle<ConstantPoolArray> array) { |
| 895 CALL_HEAP_FUNCTION(isolate(), array->Copy(), ConstantPoolArray); | 911 CALL_HEAP_FUNCTION(isolate(), array->Copy(), ConstantPoolArray); |
| 896 } | 912 } |
| 897 | 913 |
| 898 | 914 |
| 899 Handle<JSFunction> Factory::BaseNewFunctionFromSharedFunctionInfo( | |
| 900 Handle<SharedFunctionInfo> function_info, | |
| 901 Handle<Map> function_map, | |
| 902 PretenureFlag pretenure) { | |
| 903 CALL_HEAP_FUNCTION( | |
| 904 isolate(), | |
| 905 isolate()->heap()->AllocateFunction(*function_map, | |
| 906 *function_info, | |
| 907 isolate()->heap()->the_hole_value(), | |
| 908 pretenure), | |
| 909 JSFunction); | |
| 910 } | |
| 911 | |
| 912 | |
| 913 static Handle<Map> MapForNewFunction(Isolate *isolate, | 915 static Handle<Map> MapForNewFunction(Isolate *isolate, |
| 914 Handle<SharedFunctionInfo> function_info) { | 916 Handle<SharedFunctionInfo> function_info) { |
| 915 Context *context = isolate->context()->native_context(); | 917 Context *context = isolate->context()->native_context(); |
| 916 int map_index = Context::FunctionMapIndex(function_info->strict_mode(), | 918 int map_index = Context::FunctionMapIndex(function_info->strict_mode(), |
| 917 function_info->is_generator()); | 919 function_info->is_generator()); |
| 918 return Handle<Map>(Map::cast(context->get(map_index))); | 920 return Handle<Map>(Map::cast(context->get(map_index))); |
| 919 } | 921 } |
| 920 | 922 |
| 921 | 923 |
| 922 Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( | 924 Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( |
| 923 Handle<SharedFunctionInfo> function_info, | 925 Handle<SharedFunctionInfo> function_info, |
| 924 Handle<Context> context, | 926 Handle<Context> context, |
| 925 PretenureFlag pretenure) { | 927 PretenureFlag pretenure) { |
| 926 Handle<JSFunction> result = BaseNewFunctionFromSharedFunctionInfo( | 928 Handle<JSFunction> result = NewFunctionHelper( |
| 929 MapForNewFunction(isolate(), function_info), |
| 927 function_info, | 930 function_info, |
| 928 MapForNewFunction(isolate(), function_info), | 931 the_hole_value(), |
| 929 pretenure); | 932 pretenure); |
| 930 | 933 |
| 931 if (function_info->ic_age() != isolate()->heap()->global_ic_age()) { | 934 if (function_info->ic_age() != isolate()->heap()->global_ic_age()) { |
| 932 function_info->ResetForNewContext(isolate()->heap()->global_ic_age()); | 935 function_info->ResetForNewContext(isolate()->heap()->global_ic_age()); |
| 933 } | 936 } |
| 934 | 937 |
| 935 result->set_context(*context); | 938 result->set_context(*context); |
| 936 | 939 |
| 937 int index = function_info->SearchOptimizedCodeMap(context->native_context(), | 940 int index = function_info->SearchOptimizedCodeMap(context->native_context(), |
| 938 BailoutId::None()); | 941 BailoutId::None()); |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1336 static Handle<NameDictionary> NameDictionaryAdd(Handle<NameDictionary> dict, | 1339 static Handle<NameDictionary> NameDictionaryAdd(Handle<NameDictionary> dict, |
| 1337 Handle<Name> name, | 1340 Handle<Name> name, |
| 1338 Handle<Object> value, | 1341 Handle<Object> value, |
| 1339 PropertyDetails details) { | 1342 PropertyDetails details) { |
| 1340 CALL_HEAP_FUNCTION(dict->GetIsolate(), | 1343 CALL_HEAP_FUNCTION(dict->GetIsolate(), |
| 1341 dict->Add(*name, *value, details), | 1344 dict->Add(*name, *value, details), |
| 1342 NameDictionary); | 1345 NameDictionary); |
| 1343 } | 1346 } |
| 1344 | 1347 |
| 1345 | 1348 |
| 1346 static Handle<GlobalObject> NewGlobalObjectFromMap(Isolate* isolate, | |
| 1347 Handle<Map> map) { | |
| 1348 CALL_HEAP_FUNCTION(isolate, | |
| 1349 isolate->heap()->Allocate(*map, OLD_POINTER_SPACE), | |
| 1350 GlobalObject); | |
| 1351 } | |
| 1352 | |
| 1353 | |
| 1354 Handle<GlobalObject> Factory::NewGlobalObject(Handle<JSFunction> constructor) { | 1349 Handle<GlobalObject> Factory::NewGlobalObject(Handle<JSFunction> constructor) { |
| 1355 ASSERT(constructor->has_initial_map()); | 1350 ASSERT(constructor->has_initial_map()); |
| 1356 Handle<Map> map(constructor->initial_map()); | 1351 Handle<Map> map(constructor->initial_map()); |
| 1357 ASSERT(map->is_dictionary_map()); | 1352 ASSERT(map->is_dictionary_map()); |
| 1358 | 1353 |
| 1359 // Make sure no field properties are described in the initial map. | 1354 // Make sure no field properties are described in the initial map. |
| 1360 // This guarantees us that normalizing the properties does not | 1355 // This guarantees us that normalizing the properties does not |
| 1361 // require us to change property values to PropertyCells. | 1356 // require us to change property values to PropertyCells. |
| 1362 ASSERT(map->NextFreePropertyIndex() == 0); | 1357 ASSERT(map->NextFreePropertyIndex() == 0); |
| 1363 | 1358 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1382 PropertyDetails details = descs->GetDetails(i); | 1377 PropertyDetails details = descs->GetDetails(i); |
| 1383 ASSERT(details.type() == CALLBACKS); // Only accessors are expected. | 1378 ASSERT(details.type() == CALLBACKS); // Only accessors are expected. |
| 1384 PropertyDetails d = PropertyDetails(details.attributes(), CALLBACKS, i + 1); | 1379 PropertyDetails d = PropertyDetails(details.attributes(), CALLBACKS, i + 1); |
| 1385 Handle<Name> name(descs->GetKey(i)); | 1380 Handle<Name> name(descs->GetKey(i)); |
| 1386 Handle<Object> value(descs->GetCallbacksObject(i), isolate()); | 1381 Handle<Object> value(descs->GetCallbacksObject(i), isolate()); |
| 1387 Handle<PropertyCell> cell = NewPropertyCell(value); | 1382 Handle<PropertyCell> cell = NewPropertyCell(value); |
| 1388 NameDictionaryAdd(dictionary, name, cell, d); | 1383 NameDictionaryAdd(dictionary, name, cell, d); |
| 1389 } | 1384 } |
| 1390 | 1385 |
| 1391 // Allocate the global object and initialize it with the backing store. | 1386 // Allocate the global object and initialize it with the backing store. |
| 1392 Handle<GlobalObject> global = NewGlobalObjectFromMap(isolate(), map); | 1387 Handle<GlobalObject> global = New<GlobalObject>(map, OLD_POINTER_SPACE); |
| 1393 isolate()->heap()->InitializeJSObjectFromMap(*global, *dictionary, *map); | 1388 isolate()->heap()->InitializeJSObjectFromMap(*global, *dictionary, *map); |
| 1394 | 1389 |
| 1395 // Create a new map for the global object. | 1390 // Create a new map for the global object. |
| 1396 Handle<Map> new_map = Map::CopyDropDescriptors(map); | 1391 Handle<Map> new_map = Map::CopyDropDescriptors(map); |
| 1397 new_map->set_dictionary_map(true); | 1392 new_map->set_dictionary_map(true); |
| 1398 | 1393 |
| 1399 // Set up the global object as a normalized object. | 1394 // Set up the global object as a normalized object. |
| 1400 global->set_map(*new_map); | 1395 global->set_map(*new_map); |
| 1401 global->set_properties(*dictionary); | 1396 global->set_properties(*dictionary); |
| 1402 | 1397 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1442 NewJSArrayStorage(array, length, capacity, mode); | 1437 NewJSArrayStorage(array, length, capacity, mode); |
| 1443 return array; | 1438 return array; |
| 1444 } | 1439 } |
| 1445 | 1440 |
| 1446 | 1441 |
| 1447 Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements, | 1442 Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements, |
| 1448 ElementsKind elements_kind, | 1443 ElementsKind elements_kind, |
| 1449 int length, | 1444 int length, |
| 1450 PretenureFlag pretenure) { | 1445 PretenureFlag pretenure) { |
| 1451 ASSERT(length <= elements->length()); | 1446 ASSERT(length <= elements->length()); |
| 1452 Handle<JSArray> array = | 1447 Handle<JSArray> array = NewJSArray(elements_kind, pretenure); |
| 1453 isolate()->factory()->NewJSArray(elements_kind, pretenure); | |
| 1454 | 1448 |
| 1455 array->set_elements(*elements); | 1449 array->set_elements(*elements); |
| 1456 array->set_length(Smi::FromInt(length)); | 1450 array->set_length(Smi::FromInt(length)); |
| 1457 JSObject::ValidateElements(array); | 1451 JSObject::ValidateElements(array); |
| 1458 return array; | 1452 return array; |
| 1459 } | 1453 } |
| 1460 | 1454 |
| 1461 | 1455 |
| 1462 void Factory::NewJSArrayStorage(Handle<JSArray> array, | 1456 void Factory::NewJSArrayStorage(Handle<JSArray> array, |
| 1463 int length, | 1457 int length, |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1558 | 1552 |
| 1559 Handle<JSProxy> Factory::NewJSProxy(Handle<Object> handler, | 1553 Handle<JSProxy> Factory::NewJSProxy(Handle<Object> handler, |
| 1560 Handle<Object> prototype) { | 1554 Handle<Object> prototype) { |
| 1561 CALL_HEAP_FUNCTION( | 1555 CALL_HEAP_FUNCTION( |
| 1562 isolate(), | 1556 isolate(), |
| 1563 isolate()->heap()->AllocateJSProxy(*handler, *prototype), | 1557 isolate()->heap()->AllocateJSProxy(*handler, *prototype), |
| 1564 JSProxy); | 1558 JSProxy); |
| 1565 } | 1559 } |
| 1566 | 1560 |
| 1567 | 1561 |
| 1562 void Factory::ReinitializeJSReceiver(Handle<JSReceiver> object, |
| 1563 InstanceType type, |
| 1564 int size) { |
| 1565 ASSERT(type >= FIRST_JS_OBJECT_TYPE); |
| 1566 |
| 1567 // Allocate fresh map. |
| 1568 // TODO(rossberg): Once we optimize proxies, cache these maps. |
| 1569 Handle<Map> map = NewMap(type, size); |
| 1570 |
| 1571 // Check that the receiver has at least the size of the fresh object. |
| 1572 int size_difference = object->map()->instance_size() - map->instance_size(); |
| 1573 ASSERT(size_difference >= 0); |
| 1574 |
| 1575 map->set_prototype(object->map()->prototype()); |
| 1576 |
| 1577 // Allocate the backing storage for the properties. |
| 1578 int prop_size = map->unused_property_fields() - map->inobject_properties(); |
| 1579 Handle<FixedArray> properties = NewFixedArray(prop_size, TENURED); |
| 1580 |
| 1581 Heap* heap = isolate()->heap(); |
| 1582 MaybeHandle<SharedFunctionInfo> shared; |
| 1583 if (type == JS_FUNCTION_TYPE) { |
| 1584 OneByteStringKey key(STATIC_ASCII_VECTOR("<freezing call trap>"), |
| 1585 heap->HashSeed()); |
| 1586 Handle<String> name = InternalizeStringWithKey(&key); |
| 1587 shared = NewSharedFunctionInfo(name); |
| 1588 } |
| 1589 |
| 1590 // In order to keep heap in consistent state there must be no allocations |
| 1591 // before object re-initialization is finished and filler object is installed. |
| 1592 DisallowHeapAllocation no_allocation; |
| 1593 |
| 1594 // Reset the map for the object. |
| 1595 object->set_map(*map); |
| 1596 Handle<JSObject> jsobj = Handle<JSObject>::cast(object); |
| 1597 |
| 1598 // Reinitialize the object from the constructor map. |
| 1599 heap->InitializeJSObjectFromMap(*jsobj, *properties, *map); |
| 1600 |
| 1601 // Functions require some minimal initialization. |
| 1602 if (type == JS_FUNCTION_TYPE) { |
| 1603 map->set_function_with_prototype(true); |
| 1604 Handle<JSFunction> js_function = Handle<JSFunction>::cast(object); |
| 1605 InitializeFunction(js_function, shared.ToHandleChecked(), the_hole_value()); |
| 1606 js_function->set_context(isolate()->context()->native_context()); |
| 1607 } |
| 1608 |
| 1609 // Put in filler if the new object is smaller than the old. |
| 1610 if (size_difference > 0) { |
| 1611 heap->CreateFillerObjectAt( |
| 1612 object->address() + map->instance_size(), size_difference); |
| 1613 } |
| 1614 } |
| 1615 |
| 1616 |
| 1617 void Factory::ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> object, |
| 1618 Handle<JSFunction> constructor) { |
| 1619 ASSERT(constructor->has_initial_map()); |
| 1620 Handle<Map> map(constructor->initial_map(), isolate()); |
| 1621 |
| 1622 // Check that the already allocated object has the same size and type as |
| 1623 // objects allocated using the constructor. |
| 1624 ASSERT(map->instance_size() == object->map()->instance_size()); |
| 1625 ASSERT(map->instance_type() == object->map()->instance_type()); |
| 1626 |
| 1627 // Allocate the backing storage for the properties. |
| 1628 int prop_size = map->unused_property_fields() - map->inobject_properties(); |
| 1629 Handle<FixedArray> properties = NewFixedArray(prop_size, TENURED); |
| 1630 |
| 1631 // In order to keep heap in consistent state there must be no allocations |
| 1632 // before object re-initialization is finished. |
| 1633 DisallowHeapAllocation no_allocation; |
| 1634 |
| 1635 // Reset the map for the object. |
| 1636 object->set_map(constructor->initial_map()); |
| 1637 |
| 1638 Heap* heap = isolate()->heap(); |
| 1639 // Reinitialize the object from the constructor map. |
| 1640 heap->InitializeJSObjectFromMap(*object, *properties, *map); |
| 1641 } |
| 1642 |
| 1643 |
| 1568 void Factory::BecomeJSObject(Handle<JSReceiver> object) { | 1644 void Factory::BecomeJSObject(Handle<JSReceiver> object) { |
| 1569 CALL_HEAP_FUNCTION_VOID( | 1645 ReinitializeJSReceiver(object, JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 1570 isolate(), | |
| 1571 isolate()->heap()->ReinitializeJSReceiver( | |
| 1572 *object, JS_OBJECT_TYPE, JSObject::kHeaderSize)); | |
| 1573 } | 1646 } |
| 1574 | 1647 |
| 1575 | 1648 |
| 1576 void Factory::BecomeJSFunction(Handle<JSReceiver> object) { | 1649 void Factory::BecomeJSFunction(Handle<JSReceiver> object) { |
| 1577 CALL_HEAP_FUNCTION_VOID( | 1650 ReinitializeJSReceiver(object, JS_FUNCTION_TYPE, JSFunction::kSize); |
| 1578 isolate(), | |
| 1579 isolate()->heap()->ReinitializeJSReceiver( | |
| 1580 *object, JS_FUNCTION_TYPE, JSFunction::kSize)); | |
| 1581 } | 1651 } |
| 1582 | 1652 |
| 1583 | 1653 |
| 1584 Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo( | 1654 Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo( |
| 1585 Handle<String> name, | 1655 Handle<String> name, |
| 1586 int number_of_literals, | 1656 int number_of_literals, |
| 1587 bool is_generator, | 1657 bool is_generator, |
| 1588 Handle<Code> code, | 1658 Handle<Code> code, |
| 1589 Handle<ScopeInfo> scope_info) { | 1659 Handle<ScopeInfo> scope_info) { |
| 1590 Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo(name); | 1660 Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo(name); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1656 Handle<UnseededNumberDictionary> Factory::DictionaryAtNumberPut( | 1726 Handle<UnseededNumberDictionary> Factory::DictionaryAtNumberPut( |
| 1657 Handle<UnseededNumberDictionary> dictionary, | 1727 Handle<UnseededNumberDictionary> dictionary, |
| 1658 uint32_t key, | 1728 uint32_t key, |
| 1659 Handle<Object> value) { | 1729 Handle<Object> value) { |
| 1660 CALL_HEAP_FUNCTION(isolate(), | 1730 CALL_HEAP_FUNCTION(isolate(), |
| 1661 dictionary->AtNumberPut(key, *value), | 1731 dictionary->AtNumberPut(key, *value), |
| 1662 UnseededNumberDictionary); | 1732 UnseededNumberDictionary); |
| 1663 } | 1733 } |
| 1664 | 1734 |
| 1665 | 1735 |
| 1666 Handle<JSFunction> Factory::NewFunctionHelper(Handle<String> name, | 1736 void Factory::InitializeFunction(Handle<JSFunction> function, |
| 1667 Handle<Object> prototype) { | 1737 Handle<SharedFunctionInfo> shared, |
| 1668 Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name); | 1738 Handle<Object> prototype) { |
| 1669 CALL_HEAP_FUNCTION( | 1739 ASSERT(!prototype->IsMap()); |
| 1670 isolate(), | 1740 function->initialize_properties(); |
| 1671 isolate()->heap()->AllocateFunction(*isolate()->sloppy_function_map(), | 1741 function->initialize_elements(); |
| 1672 *function_share, | 1742 function->set_shared(*shared); |
| 1673 *prototype), | 1743 function->set_code(shared->code()); |
| 1674 JSFunction); | 1744 function->set_prototype_or_initial_map(*prototype); |
| 1745 function->set_context(*undefined_value()); |
| 1746 function->set_literals_or_bindings(*empty_fixed_array()); |
| 1747 function->set_next_function_link(*undefined_value()); |
| 1748 } |
| 1749 |
| 1750 |
| 1751 Handle<JSFunction> Factory::NewFunctionHelper(Handle<Map> function_map, |
| 1752 Handle<SharedFunctionInfo> shared, |
| 1753 Handle<Object> prototype, |
| 1754 PretenureFlag pretenure) { |
| 1755 AllocationSpace space = |
| 1756 (pretenure == TENURED) ? OLD_POINTER_SPACE : NEW_SPACE; |
| 1757 Handle<JSFunction> fun = New<JSFunction>(function_map, space); |
| 1758 InitializeFunction(fun, shared, prototype); |
| 1759 return fun; |
| 1675 } | 1760 } |
| 1676 | 1761 |
| 1677 | 1762 |
| 1678 Handle<JSFunction> Factory::NewFunction(Handle<String> name, | 1763 Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
| 1679 Handle<Object> prototype) { | 1764 Handle<Object> prototype) { |
| 1680 Handle<JSFunction> fun = NewFunctionHelper(name, prototype); | 1765 Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name); |
| 1766 Handle<JSFunction> fun = NewFunctionHelper( |
| 1767 isolate()->sloppy_function_map(), function_share, prototype); |
| 1681 fun->set_context(isolate()->context()->native_context()); | 1768 fun->set_context(isolate()->context()->native_context()); |
| 1682 return fun; | 1769 return fun; |
| 1683 } | 1770 } |
| 1684 | 1771 |
| 1685 | 1772 |
| 1686 Handle<JSFunction> Factory::NewFunctionWithoutPrototypeHelper( | 1773 Handle<JSFunction> Factory::NewFunctionWithoutPrototype( |
| 1687 Handle<String> name, | 1774 Handle<String> name, |
| 1688 StrictMode strict_mode) { | 1775 StrictMode strict_mode) { |
| 1689 Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name); | 1776 Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name); |
| 1690 Handle<Map> map = strict_mode == SLOPPY | 1777 Handle<Map> map = strict_mode == SLOPPY |
| 1691 ? isolate()->sloppy_function_without_prototype_map() | 1778 ? isolate()->sloppy_function_without_prototype_map() |
| 1692 : isolate()->strict_function_without_prototype_map(); | 1779 : isolate()->strict_function_without_prototype_map(); |
| 1693 CALL_HEAP_FUNCTION(isolate(), | 1780 Handle<JSFunction> fun = |
| 1694 isolate()->heap()->AllocateFunction( | 1781 NewFunctionHelper(map, function_share, the_hole_value()); |
| 1695 *map, | |
| 1696 *function_share, | |
| 1697 *the_hole_value()), | |
| 1698 JSFunction); | |
| 1699 } | |
| 1700 | |
| 1701 | |
| 1702 Handle<JSFunction> Factory::NewFunctionWithoutPrototype( | |
| 1703 Handle<String> name, | |
| 1704 StrictMode strict_mode) { | |
| 1705 Handle<JSFunction> fun = NewFunctionWithoutPrototypeHelper(name, strict_mode); | |
| 1706 fun->set_context(isolate()->context()->native_context()); | 1782 fun->set_context(isolate()->context()->native_context()); |
| 1707 return fun; | 1783 return fun; |
| 1708 } | 1784 } |
| 1709 | 1785 |
| 1710 | 1786 |
| 1711 #ifdef ENABLE_DEBUGGER_SUPPORT | 1787 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 1712 Handle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) { | 1788 Handle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) { |
| 1713 // Get the original code of the function. | 1789 // Get the original code of the function. |
| 1714 Handle<Code> code(shared->code()); | 1790 Handle<Code> code(shared->code()); |
| 1715 | 1791 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2017 if (String::Equals(name, infinity_string())) return infinity_value(); | 2093 if (String::Equals(name, infinity_string())) return infinity_value(); |
| 2018 return Handle<Object>::null(); | 2094 return Handle<Object>::null(); |
| 2019 } | 2095 } |
| 2020 | 2096 |
| 2021 | 2097 |
| 2022 Handle<Object> Factory::ToBoolean(bool value) { | 2098 Handle<Object> Factory::ToBoolean(bool value) { |
| 2023 return value ? true_value() : false_value(); | 2099 return value ? true_value() : false_value(); |
| 2024 } | 2100 } |
| 2025 | 2101 |
| 2026 } } // namespace v8::internal | 2102 } } // namespace v8::internal |
| OLD | NEW |