Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index c88e26dace771e7c2e0c4d002287e1bcddc828db..01484120f19b21e9d7adfd665b842bcd1cf24664 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -1720,11 +1720,13 @@ MaybeObject* JSObject::AddProperty(String* name, |
Object* value, |
PropertyAttributes attributes, |
StrictModeFlag strict_mode, |
- JSReceiver::StoreFromKeyed store_mode) { |
+ JSReceiver::StoreFromKeyed store_mode, |
+ ExtensibilityCheck extensibility_check) { |
ASSERT(!IsJSGlobalProxy()); |
Map* map_of_this = map(); |
Heap* heap = GetHeap(); |
- if (!map_of_this->is_extensible()) { |
+ if (extensibility_check == PERFORM_EXTENSIBILITY_CHECK && |
+ !map_of_this->is_extensible()) { |
if (strict_mode == kNonStrictMode) { |
return value; |
} else { |
@@ -1763,7 +1765,8 @@ MaybeObject* JSObject::SetPropertyPostInterceptor( |
String* name, |
Object* value, |
PropertyAttributes attributes, |
- StrictModeFlag strict_mode) { |
+ StrictModeFlag strict_mode, |
+ ExtensibilityCheck extensibility_check) { |
// Check local property, ignore interceptor. |
LookupResult result(GetIsolate()); |
LocalLookupRealNamedProperty(name, &result); |
@@ -1778,7 +1781,8 @@ MaybeObject* JSObject::SetPropertyPostInterceptor( |
SetPropertyViaPrototypes(name, value, attributes, strict_mode, &done); |
if (done) return result_object; |
// Add a new real property. |
- return AddProperty(name, value, attributes, strict_mode); |
+ return AddProperty(name, value, attributes, strict_mode, |
+ MAY_BE_STORE_FROM_KEYED, extensibility_check); |
} |
@@ -1935,7 +1939,8 @@ MaybeObject* JSObject::SetPropertyWithInterceptor( |
this_handle->SetPropertyPostInterceptor(*name_handle, |
*value_handle, |
attributes, |
- strict_mode); |
+ strict_mode, |
+ PERFORM_EXTENSIBILITY_CHECK); |
RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
return raw_result; |
} |
@@ -3664,11 +3669,14 @@ MaybeObject* JSObject::GetHiddenPropertiesDictionary(bool create_if_absent) { |
MaybeObject* dict_alloc = StringDictionary::Allocate(kInitialSize); |
StringDictionary* dictionary; |
if (!dict_alloc->To<StringDictionary>(&dictionary)) return dict_alloc; |
- // Using AddProperty or SetPropertyPostInterceptor here could fail, because |
- // object might be non-extensible. |
- return HasFastProperties() |
- ? AddFastProperty(GetHeap()->hidden_symbol(), dictionary, DONT_ENUM) |
- : AddSlowProperty(GetHeap()->hidden_symbol(), dictionary, DONT_ENUM); |
+ MaybeObject* store_result = |
+ SetPropertyPostInterceptor(GetHeap()->hidden_symbol(), |
+ dictionary, |
+ DONT_ENUM, |
+ kNonStrictMode, |
+ OMIT_EXTENSIBILITY_CHECK); |
+ if (store_result->IsFailure()) return store_result; |
+ return dictionary; |
} |
@@ -3697,7 +3705,8 @@ MaybeObject* JSObject::SetHiddenPropertiesDictionary( |
SetPropertyPostInterceptor(GetHeap()->hidden_symbol(), |
dictionary, |
DONT_ENUM, |
- kNonStrictMode); |
+ kNonStrictMode, |
+ OMIT_EXTENSIBILITY_CHECK); |
if (store_result->IsFailure()) return store_result; |
return this; |
} |