diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2016-04-20 16:07:21 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2016-04-20 16:07:21 (GMT) |
commit | 4e75ca87e3995230cc5a206bdbf45b6604030117 (patch) | |
tree | ad0861eb1cbeb4a08db610d7857cafe88d17f224 /Tools/gdb | |
parent | 8f26565ba9e3d32f6c953b04c1b9f9d13c2e1818 (diff) | |
download | cpython-4e75ca87e3995230cc5a206bdbf45b6604030117.zip cpython-4e75ca87e3995230cc5a206bdbf45b6604030117.tar.gz cpython-4e75ca87e3995230cc5a206bdbf45b6604030117.tar.bz2 |
python-gdb.py: get C types at runtime
Issue #26799: Fix python-gdb.py: don't get once C types when the Python code
is loaded, but get C types on demande. The C types can change if
python-gdb.py is loaded before the Python executable.
Patch written by Thomas Ilsche.
Diffstat (limited to 'Tools/gdb')
-rwxr-xr-x | Tools/gdb/libpython.py | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py index 32341e7..d8b87c1 100755 --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -56,16 +56,35 @@ if sys.version_info[0] >= 3: long = int # Look up the gdb.Type for some standard types: -_type_char_ptr = gdb.lookup_type('char').pointer() # char* -_type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned char* -_type_void_ptr = gdb.lookup_type('void').pointer() # void* -_type_unsigned_short_ptr = gdb.lookup_type('unsigned short').pointer() -_type_unsigned_int_ptr = gdb.lookup_type('unsigned int').pointer() +# Those need to be refreshed as types (pointer sizes) may change when +# gdb loads different executables + + +def _type_char_ptr(): + return gdb.lookup_type('char').pointer() # char* + + +def _type_unsigned_char_ptr(): + return gdb.lookup_type('unsigned char').pointer() # unsigned char* + + +def _type_void_ptr(): + return gdb.lookup_type('void').pointer() # void* + + +def _type_unsigned_short_ptr(): + return gdb.lookup_type('unsigned short').pointer() + + +def _type_unsigned_int_ptr(): + return gdb.lookup_type('unsigned int').pointer() # value computed later, see PyUnicodeObjectPtr.proxy() _is_pep393 = None -SIZEOF_VOID_P = _type_void_ptr.sizeof + +def _sizeof_void_p(): + return _type_void_ptr().sizeof Py_TPFLAGS_HEAPTYPE = (1 << 9) @@ -460,8 +479,8 @@ def _PyObject_VAR_SIZE(typeobj, nitems): return ( ( typeobj.field('tp_basicsize') + nitems * typeobj.field('tp_itemsize') + - (SIZEOF_VOID_P - 1) - ) & ~(SIZEOF_VOID_P - 1) + (_sizeof_void_p() - 1) + ) & ~(_sizeof_void_p() - 1) ).cast(_PyObject_VAR_SIZE._type_size_t) _PyObject_VAR_SIZE._type_size_t = None @@ -485,9 +504,9 @@ class HeapTypeObjectPtr(PyObjectPtr): size = _PyObject_VAR_SIZE(typeobj, tsize) dictoffset += size assert dictoffset > 0 - assert dictoffset % SIZEOF_VOID_P == 0 + assert dictoffset % _sizeof_void_p() == 0 - dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset + dictptr = self._gdbval.cast(_type_char_ptr()) + dictoffset PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer() dictptr = dictptr.cast(PyObjectPtrPtr) return PyObjectPtr.from_pyobject_ptr(dictptr.dereference()) @@ -1004,7 +1023,7 @@ class PyBytesObjectPtr(PyObjectPtr): def __str__(self): field_ob_size = self.field('ob_size') field_ob_sval = self.field('ob_sval') - char_ptr = field_ob_sval.address.cast(_type_unsigned_char_ptr) + char_ptr = field_ob_sval.address.cast(_type_unsigned_char_ptr()) return ''.join([chr(char_ptr[i]) for i in safe_range(field_ob_size)]) def proxyval(self, visited): @@ -1135,11 +1154,11 @@ class PyUnicodeObjectPtr(PyObjectPtr): field_str = self.field('data')['any'] repr_kind = int(state['kind']) if repr_kind == 1: - field_str = field_str.cast(_type_unsigned_char_ptr) + field_str = field_str.cast(_type_unsigned_char_ptr()) elif repr_kind == 2: - field_str = field_str.cast(_type_unsigned_short_ptr) + field_str = field_str.cast(_type_unsigned_short_ptr()) elif repr_kind == 4: - field_str = field_str.cast(_type_unsigned_int_ptr) + field_str = field_str.cast(_type_unsigned_int_ptr()) else: # Python 3.2 and earlier field_length = long(self.field('length')) |