From: Hannes Domani Date: Mon, 3 Jun 2024 15:23:26 +0000 (+0200) Subject: Enable call of overloaded subscript operator from python X-Git-Tag: binutils-2_43~561 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8a2e940b8d5751805d5fab127cc7dca0ce36ff0d;p=thirdparty%2Fbinutils-gdb.git 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 "", line 1, in 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 --- diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 1ae26d73261..dada8bfb7e7 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 2d38a26d948..08b99158d02 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 17a67e20c1c..b096c7538a1 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"