diff options
author | mstarzinger@chromium.org <mstarzinger@chromium.org> | 2012-06-13 11:58:18 +0000 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2012-06-14 01:37:14 +0200 |
commit | 48893af7bb7fef23a00b8fe672a1fd97e6cbd972 (patch) | |
tree | 1d962dcdb2c03598e16688bc11b73877e5abc695 /deps/v8/src | |
parent | 50464cd4f49e40f4fe792ff46a81052319a222e9 (diff) | |
download | node-48893af7bb7fef23a00b8fe672a1fd97e6cbd972.tar.gz |
Fix performance regression caused by r11202.
R=erik.corry@gmail.com
BUG=v8:2156,v8:2034
TEST=mjsunit/regress/regress-2156,mjsunit/regress/regress-2034
Review URL: https://chromiumcodereview.appspot.com/10539131
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@11800 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
Diffstat (limited to 'deps/v8/src')
-rw-r--r-- | deps/v8/src/objects.cc | 31 | ||||
-rw-r--r-- | deps/v8/src/objects.h | 13 |
2 files changed, 31 insertions, 13 deletions
diff --git a/deps/v8/src/objects.cc b/deps/v8/src/objects.cc index d3e649247..6314955b1 100644 --- a/deps/v8/src/objects.cc +++ b/deps/v8/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; } diff --git a/deps/v8/src/objects.h b/deps/v8/src/objects.h index 9aac37fcc..15ecdd141 100644 --- a/deps/v8/src/objects.h +++ b/deps/v8/src/objects.h @@ -1369,6 +1369,13 @@ class JSReceiver: public HeapObject { CERTAINLY_NOT_STORE_FROM_KEYED }; + // Internal properties (e.g. the hidden properties dictionary) might + // be added even though the receiver is non-extensible. + enum ExtensibilityCheck { + PERFORM_EXTENSIBILITY_CHECK, + OMIT_EXTENSIBILITY_CHECK + }; + // Casting. static inline JSReceiver* cast(Object* obj); @@ -1567,7 +1574,8 @@ class JSObject: public JSReceiver { String* name, Object* value, PropertyAttributes attributes, - StrictModeFlag strict_mode); + StrictModeFlag strict_mode, + ExtensibilityCheck extensibility_check); static Handle<Object> SetLocalPropertyIgnoreAttributes( Handle<JSObject> object, @@ -1959,7 +1967,8 @@ class JSObject: public JSReceiver { Object* value, PropertyAttributes attributes, StrictModeFlag strict_mode, - StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); + StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED, + ExtensibilityCheck extensibility_check = PERFORM_EXTENSIBILITY_CHECK); // Convert the object to use the canonical dictionary // representation. If the object is expected to have additional properties |