aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2024-06-03 17:23:26 +0200
committerHannes Domani <ssbssa@yahoo.de>2024-06-03 17:23:26 +0200
commit8a2e940b8d5751805d5fab127cc7dca0ce36ff0d (patch)
tree94b5b029b1435509f9c5974790b1bc669bf2e561 /gdb
parentf74da7b8b3d6f14ba9ad21b380f743e4bdc4e952 (diff)
downloadbinutils-8a2e940b8d5751805d5fab127cc7dca0ce36ff0d.zip
binutils-8a2e940b8d5751805d5fab127cc7dca0ce36ff0d.tar.gz
binutils-8a2e940b8d5751805d5fab127cc7dca0ce36ff0d.tar.bz2
Enable call of overloaded subscript operator from python
If you try to use the overloaded subscript operator of a class in python, it fails like this: (gdb) py print(gdb.parse_and_eval('b')[5]) Traceback (most recent call last): File "<string>", line 1, in <module> gdb.error: Cannot subscript requested type. Error while executing Python code. This simply checks if such an operator exists, and calls it instead, making this possible: (gdb) py print(gdb.parse_and_eval('b')[5]) 102 'f' Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r--gdb/python/py-value.c6
-rw-r--r--gdb/testsuite/gdb.python/py-value-cc.cc6
-rw-r--r--gdb/testsuite/gdb.python/py-value-cc.exp1
3 files changed, 12 insertions, 1 deletions
diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 1ae26d7..dada8bf 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -1153,7 +1153,11 @@ valpy_getitem (PyObject *self, PyObject *key)
type. */
struct value *idx = convert_value_from_python (key);
- if (idx != NULL)
+ if (idx != NULL
+ && binop_user_defined_p (BINOP_SUBSCRIPT, tmp, idx))
+ res_val = value_x_binop (tmp, idx, BINOP_SUBSCRIPT,
+ OP_NULL, EVAL_NORMAL);
+ else if (idx != NULL)
{
/* Check the value's type is something that can be accessed via
a subscript. */
diff --git a/gdb/testsuite/gdb.python/py-value-cc.cc b/gdb/testsuite/gdb.python/py-value-cc.cc
index 2d38a26..08b9915 100644
--- a/gdb/testsuite/gdb.python/py-value-cc.cc
+++ b/gdb/testsuite/gdb.python/py-value-cc.cc
@@ -42,6 +42,7 @@ class B : public A {
int arg0_func ();
int arg1_func (int arg1);
int arg2_func (int arg1, int arg2);
+ char operator[] (int num);
};
int B::static_func ()
@@ -64,6 +65,11 @@ int B::arg2_func (int arg1, int arg2)
return a * arg1 + arg2;
}
+char B::operator[] (int num)
+{
+ return a + num;
+}
+
struct X
{
union { int x; char y; };
diff --git a/gdb/testsuite/gdb.python/py-value-cc.exp b/gdb/testsuite/gdb.python/py-value-cc.exp
index 17a67e2..b096c75 100644
--- a/gdb/testsuite/gdb.python/py-value-cc.exp
+++ b/gdb/testsuite/gdb.python/py-value-cc.exp
@@ -99,6 +99,7 @@ gdb_test "python print(uu\[uu_fields\[1\]\]\['a'\])" "1000" "uu.a via field"
# Test overloaded operators.
gdb_test_no_output "python a = gdb.parse_and_eval('a')" "init a"
gdb_test "python print(a + 5)" "10" "a + 5"
+gdb_test "python print(gdb.parse_and_eval('b')\[5\])" "102 'f'"
# Test inferior function calls of methods.
gdb_test "py print(b_obj\['static_func'\]())" "1111"