Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(882)

Unified Diff: src/heap.cc

Issue 57123002: Reland 21774: Generate KeyedLoadGeneric with Hydrogen (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Turn off by default Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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).

Powered by Google App Engine
This is Rietveld 408576698