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; |