Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index ab3008fe65b95a599379cec3b87c9690fdcff44d..1f436354aaadebb0315ba34ac9ae911d2379e0c4 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -983,19 +983,18 @@ MaybeHandle<JSObject> JSObject::New(Handle<JSFunction> constructor, |
| return result; |
| } |
| - |
| -Handle<FixedArray> JSObject::EnsureWritableFastElements( |
| - Handle<JSObject> object) { |
| +void JSObject::EnsureWritableFastElements(Handle<JSObject> object) { |
| DCHECK(object->HasFastSmiOrObjectElements() || |
| object->HasFastStringWrapperElements()); |
| - Isolate* isolate = object->GetIsolate(); |
| - Handle<FixedArray> elems(FixedArray::cast(object->elements()), isolate); |
| - if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; |
| + FixedArray* raw_elems = FixedArray::cast(object->elements()); |
| + Heap* heap = object->GetHeap(); |
| + if (raw_elems->map() != heap->fixed_cow_array_map()) return; |
| + Isolate* isolate = heap->isolate(); |
| + Handle<FixedArray> elems(raw_elems, isolate); |
| Handle<FixedArray> writable_elems = isolate->factory()->CopyFixedArrayWithMap( |
| elems, isolate->factory()->fixed_array_map()); |
| object->set_elements(*writable_elems); |
| isolate->counters()->cow_arrays_converted()->Increment(); |
| - return writable_elems; |
| } |
| @@ -16249,10 +16248,16 @@ bool Map::IsValidElementsTransition(ElementsKind from_kind, |
| bool JSArray::HasReadOnlyLength(Handle<JSArray> array) { |
| - LookupIterator it(array, array->GetIsolate()->factory()->length_string(), |
| + Isolate* isolate = array->GetIsolate(); |
| + // Optimistic fast path: "length" is usually the first fast property. |
|
Camillo Bruni
2016/02/22 19:25:55
right :) makes sense
|
| + DescriptorArray* descriptors = array->map()->instance_descriptors(); |
| + if (descriptors->length() >= 1 && |
| + descriptors->GetKey(0) == isolate->heap()->length_string()) { |
| + return descriptors->GetDetails(0).IsReadOnly(); |
| + } |
| + |
| + LookupIterator it(array, isolate->factory()->length_string(), |
| LookupIterator::OWN_SKIP_INTERCEPTOR); |
| - CHECK_NE(LookupIterator::ACCESS_CHECK, it.state()); |
| - CHECK(it.IsFound()); |
| CHECK_EQ(LookupIterator::ACCESSOR, it.state()); |
| return it.IsReadOnly(); |
| } |