aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2024-03-09 16:13:10 +0100
committerTom de Vries <tdevries@suse.de>2024-03-09 16:13:10 +0100
commit50ede76876981364d6b1a314bb79c0412980c435 (patch)
tree211c94f7c5a738a18f43dccf9c31daa37ae599a5
parentb1abf8b1b93b5ccdcd400b925dd9046b80f0c32b (diff)
downloadbinutils-50ede76876981364d6b1a314bb79c0412980c435.zip
binutils-50ede76876981364d6b1a314bb79c0412980c435.tar.gz
binutils-50ede76876981364d6b1a314bb79c0412980c435.tar.bz2
[gdb/python] Normalize exceptions in gdbpy_err_fetch
With python 3.12, I run into: ... (gdb) PASS: gdb.python/py-block.exp: check variable access python print (block['nonexistent'])^M Python Exception <class 'KeyError'>: 'nonexistent'^M Error occurred in Python: 'nonexistent'^M (gdb) FAIL: gdb.python/py-block.exp: check nonexistent variable ... The problem is that that PyErr_Fetch returns a normalized exception, while the test-case matches the output for an unnormalized exception. With python 3.6, PyErr_Fetch returns an unnormalized exception, and the test passes. Fix this by: - updating the test-case to match the output for a normalized exception, and - lazily forcing normalized exceptions using PyErr_NormalizeException. Tested on aarch64-linux. Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r--gdb/python/python-internal.h15
-rw-r--r--gdb/testsuite/gdb.python/py-block.exp2
2 files changed, 15 insertions, 2 deletions
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index 9ceb4aa..30802ae 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -683,6 +683,18 @@ public:
gdbpy_ref<> value () const
{
+ if (!m_normalized)
+ {
+ PyObject *error_type, *error_value, *error_traceback;
+ error_type = m_error_type.release ();
+ error_value = m_error_value.release ();
+ error_traceback = m_error_traceback.release ();
+ PyErr_NormalizeException (&error_type, &error_value, &error_traceback);
+ m_error_type.reset (error_type);
+ m_error_value.reset (error_value);
+ m_error_traceback.reset (error_traceback);
+ m_normalized = true;
+ }
return m_error_value;
}
@@ -695,7 +707,8 @@ public:
private:
- gdbpy_ref<> m_error_type, m_error_value, m_error_traceback;
+ mutable gdbpy_ref<> m_error_type, m_error_value, m_error_traceback;
+ mutable bool m_normalized = false;
};
/* Called before entering the Python interpreter to install the
diff --git a/gdb/testsuite/gdb.python/py-block.exp b/gdb/testsuite/gdb.python/py-block.exp
index 942611a..99642a5 100644
--- a/gdb/testsuite/gdb.python/py-block.exp
+++ b/gdb/testsuite/gdb.python/py-block.exp
@@ -44,7 +44,7 @@ gdb_test "python print (block.function)" "None" "first anonymous block"
gdb_test "python print (block.start)" "${decimal}" "check start not None"
gdb_test "python print (block.end)" "${decimal}" "check end not None"
gdb_test "python print (block\['f'\].name == 'f')" "True" "check variable access"
-gdb_test "python print (block\['nonexistent'\])" ".*KeyError.*: nonexistent.*" \
+gdb_test "python print (block\['nonexistent'\])" ".*KeyError.*: 'nonexistent'.*" \
"check nonexistent variable"
gdb_test "python print (block\[42\])" ".*TypeError.*: Expected a string.*" \
"check non-string key"