From 7cb94437cb00b8c9b452533ec3b616e16851142d Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Mon, 16 Jul 2012 15:26:10 +0000 Subject: [PATCH] Remove LookupTransitionOrDescriptor altogether. Review URL: https://chromiumcodereview.appspot.com/10778011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12100 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/lithium-codegen-arm.cc | 2 +- src/hydrogen-instructions.cc | 23 +++++++---------------- src/ia32/lithium-codegen-ia32.cc | 2 +- src/objects.cc | 24 ++++-------------------- src/objects.h | 4 ---- 5 files changed, 13 insertions(+), 42 deletions(-) diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index fb687f7..3b83d90 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -2579,7 +2579,7 @@ void LCodeGen::EmitLoadFieldOrConstantFunction(Register result, Handle name, LEnvironment* env) { LookupResult lookup(isolate()); - type->LookupTransitionOrDescriptor(NULL, *name, &lookup); + type->LookupDescriptor(NULL, *name, &lookup); ASSERT(lookup.IsFound() || lookup.IsCacheable()); if (lookup.IsField()) { int index = lookup.GetLocalFieldIndexFromMap(*type); diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc index d76c1d7..e0caba1 100644 --- a/src/hydrogen-instructions.cc +++ b/src/hydrogen-instructions.cc @@ -1689,13 +1689,9 @@ static bool PrototypeChainCanNeverResolve( LookupResult lookup(isolate); Map* map = JSObject::cast(current)->map(); - map->LookupTransitionOrDescriptor(NULL, *name, &lookup); - if (lookup.IsFound()) { - if (!lookup.IsTransition()) return false; - } else if (!lookup.IsCacheable()) { - return false; - } - + map->LookupDescriptor(NULL, *name, &lookup); + if (lookup.IsFound()) return false; + if (!lookup.IsCacheable()) return false; current = JSObject::cast(current)->GetPrototype(); } return true; @@ -1720,7 +1716,7 @@ HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context, ++i) { Handle map = types->at(i); LookupResult lookup(map->GetIsolate()); - map->LookupTransitionOrDescriptor(NULL, *name, &lookup); + map->LookupDescriptor(NULL, *name, &lookup); if (lookup.IsFound()) { switch (lookup.type()) { case FIELD: { @@ -1739,10 +1735,6 @@ HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context, case CALLBACKS: break; case TRANSITION: - if (PrototypeChainCanNeverResolve(map, name)) { - negative_lookups.Add(types->at(i), zone); - } - break; case INTERCEPTOR: case NONEXISTENT: case NORMAL: @@ -1750,10 +1742,9 @@ HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context, UNREACHABLE(); break; } - } else if (lookup.IsCacheable()) { - if (PrototypeChainCanNeverResolve(map, name)) { - negative_lookups.Add(types->at(i), zone); - } + } else if (lookup.IsCacheable() && + PrototypeChainCanNeverResolve(map, name)) { + negative_lookups.Add(types->at(i), zone); } } diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 6317a54..5ec2bfa 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -2410,7 +2410,7 @@ void LCodeGen::EmitLoadFieldOrConstantFunction(Register result, Handle name, LEnvironment* env) { LookupResult lookup(isolate()); - type->LookupTransitionOrDescriptor(NULL, *name, &lookup); + type->LookupDescriptor(NULL, *name, &lookup); ASSERT(lookup.IsFound() || lookup.IsCacheable()); if (lookup.IsField()) { int index = lookup.GetLocalFieldIndexFromMap(*type); diff --git a/src/objects.cc b/src/objects.cc index ccb56cc..92de544 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -2150,20 +2150,6 @@ void Map::LookupTransition(JSObject* holder, } -void Map::LookupTransitionOrDescriptor(JSObject* holder, - String* name, - LookupResult* result) { - // AccessorPairs containing both a Descriptor and a Transition are shared - // between the DescriptorArray and the Transition array. This is why looking - // up the AccessorPair solely in the DescriptorArray works. - // TODO(verwaest) This should be implemented differently so the - // DescriptorArray is free of transitions; and so we can freely share it. - this->LookupDescriptor(holder, name, result); - if (result->IsFound()) return; - this->LookupTransition(holder, name, result); -} - - static bool ContainsMap(MapHandleList* maps, Handle map) { ASSERT(!map.is_null()); for (int i = 0; i < maps->length(); ++i) { @@ -4202,8 +4188,7 @@ void JSReceiver::LocalLookup(String* name, LookupResult* result) { } -void JSReceiver::Lookup(String* name, - LookupResult* result) { +void JSReceiver::Lookup(String* name, LookupResult* result) { // Ecma-262 3rd 8.6.2.4 Heap* heap = GetHeap(); for (Object* current = this; @@ -12545,10 +12530,9 @@ MaybeObject* StringDictionary::TransformPropertiesToFastFor( // Allocate the fixed array for the fields. Object* fields; - { MaybeObject* maybe_fields = - heap->AllocateFixedArray(number_of_allocated_fields); - if (!maybe_fields->ToObject(&fields)) return maybe_fields; - } + MaybeObject* maybe_fields = + heap->AllocateFixedArray(number_of_allocated_fields); + if (!maybe_fields->ToObject(&fields)) return maybe_fields; // Fill in the instance descriptor and the fields. int next_descriptor = 0; diff --git a/src/objects.h b/src/objects.h index 24d86fd..d4e4027 100644 --- a/src/objects.h +++ b/src/objects.h @@ -4905,10 +4905,6 @@ class Map: public HeapObject { String* name, LookupResult* result); - void LookupTransitionOrDescriptor(JSObject* holder, - String* name, - LookupResult* result); - MUST_USE_RESULT MaybeObject* RawCopy(int instance_size); MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors(); MUST_USE_RESULT MaybeObject* CopyDropDescriptors(); -- 2.7.4