| 1781 | |
| 1782 | |
| 1783 | class V8Heap(object): |
| 1784 | CLASS_MAP = { |
| 1785 | "SYMBOL_TYPE": SeqString, |
| 1786 | "SEQ_TWO_BYTE_STRING_TYPE": SeqString, |
| 1787 | "SEQ_ONE_BYTE_STRING_TYPE": SeqString, |
| 1788 | "INTERNALIZED_TWO_BYTE_STRING_TYPE": SeqString, |
| 1789 | "INTERNALIZED_ONE_BYTE_STRING_TYPE": SeqString, |
| 1790 | "CONS_TWO_BYTE_STRING_TYPE": ConsString, |
| 1791 | "CONS_ONE_BYTE_STRING_TYPE": ConsString, |
| 1792 | "EXTERNAL_TWO_BYTE_STRING_TYPE": ExternalString, |
| 1793 | "EXTERNAL_ONE_BYTE_STRING_TYPE": ExternalString, |
| 1794 | "EXTERNAL_INTERNALIZED_TWO_BYTE_STRING_TYPE": ExternalString, |
| 1795 | "EXTERNAL_INTERNALIZED_ONE_BYTE_STRING_TYPE": ExternalString, |
| 1796 | "MAP_TYPE": Map, |
| 1797 | "ODDBALL_TYPE": Oddball, |
| 1798 | "FIXED_ARRAY_TYPE": FixedArray, |
| 1799 | "HASH_TABLE_TYPE": FixedArray, |
| 1800 | "OBJECT_BOILERPLATE_DESCRIPTION_TYPE": FixedArray, |
| 1801 | "SCOPE_INFO_TYPE": FixedArray, |
| 1802 | "JS_FUNCTION_TYPE": JSFunction, |
| 1803 | "SHARED_FUNCTION_INFO_TYPE": SharedFunctionInfo, |
| 1804 | "SCRIPT_TYPE": Script, |
| 1805 | "CODE_CACHE_TYPE": CodeCache, |
| 1806 | "CODE_TYPE": Code, |
| 1807 | } |
| 1808 | |
| 1809 | def __init__(self, reader, stack_map): |
| 1810 | self.reader = reader |
| 1811 | self.stack_map = stack_map |
| 1812 | self.objects = {} |
| 1813 | |
| 1814 | def FindObjectOrSmi(self, tagged_address): |
| 1815 | if self.IsSmi(tagged_address): return self.SmiUntag(tagged_address) |
| 1816 | return self.FindObject(tagged_address) |
| 1817 | |
| 1818 | def FindObject(self, tagged_address): |
| 1819 | if tagged_address in self.objects: |
| 1820 | return self.objects[tagged_address] |
| 1821 | if not self.IsTaggedObjectAddress(tagged_address): return None |
| 1822 | address = tagged_address - 1 |
| 1823 | if not self.reader.IsValidAddress(address): return None |
| 1824 | map_tagged_address = self.reader.ReadTagged(address) |
| 1825 | if tagged_address == map_tagged_address: |
| 1826 | # Meta map? |
| 1827 | meta_map = Map(self, None, address) |
| 1828 | instance_type_name = INSTANCE_TYPES.get(meta_map.instance_type) |
| 1829 | if instance_type_name != "MAP_TYPE": return None |
| 1830 | meta_map.map = meta_map |
| 1831 | object = meta_map |
| 1832 | else: |
| 1833 | map = self.FindMap(map_tagged_address) |
| 1834 | if map is None: return None |
| 1835 | instance_type_name = INSTANCE_TYPES.get(map.instance_type) |
| 1836 | if instance_type_name is None: return None |
| 1837 | cls = V8Heap.CLASS_MAP.get(instance_type_name, HeapObject) |
| 1838 | object = cls(self, map, address) |
| 1839 | self.objects[tagged_address] = object |
| 1840 | return object |
no outgoing calls
no test coverage detected
searching dependent graphs…