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
This commit is contained in:
verwaest@chromium.org 2012-07-16 15:26:10 +00:00
parent 77ccfe895c
commit 7cb94437cb
5 changed files with 13 additions and 42 deletions

View File

@ -2579,7 +2579,7 @@ void LCodeGen::EmitLoadFieldOrConstantFunction(Register result,
Handle<String> 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);

View File

@ -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> 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);
}
}

View File

@ -2410,7 +2410,7 @@ void LCodeGen::EmitLoadFieldOrConstantFunction(Register result,
Handle<String> 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);

View File

@ -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> 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;

View File

@ -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();