Index: src/handles.cc |
diff --git a/src/handles.cc b/src/handles.cc |
index 943a1c0b6ac833e1a0a5e614857e8bfd45a2e7ed..a02b36ca121d01cec7a06d49a0453f5d277f80fe 100644 |
--- a/src/handles.cc |
+++ b/src/handles.cc |
@@ -711,26 +711,54 @@ Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
isolate); |
} |
isolate->counters()->enum_cache_misses()->Increment(); |
+ Handle<Map> map(object->map()); |
int num_enum = object->NumberOfLocalProperties(DONT_ENUM); |
+ |
Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); |
Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum); |
+ |
+ Handle<FixedArray> indexes = |
+ isolate->factory()->NewFixedArray(num_enum); |
+ Handle<FixedArray> sort_array_2 = |
+ isolate->factory()->NewFixedArray(num_enum); |
+ |
Handle<DescriptorArray> descs = |
Handle<DescriptorArray>(object->map()->instance_descriptors(), isolate); |
+ |
for (int i = 0; i < descs->number_of_descriptors(); i++) { |
if (descs->IsProperty(i) && !descs->IsDontEnum(i)) { |
- (*storage)->set(index, descs->GetKey(i)); |
+ storage->set(index, descs->GetKey(i)); |
PropertyDetails details(descs->GetDetails(i)); |
- (*sort_array)->set(index, Smi::FromInt(details.index())); |
+ sort_array->set(index, Smi::FromInt(details.index())); |
+ if (!indexes.is_null()) { |
+ if (details.type() != FIELD) { |
+ indexes = Handle<FixedArray>(); |
+ sort_array_2 = Handle<FixedArray>(); |
+ } else { |
+ int field_index = Descriptor::IndexFromValue(descs->GetValue(i)); |
+ if (field_index >= map->inobject_properties()) { |
+ field_index = -(field_index - map->inobject_properties() + 1); |
+ } |
+ indexes->set(index, Smi::FromInt(field_index)); |
+ sort_array_2->set(index, Smi::FromInt(details.index())); |
+ } |
+ } |
index++; |
} |
} |
- (*storage)->SortPairs(*sort_array, sort_array->length()); |
+ storage->SortPairs(*sort_array, sort_array->length()); |
+ if (!indexes.is_null()) { |
fschneider
2012/02/20 14:56:06
s/indexes/indices/g
|
+ indexes->SortPairs(*sort_array_2, sort_array_2->length()); |
+ } |
if (cache_result) { |
Handle<FixedArray> bridge_storage = |
isolate->factory()->NewFixedArray( |
DescriptorArray::kEnumCacheBridgeLength); |
DescriptorArray* desc = object->map()->instance_descriptors(); |
- desc->SetEnumCache(*bridge_storage, *storage); |
+ desc->SetEnumCache(*bridge_storage, |
+ *storage, |
+ indexes.is_null() ? Object::cast(Smi::FromInt(0)) |
+ : Object::cast(*indexes)); |
} |
ASSERT(storage->length() == index); |
return storage; |