OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 10093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10104 return statement_position; | 10104 return statement_position; |
10105 } | 10105 } |
10106 | 10106 |
10107 | 10107 |
10108 SafepointEntry Code::GetSafepointEntry(Address pc) { | 10108 SafepointEntry Code::GetSafepointEntry(Address pc) { |
10109 SafepointTable table(this); | 10109 SafepointTable table(this); |
10110 return table.FindEntry(pc); | 10110 return table.FindEntry(pc); |
10111 } | 10111 } |
10112 | 10112 |
10113 | 10113 |
10114 Map* Code::FindFirstMap() { | 10114 Object* Code::FindNthObject(int n, Map* match_map) { |
10115 ASSERT(is_inline_cache_stub()); | 10115 ASSERT(is_inline_cache_stub()); |
10116 DisallowHeapAllocation no_allocation; | 10116 DisallowHeapAllocation no_allocation; |
10117 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10117 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10118 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10118 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10119 RelocInfo* info = it.rinfo(); | 10119 RelocInfo* info = it.rinfo(); |
10120 Object* object = info->target_object(); | 10120 Object* object = info->target_object(); |
10121 if (object->IsMap()) return Map::cast(object); | 10121 if (object->IsHeapObject()) { |
| 10122 if (HeapObject::cast(object)->map() == match_map) { |
| 10123 if (--n == 0) return object; |
| 10124 } |
| 10125 } |
10122 } | 10126 } |
10123 return NULL; | 10127 return NULL; |
10124 } | 10128 } |
10125 | 10129 |
10126 | 10130 |
10127 void Code::ReplaceFirstMap(Map* replace_with) { | 10131 Map* Code::FindFirstMap() { |
| 10132 Object* result = FindNthObject(1, GetHeap()->meta_map()); |
| 10133 return (result != NULL) ? Map::cast(result) : NULL; |
| 10134 } |
| 10135 |
| 10136 |
| 10137 void Code::ReplaceNthObject(int n, |
| 10138 Map* match_map, |
| 10139 Object* replace_with) { |
10128 ASSERT(is_inline_cache_stub()); | 10140 ASSERT(is_inline_cache_stub()); |
10129 DisallowHeapAllocation no_allocation; | 10141 DisallowHeapAllocation no_allocation; |
10130 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10142 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10131 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10143 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10132 RelocInfo* info = it.rinfo(); | 10144 RelocInfo* info = it.rinfo(); |
10133 Object* object = info->target_object(); | 10145 Object* object = info->target_object(); |
10134 if (object->IsMap()) { | 10146 if (object->IsHeapObject()) { |
10135 info->set_target_object(replace_with); | 10147 if (HeapObject::cast(object)->map() == match_map) { |
10136 return; | 10148 if (--n == 0) { |
| 10149 info->set_target_object(replace_with); |
| 10150 return; |
| 10151 } |
| 10152 } |
10137 } | 10153 } |
10138 } | 10154 } |
10139 UNREACHABLE(); | 10155 UNREACHABLE(); |
10140 } | 10156 } |
10141 | 10157 |
10142 | 10158 |
10143 void Code::FindAllMaps(MapHandleList* maps) { | 10159 void Code::FindAllMaps(MapHandleList* maps) { |
10144 ASSERT(is_inline_cache_stub()); | 10160 ASSERT(is_inline_cache_stub()); |
10145 DisallowHeapAllocation no_allocation; | 10161 DisallowHeapAllocation no_allocation; |
10146 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10162 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10147 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10163 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10148 RelocInfo* info = it.rinfo(); | 10164 RelocInfo* info = it.rinfo(); |
10149 Object* object = info->target_object(); | 10165 Object* object = info->target_object(); |
10150 if (object->IsMap()) maps->Add(Handle<Map>(Map::cast(object))); | 10166 if (object->IsMap()) maps->Add(Handle<Map>(Map::cast(object))); |
10151 } | 10167 } |
10152 } | 10168 } |
10153 | 10169 |
10154 | 10170 |
| 10171 void Code::ReplaceFirstMap(Map* replace_with) { |
| 10172 ReplaceNthObject(1, GetHeap()->meta_map(), replace_with); |
| 10173 } |
| 10174 |
| 10175 |
10155 Code* Code::FindFirstCode() { | 10176 Code* Code::FindFirstCode() { |
10156 ASSERT(is_inline_cache_stub()); | 10177 ASSERT(is_inline_cache_stub()); |
10157 DisallowHeapAllocation no_allocation; | 10178 DisallowHeapAllocation no_allocation; |
10158 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); | 10179 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET); |
10159 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10180 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10160 RelocInfo* info = it.rinfo(); | 10181 RelocInfo* info = it.rinfo(); |
10161 return Code::GetCodeFromTargetAddress(info->target_address()); | 10182 return Code::GetCodeFromTargetAddress(info->target_address()); |
10162 } | 10183 } |
10163 return NULL; | 10184 return NULL; |
10164 } | 10185 } |
(...skipping 21 matching lines...) Expand all Loading... |
10186 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 10207 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
10187 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10208 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10188 RelocInfo* info = it.rinfo(); | 10209 RelocInfo* info = it.rinfo(); |
10189 Object* object = info->target_object(); | 10210 Object* object = info->target_object(); |
10190 if (object->IsName()) return Name::cast(object); | 10211 if (object->IsName()) return Name::cast(object); |
10191 } | 10212 } |
10192 return NULL; | 10213 return NULL; |
10193 } | 10214 } |
10194 | 10215 |
10195 | 10216 |
| 10217 void Code::ReplaceNthCell(int n, Cell* replace_with) { |
| 10218 ASSERT(is_inline_cache_stub()); |
| 10219 DisallowHeapAllocation no_allocation; |
| 10220 int mask = RelocInfo::ModeMask(RelocInfo::CELL); |
| 10221 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
| 10222 RelocInfo* info = it.rinfo(); |
| 10223 if (--n == 0) { |
| 10224 info->set_target_cell(replace_with); |
| 10225 return; |
| 10226 } |
| 10227 } |
| 10228 UNREACHABLE(); |
| 10229 } |
| 10230 |
| 10231 |
10196 void Code::ClearInlineCaches() { | 10232 void Code::ClearInlineCaches() { |
10197 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | | 10233 int mask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | |
10198 RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) | | 10234 RelocInfo::ModeMask(RelocInfo::CONSTRUCT_CALL) | |
10199 RelocInfo::ModeMask(RelocInfo::CODE_TARGET_WITH_ID) | | 10235 RelocInfo::ModeMask(RelocInfo::CODE_TARGET_WITH_ID) | |
10200 RelocInfo::ModeMask(RelocInfo::CODE_TARGET_CONTEXT); | 10236 RelocInfo::ModeMask(RelocInfo::CODE_TARGET_CONTEXT); |
10201 for (RelocIterator it(this, mask); !it.done(); it.next()) { | 10237 for (RelocIterator it(this, mask); !it.done(); it.next()) { |
10202 RelocInfo* info = it.rinfo(); | 10238 RelocInfo* info = it.rinfo(); |
10203 Code* target(Code::GetCodeFromTargetAddress(info->target_address())); | 10239 Code* target(Code::GetCodeFromTargetAddress(info->target_address())); |
10204 if (target->is_inline_cache_stub()) { | 10240 if (target->is_inline_cache_stub()) { |
10205 IC::Clear(info->pc()); | 10241 IC::Clear(info->pc()); |
(...skipping 5561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15767 return static_cast<Type*>(type_raw()); | 15803 return static_cast<Type*>(type_raw()); |
15768 } | 15804 } |
15769 | 15805 |
15770 | 15806 |
15771 void PropertyCell::set_type(Type* type, WriteBarrierMode ignored) { | 15807 void PropertyCell::set_type(Type* type, WriteBarrierMode ignored) { |
15772 set_type_raw(type, ignored); | 15808 set_type_raw(type, ignored); |
15773 } | 15809 } |
15774 | 15810 |
15775 | 15811 |
15776 } } // namespace v8::internal | 15812 } } // namespace v8::internal |
OLD | NEW |