diff options
author | Mark Shannon <mark@hotpy.org> | 2024-04-02 10:59:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-02 10:59:21 (GMT) |
commit | c32dc47aca6e8fac152699bc613e015c44ccdba9 (patch) | |
tree | e183f7c56ad5e081879c3dd75f7e11887fe7e26c /Tools/gdb/libpython.py | |
parent | c97d3af2391e62ef456ef2365d48ab9b8cdbe27b (diff) | |
download | cpython-c32dc47aca6e8fac152699bc613e015c44ccdba9.zip cpython-c32dc47aca6e8fac152699bc613e015c44ccdba9.tar.gz cpython-c32dc47aca6e8fac152699bc613e015c44ccdba9.tar.bz2 |
GH-115776: Embed the values array into the object, for "normal" Python objects. (GH-116115)
Diffstat (limited to 'Tools/gdb/libpython.py')
-rwxr-xr-x | Tools/gdb/libpython.py | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 656667a..74165ac 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -66,10 +66,12 @@ def _type_unsigned_short_ptr(): def _type_unsigned_int_ptr(): return gdb.lookup_type('unsigned int').pointer() - def _sizeof_void_p(): return gdb.lookup_type('void').pointer().sizeof +def _sizeof_pyobject(): + return gdb.lookup_type('PyObject').sizeof + def _managed_dict_offset(): # See pycore_object.h pyobj = gdb.lookup_type("PyObject") @@ -79,6 +81,7 @@ def _managed_dict_offset(): return -3 * _sizeof_void_p() +Py_TPFLAGS_INLINE_VALUES = (1 << 2) Py_TPFLAGS_MANAGED_DICT = (1 << 4) Py_TPFLAGS_HEAPTYPE = (1 << 9) Py_TPFLAGS_LONG_SUBCLASS = (1 << 24) @@ -493,11 +496,12 @@ class HeapTypeObjectPtr(PyObjectPtr): has_values = int_from_int(typeobj.field('tp_flags')) & Py_TPFLAGS_MANAGED_DICT if not has_values: return None - ptr = self._gdbval.cast(_type_char_ptr()) + _managed_dict_offset() - char_ptr = ptr.cast(_type_char_ptr().pointer()).dereference() - if (int(char_ptr) & 1) == 0: + obj_ptr = self._gdbval.cast(_type_char_ptr()) + dict_ptr_ptr = obj_ptr + _managed_dict_offset() + dict_ptr = dict_ptr_ptr.cast(_type_char_ptr().pointer()).dereference() + if int(dict_ptr): return None - char_ptr += 1 + char_ptr = obj_ptr + _sizeof_pyobject() values_ptr = char_ptr.cast(gdb.lookup_type("PyDictValues").pointer()) values = values_ptr['values'] return PyKeysValuesPair(self.get_cached_keys(), values) |