mirror of https://github.com/python/cpython
Merge 3.5: Issue #26799
This commit is contained in:
commit
c88390f02d
|
@ -651,6 +651,7 @@ Catalin Iacob
|
||||||
Mihai Ibanescu
|
Mihai Ibanescu
|
||||||
Ali Ikinci
|
Ali Ikinci
|
||||||
Aaron Iles
|
Aaron Iles
|
||||||
|
Thomas Ilsche
|
||||||
Lars Immisch
|
Lars Immisch
|
||||||
Bobby Impollonia
|
Bobby Impollonia
|
||||||
Naoki Inada
|
Naoki Inada
|
||||||
|
|
|
@ -1065,6 +1065,11 @@ Windows
|
||||||
Tools/Demos
|
Tools/Demos
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
- 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.
|
||||||
|
|
||||||
- Issue #26271: Fix the Freeze tool to properly use flags passed through
|
- Issue #26271: Fix the Freeze tool to properly use flags passed through
|
||||||
configure. Patch by Daniel Shaulov.
|
configure. Patch by Daniel Shaulov.
|
||||||
|
|
||||||
|
|
|
@ -56,16 +56,35 @@ if sys.version_info[0] >= 3:
|
||||||
long = int
|
long = int
|
||||||
|
|
||||||
# Look up the gdb.Type for some standard types:
|
# Look up the gdb.Type for some standard types:
|
||||||
_type_char_ptr = gdb.lookup_type('char').pointer() # char*
|
# Those need to be refreshed as types (pointer sizes) may change when
|
||||||
_type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned char*
|
# gdb loads different executables
|
||||||
_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()
|
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()
|
# value computed later, see PyUnicodeObjectPtr.proxy()
|
||||||
_is_pep393 = None
|
_is_pep393 = None
|
||||||
|
|
||||||
SIZEOF_VOID_P = _type_void_ptr.sizeof
|
|
||||||
|
def _sizeof_void_p():
|
||||||
|
return _type_void_ptr().sizeof
|
||||||
|
|
||||||
|
|
||||||
Py_TPFLAGS_HEAPTYPE = (1 << 9)
|
Py_TPFLAGS_HEAPTYPE = (1 << 9)
|
||||||
|
@ -460,8 +479,8 @@ def _PyObject_VAR_SIZE(typeobj, nitems):
|
||||||
|
|
||||||
return ( ( typeobj.field('tp_basicsize') +
|
return ( ( typeobj.field('tp_basicsize') +
|
||||||
nitems * typeobj.field('tp_itemsize') +
|
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)
|
).cast(_PyObject_VAR_SIZE._type_size_t)
|
||||||
_PyObject_VAR_SIZE._type_size_t = None
|
_PyObject_VAR_SIZE._type_size_t = None
|
||||||
|
|
||||||
|
@ -485,9 +504,9 @@ class HeapTypeObjectPtr(PyObjectPtr):
|
||||||
size = _PyObject_VAR_SIZE(typeobj, tsize)
|
size = _PyObject_VAR_SIZE(typeobj, tsize)
|
||||||
dictoffset += size
|
dictoffset += size
|
||||||
assert dictoffset > 0
|
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()
|
PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
|
||||||
dictptr = dictptr.cast(PyObjectPtrPtr)
|
dictptr = dictptr.cast(PyObjectPtrPtr)
|
||||||
return PyObjectPtr.from_pyobject_ptr(dictptr.dereference())
|
return PyObjectPtr.from_pyobject_ptr(dictptr.dereference())
|
||||||
|
@ -1004,7 +1023,7 @@ class PyBytesObjectPtr(PyObjectPtr):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
field_ob_size = self.field('ob_size')
|
field_ob_size = self.field('ob_size')
|
||||||
field_ob_sval = self.field('ob_sval')
|
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)])
|
return ''.join([chr(char_ptr[i]) for i in safe_range(field_ob_size)])
|
||||||
|
|
||||||
def proxyval(self, visited):
|
def proxyval(self, visited):
|
||||||
|
@ -1135,11 +1154,11 @@ class PyUnicodeObjectPtr(PyObjectPtr):
|
||||||
field_str = self.field('data')['any']
|
field_str = self.field('data')['any']
|
||||||
repr_kind = int(state['kind'])
|
repr_kind = int(state['kind'])
|
||||||
if repr_kind == 1:
|
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:
|
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:
|
elif repr_kind == 4:
|
||||||
field_str = field_str.cast(_type_unsigned_int_ptr)
|
field_str = field_str.cast(_type_unsigned_int_ptr())
|
||||||
else:
|
else:
|
||||||
# Python 3.2 and earlier
|
# Python 3.2 and earlier
|
||||||
field_length = long(self.field('length'))
|
field_length = long(self.field('length'))
|
||||||
|
|
Loading…
Reference in New Issue