Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index d8a05eb01c528f81c29d87cb8e83482d1450b986..73c5b5f101617f4ac5261fcf02d1fb65f668b8cd 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -4091,6 +4091,11 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( |
extensibility_check); |
} |
+ if (lookup.IsFound() && |
+ (lookup.type() == INTERCEPTOR || lookup.type() == CALLBACKS)) { |
+ LocalLookupRealNamedProperty(name_raw, &lookup); |
+ } |
+ |
// Check for accessor in prototype chain removed here in clone. |
if (!lookup.IsFound()) { |
// Neither properties nor transitions found. |
@@ -4132,31 +4137,14 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes( |
} |
break; |
case CALLBACKS: |
- // Callbacks are not guaranteed to be installed on the receiver. Also |
- // perform a local lookup again. Fall through. |
- case INTERCEPTOR: |
- self->LocalLookupRealNamedProperty(*name, &lookup); |
- if (lookup.IsFound()) { |
- if (lookup.IsPropertyCallbacks()) { |
- result = ConvertAndSetLocalProperty( |
- &lookup, *name, *value, attributes); |
- } else if (lookup.IsNormal()) { |
- result = self->ReplaceSlowProperty(*name, *value, attributes); |
- } else { |
- result = SetPropertyToFieldWithAttributes( |
- &lookup, name, value, attributes); |
- } |
- } else { |
- result = self->AddProperty( |
- *name, *value, attributes, kNonStrictMode, MAY_BE_STORE_FROM_KEYED, |
- extensibility_check, value_type, mode); |
- } |
+ result = ConvertAndSetLocalProperty(&lookup, *name, *value, attributes); |
break; |
case TRANSITION: |
result = SetPropertyUsingTransition(&lookup, name, value, attributes); |
break; |
- case HANDLER: |
case NONEXISTENT: |
+ case HANDLER: |
+ case INTERCEPTOR: |
UNREACHABLE(); |
} |