Index: src/heap.cc |
diff --git a/src/heap.cc b/src/heap.cc |
index d5c40ad154ad0e8de49a1ba86de2a659c352dbb7..b46ddfa89f4d9e4905dd5c21af60ff3f739dc2f5 100644 |
--- a/src/heap.cc |
+++ b/src/heap.cc |
@@ -7709,12 +7709,34 @@ int KeyedLookupCache::Hash(Map* map, Name* name) { |
} |
+int KeyedLookupCache::ConvertToFastIndexForGeneratedCode(Map* map, int index) { |
+ if (FLAG_compiled_keyed_generic_loads) { |
+ if (index >= map->inobject_properties()) { |
+ return -(index - map->inobject_properties() + 1); |
Toon Verwaest
2013/12/04 17:29:26
Seems like this should be combined with the code i
danno
2014/06/06 15:43:50
Well, essentially because they are are not the sam
|
+ } |
+ } |
+ return index; |
+} |
+ |
+ |
+int KeyedLookupCache::ConvertFromFastIndexForGeneratedCode(Map* map, |
+ int index) { |
+ if (FLAG_compiled_keyed_generic_loads) { |
+ if (index < 0) { |
+ return -index + map->inobject_properties() - 1; |
Toon Verwaest
2013/12/04 17:29:26
Same as above.
danno
2014/06/06 15:43:50
See my comment above.
|
+ } |
+ } |
+ return index; |
+} |
+ |
+ |
int KeyedLookupCache::Lookup(Map* map, Name* name) { |
int index = (Hash(map, name) & kHashMask); |
for (int i = 0; i < kEntriesPerBucket; i++) { |
Key& key = keys_[index + i]; |
if ((key.map == map) && key.name->Equals(name)) { |
- return field_offsets_[index + i]; |
+ int result = field_offsets_[index + i]; |
+ result = ConvertFromFastIndexForGeneratedCode(map, result); |
} |
} |
return kNotFound; |
@@ -7734,6 +7756,11 @@ void KeyedLookupCache::Update(Map* map, Name* name, int field_offset) { |
// cache to only contain old space names. |
ASSERT(!map->GetIsolate()->heap()->InNewSpace(name)); |
+ // Swizzle the field offset so that it's in the most efficient format to be |
+ // accessed in the cache from generated code: in-object properties are index |
+ // offsets and out-of-object are negative offsets. |
+ field_offset = ConvertToFastIndexForGeneratedCode(map, field_offset); |
+ |
int index = (Hash(map, name) & kHashMask); |
// After a GC there will be free slots, so we use them in order (this may |
// help to get the most frequently used one in position 0). |