| Index: src/heap.cc
|
| ===================================================================
|
| --- src/heap.cc (revision 564)
|
| +++ src/heap.cc (working copy)
|
| @@ -1242,7 +1242,7 @@
|
| int hash;
|
| if (number->IsSmi()) {
|
| hash = smi_get_hash(Smi::cast(number));
|
| - number_string_cache_->set(hash * 2, number, FixedArray::SKIP_WRITE_BARRIER);
|
| + number_string_cache_->set(hash * 2, number, SKIP_WRITE_BARRIER);
|
| } else {
|
| hash = double_get_hash(number->Number());
|
| number_string_cache_->set(hash * 2, number);
|
| @@ -1655,18 +1655,35 @@
|
|
|
| JSObject* boilerplate =
|
| Top::context()->global_context()->arguments_boilerplate();
|
| - Object* result = CopyJSObject(boilerplate);
|
| +
|
| + // Make the clone.
|
| + Map* map = boilerplate->map();
|
| + int object_size = map->instance_size();
|
| + Object* result = new_space_.AllocateRaw(object_size);
|
| if (result->IsFailure()) return result;
|
| + ASSERT(Heap::InNewSpace(result));
|
|
|
| - Object* obj = JSObject::cast(result)->properties();
|
| - FixedArray::cast(obj)->set(arguments_callee_index, callee);
|
| - FixedArray::cast(obj)->set(arguments_length_index, Smi::FromInt(length));
|
| + // Copy the content.
|
| + CopyBlock(reinterpret_cast<Object**>(HeapObject::cast(result)->address()),
|
| + reinterpret_cast<Object**>(boilerplate->address()),
|
| + object_size);
|
|
|
| - // Allocate the fixed array.
|
| - obj = Heap::AllocateFixedArray(length);
|
| - if (obj->IsFailure()) return obj;
|
| - JSObject::cast(result)->set_elements(FixedArray::cast(obj));
|
| + // Set the two properties.
|
| + JSObject::cast(result)->InObjectPropertyAtPut(arguments_callee_index,
|
| + callee,
|
| + SKIP_WRITE_BARRIER);
|
| + JSObject::cast(result)->InObjectPropertyAtPut(arguments_length_index,
|
| + Smi::FromInt(length),
|
| + SKIP_WRITE_BARRIER);
|
|
|
| + // Allocate the elements if needed.
|
| + if (length > 0) {
|
| + // Allocate the fixed array.
|
| + Object* obj = Heap::AllocateFixedArray(length);
|
| + if (obj->IsFailure()) return obj;
|
| + JSObject::cast(result)->set_elements(FixedArray::cast(obj));
|
| + }
|
| +
|
| // Check the state of the object
|
| ASSERT(JSObject::cast(result)->HasFastProperties());
|
| ASSERT(JSObject::cast(result)->HasFastElements());
|
| @@ -2111,7 +2128,7 @@
|
| FixedArray* result = FixedArray::cast(obj);
|
| result->set_length(len);
|
| // Copy the content
|
| - FixedArray::WriteBarrierMode mode = result->GetWriteBarrierMode();
|
| + WriteBarrierMode mode = result->GetWriteBarrierMode();
|
| for (int i = 0; i < len; i++) result->set(i, src->get(i), mode);
|
| return result;
|
| }
|
| @@ -2124,8 +2141,11 @@
|
| reinterpret_cast<Array*>(result)->set_map(fixed_array_map());
|
| FixedArray* array = FixedArray::cast(result);
|
| array->set_length(length);
|
| + Object* value = undefined_value();
|
| // Initialize body.
|
| - for (int index = 0; index < length; index++) array->set_undefined(index);
|
| + for (int index = 0; index < length; index++) {
|
| + array->set(index, value, SKIP_WRITE_BARRIER);
|
| + }
|
| }
|
| return result;
|
| }
|
| @@ -2150,7 +2170,10 @@
|
| reinterpret_cast<Array*>(result)->set_map(fixed_array_map());
|
| FixedArray* array = FixedArray::cast(result);
|
| array->set_length(length);
|
| - for (int index = 0; index < length; index++) array->set_undefined(index);
|
| + Object* value = undefined_value();
|
| + for (int index = 0; index < length; index++) {
|
| + array->set(index, value, SKIP_WRITE_BARRIER);
|
| + }
|
| return array;
|
| }
|
|
|
| @@ -2164,7 +2187,10 @@
|
| FixedArray* array = FixedArray::cast(result);
|
| array->set_length(length);
|
| // Initialize body.
|
| - for (int index = 0; index < length; index++) array->set_the_hole(index);
|
| + Object* value = the_hole_value();
|
| + for (int index = 0; index < length; index++) {
|
| + array->set(index, value, SKIP_WRITE_BARRIER);
|
| + }
|
| }
|
| return result;
|
| }
|
|
|