diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f9e94b63ac..51cee9a078 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2009-09-22 Tom Tromey + + PR python/10680: + * eval.c (evaluate_subexp_standard) : Handle internal + functions in EVAL_AVOID_SIDE_EFFECTS case. + 2009-09-22 Jie Zhang * MAINTAINERS: Add myself under Write After Approval. diff --git a/gdb/eval.c b/gdb/eval.c index 7e41d3962a..2926465c41 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -1513,11 +1513,18 @@ evaluate_subexp_standard (struct type *expect_type, gdb isn't asked for it's opinion (ie. through "whatis"), it won't offer it. */ - struct type *ftype = - TYPE_TARGET_TYPE (value_type (argvec[0])); + struct type *ftype = value_type (argvec[0]); - if (ftype) - return allocate_value (TYPE_TARGET_TYPE (value_type (argvec[0]))); + if (TYPE_CODE (ftype) == TYPE_CODE_INTERNAL_FUNCTION) + { + /* We don't know anything about what the internal + function might return, but we have to return + something. */ + return value_zero (builtin_type (exp->gdbarch)->builtin_int, + not_lval); + } + else if (TYPE_TARGET_TYPE (ftype)) + return allocate_value (TYPE_TARGET_TYPE (ftype)); else error (_("Expression of type other than \"Function returning ...\" used as function")); } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index ac6fbc296c..b86f723396 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-09-22 Tom Tromey + + * gdb.python/py-function.exp: Add regression tests. + 2009-09-21 Keith Seitz * gdb.cp/cplusfuncs.exp (do_tests): Add check for proper error message diff --git a/gdb/testsuite/gdb.python/py-function.exp b/gdb/testsuite/gdb.python/py-function.exp index 7feca2b6aa..30fde7dd41 100644 --- a/gdb/testsuite/gdb.python/py-function.exp +++ b/gdb/testsuite/gdb.python/py-function.exp @@ -77,3 +77,16 @@ gdb_py_test_multiple "input value-returning convenience function" \ "end" "" gdb_test "print \$double (1)" "= 2" "call value-returning function" + +gdb_py_test_multiple "input int-returning function" \ + "python" "" \ + "class Yes(gdb.Function):" "" \ + " def __init__(self):" "" \ + " gdb.Function.__init__(self, 'yes')" "" \ + " def invoke(self):" "" \ + " return 1" "" \ + "Yes ()" "" \ + "end" "" + +gdb_test "print \$yes() && \$yes()" " = 1" "call yes with &&" +gdb_test "print \$yes() || \$yes()" " = 1" "call yes with ||"