Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 92e4dc4c8c9c98f03a6267e2f393dda5c4312803..c5a9a7c10cd429cdd4898ab901a23f9b0ba9fb43 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -10501,20 +10501,22 @@ Map* Code::FindFirstMap() { |
} |
-void Code::ReplaceNthObject(int n, |
- Map* match_map, |
- Object* replace_with) { |
+void Code::FindAndReplace(const FindAndReplacePattern& pattern) { |
ASSERT(is_inline_cache_stub() || is_handler()); |
DisallowHeapAllocation no_allocation; |
int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
+ STATIC_ASSERT(FindAndReplacePattern::kMaxCount < 32); |
+ unsigned remaining_set = (1u << pattern.count_) - 1; |
for (RelocIterator it(this, mask); !it.done(); it.next()) { |
RelocInfo* info = it.rinfo(); |
Object* object = info->target_object(); |
if (object->IsHeapObject()) { |
- if (HeapObject::cast(object)->map() == match_map) { |
- if (--n == 0) { |
- info->set_target_object(replace_with); |
- return; |
+ Map* map = HeapObject::cast(object)->map(); |
+ for (int i = 0; i < pattern.count_; i++) { |
+ if (((remaining_set >> i) & 1) && map == *pattern.find_[i]) { |
+ info->set_target_object(*pattern.replace_[i]); |
+ remaining_set ^= 1u << i; |
+ if (!remaining_set) return; |
} |
} |
Toon Verwaest
2014/03/17 09:40:14
Why don't we just introduce an invariant that the
ulan
2014/03/17 13:43:31
Good idea, turned that into O(m) and added comment
|
} |
@@ -10550,11 +10552,6 @@ void Code::FindAllTypes(TypeHandleList* types) { |
} |
-void Code::ReplaceFirstMap(Map* replace_with) { |
- ReplaceNthObject(1, GetHeap()->meta_map(), replace_with); |
-} |
- |
- |
Code* Code::FindFirstHandler() { |
ASSERT(is_inline_cache_stub()); |
DisallowHeapAllocation no_allocation; |
@@ -10600,21 +10597,6 @@ Name* Code::FindFirstName() { |
} |
-void Code::ReplaceNthCell(int n, Cell* replace_with) { |
- ASSERT(is_inline_cache_stub()); |
- DisallowHeapAllocation no_allocation; |
- int mask = RelocInfo::ModeMask(RelocInfo::CELL); |
- for (RelocIterator it(this, mask); !it.done(); it.next()) { |
- RelocInfo* info = it.rinfo(); |
- if (--n == 0) { |
- info->set_target_cell(replace_with); |
- return; |
- } |
- } |
- UNREACHABLE(); |
-} |
- |
- |
void Code::ClearInlineCaches() { |
ClearInlineCaches(NULL); |
} |