Chromium Code Reviews| Index: src/objects.cc |
| diff --git a/src/objects.cc b/src/objects.cc |
| index a5da88a0b3b2e0b5e44b17e0918d17655ea38e09..d3212c64fe945dddb472bb7017dec53131d4057b 100644 |
| --- a/src/objects.cc |
| +++ b/src/objects.cc |
| @@ -4309,10 +4309,19 @@ Maybe<bool> Object::SetPropertyInternal(LookupIterator* it, |
| case LookupIterator::INTERCEPTOR: |
| if (it->HolderIsReceiverOrHiddenPrototype()) { |
| + Handle<Map> store_target_map = |
| + handle(it->GetStoreTarget()->map(), it->isolate()); |
| Maybe<bool> result = |
| JSObject::SetPropertyWithInterceptor(it, should_throw, value); |
| if (result.IsNothing() || result.FromJust()) return result; |
| + // Interceptor modified the store target but failed to set the |
| + // property. |
| + Utils::ApiCheck(*store_target_map == it->GetStoreTarget()->map(), |
| + it->IsElement() ? "v8::IndexedPropertySetterCallback" |
| + : "v8::NamedPropertySetterCallback", |
| + "Interceptor silently changed store target."); |
| } else { |
| + Handle<JSObject> store_target = it->GetStoreTarget(); |
| Maybe<PropertyAttributes> maybe_attributes = |
| JSObject::GetPropertyAttributesWithInterceptor(it); |
| if (!maybe_attributes.IsJust()) return Nothing<bool>(); |
| @@ -4320,6 +4329,12 @@ Maybe<bool> Object::SetPropertyInternal(LookupIterator* it, |
| if ((maybe_attributes.FromJust() & READ_ONLY) != 0) { |
| return WriteToReadOnlyProperty(it, value, should_throw); |
| } |
| + // Interceptor modified the store target but failed to set the |
| + // property. |
| + Utils::ApiCheck(*store_target == *it->GetStoreTarget(), |
|
Toon Verwaest
2016/06/21 13:09:24
Don't you want to do exactly the same check in bot
|
| + it->IsElement() ? "v8::IndexedPropertySetterCallback" |
| + : "v8::NamedPropertySetterCallback", |
| + "Interceptor silently changed store target."); |
| *found = false; |
| return Nothing<bool>(); |
| } |