[3.6] bpo-30345: Update test_gdb.py and python-gdb.py from master (#1… · python/cpython@d05f7fd (original) (raw)
`@@ -362,6 +362,7 @@ def subclass_from_type(cls, t):
`
362
362
`'set' : PySetObjectPtr,
`
363
363
`'frozenset' : PySetObjectPtr,
`
364
364
`'builtin_function_or_method' : PyCFunctionObjectPtr,
`
``
365
`+
'method-wrapper': wrapperobject,
`
365
366
` }
`
366
367
`if tp_name in name_map:
`
367
368
`return name_map[tp_name]
`
`@@ -1330,6 +1331,39 @@ def write_repr(self, out, visited):
`
1330
1331
`out.write(quote)
`
1331
1332
``
1332
1333
``
``
1334
`+
class wrapperobject(PyObjectPtr):
`
``
1335
`+
_typename = 'wrapperobject'
`
``
1336
+
``
1337
`+
def safe_name(self):
`
``
1338
`+
try:
`
``
1339
`+
name = self.field('descr')['d_base']['name'].string()
`
``
1340
`+
return repr(name)
`
``
1341
`+
except (NullPyObjectPtr, RuntimeError):
`
``
1342
`+
return ''
`
``
1343
+
``
1344
`+
def safe_tp_name(self):
`
``
1345
`+
try:
`
``
1346
`+
return self.field('self')['ob_type']['tp_name'].string()
`
``
1347
`+
except (NullPyObjectPtr, RuntimeError):
`
``
1348
`+
return ''
`
``
1349
+
``
1350
`+
def safe_self_addresss(self):
`
``
1351
`+
try:
`
``
1352
`+
address = long(self.field('self'))
`
``
1353
`+
return '%#x' % address
`
``
1354
`+
except (NullPyObjectPtr, RuntimeError):
`
``
1355
`+
return ''
`
``
1356
+
``
1357
`+
def proxyval(self, visited):
`
``
1358
`+
name = self.safe_name()
`
``
1359
`+
tp_name = self.safe_tp_name()
`
``
1360
`+
self_address = self.safe_self_addresss()
`
``
1361
`+
return ("<method-wrapper %s of %s object at %s>"
`
``
1362
`+
% (name, tp_name, self_address))
`
``
1363
+
``
1364
`+
def write_repr(self, out, visited):
`
``
1365
`+
proxy = self.proxyval(visited)
`
``
1366
`+
out.write(proxy)
`
1333
1367
``
1334
1368
``
1335
1369
`def int_from_int(gdbval):
`
`@@ -1364,11 +1398,13 @@ def to_string (self):
`
1364
1398
``
1365
1399
`def pretty_printer_lookup(gdbval):
`
1366
1400
`type = gdbval.type.unqualified()
`
1367
``
`-
if type.code == gdb.TYPE_CODE_PTR:
`
1368
``
`-
type = type.target().unqualified()
`
1369
``
`-
t = str(type)
`
1370
``
`-
if t in ("PyObject", "PyFrameObject", "PyUnicodeObject"):
`
1371
``
`-
return PyObjectPtrPrinter(gdbval)
`
``
1401
`+
if type.code != gdb.TYPE_CODE_PTR:
`
``
1402
`+
return None
`
``
1403
+
``
1404
`+
type = type.target().unqualified()
`
``
1405
`+
t = str(type)
`
``
1406
`+
if t in ("PyObject", "PyFrameObject", "PyUnicodeObject", "wrapperobject"):
`
``
1407
`+
return PyObjectPtrPrinter(gdbval)
`
1372
1408
``
1373
1409
`"""
`
1374
1410
`During development, I've been manually invoking the code in this way:
`
`@@ -1497,11 +1533,8 @@ def is_other_python_frame(self):
`
1497
1533
`return 'Garbage-collecting'
`
1498
1534
``
1499
1535
`# Detect invocations of PyCFunction instances:
`
1500
``
`-
older = self.older()
`
1501
``
`-
if not older:
`
1502
``
`-
return False
`
1503
``
-
1504
``
`-
caller = older._gdbframe.name()
`
``
1536
`+
frame = self._gdbframe
`
``
1537
`+
caller = frame.name()
`
1505
1538
`if not caller:
`
1506
1539
`return False
`
1507
1540
``
`@@ -1513,18 +1546,25 @@ def is_other_python_frame(self):
`
1513
1546
`# "self" is the (PyObject*) of the 'self'
`
1514
1547
`try:
`
1515
1548
`# Use the prettyprinter for the func:
`
1516
``
`-
func = older._gdbframe.read_var('func')
`
``
1549
`+
func = frame.read_var('func')
`
1517
1550
`return str(func)
`
1518
1551
`except RuntimeError:
`
1519
1552
`return 'PyCFunction invocation (unable to read "func")'
`
1520
1553
``
1521
1554
`elif caller == '_PyCFunction_FastCallDict':
`
1522
1555
`try:
`
1523
``
`-
func = older._gdbframe.read_var('func_obj')
`
``
1556
`+
func = frame.read_var('func_obj')
`
1524
1557
`return str(func)
`
1525
1558
`except RuntimeError:
`
1526
1559
`return 'PyCFunction invocation (unable to read "func_obj")'
`
1527
1560
``
``
1561
`+
if caller == 'wrapper_call':
`
``
1562
`+
try:
`
``
1563
`+
func = frame.read_var('wp')
`
``
1564
`+
return str(func)
`
``
1565
`+
except RuntimeError:
`
``
1566
`+
return ''
`
``
1567
+
1528
1568
`# This frame isn't worth reporting:
`
1529
1569
`return False
`
1530
1570
``