annotate Tools/gdb/libpython.py @ 72475:8beaa9a37387

Implement PEP 393.
author Martin v. Löwis <martin@v.loewis.de>
date Wed, 28 Sep 2011 07:41:54 +0200
parents 316764e64b0a
children 69a6c56e8989
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
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
54 _is_pep393 = 'data' in [f.name for f in gdb.lookup_type('PyUnicodeObject').target().fields()]
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
55
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
56 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
57
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_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
60
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_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
62 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
63 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
64 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
65 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
66 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
67 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
68 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
69
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
70
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
71 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
72
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
73 hexdigits = "0123456789abcdef"
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
74
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
75 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
76
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
77 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
78 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
79
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
80
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
81 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
82 # 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
83 # 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
84 # 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
85 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
86
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
87
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
88 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
89 # 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
90 # 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
91 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
92
64134
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
93 def write_unicode(file, text):
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
94 # 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
95 # 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
96 # UnicodeEncodeError.
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
97 if isinstance(text, unicode):
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
98 text = text.encode(ENCODING, 'backslashreplace')
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
99 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
100
65485
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
101 def os_fsencode(filename):
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
102 if not isinstance(filename, unicode):
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
103 return filename
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
104 encoding = sys.getfilesystemencoding()
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
105 if encoding == 'mbcs':
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
106 # mbcs doesn't support surrogateescape
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
107 return filename.encode(encoding)
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
108 encoded = []
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
109 for char in filename:
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
110 # surrogateescape error handler
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
111 if 0xDC80 <= ord(char) <= 0xDCFF:
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
112 byte = chr(ord(char) - 0xDC00)
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
113 else:
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
114 byte = char.encode(encoding)
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
115 encoded.append(byte)
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
116 return ''.join(encoded)
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
117
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
118 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
119 pass
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 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
122 '''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
123 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
124 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
125 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
126 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
127
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
128 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
129 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
130 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
131 # Truncation:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
132 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
133 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
134
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
135 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
136
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
137 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
138 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
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 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
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 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
143 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
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 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
146 about.
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 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
149 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
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 _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
152
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
153 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
154 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
155 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
156 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
157 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
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 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
160 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
161 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
162 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
163
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
164 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
165 "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
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 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
168 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
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 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
171 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
172 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
173 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
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 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
176 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
177
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
178 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
179 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
180 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
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 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
183 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
184 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
185
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
186 # 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
187 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
188
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
189 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
190 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
191 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
192 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
193 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
194 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
195
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
196 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
197 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
198 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
199 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
200 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
201 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
202 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
203
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
204 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
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 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
207 (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
208 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
209 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
210 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
211 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
212 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
213 # 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
214 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
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 # 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
217 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
218
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
219 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
220 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
221
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
222 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
223 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
224
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
225 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
226 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
227 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
228
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
229 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
230 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
231
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
232 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
233 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
234 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
235 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
236
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
237 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
238 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
239 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
240 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
241 # 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
242 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
243 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
244 # 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
245 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
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 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
248 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
249 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
250 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
251 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
252
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
253 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
254
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
255 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
256 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
257
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
258 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
259 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
260 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
261 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
262 '''
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 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
265 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266 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
267 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
268 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
269 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
270
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
271 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
272 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
273 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
274
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
275 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
276 # 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
277 # 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
278 # 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
279 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
280 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
281 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
282
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283 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
284 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
285
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286 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
287 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
288 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
289 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
290 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291 # 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
292 # 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
293 # 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
294 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
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 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
297 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
298 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
299 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
300 (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
301 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
302
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
303 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
304 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
305 (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
306 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
307 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
308 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
309 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
310
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
311 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
312 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
313 flags
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
314 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
315 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
316 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
317 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
318 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
319 # 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
320 # class
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
321 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
322
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
323 #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
324 #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
325
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
326 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
327 '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
328 '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
329 '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
330 '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
331 '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
332 '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
333 '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
334 }
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
335 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
336 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
337
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
338 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
339 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
340
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
341 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
342 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
343 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
344 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
345 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
346 return PyTupleObjectPtr
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
347 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
348 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
349 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
350 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
351 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
352 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
353 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
354 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
355 #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
356 # 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
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 # 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
359 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
360
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
361 @classmethod
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 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
363 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
364 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
365 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
366 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
367 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
368 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
369 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
370 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
371 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
372 # 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
373 # class
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
374 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
375 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
376
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
377 @classmethod
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 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
379 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
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 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
382 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
383
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
384 class PyVarObjectPtr(PyObjectPtr):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
385 _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
386
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
387 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
388 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
389 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
390 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
391
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
392 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
393 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
394 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
395 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
396
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
397 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
398 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
399
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
400
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
401 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
402 '''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
403 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
404 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
405 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
406
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
407 # 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
408 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
409 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
410 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
411 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
412 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
413 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
414 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
415 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
416 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
417 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
418 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
419 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
420
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
421
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
422 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
423
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
424 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
425 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
426 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
427 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
428
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
429 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
430 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
431 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
432 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
433 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
434 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
435 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
436 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
437 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
438
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
439 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
440 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
441 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
442 (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
443 ) & ~(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
444 ).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
445
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
446 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
447 _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
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 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
450 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
451 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
452 (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
453 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
454 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
455 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
456 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
457 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
458 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
459 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
460 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
461 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
462 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
463 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
464 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
465 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
466 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
467
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
468 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
469 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
470 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
471 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
472 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
473 # 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
474 pass
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
475
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
476 # 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
477 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
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 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
480 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
481 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
482
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
483 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
484 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
485 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
486 # 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
487 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
488 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
489 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
490
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
491 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
492 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
493 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
494 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
495 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
496 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
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 # 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
499 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
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 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
502 # 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
503 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
504 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
505 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
506 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
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 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
509 _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
510 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
511
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
512 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
513 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
514 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
515 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
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 __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
518 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
519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
520 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
521 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
522 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
523 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
524 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
525 _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
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 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
528 # 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
529 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
530 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
531 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
532 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
533 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
534 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
535
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 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
537 # 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
538 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
539 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
540 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
541 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
542
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
543 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
544 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
545
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
546 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
547 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
548 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
549 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
550 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
551 _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
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 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
555 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
556 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
557
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
558 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
559 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
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 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
562 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
563 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
564 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
565
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
566 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
567 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
568 % (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
569 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
570 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
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
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
573 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
574 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
575 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
576 (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
577 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
578 _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
579
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
580 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
581 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
582 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
583
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
584 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
585 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
586 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
587 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
588 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
589
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
590
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
591 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
592 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
593 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
594 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
595 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
596 _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
597
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
598 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
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 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
601
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
602 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
603 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
604 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
605 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
606
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
607 # 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
608 # 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
609 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
610
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
611 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
612 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
613 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
614 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
615 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
616 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
617 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
618
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 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
621 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
622 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
623 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
624 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
625 _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
626
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
627 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
628 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
629 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
630 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
631 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
632 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
633 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
634 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
635 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
636 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
637 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
638
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
639 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
640 # 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
641 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
642 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
643 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
644
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
645 result = {}
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
646 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
647 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
648 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
649 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
650 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
651
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
652 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
653 # 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
654 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
655 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
656 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
657 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
658
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
659 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
660 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
661 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
662 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
663 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
664 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
665 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
666 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
667 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
668 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
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 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
671 _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
672
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
673 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
674 # 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
675 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
676 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
677 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
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 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
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 # 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
687 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
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 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
690 # 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
691 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
692 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
693 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
694 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
695
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
696 # 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
697
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
698 # 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
699 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
700 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
701
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
702 # 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
703 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
704
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
705 _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
706 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
707
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
708 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
709 _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
710
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
711 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
712 # 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
713 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
714 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
715
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
716 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
717 # 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
718 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
719 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
720 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
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 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
723 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
724 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
725
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
726 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
727 # 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
728 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
729 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
730 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
731 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
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 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
734 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
735 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
736 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
737 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
738 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
739 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
740
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
741 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
742 _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
743
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
744 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
745 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
746 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
747 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
748 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
749 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
750 };
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
751
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
752 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
753 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
754 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
755 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
756 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
757
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
758 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
759 #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
760 #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
761 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
762 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
763 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
764 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
765
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
766 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
767
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
768 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
769 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
770 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
771 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
772
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
773 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
774 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
775 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
776 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
777 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
778 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
779
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
780 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
781 # 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
782 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
783 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
784
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
785
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
786 class PyBoolObjectPtr(PyLongObjectPtr):
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
787 """
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
788 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
789 <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
790 """
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
791 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
792 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
793 return True
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
794 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
795 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
796
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
797 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
798 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
799 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
800 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
801 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
802 _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
803
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
804 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
805 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
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
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
808 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
809 _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
810
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
811 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
812 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
813
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
814 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
815 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
816 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
817 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
818
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
819 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
820 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
821 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
822 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
823
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
824 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
825 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
826 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
827 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
828 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
829 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
830 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
831
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
832 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
833 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
834 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
835 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
836 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
837 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
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 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
840 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
841 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
842 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
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 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
845 return
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 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
848 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
849
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
850 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
851 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
852 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
853 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
854 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
855 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
856 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
857
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
858 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
859 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
860
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
861 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
862 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
863 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
864 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
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 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
867 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
868 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
869 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
870 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
871 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
872 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
873 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
874 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
875 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
876 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
877 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
878
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
879 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
880 '''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
881 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
882 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
883 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
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_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
886 '''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
887
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
888 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
889
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
890 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
891 '''
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
892 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
893 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
894 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
895 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
896 # 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
897 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
898 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
899 #try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
900 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
901 #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
902 # 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
903
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
904 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
905 '''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
906 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
907 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
908 return '(frame information optimized out)'
65485
023b41376290 libpython: implementation of os.fsencode() with surrogateescape error handler
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64573
diff changeset
909 filename = self.filename()
71106
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
910 try:
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
911 f = open(os_fsencode(filename), 'r')
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
912 except IOError:
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
913 return None
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
914 with f:
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
915 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
916 # 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
917 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
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 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
920 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
921 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
922 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
923 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
924 % (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
925 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
926 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
927 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
928 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
929 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
930 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
931 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
932 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
933
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
934 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
935 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
936 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
937
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
938 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
939
70078
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
940 def print_traceback(self):
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
941 if self.is_optimized_out():
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
942 sys.stdout.write(' (frame information optimized out)\n')
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
943 visited = set()
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
944 sys.stdout.write(' File "%s", line %i, in %s\n'
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
945 % (self.co_filename.proxyval(visited),
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
946 self.current_line_num(),
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
947 self.co_name.proxyval(visited)))
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
948
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
949 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
950 _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
951
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
952 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
953 # 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
954 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
955 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
956 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
957
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
958 members = []
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
959 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
960 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
961 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
962 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
963 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
964 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
965 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
966 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
967 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
968 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
969 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
970 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
971
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
972 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
973 # 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
974 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
975
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
976 # 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
977 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
978 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
979 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
980 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
981
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
982 # 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
983 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
984 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
985 out.write('()')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
986 return
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
987
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
988 # 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
989 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
990 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
991 out.write('(')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
992
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
993 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
994 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
995 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
996 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
997 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
998 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
999 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
1000 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
1001 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
1002 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
1003 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
1004 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
1005 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
1006 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
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
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1009 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
1010 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
1011
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1012
60812
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
1013 class PyBytesObjectPtr(PyObjectPtr):
6d836b10e370 Adapt libpython.py and test_gdb.py to Python3
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60803
diff changeset
1014 _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
1015
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1016 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
1017 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
1018 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
1019 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
1020 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
1021
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1022 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
1023 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
1024
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1025 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
1026 # 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
1027
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1028 # 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
1029 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
1030
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1031 # 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
1032 # 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
1033 quote = "'"
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1034 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
1035 quote = '"'
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1036 out.write('b')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1037 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1038 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
1039 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
1040 out.write('\\')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1041 out.write(byte)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1042 elif byte == '\t':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1043 out.write('\\t')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1044 elif byte == '\n':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1045 out.write('\\n')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1046 elif byte == '\r':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1047 out.write('\\r')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1048 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
1049 out.write('\\x')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1050 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
1051 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
1052 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1053 out.write(byte)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1054 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1055
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1056 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
1057 _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
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 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
1060 # 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
1061 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
1062 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
1063
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1064 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
1065 # 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
1066 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
1067 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
1068 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
1069
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1070 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
1071 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
1072 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
1073
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1074 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
1075 # 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
1076 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
1077 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
1078 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1079 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
1080
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1081 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
1082 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
1083 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
1084 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
1085 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
1086 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
1087 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
1088 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
1089 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1090 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
1091
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1092 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
1093 _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
1094
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1095
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1096 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
1097 # 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
1098 if char == u" ":
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1099 return True
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1100 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
1101 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
1102
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1103 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
1104 _unichr = unichr
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1105 else:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1106 # 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
1107 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
1108 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
1109 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
1110 x -= 0x10000
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1111 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
1112 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
1113 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
1114
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1115
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1116 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
1117 _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
1118
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1119 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
1120 _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
1121 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
1122
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1123 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
1124 # 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
1125 # 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
1126 # 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
1127 field_length = long(self.field('length'))
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1128 if _is_pep393:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1129 # Python 3.3 and newer
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1130 may_have_surrogates = False
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1131 field_state = long(self.field('state'))
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1132 repr_kind = (field_state & 0xC) >> 2
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1133 if repr_kind == 0:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1134 # string is not ready
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1135 may_have_surrogates = True
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1136 field_str = self.field('wstr')
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1137 field_length = self.field('wstr_length')
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1138 elif repr_kind == 1:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1139 field_str = self.field('data')['latin1']
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1140 elif repr_kind == 2:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1141 field_str = self.field('data')['ucs2']
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1142 elif repr_kind == 3:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1143 field_str = self.field('data')['ucs4']
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1144 else:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1145 # Python 3.2 and earlier
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1146 field_str = self.field('str')
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1147 may_have_surrogates = self.char_width() == 2
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1148
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1149 # Gather a list of ints from the Py_UNICODE array; these are either
72475
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1150 # UCS-1, UCS-2 or UCS-4 code points:
8beaa9a37387 Implement PEP 393.
Martin v. Löwis <martin@v.loewis.de>
parents: 71106
diff changeset
1151 if not may_have_surrogates:
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1152 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
1153 else:
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1154 # 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
1155 # 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
1156 Py_UNICODEs = []
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1157 i = 0
64571
b1cf3f7f304c Add a safety limit to the number of unicode characters we fetch
Antoine Pitrou <solipsis@pitrou.net>
parents: 64570
diff changeset
1158 limit = safety_limit(field_length)
b1cf3f7f304c Add a safety limit to the number of unicode characters we fetch
Antoine Pitrou <solipsis@pitrou.net>
parents: 64570
diff changeset
1159 while i < limit:
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1160 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
1161 i += 1
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1162 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
1163 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
1164 continue
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1165 # 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
1166 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
1167 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
1168 continue
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1169 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
1170 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
1171 code += 0x00010000
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1172 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
1173 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
1174
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1175 # 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
1176 # 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
1177 # 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
1178 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
1179 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
1180
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1181 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
1182 # 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
1183
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1184 # 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
1185 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
1186
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1187 # 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
1188 # to Python 2:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1189 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
1190 quote = '"'
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1191 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1192 quote = "'"
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1193 out.write(quote)
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 i = 0
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1196 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
1197 ch = proxy[i]
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1198 i += 1
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1199
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1200 # 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
1201 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
1202 out.write('\\')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1203 out.write(ch)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1204
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1205 # 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
1206 elif ch == '\t':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1207 out.write('\\t')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1208 elif ch == '\n':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1209 out.write('\\n')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1210 elif ch == '\r':
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1211 out.write('\\r')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1212
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1213 # 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
1214 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
1215 out.write('\\x')
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1216 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
1217 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
1218
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1219 # 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
1220 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
1221 out.write(ch)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1222
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1223 # Non-ASCII characters
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1224 else:
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1225 ucs = ch
64570
a2aeddc19b66 Issue #9188: The gdb extension now handles correctly narrow (UCS2) as well
Antoine Pitrou <solipsis@pitrou.net>
parents: 64134
diff changeset
1226 ch2 = None
64573
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1227 if sys.maxunicode < 0x10000:
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 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
1229 # 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
1230 if (i < len(proxy)
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1231 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
1232 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
1233 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
1234 ucs = ch + ch2
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1235 i += 1
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1236
64573
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1237 # Unfortuately, Python 2's unicode type doesn't seem
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1238 # 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
1239 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
1240 if printable:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1241 try:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1242 ucs.encode(ENCODING)
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1243 except UnicodeEncodeError:
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1244 printable = False
60823
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1245
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1246 # 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
1247 # (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
1248 if not printable:
64573
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1249 if ch2 is not None:
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1250 # Match Python 3's representation of non-printable
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1251 # wide characters.
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1252 code = (ord(ch) & 0x03FF) << 10
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1253 code |= ord(ch2) & 0x03FF
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1254 code += 0x00010000
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1255 else:
441e94ce4087 gdb: fix representation of non-printable surrogate pairs, and workaround
Antoine Pitrou <solipsis@pitrou.net>
parents: 64571
diff changeset
1256 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
1257
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1258 # 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
1259 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
1260 out.write('\\x')
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1261 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
1262 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
1263 # 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
1264 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
1265 out.write('\\U')
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1266 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
1267 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
1268 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
1269 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
1270 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
1271 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
1272 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
1273 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
1274 # 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
1275 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1276 out.write('\\u')
61768
503afc62d632 Issue #8559: improve unicode support of (gdb) libpython.py
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60823
diff changeset
1277 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
1278 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
1279 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
1280 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
1281 else:
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1282 # 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
1283 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
1284 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
1285 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
1286
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1287 out.write(quote)
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1288
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1289
888c75a1be55 Issue #8380: Port gdb/libpython to 3.x.
Martin v. Löwis <martin@v.loewis.de>
parents: 60812
diff changeset
1290
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1291
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1292 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
1293 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
1294
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1295
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1296 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
1297 # 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
1298 # 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
1299 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
1300 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
1301 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1302 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
1303 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
1304
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1305
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1306 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
1307 "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
1308
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1309 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
1310 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
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 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
1313 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
1314 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
1315 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
1316 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1317 # 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
1318 # 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
1319 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
1320 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
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 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
1323 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
1324 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
1325 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
1326 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
1327 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
1328 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
1329
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1330 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1331 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
1332 (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
1333
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1334 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
1335 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
1336 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
1337 end
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1338
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1339 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
1340 (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
1341
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1342 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
1343 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
1344 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
1345 .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
1346 /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
1347 /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
1348 """
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1349 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
1350 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
1351 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
1352
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1353 # 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
1354 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
1355
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1356 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
1357
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1358
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1359
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1360 # 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
1361 # 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
1362 # 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
1363
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1364 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
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 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
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 __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
1369 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
1370
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1371 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
1372 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
1373 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
1374 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
1375 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1376 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
1377
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1378 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
1379 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
1380 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
1381 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
1382 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1383 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
1384
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1385 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
1386 '''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
1387
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1388 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
1389 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
1390 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
1391 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
1392 '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
1393 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
1394 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
1395 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
1396
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1397 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
1398 '''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
1399 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
1400 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
1401 # 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
1402 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
1403 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
1404 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
1405 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
1406 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
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 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
1409 '''Is this a PyEval_EvalFrameEx frame?'''
60792
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1410 if self._gdbframe.name() == 'PyEval_EvalFrameEx':
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1411 '''
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1412 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
1413 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
1414 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
1415
60792
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1416 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
1417 '''
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1418 if self._gdbframe.type() == gdb.NORMAL_FRAME:
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1419 # We have a PyEval_EvalFrameEx frame:
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1420 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
1421
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1422 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
1423
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1424 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
1425 try:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1426 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
1427 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
1428 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
1429 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
1430
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1431 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1432 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
1433 _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
1434 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
1435 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
1436 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
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 @classmethod
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1439 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
1440 '''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
1441 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
1442 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
1443
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1444 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
1445 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
1446 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
1447 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
1448
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1449 # 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
1450 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
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 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
1453 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
1454 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
1455 if pyop:
64134
fc794add559d libpython.py: py-bt commands escape unencodable characters
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63012
diff changeset
1456 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
1457 write_unicode(sys.stdout, '#%i %s\n' % (self.get_index(), line))
71106
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1458 line = pyop.current_line()
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1459 if line is not None:
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1460 sys.stdout.write(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
1461 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1462 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
1463 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1464 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
1465
70078
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1466 def print_traceback(self):
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1467 if self.is_evalframeex():
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1468 pyop = self.get_pyop()
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1469 if pyop:
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1470 pyop.print_traceback()
71106
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1471 line = pyop.current_line()
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1472 if line is not None:
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1473 sys.stdout.write(' %s\n' % line.strip())
70078
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1474 else:
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1475 sys.stdout.write(' (unable to read python frame information)\n')
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1476 else:
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1477 sys.stdout.write(' (not a python frame)\n')
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1478
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1479 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
1480 '''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
1481
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1482 Use
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1483 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
1484 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
1485
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1486 Use
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1487 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
1488 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
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
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1491 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
1492 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
1493 "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
1494 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
1495 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
1496
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 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
1499 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
1500
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1501 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
1502 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
1503
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1504 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
1505 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
1506 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
1507 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
1508
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1509 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
1510 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
1511 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
1512
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1513 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
1514 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
1515 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
1516 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1517
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1518 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
1519 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
1520 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
1521 return
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 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
1524 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
1525
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1526 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
1527 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
1528 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
1529
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1530 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
1531 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
1532
71106
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1533 try:
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1534 f = open(os_fsencode(filename), 'r')
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1535 except IOError as err:
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1536 sys.stdout.write('Unable to open %s: %s\n'
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1537 % (filename, err))
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1538 return
316764e64b0a libpython.py (gdb) now catchs IOError in py-list and py-bt commands
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70078
diff changeset
1539 with f:
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1540 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
1541 # 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
1542 # 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
1543 # 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
1544 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
1545 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
1546 # 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
1547 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
1548 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
1549 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
1550
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1551
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1552 # ...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
1553 PyList()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1554
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1555 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
1556 '''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
1557 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
1558 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
1559 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
1560 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
1561 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1562 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
1563
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1564 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
1565 break
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 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
1568 # Result:
60803
a2a4d9dc7884 Merged revisions 79986-79987,80156 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 60792
diff changeset
1569 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
1570 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
1571 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1572
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1573 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
1574
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1575 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
1576 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
1577 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1578 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
1579
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1580 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
1581 '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
1582 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
1583 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
1584 "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
1585 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
1586 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
1587
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1588
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1589 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
1590 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
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 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
1593 '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
1594 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
1595 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
1596 "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
1597 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
1598 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
1599
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 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
1602 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
1603
60792
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1604 # 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
1605 if hasattr(gdb.Frame, 'select'):
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1606 PyUp()
19a9a457a47a Merged revisions 80288 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60519
diff changeset
1607 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
1608
70078
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1609 class PyBacktraceFull(gdb.Command):
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1610 'Display the current python frame and all the frames within its call stack (if any)'
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1611 def __init__(self):
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1612 gdb.Command.__init__ (self,
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1613 "py-bt-full",
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1614 gdb.COMMAND_STACK,
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1615 gdb.COMPLETE_NONE)
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1616
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1617
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1618 def invoke(self, args, from_tty):
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1619 frame = Frame.get_selected_python_frame()
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1620 while frame:
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1621 if frame.is_evalframeex():
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1622 frame.print_summary()
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1623 frame = frame.older()
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1624
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1625 PyBacktraceFull()
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1626
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1627 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
1628 '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
1629 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
1630 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
1631 "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
1632 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
1633 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
1634
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1635
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1636 def invoke(self, args, from_tty):
70078
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1637 sys.stdout.write('Traceback (most recent call first):\n')
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1638 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
1639 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
1640 if frame.is_evalframeex():
70078
b340d1577dc5 Issue #11996: libpython (gdb), replace "py-bt" command by "py-bt-full" and add
Victor Stinner <victor.stinner@haypocalc.com>
parents: 65485
diff changeset
1641 frame.print_traceback()
60519
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1642 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
1643
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1644 PyBacktrace()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1645
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1646 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
1647 '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
1648 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
1649 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
1650 "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
1651 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
1652 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
1653
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1654
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1655 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
1656 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
1657
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1658 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
1659 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
1660 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
1661 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1662
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1663 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
1664 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
1665 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
1666 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1667
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1668 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
1669
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1670 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
1671 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
1672 % (scope,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1673 name,
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1674 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
1675 else:
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1676 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
1677
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1678 PyPrint()
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1679
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1680 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
1681 '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
1682 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
1683 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
1684 "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
1685 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
1686 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
1687
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1688
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1689 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
1690 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
1691
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1692 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
1693 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
1694 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
1695 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1696
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1697 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
1698 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
1699 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
1700 return
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1701
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1702 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
1703 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
1704 % (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
1705 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
1706
fd3caea92cd9 Merged revisions 79548,79557,79616-79617,79716,79778,79795,79803,79896 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1707 PyLocals()