| Index: tools/grokdump.py
|
| diff --git a/tools/grokdump.py b/tools/grokdump.py
|
| index 380bc4ab8f594df188a4043763e1a57ceef8d1cd..44f9518f63f282f32a8eed47a52de817fd08acbd 100755
|
| --- a/tools/grokdump.py
|
| +++ b/tools/grokdump.py
|
| @@ -523,13 +523,20 @@ INSTANCE_TYPES = {
|
| 66: "EXTERNAL_SYMBOL_TYPE",
|
| 74: "EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE",
|
| 70: "EXTERNAL_ASCII_SYMBOL_TYPE",
|
| + 82: "SHORT_EXTERNAL_SYMBOL_TYPE",
|
| + 90: "SHORT_EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE",
|
| + 86: "SHORT_EXTERNAL_ASCII_SYMBOL_TYPE",
|
| 0: "STRING_TYPE",
|
| 4: "ASCII_STRING_TYPE",
|
| 1: "CONS_STRING_TYPE",
|
| 5: "CONS_ASCII_STRING_TYPE",
|
| + 3: "SLICED_STRING_TYPE",
|
| 2: "EXTERNAL_STRING_TYPE",
|
| 10: "EXTERNAL_STRING_WITH_ASCII_DATA_TYPE",
|
| 6: "EXTERNAL_ASCII_STRING_TYPE",
|
| + 18: "SHORT_EXTERNAL_STRING_TYPE",
|
| + 26: "SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE",
|
| + 22: "SHORT_EXTERNAL_ASCII_STRING_TYPE",
|
| 6: "PRIVATE_EXTERNAL_ASCII_STRING_TYPE",
|
| 128: "MAP_TYPE",
|
| 129: "CODE_TYPE",
|
| @@ -538,43 +545,45 @@ INSTANCE_TYPES = {
|
| 132: "HEAP_NUMBER_TYPE",
|
| 133: "FOREIGN_TYPE",
|
| 134: "BYTE_ARRAY_TYPE",
|
| - 135: "EXTERNAL_BYTE_ARRAY_TYPE",
|
| - 136: "EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE",
|
| - 137: "EXTERNAL_SHORT_ARRAY_TYPE",
|
| - 138: "EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE",
|
| - 139: "EXTERNAL_INT_ARRAY_TYPE",
|
| - 140: "EXTERNAL_UNSIGNED_INT_ARRAY_TYPE",
|
| - 141: "EXTERNAL_FLOAT_ARRAY_TYPE",
|
| - 143: "EXTERNAL_PIXEL_ARRAY_TYPE",
|
| - 145: "FILLER_TYPE",
|
| - 146: "ACCESSOR_INFO_TYPE",
|
| - 147: "ACCESS_CHECK_INFO_TYPE",
|
| - 148: "INTERCEPTOR_INFO_TYPE",
|
| - 149: "CALL_HANDLER_INFO_TYPE",
|
| - 150: "FUNCTION_TEMPLATE_INFO_TYPE",
|
| - 151: "OBJECT_TEMPLATE_INFO_TYPE",
|
| - 152: "SIGNATURE_INFO_TYPE",
|
| - 153: "TYPE_SWITCH_INFO_TYPE",
|
| - 154: "SCRIPT_TYPE",
|
| - 155: "CODE_CACHE_TYPE",
|
| - 156: "POLYMORPHIC_CODE_CACHE_TYPE",
|
| - 159: "FIXED_ARRAY_TYPE",
|
| - 160: "SHARED_FUNCTION_INFO_TYPE",
|
| - 161: "JS_MESSAGE_OBJECT_TYPE",
|
| - 162: "JS_VALUE_TYPE",
|
| - 163: "JS_OBJECT_TYPE",
|
| - 164: "JS_CONTEXT_EXTENSION_OBJECT_TYPE",
|
| - 165: "JS_GLOBAL_OBJECT_TYPE",
|
| - 166: "JS_BUILTINS_OBJECT_TYPE",
|
| - 167: "JS_GLOBAL_PROXY_TYPE",
|
| - 168: "JS_ARRAY_TYPE",
|
| - 169: "JS_PROXY_TYPE",
|
| - 170: "JS_WEAK_MAP_TYPE",
|
| - 171: "JS_REGEXP_TYPE",
|
| - 172: "JS_FUNCTION_TYPE",
|
| - 173: "JS_FUNCTION_PROXY_TYPE",
|
| - 157: "DEBUG_INFO_TYPE",
|
| - 158: "BREAK_POINT_INFO_TYPE",
|
| + 135: "FREE_SPACE_TYPE",
|
| + 136: "EXTERNAL_BYTE_ARRAY_TYPE",
|
| + 137: "EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE",
|
| + 138: "EXTERNAL_SHORT_ARRAY_TYPE",
|
| + 139: "EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE",
|
| + 140: "EXTERNAL_INT_ARRAY_TYPE",
|
| + 141: "EXTERNAL_UNSIGNED_INT_ARRAY_TYPE",
|
| + 142: "EXTERNAL_FLOAT_ARRAY_TYPE",
|
| + 144: "EXTERNAL_PIXEL_ARRAY_TYPE",
|
| + 146: "FILLER_TYPE",
|
| + 147: "ACCESSOR_INFO_TYPE",
|
| + 148: "ACCESS_CHECK_INFO_TYPE",
|
| + 149: "INTERCEPTOR_INFO_TYPE",
|
| + 150: "CALL_HANDLER_INFO_TYPE",
|
| + 151: "FUNCTION_TEMPLATE_INFO_TYPE",
|
| + 152: "OBJECT_TEMPLATE_INFO_TYPE",
|
| + 153: "SIGNATURE_INFO_TYPE",
|
| + 154: "TYPE_SWITCH_INFO_TYPE",
|
| + 155: "SCRIPT_TYPE",
|
| + 156: "CODE_CACHE_TYPE",
|
| + 157: "POLYMORPHIC_CODE_CACHE_TYPE",
|
| + 160: "FIXED_ARRAY_TYPE",
|
| + 145: "FIXED_DOUBLE_ARRAY_TYPE",
|
| + 161: "SHARED_FUNCTION_INFO_TYPE",
|
| + 162: "JS_MESSAGE_OBJECT_TYPE",
|
| + 165: "JS_VALUE_TYPE",
|
| + 166: "JS_OBJECT_TYPE",
|
| + 167: "JS_CONTEXT_EXTENSION_OBJECT_TYPE",
|
| + 168: "JS_GLOBAL_OBJECT_TYPE",
|
| + 169: "JS_BUILTINS_OBJECT_TYPE",
|
| + 170: "JS_GLOBAL_PROXY_TYPE",
|
| + 171: "JS_ARRAY_TYPE",
|
| + 164: "JS_PROXY_TYPE",
|
| + 174: "JS_WEAK_MAP_TYPE",
|
| + 175: "JS_REGEXP_TYPE",
|
| + 176: "JS_FUNCTION_TYPE",
|
| + 163: "JS_FUNCTION_PROXY_TYPE",
|
| + 158: "DEBUG_INFO_TYPE",
|
| + 159: "BREAK_POINT_INFO_TYPE",
|
| }
|
|
|
|
|
| @@ -652,7 +661,7 @@ class HeapObject(object):
|
|
|
|
|
| class Map(HeapObject):
|
| - def InstanceTypeOffset():
|
| + def InstanceTypeOffset(self):
|
| return self.heap.PointerSize() + self.heap.IntSize()
|
|
|
| def __init__(self, heap, map, address):
|
| @@ -886,7 +895,7 @@ class Code(HeapObject):
|
| def HeaderSize(heap):
|
| return (heap.PointerSize() + heap.IntSize() + \
|
| 4 * heap.PointerSize() + 3 * heap.IntSize() + \
|
| - CODE_ALIGNMENT_MASK) & ~CODE_ALIGNMENT_MASK
|
| + Code.CODE_ALIGNMENT_MASK) & ~Code.CODE_ALIGNMENT_MASK
|
|
|
| def __init__(self, heap, map, address):
|
| HeapObject.__init__(self, heap, map, address)
|
| @@ -916,6 +925,9 @@ class V8Heap(object):
|
| "EXTERNAL_SYMBOL_TYPE": ExternalString,
|
| "EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE": ExternalString,
|
| "EXTERNAL_ASCII_SYMBOL_TYPE": ExternalString,
|
| + "SHORT_EXTERNAL_SYMBOL_TYPE": ExternalString,
|
| + "SHORT_EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE": ExternalString,
|
| + "SHORT_EXTERNAL_ASCII_SYMBOL_TYPE": ExternalString,
|
| "STRING_TYPE": SeqString,
|
| "ASCII_STRING_TYPE": SeqString,
|
| "CONS_STRING_TYPE": ConsString,
|
| @@ -945,7 +957,7 @@ class V8Heap(object):
|
| def FindObject(self, tagged_address):
|
| if tagged_address in self.objects:
|
| return self.objects[tagged_address]
|
| - if (tagged_address & 1) != 1: return None
|
| + if (tagged_address & self.ObjectAlignmentMask()) != 1: return None
|
| address = tagged_address - 1
|
| if not self.reader.IsValidAddress(address): return None
|
| map_tagged_address = self.reader.ReadUIntPtr(address)
|
| @@ -957,7 +969,7 @@ class V8Heap(object):
|
| meta_map.map = meta_map
|
| object = meta_map
|
| else:
|
| - map = self.FindObject(map_tagged_address)
|
| + map = self.FindMap(map_tagged_address)
|
| if map is None: return None
|
| instance_type_name = INSTANCE_TYPES.get(map.instance_type)
|
| if instance_type_name is None: return None
|
| @@ -966,9 +978,27 @@ class V8Heap(object):
|
| self.objects[tagged_address] = object
|
| return object
|
|
|
| + def FindMap(self, tagged_address):
|
| + if (tagged_address & self.MapAlignmentMask()) != 1: return None
|
| + address = tagged_address - 1
|
| + if not self.reader.IsValidAddress(address): return None
|
| + object = Map(self, None, address)
|
| + return object
|
| +
|
| + def IntSize(self):
|
| + return 4
|
| +
|
| def PointerSize(self):
|
| return self.reader.PointerSize()
|
|
|
| + def ObjectAlignmentMask(self):
|
| + return self.PointerSize() - 1
|
| +
|
| + def MapAlignmentMask(self):
|
| + if self.reader.arch == MD_CPU_ARCHITECTURE_AMD64:
|
| + return (1 << 4) - 1
|
| + elif self.reader.arch == MD_CPU_ARCHITECTURE_X86:
|
| + return (1 << 5) - 1
|
|
|
|
|
| EIP_PROXIMITY = 64
|
|
|