mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-09 04:21:49 +08:00
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>
This commit is contained in:
parent
f74da7b8b3
commit
8a2e940b8d
@ -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. */
|
||||
|
@ -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; };
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user