summaryrefslogtreecommitdiffstats
path: root/Tools/gdb/libpython.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/gdb/libpython.py')
-rwxr-xr-xTools/gdb/libpython.py26
1 files changed, 17 insertions, 9 deletions
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index 56d6970..e38bd59 100755
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -882,10 +882,16 @@ class PyLongObjectPtr(PyObjectPtr):
def proxyval(self, visited):
'''
Python's Include/longobjrep.h has this declaration:
- struct _longobject {
- PyObject_VAR_HEAD
- digit ob_digit[1];
- };
+
+ typedef struct _PyLongValue {
+ uintptr_t lv_tag; /* Number of digits, sign and flags */
+ digit ob_digit[1];
+ } _PyLongValue;
+
+ struct _longobject {
+ PyObject_HEAD
+ _PyLongValue long_value;
+ };
with this description:
The absolute value of a number is equal to
@@ -897,11 +903,13 @@ class PyLongObjectPtr(PyObjectPtr):
#define PyLong_SHIFT 30
#define PyLong_SHIFT 15
'''
- ob_size = int(self.field('ob_size'))
- if ob_size == 0:
+ long_value = self.field('long_value')
+ lv_tag = int(long_value['lv_tag'])
+ size = lv_tag >> 3
+ if size == 0:
return 0
- ob_digit = self.field('long_value')['ob_digit']
+ ob_digit = long_value['ob_digit']
if gdb.lookup_type('digit').sizeof == 2:
SHIFT = 15
@@ -909,9 +917,9 @@ class PyLongObjectPtr(PyObjectPtr):
SHIFT = 30
digits = [int(ob_digit[i]) * 2**(SHIFT*i)
- for i in safe_range(abs(ob_size))]
+ for i in safe_range(size)]
result = sum(digits)
- if ob_size < 0:
+ if (lv_tag & 3) == 2:
result = -result
return result