From: danno@chromium.org Date: Thu, 27 Jun 2013 13:36:15 +0000 (+0000) Subject: Generalize utilities to allow code templatization X-Git-Tag: upstream/4.7.83~13653 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c35dbc30cb281845c85df363e8fe2609849c2685;p=platform%2Fupstream%2Fv8.git Generalize utilities to allow code templatization R=mvstanton@chromium.org Review URL: https://codereview.chromium.org/17853004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15357 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/objects.cc b/src/objects.cc index 70019d8..7bdcd01 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -10109,29 +10109,45 @@ SafepointEntry Code::GetSafepointEntry(Address pc) { } -Map* Code::FindFirstMap() { +Object* Code::FindNthObject(int n, Map* match_map) { ASSERT(is_inline_cache_stub()); DisallowHeapAllocation no_allocation; int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); for (RelocIterator it(this, mask); !it.done(); it.next()) { RelocInfo* info = it.rinfo(); Object* object = info->target_object(); - if (object->IsMap()) return Map::cast(object); + if (object->IsHeapObject()) { + if (HeapObject::cast(object)->map() == match_map) { + if (--n == 0) return object; + } + } } return NULL; } -void Code::ReplaceFirstMap(Map* replace_with) { +Map* Code::FindFirstMap() { + Object* result = FindNthObject(1, GetHeap()->meta_map()); + return (result != NULL) ? Map::cast(result) : NULL; +} + + +void Code::ReplaceNthObject(int n, + Map* match_map, + Object* replace_with) { ASSERT(is_inline_cache_stub()); DisallowHeapAllocation no_allocation; int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); for (RelocIterator it(this, mask); !it.done(); it.next()) { RelocInfo* info = it.rinfo(); Object* object = info->target_object(); - if (object->IsMap()) { - info->set_target_object(replace_with); - return; + if (object->IsHeapObject()) { + if (HeapObject::cast(object)->map() == match_map) { + if (--n == 0) { + info->set_target_object(replace_with); + return; + } + } } } UNREACHABLE(); @@ -10150,6 +10166,11 @@ void Code::FindAllMaps(MapHandleList* maps) { } +void Code::ReplaceFirstMap(Map* replace_with) { + ReplaceNthObject(1, GetHeap()->meta_map(), replace_with); +} + + Code* Code::FindFirstCode() { ASSERT(is_inline_cache_stub()); DisallowHeapAllocation no_allocation; @@ -10191,6 +10212,21 @@ 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() { int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) | diff --git a/src/objects.h b/src/objects.h index 1afdddb..01c3157 100644 --- a/src/objects.h +++ b/src/objects.h @@ -4685,6 +4685,10 @@ class Code: public HeapObject { // Get the safepoint entry for the given pc. SafepointEntry GetSafepointEntry(Address pc); + // Find an object in a stub with a specified map + Object* FindNthObject(int n, Map* match_map); + void ReplaceNthObject(int n, Map* match_map, Object* replace_with); + // Find the first map in an IC stub. Map* FindFirstMap(); void FindAllMaps(MapHandleList* maps); @@ -4697,6 +4701,8 @@ class Code: public HeapObject { // Find the first name in an IC stub. Name* FindFirstName(); + void ReplaceNthCell(int n, Cell* replace_with); + class ExtraICStateStrictMode: public BitField {}; class ExtraICStateKeyedAccessStoreMode: public BitField {}; // NOLINT