Chromium Code Reviews| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index f8d080d676399d0eea6aebff3fc8ef0f0744d8ae..a03054653aa16cf014d8ffd83783a7ccd4d7c223 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -10267,25 +10267,21 @@ MaybeObject* JSObject::SetElement(uint32_t index, | 
| bool check_prototype, | 
| SetPropertyMode set_mode) { | 
| Isolate* isolate = GetIsolate(); | 
| - HandleScope scope(isolate); | 
| - Handle<JSObject> self(this); | 
| - Handle<Object> value(value_raw); | 
| // Check access rights if needed. | 
| if (IsAccessCheckNeeded()) { | 
| - Heap* heap = GetHeap(); | 
| - if (!heap->isolate()->MayIndexedAccess(*self, index, v8::ACCESS_SET)) { | 
| - heap->isolate()->ReportFailedAccessCheck(*self, v8::ACCESS_SET); | 
| - return *value; | 
| + if (!isolate->MayIndexedAccess(this, index, v8::ACCESS_SET)) { | 
| + isolate->ReportFailedAccessCheck(this, v8::ACCESS_SET); | 
| + return value_raw; | 
| } | 
| } | 
| if (IsJSGlobalProxy()) { | 
| Object* proto = GetPrototype(); | 
| - if (proto->IsNull()) return *value; | 
| + if (proto->IsNull()) return value_raw; | 
| ASSERT(proto->IsJSGlobalObject()); | 
| return JSObject::cast(proto)->SetElement(index, | 
| - *value, | 
| + value_raw, | 
| attributes, | 
| strict_mode, | 
| check_prototype, | 
| @@ -10295,7 +10291,7 @@ MaybeObject* JSObject::SetElement(uint32_t index, | 
| // Don't allow element properties to be redefined for external arrays. | 
| if (HasExternalArrayElements() && set_mode == DEFINE_PROPERTY) { | 
| Handle<Object> number = isolate->factory()->NewNumberFromUint(index); | 
| - Handle<Object> args[] = { self, number }; | 
| + Handle<Object> args[] = { handle(this), number }; | 
| Handle<Object> error = isolate->factory()->NewTypeError( | 
| "redef_external_array_element", HandleVector(args, ARRAY_SIZE(args))); | 
| return isolate->Throw(*error); | 
| @@ -10310,23 +10306,27 @@ MaybeObject* JSObject::SetElement(uint32_t index, | 
| dictionary->set_requires_slow_elements(); | 
| } | 
| + if (!(FLAG_harmony_observation && map()->is_observed())) { | 
| + return HasIndexedInterceptor() | 
| 
 
rafaelw
2012/11/13 13:18:44
consider factoring out into inline static?
 
Toon Verwaest
2012/11/13 13:38:08
+1
On 2012/11/13 13:18:44, rafaelw wrote:
 
rossberg
2012/11/13 13:47:44
Note that one version is handlified while the othe
 
rafaelw
2012/11/13 14:53:01
I'm not understanding why it wouldn't work, but I
 
rossberg
2012/11/13 15:33:13
Thing is, I could only factor it out in form of a
 
 | 
| + ? SetElementWithInterceptor( | 
| + index, value_raw, attributes, strict_mode, check_prototype, set_mode) | 
| + : SetElementWithoutInterceptor( | 
| + index, value_raw, attributes, strict_mode, check_prototype, set_mode); | 
| + } | 
| + | 
| // From here on, everything has to be handlified. | 
| - Handle<String> name; | 
| - Handle<Object> old_value(isolate->heap()->the_hole_value()); | 
| - Handle<Object> old_array_length; | 
| - PropertyAttributes old_attributes = ABSENT; | 
| - bool preexists = false; | 
| - if (FLAG_harmony_observation && map()->is_observed()) { | 
| - name = isolate->factory()->Uint32ToString(index); | 
| - preexists = self->HasLocalElement(index); | 
| - if (preexists) { | 
| - old_attributes = self->GetLocalPropertyAttribute(*name); | 
| - // TODO(observe): only read & set old_value if we have a data property | 
| - old_value = Object::GetElement(self, index); | 
| - } else if (self->IsJSArray()) { | 
| - // Store old array length in case adding an element grows the array. | 
| - old_array_length = handle(Handle<JSArray>::cast(self)->length()); | 
| - } | 
| + Handle<JSObject> self(this); | 
| + Handle<Object> value(value_raw); | 
| + PropertyAttributes old_attributes = self->GetLocalElementAttribute(index); | 
| + Handle<Object> old_value = isolate->factory()->the_hole_value(); | 
| + Handle<Object> old_length; | 
| + | 
| + if (old_attributes != ABSENT) { | 
| + // TODO(observe): only read & set old_value if we have a data property | 
| + old_value = Object::GetElement(self, index); | 
| + } else if (self->IsJSArray()) { | 
| + // Store old array length in case adding an element grows the array. | 
| + old_length = handle(Handle<JSArray>::cast(self)->length()); | 
| } | 
| // Check for lookup interceptor | 
| @@ -10339,23 +10339,19 @@ MaybeObject* JSObject::SetElement(uint32_t index, | 
| Handle<Object> hresult; | 
| if (!result->ToHandle(&hresult)) return result; | 
| - if (FLAG_harmony_observation && map()->is_observed()) { | 
| - PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name); | 
| - if (!preexists) { | 
| - EnqueueChangeRecord(self, "new", name, old_value); | 
| - if (self->IsJSArray() && | 
| - !old_array_length->SameValue(Handle<JSArray>::cast(self)->length())) { | 
| - EnqueueChangeRecord(self, "updated", | 
| - isolate->factory()->length_symbol(), | 
| - old_array_length); | 
| - } | 
| - } else if (new_attributes != old_attributes || old_value->IsTheHole()) { | 
| - EnqueueChangeRecord(self, "reconfigured", name, old_value); | 
| - } else { | 
| - Handle<Object> new_value = Object::GetElement(self, index); | 
| - if (!new_value->SameValue(*old_value)) | 
| - EnqueueChangeRecord(self, "updated", name, old_value); | 
| - } | 
| + Handle<String> name = isolate->factory()->Uint32ToString(index); | 
| + PropertyAttributes new_attributes = self->GetLocalElementAttribute(index); | 
| + if (old_attributes == ABSENT) { | 
| 
 
rafaelw
2012/11/13 13:18:44
nit: return early here. e.g.
if (old_attributes !
 
Toon Verwaest
2012/11/13 13:38:08
This doesn't seem possible, given that the value i
 
rafaelw
2012/11/13 13:41:25
You are correct. Sorry. Misread the code.
On 2012
 
 | 
| + EnqueueChangeRecord(self, "new", name, old_value); | 
| + if (self->IsJSArray() && | 
| + !old_length->SameValue(Handle<JSArray>::cast(self)->length())) { | 
| + EnqueueChangeRecord( | 
| + self, "updated", isolate->factory()->length_symbol(), old_length); | 
| + } | 
| + } else if (old_attributes != new_attributes || old_value->IsTheHole()) { | 
| + EnqueueChangeRecord(self, "reconfigured", name, old_value); | 
| + } else if (!old_value->SameValue(*Object::GetElement(self, index))) { | 
| + EnqueueChangeRecord(self, "updated", name, old_value); | 
| } | 
| return *hresult; |