annotate Tools/gdb/libpython.py @ 64570:a2aeddc19b66

Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well as wide (UCS4) unicode builds for both the host interpreter (embedded inside gdb) and the interpreter under test.
author Antoine Pitrou <solipsis@pitrou.net>
date Wed, 08 Sep 2010 20:57:48 +0000
parents fc794add559d
children b1cf3f7f304c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 #!/usr/bin/python
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
2 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
3 From gdb 7 onwards, gdb's build can be configured --with-python, allowing gdb
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4 to be extended with Python code e.g. for library-specific data visualizations,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5 such as for the C++ STL types. Documentation on this API can be seen at:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
6 http://sourceware.org/gdb/current/onlinedocs/gdb/Python-API.html
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
7
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9 This python module deals with the case when the process being debugged (the
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
10 "inferior process" in gdb parlance) is itself python, or more specifically,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
11 linked against libpython. In this situation, almost every item of data is a
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
12 (PyObject*), and having the debugger merely print their addresses is not very
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
13 enlightening.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
14
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
15 This module embeds knowledge about the implementation details of libpython so
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16 that we can emit useful visualizations e.g. a string, a list, a dict, a frame
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
17 giving file/line information and the state of local variables
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19 In particular, given a gdb.Value corresponding to a PyObject* in the inferior
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
20 process, we can generate a "proxy value" within the gdb process. For example,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21 given a PyObject* in the inferior process that is in fact a PyListObject*
60812
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
22 holding three PyObject* that turn out to be PyBytesObject* instances, we can
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
23 generate a proxy value within the gdb process that is a list of bytes
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
24 instances:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
25 [b"foo", b"bar", b"baz"]
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27 Doing so can be expensive for complicated graphs of objects, and could take
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
28 some time, so we also have a "write_repr" method that writes a representation
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
29 of the data to a file-like object. This allows us to stop the traversal by
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30 having the file-like object raise an exception if it gets too much data.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32 With both "proxyval" and "write_repr" we keep track of the set of all addresses
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33 visited so far in the traversal, to avoid infinite recursion due to cycles in
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
34 the graph of object references.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
35
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
36 We try to defer gdb.lookup_type() invocations for python types until as late as
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
37 possible: for a dynamically linked python binary, when the process starts in
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38 the debugger, the libpython.so hasn't been dynamically loaded yet, so none of
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
39 the type names are known to the debugger
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
40
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
41 The module also extends gdb with some python-specific commands.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
43 from __future__ import with_statement
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44 import gdb
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
45 import locale
63012
d30b9dffb86d #9235: fix missing import of sys.
Georg Brandl <georg@python.org>
parents: 63011
diff changeset
46 import sys
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
47
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48 # Look up the gdb.Type for some standard types:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
49 _type_char_ptr = gdb.lookup_type('char').pointer() # char*
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
50 _type_unsigned_char_ptr = gdb.lookup_type('unsigned char').pointer() # unsigned char*
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
51 _type_void_ptr = gdb.lookup_type('void').pointer() # void*
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
52 _type_size_t = gdb.lookup_type('size_t')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
53
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
54 SIZEOF_VOID_P = _type_void_ptr.sizeof
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
55
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
56
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
57 Py_TPFLAGS_HEAPTYPE = (1L << 9)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
58
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
59 Py_TPFLAGS_LONG_SUBCLASS = (1L << 24)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60 Py_TPFLAGS_LIST_SUBCLASS = (1L << 25)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
61 Py_TPFLAGS_TUPLE_SUBCLASS = (1L << 26)
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
62 Py_TPFLAGS_BYTES_SUBCLASS = (1L << 27)
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
63 Py_TPFLAGS_UNICODE_SUBCLASS = (1L << 28)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64 Py_TPFLAGS_DICT_SUBCLASS = (1L << 29)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
65 Py_TPFLAGS_BASE_EXC_SUBCLASS = (1L << 30)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
66 Py_TPFLAGS_TYPE_SUBCLASS = (1L << 31)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
67
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
68
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
69 MAX_OUTPUT_LEN=1024
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
70
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
71 hexdigits = "0123456789abcdef"
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
72
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
73 ENCODING = locale.getpreferredencoding()
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
74
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
75 class NullPyObjectPtr(RuntimeError):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
76 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
77
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
78
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
79 def safety_limit(val):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
80 # Given a integer value from the process being debugged, limit it to some
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
81 # safety threshold so that arbitrary breakage within said process doesn't
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
82 # break the gdb process too much (e.g. sizes of iterations, sizes of lists)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
83 return min(val, 1000)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
84
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
85
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
86 def safe_range(val):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
87 # As per range, but don't trust the value too much: cap it to a safety
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
88 # threshold in case the data was corrupted
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
89 return xrange(safety_limit(val))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
90
64134
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
91 def write_unicode(file, text):
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
92 # Write a byte or unicode string to file. Unicode strings are encoded to
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
93 # ENCODING encoding with 'backslashreplace' error handler to avoid
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
94 # UnicodeEncodeError.
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
95 if isinstance(text, unicode):
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
96 text = text.encode(ENCODING, 'backslashreplace')
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
97 file.write(text)
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
98
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
99 class StringTruncated(RuntimeError):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
100 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
101
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
102 class TruncatedStringIO(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
103 '''Similar to cStringIO, but can truncate the output by raising a
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
104 StringTruncated exception'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
105 def __init__(self, maxlen=None):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
106 self._val = ''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
107 self.maxlen = maxlen
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
108
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
109 def write(self, data):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
110 if self.maxlen:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
111 if len(data) + len(self._val) > self.maxlen:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
112 # Truncation:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
113 self._val += data[0:self.maxlen - len(self._val)]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
114 raise StringTruncated()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
115
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
116 self._val += data
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
117
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
118 def getvalue(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
119 return self._val
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
120
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
121 class PyObjectPtr(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
122 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
123 Class wrapping a gdb.Value that's a either a (PyObject*) within the
60812
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
124 inferior process, or some subclass pointer e.g. (PyBytesObject*)
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
125
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
126 There will be a subclass for every refined PyObject type that we care
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
127 about.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
128
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
129 Note that at every stage the underlying pointer could be NULL, point
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
130 to corrupt data, etc; this is the debugger, after all.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
131 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
132 _typename = 'PyObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
133
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
134 def __init__(self, gdbval, cast_to=None):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
135 if cast_to:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
136 self._gdbval = gdbval.cast(cast_to)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
137 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
138 self._gdbval = gdbval
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
139
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
140 def field(self, name):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
141 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
142 Get the gdb.Value for the given field within the PyObject, coping with
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
143 some python 2 versus python 3 differences.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
144
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
145 Various libpython types are defined using the "PyObject_HEAD" and
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
146 "PyObject_VAR_HEAD" macros.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
147
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
148 In Python 2, this these are defined so that "ob_type" and (for a var
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
149 object) "ob_size" are fields of the type in question.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
150
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
151 In Python 3, this is defined as an embedded PyVarObject type thus:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
152 PyVarObject ob_base;
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
153 so that the "ob_size" field is located insize the "ob_base" field, and
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
154 the "ob_type" is most easily accessed by casting back to a (PyObject*).
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
155 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
156 if self.is_null():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
157 raise NullPyObjectPtr(self)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
158
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
159 if name == 'ob_type':
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
160 pyo_ptr = self._gdbval.cast(PyObjectPtr.get_gdb_type())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
161 return pyo_ptr.dereference()[name]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
162
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
163 if name == 'ob_size':
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
164 pyo_ptr = self._gdbval.cast(PyVarObjectPtr.get_gdb_type())
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
165 return pyo_ptr.dereference()[name]
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
166
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
167 # General case: look it up inside the object:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
168 return self._gdbval.dereference()[name]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
169
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
170 def pyop_field(self, name):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
171 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
172 Get a PyObjectPtr for the given PyObject* field within this PyObject,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
173 coping with some python 2 versus python 3 differences.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
174 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
175 return PyObjectPtr.from_pyobject_ptr(self.field(name))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
176
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
177 def write_field_repr(self, name, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
178 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
179 Extract the PyObject* field named "name", and write its representation
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
180 to file-like object "out"
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
181 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
182 field_obj = self.pyop_field(name)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
183 field_obj.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
184
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
185 def get_truncated_repr(self, maxlen):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
186 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
187 Get a repr-like string for the data, but truncate it at "maxlen" bytes
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
188 (ending the object graph traversal as soon as you do)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
189 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
190 out = TruncatedStringIO(maxlen)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
191 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
192 self.write_repr(out, set())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
193 except StringTruncated:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
194 # Truncation occurred:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
195 return out.getvalue() + '...(truncated)'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
196
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
197 # No truncation occurred:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
198 return out.getvalue()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
199
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
200 def type(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
201 return PyTypeObjectPtr(self.field('ob_type'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
202
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
203 def is_null(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
204 return 0 == long(self._gdbval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
205
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
206 def is_optimized_out(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
207 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
208 Is the value of the underlying PyObject* visible to the debugger?
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
209
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
210 This can vary with the precise version of the compiler used to build
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
211 Python, and the precise version of gdb.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
212
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
213 See e.g. https://bugzilla.redhat.com/show_bug.cgi?id=556975 with
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
214 PyEval_EvalFrameEx's "f"
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
215 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
216 return self._gdbval.is_optimized_out
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
217
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
218 def safe_tp_name(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
219 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
220 return self.type().field('tp_name').string()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
221 except NullPyObjectPtr:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
222 # NULL tp_name?
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
223 return 'unknown'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
224 except RuntimeError:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
225 # Can't even read the object at all?
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
226 return 'unknown'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
227
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
228 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
229 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
230 Scrape a value from the inferior process, and try to represent it
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
231 within the gdb process, whilst (hopefully) avoiding crashes when
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
232 the remote data is corrupt.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
233
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
234 Derived classes will override this.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
235
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
236 For example, a PyIntObject* with ob_ival 42 in the inferior process
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
237 should result in an int(42) in this process.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
238
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
239 visited: a set of all gdb.Value pyobject pointers already visited
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
240 whilst generating this value (to guard against infinite recursion when
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
241 visiting object graphs with loops). Analogous to Py_ReprEnter and
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
242 Py_ReprLeave
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
243 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
244
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
245 class FakeRepr(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
246 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
247 Class representing a non-descript PyObject* value in the inferior
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
248 process for when we don't have a custom scraper, intended to have
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
249 a sane repr().
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
250 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
251
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
252 def __init__(self, tp_name, address):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
253 self.tp_name = tp_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
254 self.address = address
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
255
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
256 def __repr__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
257 # For the NULL pointer, we have no way of knowing a type, so
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
258 # special-case it as per
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
259 # http://bugs.python.org/issue8032#msg100882
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
260 if self.address == 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
261 return '0x0'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
262 return '<%s at remote 0x%x>' % (self.tp_name, self.address)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
263
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
264 return FakeRepr(self.safe_tp_name(),
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
265 long(self._gdbval))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
267 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
268 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
269 Write a string representation of the value scraped from the inferior
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
270 process to "out", a file-like object.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
271 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
272 # Default implementation: generate a proxy value and write its repr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
273 # However, this could involve a lot of work for complicated objects,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
274 # so for derived classes we specialize this
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
275 return out.write(repr(self.proxyval(visited)))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
276
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
277 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
278 def subclass_from_type(cls, t):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
279 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
280 Given a PyTypeObjectPtr instance wrapping a gdb.Value that's a
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
281 (PyTypeObject*), determine the corresponding subclass of PyObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
282 to use
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
284 Ideally, we would look up the symbols for the global types, but that
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
285 isn't working yet:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286 (gdb) python print gdb.lookup_symbol('PyList_Type')[0].value
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
287 Traceback (most recent call last):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
288 File "<string>", line 1, in <module>
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
289 NotImplementedError: Symbol type not yet supported in Python scripts.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
290 Error while executing Python code.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
292 For now, we use tp_flags, after doing some string comparisons on the
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
293 tp_name for some special-cases that don't seem to be visible through
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
294 flags
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
295 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
296 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
297 tp_name = t.field('tp_name').string()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
298 tp_flags = int(t.field('tp_flags'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
299 except RuntimeError:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
300 # Handle any kind of error e.g. NULL ptrs by simply using the base
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
301 # class
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
302 return cls
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
303
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
304 #print 'tp_flags = 0x%08x' % tp_flags
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
305 #print 'tp_name = %r' % tp_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
306
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
307 name_map = {'bool': PyBoolObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
308 'classobj': PyClassObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
309 'instance': PyInstanceObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
310 'NoneType': PyNoneStructPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
311 'frame': PyFrameObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
312 'set' : PySetObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
313 'frozenset' : PySetObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
314 'builtin_function_or_method' : PyCFunctionObjectPtr,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
315 }
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
316 if tp_name in name_map:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
317 return name_map[tp_name]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
318
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
319 if tp_flags & Py_TPFLAGS_HEAPTYPE:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
320 return HeapTypeObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
321
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
322 if tp_flags & Py_TPFLAGS_LONG_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
323 return PyLongObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
324 if tp_flags & Py_TPFLAGS_LIST_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
325 return PyListObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
326 if tp_flags & Py_TPFLAGS_TUPLE_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
327 return PyTupleObjectPtr
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
328 if tp_flags & Py_TPFLAGS_BYTES_SUBCLASS:
60812
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
329 return PyBytesObjectPtr
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
330 if tp_flags & Py_TPFLAGS_UNICODE_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
331 return PyUnicodeObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
332 if tp_flags & Py_TPFLAGS_DICT_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
333 return PyDictObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
334 if tp_flags & Py_TPFLAGS_BASE_EXC_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
335 return PyBaseExceptionObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
336 #if tp_flags & Py_TPFLAGS_TYPE_SUBCLASS:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
337 # return PyTypeObjectPtr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
338
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
339 # Use the base class:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
340 return cls
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
341
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
342 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
343 def from_pyobject_ptr(cls, gdbval):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
344 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
345 Try to locate the appropriate derived class dynamically, and cast
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
346 the pointer accordingly.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
347 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
348 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
349 p = PyObjectPtr(gdbval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
350 cls = cls.subclass_from_type(p.type())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
351 return cls(gdbval, cast_to=cls.get_gdb_type())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
352 except RuntimeError:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
353 # Handle any kind of error e.g. NULL ptrs by simply using the base
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
354 # class
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
355 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
356 return cls(gdbval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
357
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
358 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
359 def get_gdb_type(cls):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
360 return gdb.lookup_type(cls._typename).pointer()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
361
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
362 def as_address(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
363 return long(self._gdbval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
364
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
365 class PyVarObjectPtr(PyObjectPtr):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
366 _typename = 'PyVarObject'
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
367
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
368 class ProxyAlreadyVisited(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
369 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
370 Placeholder proxy to use when protecting against infinite recursion due to
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
371 loops in the object graph.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
372
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
373 Analogous to the values emitted by the users of Py_ReprEnter and Py_ReprLeave
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
374 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
375 def __init__(self, rep):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
376 self._rep = rep
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
377
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
378 def __repr__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
379 return self._rep
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
380
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
381
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
382 def _write_instance_repr(out, visited, name, pyop_attrdict, address):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
383 '''Shared code for use by old-style and new-style classes:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
384 write a representation to file-like object "out"'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
385 out.write('<')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
386 out.write(name)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
387
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
388 # Write dictionary of instance attributes:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
389 if isinstance(pyop_attrdict, PyDictObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
390 out.write('(')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
391 first = True
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
392 for pyop_arg, pyop_val in pyop_attrdict.iteritems():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
393 if not first:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
394 out.write(', ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
395 first = False
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
396 out.write(pyop_arg.proxyval(visited))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
397 out.write('=')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
398 pyop_val.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
399 out.write(')')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
400 out.write(' at remote 0x%x>' % address)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
401
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
402
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
403 class InstanceProxy(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
404
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
405 def __init__(self, cl_name, attrdict, address):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
406 self.cl_name = cl_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
407 self.attrdict = attrdict
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
408 self.address = address
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
409
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
410 def __repr__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
411 if isinstance(self.attrdict, dict):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
412 kwargs = ', '.join(["%s=%r" % (arg, val)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
413 for arg, val in self.attrdict.iteritems()])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
414 return '<%s(%s) at remote 0x%x>' % (self.cl_name,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
415 kwargs, self.address)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
416 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
417 return '<%s at remote 0x%x>' % (self.cl_name,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
418 self.address)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
419
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
420 def _PyObject_VAR_SIZE(typeobj, nitems):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
421 return ( ( typeobj.field('tp_basicsize') +
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
422 nitems * typeobj.field('tp_itemsize') +
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
423 (SIZEOF_VOID_P - 1)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
424 ) & ~(SIZEOF_VOID_P - 1)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
425 ).cast(_type_size_t)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
426
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
427 class HeapTypeObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
428 _typename = 'PyObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
429
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
430 def get_attr_dict(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
431 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
432 Get the PyDictObject ptr representing the attribute dictionary
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
433 (or None if there's a problem)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
434 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
435 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
436 typeobj = self.type()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
437 dictoffset = int_from_int(typeobj.field('tp_dictoffset'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
438 if dictoffset != 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
439 if dictoffset < 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
440 type_PyVarObject_ptr = gdb.lookup_type('PyVarObject').pointer()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
441 tsize = int_from_int(self._gdbval.cast(type_PyVarObject_ptr)['ob_size'])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
442 if tsize < 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
443 tsize = -tsize
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
444 size = _PyObject_VAR_SIZE(typeobj, tsize)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
445 dictoffset += size
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
446 assert dictoffset > 0
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
447 assert dictoffset % SIZEOF_VOID_P == 0
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
448
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
449 dictptr = self._gdbval.cast(_type_char_ptr) + dictoffset
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
450 PyObjectPtrPtr = PyObjectPtr.get_gdb_type().pointer()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
451 dictptr = dictptr.cast(PyObjectPtrPtr)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
452 return PyObjectPtr.from_pyobject_ptr(dictptr.dereference())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
453 except RuntimeError:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
454 # Corrupt data somewhere; fail safe
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
455 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
456
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
457 # Not found, or some kind of error:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
458 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
459
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
460 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
461 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
462 Support for new-style classes.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
463
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
464 Currently we just locate the dictionary using a transliteration to
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
465 python of _PyObject_GetDictPtr, ignoring descriptors
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
466 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
467 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
468 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
469 return ProxyAlreadyVisited('<...>')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
470 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
471
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
472 pyop_attr_dict = self.get_attr_dict()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
473 if pyop_attr_dict:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
474 attr_dict = pyop_attr_dict.proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
475 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
476 attr_dict = {}
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
477 tp_name = self.safe_tp_name()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
478
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
479 # New-style class:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
480 return InstanceProxy(tp_name, attr_dict, long(self._gdbval))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
481
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
482 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
483 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
484 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
485 out.write('<...>')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
486 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
487 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
488
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
489 pyop_attrdict = self.get_attr_dict()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
490 _write_instance_repr(out, visited,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
491 self.safe_tp_name(), pyop_attrdict, self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
492
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
493 class ProxyException(Exception):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
494 def __init__(self, tp_name, args):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
495 self.tp_name = tp_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
496 self.args = args
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
497
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
498 def __repr__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
499 return '%s%r' % (self.tp_name, self.args)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
500
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
501 class PyBaseExceptionObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
502 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
503 Class wrapping a gdb.Value that's a PyBaseExceptionObject* i.e. an exception
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
504 within the process being debugged.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
505 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
506 _typename = 'PyBaseExceptionObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
507
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
508 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
509 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
510 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
511 return ProxyAlreadyVisited('(...)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
512 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
513 arg_proxy = self.pyop_field('args').proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
514 return ProxyException(self.safe_tp_name(),
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
515 arg_proxy)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
516
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
517 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
518 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
519 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
520 out.write('(...)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
521 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
522 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
523
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
524 out.write(self.safe_tp_name())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
525 self.write_field_repr('args', out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
526
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
527 class PyClassObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
528 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
529 Class wrapping a gdb.Value that's a PyClassObject* i.e. a <classobj>
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
530 instance within the process being debugged.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
531 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
532 _typename = 'PyClassObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
533
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
534
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
535 class BuiltInFunctionProxy(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
536 def __init__(self, ml_name):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
537 self.ml_name = ml_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
538
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
539 def __repr__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
540 return "<built-in function %s>" % self.ml_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
541
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
542 class BuiltInMethodProxy(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
543 def __init__(self, ml_name, pyop_m_self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
544 self.ml_name = ml_name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
545 self.pyop_m_self = pyop_m_self
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
546
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
547 def __repr__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
548 return ('<built-in method %s of %s object at remote 0x%x>'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
549 % (self.ml_name,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
550 self.pyop_m_self.safe_tp_name(),
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
551 self.pyop_m_self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
552 )
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
553
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
554 class PyCFunctionObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
555 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
556 Class wrapping a gdb.Value that's a PyCFunctionObject*
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
557 (see Include/methodobject.h and Objects/methodobject.c)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
558 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
559 _typename = 'PyCFunctionObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
560
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
561 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
562 m_ml = self.field('m_ml') # m_ml is a (PyMethodDef*)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
563 ml_name = m_ml['ml_name'].string()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
564
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
565 pyop_m_self = self.pyop_field('m_self')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
566 if pyop_m_self.is_null():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
567 return BuiltInFunctionProxy(ml_name)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
568 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
569 return BuiltInMethodProxy(ml_name, pyop_m_self)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
570
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
571
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
572 class PyCodeObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
573 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
574 Class wrapping a gdb.Value that's a PyCodeObject* i.e. a <code> instance
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
575 within the process being debugged.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
576 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
577 _typename = 'PyCodeObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
578
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
579 def addr2line(self, addrq):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
580 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
581 Get the line number for a given bytecode offset
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
582
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
583 Analogous to PyCode_Addr2Line; translated from pseudocode in
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
584 Objects/lnotab_notes.txt
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
585 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
586 co_lnotab = self.pyop_field('co_lnotab').proxyval(set())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
587
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
588 # Initialize lineno to co_firstlineno as per PyCode_Addr2Line
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
589 # not 0, as lnotab_notes.txt has it:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
590 lineno = int_from_int(self.field('co_firstlineno'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
591
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
592 addr = 0
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
593 for addr_incr, line_incr in zip(co_lnotab[::2], co_lnotab[1::2]):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
594 addr += ord(addr_incr)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
595 if addr > addrq:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
596 return lineno
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
597 lineno += ord(line_incr)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
598 return lineno
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
599
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
600
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
601 class PyDictObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
602 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
603 Class wrapping a gdb.Value that's a PyDictObject* i.e. a dict instance
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
604 within the process being debugged.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
605 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
606 _typename = 'PyDictObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
607
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
608 def iteritems(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
609 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
610 Yields a sequence of (PyObjectPtr key, PyObjectPtr value) pairs,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
611 analagous to dict.iteritems()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
612 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
613 for i in safe_range(self.field('ma_mask') + 1):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
614 ep = self.field('ma_table') + i
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
615 pyop_value = PyObjectPtr.from_pyobject_ptr(ep['me_value'])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
616 if not pyop_value.is_null():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
617 pyop_key = PyObjectPtr.from_pyobject_ptr(ep['me_key'])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
618 yield (pyop_key, pyop_value)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
619
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
620 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
621 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
622 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
623 return ProxyAlreadyVisited('{...}')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
624 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
625
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
626 result = {}
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
627 for pyop_key, pyop_value in self.iteritems():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
628 proxy_key = pyop_key.proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
629 proxy_value = pyop_value.proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
630 result[proxy_key] = proxy_value
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
631 return result
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
632
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
633 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
634 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
635 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
636 out.write('{...}')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
637 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
638 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
639
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
640 out.write('{')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
641 first = True
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
642 for pyop_key, pyop_value in self.iteritems():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
643 if not first:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
644 out.write(', ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
645 first = False
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
646 pyop_key.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
647 out.write(': ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
648 pyop_value.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
649 out.write('}')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
650
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
651 class PyInstanceObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
652 _typename = 'PyInstanceObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
653
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
654 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
655 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
656 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
657 return ProxyAlreadyVisited('<...>')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
658 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
659
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
660 # Get name of class:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
661 in_class = self.pyop_field('in_class')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
662 cl_name = in_class.pyop_field('cl_name').proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
663
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
664 # Get dictionary of instance attributes:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
665 in_dict = self.pyop_field('in_dict').proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
666
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
667 # Old-style class:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
668 return InstanceProxy(cl_name, in_dict, long(self._gdbval))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
669
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
670 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
671 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
672 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
673 out.write('<...>')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
674 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
675 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
676
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
677 # Old-style class:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
678
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
679 # Get name of class:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
680 in_class = self.pyop_field('in_class')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
681 cl_name = in_class.pyop_field('cl_name').proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
682
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
683 # Get dictionary of instance attributes:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
684 pyop_in_dict = self.pyop_field('in_dict')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
685
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
686 _write_instance_repr(out, visited,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
687 cl_name, pyop_in_dict, self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
688
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
689 class PyListObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
690 _typename = 'PyListObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
691
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
692 def __getitem__(self, i):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
693 # Get the gdb.Value for the (PyObject*) with the given index:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
694 field_ob_item = self.field('ob_item')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
695 return field_ob_item[i]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
696
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
697 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
698 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
699 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
700 return ProxyAlreadyVisited('[...]')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
701 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
702
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
703 result = [PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
704 for i in safe_range(int_from_int(self.field('ob_size')))]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
705 return result
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
706
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
707 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
708 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
709 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
710 out.write('[...]')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
711 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
712 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
713
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
714 out.write('[')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
715 for i in safe_range(int_from_int(self.field('ob_size'))):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
716 if i > 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
717 out.write(', ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
718 element = PyObjectPtr.from_pyobject_ptr(self[i])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
719 element.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
720 out.write(']')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
721
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
722 class PyLongObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
723 _typename = 'PyLongObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
724
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
725 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
726 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
727 Python's Include/longobjrep.h has this declaration:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
728 struct _longobject {
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
729 PyObject_VAR_HEAD
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
730 digit ob_digit[1];
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
731 };
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
732
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
733 with this description:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
734 The absolute value of a number is equal to
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
735 SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
736 Negative numbers are represented with ob_size < 0;
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
737 zero is represented by ob_size == 0.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
738
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
739 where SHIFT can be either:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
740 #define PyLong_SHIFT 30
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
741 #define PyLong_SHIFT 15
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
742 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
743 ob_size = long(self.field('ob_size'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
744 if ob_size == 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
745 return 0L
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
746
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
747 ob_digit = self.field('ob_digit')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
748
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
749 if gdb.lookup_type('digit').sizeof == 2:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
750 SHIFT = 15L
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
751 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
752 SHIFT = 30L
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
753
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
754 digits = [long(ob_digit[i]) * 2**(SHIFT*i)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
755 for i in safe_range(abs(ob_size))]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
756 result = sum(digits)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
757 if ob_size < 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
758 result = -result
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
759 return result
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
760
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
761 def write_repr(self, out, visited):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
762 # Write this out as a Python 3 int literal, i.e. without the "L" suffix
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
763 proxy = self.proxyval(visited)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
764 out.write("%s" % proxy)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
765
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
766
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
767 class PyBoolObjectPtr(PyLongObjectPtr):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
768 """
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
769 Class wrapping a gdb.Value that's a PyBoolObject* i.e. one of the two
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
770 <bool> instances (Py_True/Py_False) within the process being debugged.
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
771 """
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
772 def proxyval(self, visited):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
773 if PyLongObjectPtr.proxyval(self, visited):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
774 return True
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
775 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
776 return False
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
777
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
778 class PyNoneStructPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
779 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
780 Class wrapping a gdb.Value that's a PyObject* pointing to the
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
781 singleton (we hope) _Py_NoneStruct with ob_type PyNone_Type
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
782 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
783 _typename = 'PyObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
784
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
785 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
786 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
787
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
788
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
789 class PyFrameObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
790 _typename = 'PyFrameObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
791
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
792 def __init__(self, gdbval, cast_to):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
793 PyObjectPtr.__init__(self, gdbval, cast_to)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
794
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
795 if not self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
796 self.co = PyCodeObjectPtr.from_pyobject_ptr(self.field('f_code'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
797 self.co_name = self.co.pyop_field('co_name')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
798 self.co_filename = self.co.pyop_field('co_filename')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
799
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
800 self.f_lineno = int_from_int(self.field('f_lineno'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
801 self.f_lasti = int_from_int(self.field('f_lasti'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
802 self.co_nlocals = int_from_int(self.co.field('co_nlocals'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
803 self.co_varnames = PyTupleObjectPtr.from_pyobject_ptr(self.co.field('co_varnames'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
804
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
805 def iter_locals(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
806 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
807 Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
808 the local variables of this frame
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
809 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
810 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
811 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
812
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
813 f_localsplus = self.field('f_localsplus')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
814 for i in safe_range(self.co_nlocals):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
815 pyop_value = PyObjectPtr.from_pyobject_ptr(f_localsplus[i])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
816 if not pyop_value.is_null():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
817 pyop_name = PyObjectPtr.from_pyobject_ptr(self.co_varnames[i])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
818 yield (pyop_name, pyop_value)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
819
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
820 def iter_globals(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
821 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
822 Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
823 the global variables of this frame
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
824 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
825 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
826 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
827
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
828 pyop_globals = self.pyop_field('f_globals')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
829 return pyop_globals.iteritems()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
830
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
831 def iter_builtins(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
832 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
833 Yield a sequence of (name,value) pairs of PyObjectPtr instances, for
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
834 the builtin variables
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
835 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
836 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
837 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
838
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
839 pyop_builtins = self.pyop_field('f_builtins')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
840 return pyop_builtins.iteritems()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
841
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
842 def get_var_by_name(self, name):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
843 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
844 Look for the named local variable, returning a (PyObjectPtr, scope) pair
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
845 where scope is a string 'local', 'global', 'builtin'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
846
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
847 If not found, return (None, None)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
848 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
849 for pyop_name, pyop_value in self.iter_locals():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
850 if name == pyop_name.proxyval(set()):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
851 return pyop_value, 'local'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
852 for pyop_name, pyop_value in self.iter_globals():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
853 if name == pyop_name.proxyval(set()):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
854 return pyop_value, 'global'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
855 for pyop_name, pyop_value in self.iter_builtins():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
856 if name == pyop_name.proxyval(set()):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
857 return pyop_value, 'builtin'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
858 return None, None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
859
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
860 def filename(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
861 '''Get the path of the current Python source file, as a string'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
862 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
863 return '(frame information optimized out)'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
864 return self.co_filename.proxyval(set())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
865
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
866 def current_line_num(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
867 '''Get current line number as an integer (1-based)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
868
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
869 Translated from PyFrame_GetLineNumber and PyCode_Addr2Line
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
870
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
871 See Objects/lnotab_notes.txt
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
872 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
873 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
874 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
875 f_trace = self.field('f_trace')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
876 if long(f_trace) != 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
877 # we have a non-NULL f_trace:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
878 return self.f_lineno
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
879 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
880 #try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
881 return self.co.addr2line(self.f_lasti)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
882 #except ValueError:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
883 # return self.f_lineno
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
884
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
885 def current_line(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
886 '''Get the text of the current source line as a string, with a trailing
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
887 newline character'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
888 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
889 return '(frame information optimized out)'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
890 with open(self.filename(), 'r') as f:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
891 all_lines = f.readlines()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
892 # Convert from 1-based current_line_num to 0-based list offset:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
893 return all_lines[self.current_line_num()-1]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
894
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
895 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
896 if self.is_optimized_out():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
897 out.write('(frame information optimized out)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
898 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
899 out.write('Frame 0x%x, for file %s, line %i, in %s ('
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
900 % (self.as_address(),
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
901 self.co_filename.proxyval(visited),
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
902 self.current_line_num(),
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
903 self.co_name.proxyval(visited)))
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
904 first = True
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
905 for pyop_name, pyop_value in self.iter_locals():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
906 if not first:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
907 out.write(', ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
908 first = False
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
909
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
910 out.write(pyop_name.proxyval(visited))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
911 out.write('=')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
912 pyop_value.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
913
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
914 out.write(')')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
915
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
916 class PySetObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
917 _typename = 'PySetObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
918
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
919 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
920 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
921 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
922 return ProxyAlreadyVisited('%s(...)' % self.safe_tp_name())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
923 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
924
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
925 members = []
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
926 table = self.field('table')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
927 for i in safe_range(self.field('mask')+1):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
928 setentry = table[i]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
929 key = setentry['key']
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
930 if key != 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
931 key_proxy = PyObjectPtr.from_pyobject_ptr(key).proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
932 if key_proxy != '<dummy key>':
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
933 members.append(key_proxy)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
934 if self.safe_tp_name() == 'frozenset':
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
935 return frozenset(members)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
936 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
937 return set(members)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
938
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
939 def write_repr(self, out, visited):
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
940 # Emulate Python 3's set_repr
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
941 tp_name = self.safe_tp_name()
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
942
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
943 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
944 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
945 out.write('(...)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
946 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
947 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
948
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
949 # Python 3's set_repr special-cases the empty set:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
950 if not self.field('used'):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
951 out.write(tp_name)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
952 out.write('()')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
953 return
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
954
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
955 # Python 3 uses {} for set literals:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
956 if tp_name != 'set':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
957 out.write(tp_name)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
958 out.write('(')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
959
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
960 out.write('{')
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
961 first = True
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
962 table = self.field('table')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
963 for i in safe_range(self.field('mask')+1):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
964 setentry = table[i]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
965 key = setentry['key']
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
966 if key != 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
967 pyop_key = PyObjectPtr.from_pyobject_ptr(key)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
968 key_proxy = pyop_key.proxyval(visited) # FIXME!
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
969 if key_proxy != '<dummy key>':
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
970 if not first:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
971 out.write(', ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
972 first = False
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
973 pyop_key.write_repr(out, visited)
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
974 out.write('}')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
975
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
976 if tp_name != 'set':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
977 out.write(')')
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
978
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
979
60812
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
980 class PyBytesObjectPtr(PyObjectPtr):
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
981 _typename = 'PyBytesObject'
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
982
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
983 def __str__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
984 field_ob_size = self.field('ob_size')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
985 field_ob_sval = self.field('ob_sval')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
986 char_ptr = field_ob_sval.address.cast(_type_unsigned_char_ptr)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
987 return ''.join([chr(char_ptr[i]) for i in safe_range(field_ob_size)])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
988
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
989 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
990 return str(self)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
991
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
992 def write_repr(self, out, visited):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
993 # Write this out as a Python 3 bytes literal, i.e. with a "b" prefix
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
994
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
995 # Get a PyStringObject* within the Python 2 gdb process:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
996 proxy = self.proxyval(visited)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
997
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
998 # Transliteration of Python 3's Objects/bytesobject.c:PyBytes_Repr
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
999 # to Python 2 code:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1000 quote = "'"
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1001 if "'" in proxy and not '"' in proxy:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1002 quote = '"'
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1003 out.write('b')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1004 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1005 for byte in proxy:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1006 if byte == quote or byte == '\\':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1007 out.write('\\')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1008 out.write(byte)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1009 elif byte == '\t':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1010 out.write('\\t')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1011 elif byte == '\n':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1012 out.write('\\n')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1013 elif byte == '\r':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1014 out.write('\\r')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1015 elif byte < ' ' or ord(byte) >= 0x7f:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1016 out.write('\\x')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1017 out.write(hexdigits[(ord(byte) & 0xf0) >> 4])
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1018 out.write(hexdigits[ord(byte) & 0xf])
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1019 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1020 out.write(byte)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1021 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1022
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1023 class PyTupleObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1024 _typename = 'PyTupleObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1025
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1026 def __getitem__(self, i):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1027 # Get the gdb.Value for the (PyObject*) with the given index:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1028 field_ob_item = self.field('ob_item')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1029 return field_ob_item[i]
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1030
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1031 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1032 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1033 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1034 return ProxyAlreadyVisited('(...)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1035 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1036
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1037 result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1038 for i in safe_range(int_from_int(self.field('ob_size')))])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1039 return result
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1040
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1041 def write_repr(self, out, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1042 # Guard against infinite loops:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1043 if self.as_address() in visited:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1044 out.write('(...)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1045 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1046 visited.add(self.as_address())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1047
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1048 out.write('(')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1049 for i in safe_range(int_from_int(self.field('ob_size'))):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1050 if i > 0:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1051 out.write(', ')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1052 element = PyObjectPtr.from_pyobject_ptr(self[i])
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1053 element.write_repr(out, visited)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1054 if self.field('ob_size') == 1:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1055 out.write(',)')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1056 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1057 out.write(')')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1058
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1059 class PyTypeObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1060 _typename = 'PyTypeObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1061
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1062
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1063 def _unichr_is_printable(char):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1064 # Logic adapted from Python 3's Tools/unicode/makeunicodedata.py
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1065 if char == u" ":
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1066 return True
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1067 import unicodedata
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1068 return unicodedata.category(char) not in ("C", "Z")
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1069
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1070 if sys.maxunicode >= 0x10000:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1071 _unichr = unichr
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1072 else:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1073 # Needed for proper surrogate support if sizeof(Py_UNICODE) is 2 in gdb
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1074 def _unichr(x):
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1075 if x < 0x10000:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1076 return unichr(x)
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1077 x -= 0x10000
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1078 ch1 = 0xD800 | (x >> 10)
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1079 ch2 = 0xDC00 | (x & 0x3FF)
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1080 return unichr(ch1) + unichr(ch2)
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1081
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1082
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1083 class PyUnicodeObjectPtr(PyObjectPtr):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1084 _typename = 'PyUnicodeObject'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1085
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1086 def char_width(self):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1087 _type_Py_UNICODE = gdb.lookup_type('Py_UNICODE')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1088 return _type_Py_UNICODE.sizeof
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1089
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1090 def proxyval(self, visited):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1091 # From unicodeobject.h:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1092 # Py_ssize_t length; /* Length of raw Unicode data in buffer */
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1093 # Py_UNICODE *str; /* Raw Unicode buffer */
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1094 field_length = long(self.field('length'))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1095 field_str = self.field('str')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1096
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1097 # Gather a list of ints from the Py_UNICODE array; these are either
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1098 # UCS-2 or UCS-4 code points:
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1099 if self.char_width() > 2:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1100 Py_UNICODEs = [int(field_str[i]) for i in safe_range(field_length)]
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1101 else:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1102 # A more elaborate routine if sizeof(Py_UNICODE) is 2 in the
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1103 # inferior process: we must join surrogate pairs.
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1104 Py_UNICODEs = []
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1105 i = 0
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1106 while i < field_length:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1107 ucs = int(field_str[i])
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1108 i += 1
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1109 if ucs < 0xD800 or ucs >= 0xDC00 or i == field_length:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1110 Py_UNICODEs.append(ucs)
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1111 continue
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1112 # This could be a surrogate pair.
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1113 ucs2 = int(field_str[i])
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1114 if ucs2 < 0xDC00 or ucs2 > 0xDFFF:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1115 continue
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1116 code = (ucs & 0x03FF) << 10
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1117 code |= ucs2 & 0x03FF
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1118 code += 0x00010000
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1119 Py_UNICODEs.append(code)
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1120 i += 1
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1121
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1122 # Convert the int code points to unicode characters, and generate a
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1123 # local unicode instance.
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1124 # This splits surrogate pairs if sizeof(Py_UNICODE) is 2 here (in gdb).
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1125 result = u''.join([_unichr(ucs) for ucs in Py_UNICODEs])
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1126 return result
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1127
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1128 def write_repr(self, out, visited):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1129 # Write this out as a Python 3 str literal, i.e. without a "u" prefix
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1130
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1131 # Get a PyUnicodeObject* within the Python 2 gdb process:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1132 proxy = self.proxyval(visited)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1133
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1134 # Transliteration of Python 3's Object/unicodeobject.c:unicode_repr
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1135 # to Python 2:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1136 if "'" in proxy and '"' not in proxy:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1137 quote = '"'
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1138 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1139 quote = "'"
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1140 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1141
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1142 i = 0
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1143 while i < len(proxy):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1144 ch = proxy[i]
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1145 i += 1
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1146
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1147 # Escape quotes and backslashes
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1148 if ch == quote or ch == '\\':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1149 out.write('\\')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1150 out.write(ch)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1151
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1152 # Map special whitespace to '\t', \n', '\r'
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1153 elif ch == '\t':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1154 out.write('\\t')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1155 elif ch == '\n':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1156 out.write('\\n')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1157 elif ch == '\r':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1158 out.write('\\r')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1159
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1160 # Map non-printable US ASCII to '\xhh' */
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1161 elif ch < ' ' or ch == 0x7F:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1162 out.write('\\x')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1163 out.write(hexdigits[(ord(ch) >> 4) & 0x000F])
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1164 out.write(hexdigits[ord(ch) & 0x000F])
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1165
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1166 # Copy ASCII characters as-is
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1167 elif ord(ch) < 0x7F:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1168 out.write(ch)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1169
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1170 # Non-ASCII characters
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1171 else:
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1172 ucs = ch
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1173 orig_ucs = None
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1174 ch2 = None
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1175 if self.char_width() == 2:
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1176 # If sizeof(Py_UNICODE) is 2 here (in gdb), join
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1177 # surrogate pairs before calling _unichr_is_printable.
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1178 if (i < len(proxy)
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1179 and 0xD800 <= ord(ch) < 0xDC00 \
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1180 and 0xDC00 <= ord(proxy[i]) <= 0xDFFF):
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1181 ch2 = proxy[i]
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1182 ucs = ch + ch2
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1183 i += 1
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1184
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1185 printable = _unichr_is_printable(ucs)
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1186 if printable:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1187 try:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1188 ucs.encode(ENCODING)
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1189 except UnicodeEncodeError:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1190 printable = False
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1191 if orig_ucs is not None:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1192 ucs = orig_ucs
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1193 i -= 1
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1194
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1195 # Map Unicode whitespace and control characters
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1196 # (categories Z* and C* except ASCII space)
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1197 if not printable:
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1198 # Unfortuately, Python 2's unicode type doesn't seem
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1199 # to expose the "isprintable" method
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1200 code = ord(ucs)
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1201
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1202 # Map 8-bit characters to '\\xhh'
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1203 if code <= 0xff:
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1204 out.write('\\x')
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1205 out.write(hexdigits[(code >> 4) & 0x000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1206 out.write(hexdigits[code & 0x000F])
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1207 # Map 21-bit characters to '\U00xxxxxx'
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1208 elif code >= 0x10000:
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1209 out.write('\\U')
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1210 out.write(hexdigits[(code >> 28) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1211 out.write(hexdigits[(code >> 24) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1212 out.write(hexdigits[(code >> 20) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1213 out.write(hexdigits[(code >> 16) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1214 out.write(hexdigits[(code >> 12) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1215 out.write(hexdigits[(code >> 8) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1216 out.write(hexdigits[(code >> 4) & 0x0000000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1217 out.write(hexdigits[code & 0x0000000F])
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1218 # Map 16-bit characters to '\uxxxx'
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1219 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1220 out.write('\\u')
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1221 out.write(hexdigits[(code >> 12) & 0x000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1222 out.write(hexdigits[(code >> 8) & 0x000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1223 out.write(hexdigits[(code >> 4) & 0x000F])
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1224 out.write(hexdigits[code & 0x000F])
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1225 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1226 # Copy characters as-is
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1227 out.write(ch)
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1228 if ch2 is not None:
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1229 out.write(ch2)
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1230
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1231 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1232
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1233
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1234
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1235
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1236 def int_from_int(gdbval):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1237 return int(str(gdbval))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1238
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1239
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1240 def stringify(val):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1241 # TODO: repr() puts everything on one line; pformat can be nicer, but
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1242 # can lead to v.long results; this function isolates the choice
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1243 if True:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1244 return repr(val)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1245 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1246 from pprint import pformat
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1247 return pformat(val)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1248
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1249
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1250 class PyObjectPtrPrinter:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1251 "Prints a (PyObject*)"
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1252
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1253 def __init__ (self, gdbval):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1254 self.gdbval = gdbval
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1255
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1256 def to_string (self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1257 pyop = PyObjectPtr.from_pyobject_ptr(self.gdbval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1258 if True:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1259 return pyop.get_truncated_repr(MAX_OUTPUT_LEN)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1260 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1261 # Generate full proxy value then stringify it.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1262 # Doing so could be expensive
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1263 proxyval = pyop.proxyval(set())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1264 return stringify(proxyval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1265
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1266 def pretty_printer_lookup(gdbval):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1267 type = gdbval.type.unqualified()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1268 if type.code == gdb.TYPE_CODE_PTR:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1269 type = type.target().unqualified()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1270 t = str(type)
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1271 if t in ("PyObject", "PyFrameObject", "PyUnicodeObject"):
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1272 return PyObjectPtrPrinter(gdbval)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1273
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1274 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1275 During development, I've been manually invoking the code in this way:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1276 (gdb) python
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1277
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1278 import sys
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1279 sys.path.append('/home/david/coding/python-gdb')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1280 import libpython
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1281 end
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1282
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1283 then reloading it after each edit like this:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1284 (gdb) python reload(libpython)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1285
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1286 The following code should ensure that the prettyprinter is registered
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1287 if the code is autoloaded by gdb when visiting libpython.so, provided
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1288 that this python file is installed to the same path as the library (or its
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1289 .debug file) plus a "-gdb.py" suffix, e.g:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1290 /usr/lib/libpython2.6.so.1.0-gdb.py
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1291 /usr/lib/debug/usr/lib/libpython2.6.so.1.0.debug-gdb.py
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1292 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1293 def register (obj):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1294 if obj == None:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1295 obj = gdb
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1296
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1297 # Wire up the pretty-printer
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1298 obj.pretty_printers.append(pretty_printer_lookup)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1299
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1300 register (gdb.current_objfile ())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1301
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1302
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1303
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1304 # Unfortunately, the exact API exposed by the gdb module varies somewhat
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1305 # from build to build
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1306 # See http://bugs.python.org/issue8279?#msg102276
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1307
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1308 class Frame(object):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1309 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1310 Wrapper for gdb.Frame, adding various methods
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1311 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1312 def __init__(self, gdbframe):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1313 self._gdbframe = gdbframe
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1314
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1315 def older(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1316 older = self._gdbframe.older()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1317 if older:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1318 return Frame(older)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1319 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1320 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1321
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1322 def newer(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1323 newer = self._gdbframe.newer()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1324 if newer:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1325 return Frame(newer)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1326 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1327 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1328
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1329 def select(self):
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1330 '''If supported, select this frame and return True; return False if unsupported
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1331
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1332 Not all builds have a gdb.Frame.select method; seems to be present on Fedora 12
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1333 onwards, but absent on Ubuntu buildbot'''
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1334 if not hasattr(self._gdbframe, 'select'):
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1335 print ('Unable to select frame: '
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1336 'this build of gdb does not expose a gdb.Frame.select method')
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1337 return False
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1338 self._gdbframe.select()
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1339 return True
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1340
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1341 def get_index(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1342 '''Calculate index of frame, starting at 0 for the newest frame within
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1343 this thread'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1344 index = 0
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1345 # Go down until you reach the newest frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1346 iter_frame = self
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1347 while iter_frame.newer():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1348 index += 1
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1349 iter_frame = iter_frame.newer()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1350 return index
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1351
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1352 def is_evalframeex(self):
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1353 '''Is this a PyEval_EvalFrameEx frame?'''
60792
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1354 if self._gdbframe.name() == 'PyEval_EvalFrameEx':
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1355 '''
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1356 I believe we also need to filter on the inline
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1357 struct frame_id.inline_depth, only regarding frames with
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1358 an inline depth of 0 as actually being this function
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1359
60792
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1360 So we reject those with type gdb.INLINE_FRAME
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1361 '''
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1362 if self._gdbframe.type() == gdb.NORMAL_FRAME:
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1363 # We have a PyEval_EvalFrameEx frame:
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1364 return True
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1365
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1366 return False
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1367
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1368 def get_pyop(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1369 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1370 f = self._gdbframe.read_var('f')
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1371 return PyFrameObjectPtr.from_pyobject_ptr(f)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1372 except ValueError:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1373 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1374
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1375 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1376 def get_selected_frame(cls):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1377 _gdbframe = gdb.selected_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1378 if _gdbframe:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1379 return Frame(_gdbframe)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1380 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1381
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1382 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1383 def get_selected_python_frame(cls):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1384 '''Try to obtain the Frame for the python code in the selected frame,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1385 or None'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1386 frame = cls.get_selected_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1387
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1388 while frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1389 if frame.is_evalframeex():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1390 return frame
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1391 frame = frame.older()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1392
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1393 # Not found:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1394 return None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1395
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1396 def print_summary(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1397 if self.is_evalframeex():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1398 pyop = self.get_pyop()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1399 if pyop:
64134
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
1400 line = pyop.get_truncated_repr(MAX_OUTPUT_LEN)
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
1401 write_unicode(sys.stdout, '#%i %s\n' % (self.get_index(), line))
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1402 sys.stdout.write(pyop.current_line())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1403 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1404 sys.stdout.write('#%i (unable to read python frame information)\n' % self.get_index())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1405 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1406 sys.stdout.write('#%i\n' % self.get_index())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1407
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1408 class PyList(gdb.Command):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1409 '''List the current Python source code, if any
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1410
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1411 Use
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1412 py-list START
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1413 to list at a different line number within the python source.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1414
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1415 Use
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1416 py-list START, END
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1417 to list a specific range of lines within the python source.
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1418 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1419
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1420 def __init__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1421 gdb.Command.__init__ (self,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1422 "py-list",
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1423 gdb.COMMAND_FILES,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1424 gdb.COMPLETE_NONE)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1425
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1426
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1427 def invoke(self, args, from_tty):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1428 import re
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1429
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1430 start = None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1431 end = None
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1432
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1433 m = re.match(r'\s*(\d+)\s*', args)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1434 if m:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1435 start = int(m.group(0))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1436 end = start + 10
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1437
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1438 m = re.match(r'\s*(\d+)\s*,\s*(\d+)\s*', args)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1439 if m:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1440 start, end = map(int, m.groups())
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1441
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1442 frame = Frame.get_selected_python_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1443 if not frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1444 print 'Unable to locate python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1445 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1446
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1447 pyop = frame.get_pyop()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1448 if not pyop:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1449 print 'Unable to read information on python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1450 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1451
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1452 filename = pyop.filename()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1453 lineno = pyop.current_line_num()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1454
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1455 if start is None:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1456 start = lineno - 5
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1457 end = lineno + 5
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1458
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1459 if start<1:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1460 start = 1
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1461
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1462 with open(filename, 'r') as f:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1463 all_lines = f.readlines()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1464 # start and end are 1-based, all_lines is 0-based;
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1465 # so [start-1:end] as a python slice gives us [start, end] as a
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1466 # closed interval
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1467 for i, line in enumerate(all_lines[start-1:end]):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1468 linestr = str(i+start)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1469 # Highlight current line:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1470 if i + start == lineno:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1471 linestr = '>' + linestr
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1472 sys.stdout.write('%4s %s' % (linestr, line))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1473
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1474
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1475 # ...and register the command:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1476 PyList()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1477
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1478 def move_in_stack(move_up):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1479 '''Move up or down the stack (for the py-up/py-down command)'''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1480 frame = Frame.get_selected_python_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1481 while frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1482 if move_up:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1483 iter_frame = frame.older()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1484 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1485 iter_frame = frame.newer()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1486
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1487 if not iter_frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1488 break
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1489
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1490 if iter_frame.is_evalframeex():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1491 # Result:
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1492 if iter_frame.select():
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1493 iter_frame.print_summary()
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1494 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1495
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1496 frame = iter_frame
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1497
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1498 if move_up:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1499 print 'Unable to find an older python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1500 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1501 print 'Unable to find a newer python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1502
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1503 class PyUp(gdb.Command):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1504 'Select and print the python stack frame that called this one (if any)'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1505 def __init__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1506 gdb.Command.__init__ (self,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1507 "py-up",
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1508 gdb.COMMAND_STACK,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1509 gdb.COMPLETE_NONE)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1510
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1511
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1512 def invoke(self, args, from_tty):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1513 move_in_stack(move_up=True)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1514
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1515 class PyDown(gdb.Command):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1516 'Select and print the python stack frame called by this one (if any)'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1517 def __init__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1518 gdb.Command.__init__ (self,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1519 "py-down",
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1520 gdb.COMMAND_STACK,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1521 gdb.COMPLETE_NONE)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1522
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1523
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1524 def invoke(self, args, from_tty):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1525 move_in_stack(move_up=False)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1526
60792
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1527 # Not all builds of gdb have gdb.Frame.select
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1528 if hasattr(gdb.Frame, 'select'):
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1529 PyUp()
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1530 PyDown()
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1531
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1532 class PyBacktrace(gdb.Command):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1533 'Display the current python frame and all the frames within its call stack (if any)'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1534 def __init__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1535 gdb.Command.__init__ (self,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1536 "py-bt",
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1537 gdb.COMMAND_STACK,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1538 gdb.COMPLETE_NONE)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1539
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1540
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1541 def invoke(self, args, from_tty):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1542 frame = Frame.get_selected_python_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1543 while frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1544 if frame.is_evalframeex():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1545 frame.print_summary()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1546 frame = frame.older()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1547
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1548 PyBacktrace()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1549
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1550 class PyPrint(gdb.Command):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1551 'Look up the given python variable name, and print it'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1552 def __init__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1553 gdb.Command.__init__ (self,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1554 "py-print",
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1555 gdb.COMMAND_DATA,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1556 gdb.COMPLETE_NONE)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1557
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1558
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1559 def invoke(self, args, from_tty):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1560 name = str(args)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1561
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1562 frame = Frame.get_selected_python_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1563 if not frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1564 print 'Unable to locate python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1565 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1566
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1567 pyop_frame = frame.get_pyop()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1568 if not pyop_frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1569 print 'Unable to read information on python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1570 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1571
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1572 pyop_var, scope = pyop_frame.get_var_by_name(name)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1573
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1574 if pyop_var:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1575 print ('%s %r = %s'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1576 % (scope,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1577 name,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1578 pyop_var.get_truncated_repr(MAX_OUTPUT_LEN)))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1579 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1580 print '%r not found' % name
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1581
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1582 PyPrint()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1583
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1584 class PyLocals(gdb.Command):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1585 'Look up the given python variable name, and print it'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1586 def __init__(self):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1587 gdb.Command.__init__ (self,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1588 "py-locals",
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1589 gdb.COMMAND_DATA,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1590 gdb.COMPLETE_NONE)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1591
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1592
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1593 def invoke(self, args, from_tty):
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1594 name = str(args)
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1595
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1596 frame = Frame.get_selected_python_frame()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1597 if not frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1598 print 'Unable to locate python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1599 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1600
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1601 pyop_frame = frame.get_pyop()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1602 if not pyop_frame:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1603 print 'Unable to read information on python frame'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1604 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1605
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1606 for pyop_name, pyop_value in pyop_frame.iter_locals():
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1607 print ('%s = %s'
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1608 % (pyop_name.proxyval(set()),
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1609 pyop_value.get_truncated_repr(MAX_OUTPUT_LEN)))
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1610
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1611 PyLocals()