From 436098b4a27251376e391ed632ea27e52bcdb446 Mon Sep 17 00:00:00 2001 From: "svenpanne@chromium.org" Date: Fri, 13 Apr 2012 09:35:18 +0000 Subject: [PATCH] Prepare DefinePropertyAccessor for callback transitions. Although things are currently OK here, in the future it won't be enough to check for the existence of a CALLBACKS result, we must additionally check that it actually contains an accessor. In a nutshell: 'sed s/IsFound/IsProperty/' once again... Additionally, the control flow in DefinePropertyAccessor has been simplified by using a helper function. Review URL: https://chromiumcodereview.appspot.com/10071009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11305 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects.cc | 36 ++++++++++++++---------------------- src/objects.h | 1 + 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/objects.cc b/src/objects.cc index a4f63a1..961876b 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -4410,37 +4410,29 @@ MaybeObject* JSObject::DefineElementAccessor(uint32_t index, } -MaybeObject* JSObject::DefinePropertyAccessor(String* name, - Object* getter, - Object* setter, - PropertyAttributes attributes) { - // Lookup the name. +MaybeObject* JSObject::CreateAccessorPairFor(String* name) { LookupResult result(GetHeap()->isolate()); LocalLookupRealNamedProperty(name, &result); - if (result.IsFound()) { - if (result.type() == CALLBACKS) { - ASSERT(!result.IsDontDelete()); - Object* obj = result.GetCallbackObject(); - // Need to preserve old getters/setters. - if (obj->IsAccessorPair()) { - AccessorPair* copy; - { MaybeObject* maybe_copy = - AccessorPair::cast(obj)->CopyWithoutTransitions(); - if (!maybe_copy->To(©)) return maybe_copy; - } - copy->SetComponents(getter, setter); - // Use set to update attributes. - return SetPropertyCallback(name, copy, attributes); - } + if (result.IsProperty() && result.type() == CALLBACKS) { + ASSERT(!result.IsDontDelete()); + Object* obj = result.GetCallbackObject(); + if (obj->IsAccessorPair()) { + return AccessorPair::cast(obj)->CopyWithoutTransitions(); } } + return GetHeap()->AllocateAccessorPair(); +} + +MaybeObject* JSObject::DefinePropertyAccessor(String* name, + Object* getter, + Object* setter, + PropertyAttributes attributes) { AccessorPair* accessors; - { MaybeObject* maybe_accessors = GetHeap()->AllocateAccessorPair(); + { MaybeObject* maybe_accessors = CreateAccessorPairFor(name); if (!maybe_accessors->To(&accessors)) return maybe_accessors; } accessors->SetComponents(getter, setter); - return SetPropertyCallback(name, accessors, attributes); } diff --git a/src/objects.h b/src/objects.h index 147dc00..b728d0c 100644 --- a/src/objects.h +++ b/src/objects.h @@ -2186,6 +2186,7 @@ class JSObject: public JSReceiver { Object* getter, Object* setter, PropertyAttributes attributes); + MUST_USE_RESULT MaybeObject* CreateAccessorPairFor(String* name); MUST_USE_RESULT MaybeObject* DefinePropertyAccessor( String* name, Object* getter, -- 2.7.4