OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/base/once.h" | 9 #include "src/base/once.h" |
10 #include "src/base/utils/random-number-generator.h" | 10 #include "src/base/utils/random-number-generator.h" |
(...skipping 3551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3562 result->set_map_no_write_barrier(map); | 3562 result->set_map_no_write_barrier(map); |
3563 if (allocation_site != NULL) { | 3563 if (allocation_site != NULL) { |
3564 AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( | 3564 AllocationMemento* alloc_memento = reinterpret_cast<AllocationMemento*>( |
3565 reinterpret_cast<Address>(result) + map->instance_size()); | 3565 reinterpret_cast<Address>(result) + map->instance_size()); |
3566 InitializeAllocationMemento(alloc_memento, allocation_site); | 3566 InitializeAllocationMemento(alloc_memento, allocation_site); |
3567 } | 3567 } |
3568 return result; | 3568 return result; |
3569 } | 3569 } |
3570 | 3570 |
3571 | 3571 |
3572 AllocationResult Heap::AllocateArgumentsObject(Object* callee, int length) { | |
3573 // To get fast allocation and map sharing for arguments objects we | |
3574 // allocate them based on an arguments boilerplate. | |
3575 | |
3576 JSObject* boilerplate; | |
3577 int arguments_object_size; | |
3578 bool strict_mode_callee = callee->IsJSFunction() && | |
3579 JSFunction::cast(callee)->shared()->strict_mode() == STRICT; | |
3580 if (strict_mode_callee) { | |
3581 boilerplate = | |
3582 isolate()->context()->native_context()->strict_arguments_boilerplate(); | |
3583 arguments_object_size = kStrictArgumentsObjectSize; | |
3584 } else { | |
3585 boilerplate = | |
3586 isolate()->context()->native_context()->sloppy_arguments_boilerplate(); | |
3587 arguments_object_size = kSloppyArgumentsObjectSize; | |
3588 } | |
3589 | |
3590 // Check that the size of the boilerplate matches our | |
3591 // expectations. The ArgumentsAccessStub::GenerateNewObject relies | |
3592 // on the size being a known constant. | |
3593 ASSERT(arguments_object_size == boilerplate->map()->instance_size()); | |
3594 | |
3595 // Do the allocation. | |
3596 HeapObject* result; | |
3597 { AllocationResult allocation = | |
3598 AllocateRaw(arguments_object_size, NEW_SPACE, OLD_POINTER_SPACE); | |
3599 if (!allocation.To(&result)) return allocation; | |
3600 } | |
3601 | |
3602 // Copy the content. The arguments boilerplate doesn't have any | |
3603 // fields that point to new space so it's safe to skip the write | |
3604 // barrier here. | |
3605 CopyBlock(result->address(), boilerplate->address(), JSObject::kHeaderSize); | |
3606 | |
3607 // Set the length property. | |
3608 JSObject* js_obj = JSObject::cast(result); | |
3609 js_obj->InObjectPropertyAtPut( | |
3610 kArgumentsLengthIndex, Smi::FromInt(length), SKIP_WRITE_BARRIER); | |
3611 // Set the callee property for sloppy mode arguments object only. | |
3612 if (!strict_mode_callee) { | |
3613 js_obj->InObjectPropertyAtPut(kArgumentsCalleeIndex, callee); | |
3614 } | |
3615 | |
3616 // Check the state of the object | |
3617 ASSERT(js_obj->HasFastProperties()); | |
3618 ASSERT(js_obj->HasFastObjectElements()); | |
3619 | |
3620 return js_obj; | |
3621 } | |
3622 | |
3623 | |
3624 void Heap::InitializeJSObjectFromMap(JSObject* obj, | 3572 void Heap::InitializeJSObjectFromMap(JSObject* obj, |
3625 FixedArray* properties, | 3573 FixedArray* properties, |
3626 Map* map) { | 3574 Map* map) { |
3627 obj->set_properties(properties); | 3575 obj->set_properties(properties); |
3628 obj->initialize_elements(); | 3576 obj->initialize_elements(); |
3629 // TODO(1240798): Initialize the object's body using valid initial values | 3577 // TODO(1240798): Initialize the object's body using valid initial values |
3630 // according to the object's initial map. For example, if the map's | 3578 // according to the object's initial map. For example, if the map's |
3631 // instance type is JS_ARRAY_TYPE, the length field should be initialized | 3579 // instance type is JS_ARRAY_TYPE, the length field should be initialized |
3632 // to a number (e.g. Smi::FromInt(0)) and the elements initialized to a | 3580 // to a number (e.g. Smi::FromInt(0)) and the elements initialized to a |
3633 // fixed array (e.g. Heap::empty_fixed_array()). Currently, the object | 3581 // fixed array (e.g. Heap::empty_fixed_array()). Currently, the object |
(...skipping 2829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6463 static_cast<int>(object_sizes_last_time_[index])); | 6411 static_cast<int>(object_sizes_last_time_[index])); |
6464 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) | 6412 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) |
6465 #undef ADJUST_LAST_TIME_OBJECT_COUNT | 6413 #undef ADJUST_LAST_TIME_OBJECT_COUNT |
6466 | 6414 |
6467 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); | 6415 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); |
6468 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); | 6416 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); |
6469 ClearObjectStats(); | 6417 ClearObjectStats(); |
6470 } | 6418 } |
6471 | 6419 |
6472 } } // namespace v8::internal | 6420 } } // namespace v8::internal |
OLD | NEW |