Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index b2110a9f811d5bf13d0a895178f49dc34d5d71a0..f0fed335117e9c7b4ab3dfc259f361b1d2c0e2f8 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -2920,6 +2920,9 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup, |
lookup, name_raw, value_raw, attributes, strict_mode, store_mode); |
} |
+ ASSERT(!lookup->IsFound() || lookup->holder() == this || |
+ lookup->holder()->map()->is_hidden_prototype()); |
+ |
// From this point on everything needs to be handlified, because |
// SetPropertyViaPrototypes might call back into JavaScript. |
HandleScope scope(isolate); |
@@ -2961,10 +2964,10 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup, |
MaybeObject* result = *value; |
switch (lookup->type()) { |
case NORMAL: |
- result = self->SetNormalizedProperty(lookup, *value); |
+ result = lookup->holder()->SetNormalizedProperty(lookup, *value); |
break; |
case FIELD: |
- result = self->FastPropertyAtPut( |
+ result = lookup->holder()->FastPropertyAtPut( |
lookup->GetFieldIndex().field_index(), *value); |
break; |
case CONSTANT_FUNCTION: |
@@ -2972,21 +2975,17 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup, |
if (*value == lookup->GetConstantFunction()) return *value; |
// Preserve the attributes of this existing property. |
attributes = lookup->GetAttributes(); |
- result = self->ConvertDescriptorToField(*name, *value, attributes); |
+ result = |
+ lookup->holder()->ConvertDescriptorToField(*name, *value, attributes); |
break; |
case CALLBACKS: { |
Object* callback_object = lookup->GetCallbackObject(); |
- return self->SetPropertyWithCallback(callback_object, |
- *name, |
- *value, |
- lookup->holder(), |
- strict_mode); |
+ return self->SetPropertyWithCallback( |
+ callback_object, *name, *value, lookup->holder(), strict_mode); |
} |
case INTERCEPTOR: |
- result = self->SetPropertyWithInterceptor(*name, |
- *value, |
- attributes, |
- strict_mode); |
+ result = lookup->holder()->SetPropertyWithInterceptor( |
+ *name, *value, attributes, strict_mode); |
break; |
case TRANSITION: { |
Map* transition_map = lookup->GetTransitionTarget(); |
@@ -2998,15 +2997,15 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup, |
if (details.type() == FIELD) { |
if (attributes == details.attributes()) { |
int field_index = descriptors->GetFieldIndex(descriptor); |
- result = self->AddFastPropertyUsingMap(transition_map, |
- *name, |
- *value, |
- field_index); |
+ result = lookup->holder()->AddFastPropertyUsingMap( |
+ transition_map, *name, *value, field_index); |
} else { |
- result = self->ConvertDescriptorToField(*name, *value, attributes); |
+ result = lookup->holder()->ConvertDescriptorToField( |
+ *name, *value, attributes); |
} |
} else if (details.type() == CALLBACKS) { |
- result = self->ConvertDescriptorToField(*name, *value, attributes); |
+ result = lookup->holder()->ConvertDescriptorToField( |
+ *name, *value, attributes); |
} else { |
ASSERT(details.type() == CONSTANT_FUNCTION); |
@@ -3014,12 +3013,12 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup, |
if (constant_function == *value) { |
// If the same constant function is being added we can simply |
// transition to the target map. |
- self->set_map(transition_map); |
+ lookup->holder()->set_map(transition_map); |
result = constant_function; |
} else { |
// Otherwise, replace with a map transition to a new map with a FIELD, |
// even if the value is a constant function. |
- result = self->ConvertTransitionToMapTransition( |
+ result = lookup->holder()->ConvertTransitionToMapTransition( |
lookup->GetTransitionIndex(), *name, *value, attributes); |
} |
} |