Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1163 | 1163 |
| 1164 | 1164 |
| 1165 static int GcSafeSizeOfCodeSpaceObject(HeapObject* object) { | 1165 static int GcSafeSizeOfCodeSpaceObject(HeapObject* object) { |
| 1166 MapWord map_word = object->map_word(); | 1166 MapWord map_word = object->map_word(); |
| 1167 Map* map = map_word.IsForwardingAddress() ? | 1167 Map* map = map_word.IsForwardingAddress() ? |
| 1168 map_word.ToForwardingAddress()->map() : map_word.ToMap(); | 1168 map_word.ToForwardingAddress()->map() : map_word.ToMap(); |
| 1169 return object->SizeFromMap(map); | 1169 return object->SizeFromMap(map); |
| 1170 } | 1170 } |
| 1171 | 1171 |
| 1172 | 1172 |
| 1173 Code* PcToCodeCache::GcSafeFindCodeForPc(Address pc) { | 1173 Code* PcToCodeCache::GcSafeFindCodeForPc(Address pc) { |
|
Rico
2011/09/20 09:10:35
We should consider renaming pc to something else s
| |
| 1174 Heap* heap = isolate_->heap(); | 1174 Heap* heap = isolate_->heap(); |
| 1175 // Check if the pc points into a large object chunk. | 1175 // Check if the pc points into a large object chunk. |
| 1176 LargePage* large_page = heap->lo_space()->FindPageContainingPc(pc); | 1176 LargePage* large_page = heap->lo_space()->FindPageContainingPc(pc); |
| 1177 if (large_page != NULL) return GcSafeCastToCode(large_page->GetObject(), pc); | 1177 if (large_page != NULL) return GcSafeCastToCode(large_page->GetObject(), pc); |
| 1178 | 1178 |
| 1179 // Iterate through the page until we reach the end or find an object starting | 1179 // Iterate through the page until we reach the end or find an object starting |
| 1180 // after the pc. | 1180 // after the pc. |
| 1181 Page* page = Page::FromAddress(pc); | 1181 Page* page = Page::FromAddress(pc); |
| 1182 | 1182 |
| 1183 Address addr = page->skip_list()->StartFor(pc); | 1183 Address addr = page->skip_list()->StartFor(pc); |
| 1184 | 1184 |
| 1185 Address top = heap->code_space()->top(); | 1185 Address top = heap->code_space()->top(); |
| 1186 Address limit = heap->code_space()->limit(); | 1186 Address limit = heap->code_space()->limit(); |
| 1187 | 1187 |
| 1188 while (true) { | 1188 while (true) { |
| 1189 if (addr == top && addr != limit) { | 1189 if (addr == top && addr != limit) { |
| 1190 addr = limit; | 1190 addr = limit; |
| 1191 continue; | 1191 continue; |
| 1192 } | 1192 } |
| 1193 | 1193 |
| 1194 HeapObject* obj = HeapObject::FromAddress(addr); | 1194 HeapObject* obj = HeapObject::FromAddress(addr); |
| 1195 int obj_size = GcSafeSizeOfCodeSpaceObject(obj); | 1195 int obj_size = GcSafeSizeOfCodeSpaceObject(obj); |
| 1196 Address next_addr = addr + obj_size; | 1196 Address next_addr = addr + obj_size; |
| 1197 if (next_addr >= pc) return GcSafeCastToCode(obj, pc); | 1197 if (next_addr > pc) return GcSafeCastToCode(obj, pc); |
| 1198 addr = next_addr; | 1198 addr = next_addr; |
| 1199 } | 1199 } |
| 1200 } | 1200 } |
| 1201 | 1201 |
| 1202 | 1202 |
| 1203 PcToCodeCache::PcToCodeCacheEntry* PcToCodeCache::GetCacheEntry(Address pc) { | 1203 PcToCodeCache::PcToCodeCacheEntry* PcToCodeCache::GetCacheEntry(Address pc) { |
| 1204 isolate_->counters()->pc_to_code()->Increment(); | 1204 isolate_->counters()->pc_to_code()->Increment(); |
| 1205 ASSERT(IsPowerOf2(kPcToCodeCacheSize)); | 1205 ASSERT(IsPowerOf2(kPcToCodeCacheSize)); |
| 1206 uint32_t hash = ComputeIntegerHash( | 1206 uint32_t hash = ComputeIntegerHash( |
| 1207 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(pc))); | 1207 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(pc))); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1287 ZoneList<StackFrame*> list(10); | 1287 ZoneList<StackFrame*> list(10); |
| 1288 for (StackFrameIterator it; !it.done(); it.Advance()) { | 1288 for (StackFrameIterator it; !it.done(); it.Advance()) { |
| 1289 StackFrame* frame = AllocateFrameCopy(it.frame()); | 1289 StackFrame* frame = AllocateFrameCopy(it.frame()); |
| 1290 list.Add(frame); | 1290 list.Add(frame); |
| 1291 } | 1291 } |
| 1292 return list.ToVector(); | 1292 return list.ToVector(); |
| 1293 } | 1293 } |
| 1294 | 1294 |
| 1295 | 1295 |
| 1296 } } // namespace v8::internal | 1296 } } // namespace v8::internal |
| OLD | NEW |