int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) { if (gdbpy_is_value_object (obj)) *addr = value_as_address (value_object_to_value (obj)); else { PyObject *num = PyNumber_Long (obj); gdb_py_ulongest val; if (num == NULL) return 0; val = gdb_py_long_as_ulongest (num); Py_XDECREF (num); if (PyErr_Occurred ()) return 0; if (sizeof (val) > sizeof (CORE_ADDR) && ((CORE_ADDR) val) != val) { PyErr_SetString (PyExc_ValueError, _("Overflow converting to address.")); return 0; } *addr = val; } return 1; }
int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) { if (gdbpy_is_value_object (obj)) { TRY { *addr = value_as_address (value_object_to_value (obj)); } CATCH (except, RETURN_MASK_ALL) { GDB_PY_SET_HANDLE_EXCEPTION (except); } END_CATCH }
int get_addr_from_python (PyObject *obj, CORE_ADDR *addr) { if (gdbpy_is_value_object (obj)) *addr = value_as_address (value_object_to_value (obj)); else if (PyLong_Check (obj)) { /* Assume CORE_ADDR corresponds to unsigned long. */ *addr = PyLong_AsUnsignedLong (obj); if (PyErr_Occurred () != NULL) return 0; } else if (PyInt_Check (obj)) { long val; /* Assume CORE_ADDR corresponds to unsigned long. */ val = PyInt_AsLong (obj); if (val >= 0) *addr = val; else { /* If no error ocurred, VAL is indeed negative. */ if (PyErr_Occurred () != NULL) return 0; PyErr_SetString (PyExc_ValueError, _("Supplied address is negative.")); return 0; } } else { PyErr_SetString (PyExc_TypeError, _("Invalid type for address.")); return 0; } return 1; }
void bpfinishpy_pre_stop_hook (struct gdbpy_breakpoint_object *bp_obj) { struct finish_breakpoint_object *self_finishbp = (struct finish_breakpoint_object *) bp_obj; /* Can compute return_value only once. */ gdb_assert (!self_finishbp->return_value); if (!self_finishbp->return_type) return; TRY { struct value *function = value_object_to_value (self_finishbp->function_value); struct type *value_type = type_object_to_type (self_finishbp->return_type); /* bpfinishpy_init cannot finish into DUMMY_FRAME (throws an error in such case) so it is OK to always pass CTX_SAVER as NULL. */ struct value *ret = get_return_value (function, value_type, NULL); if (ret) { self_finishbp->return_value = value_to_value_object (ret); if (!self_finishbp->return_value) gdbpy_print_stack (); } else { Py_INCREF (Py_None); self_finishbp->return_value = Py_None; } } CATCH (except, RETURN_MASK_ALL) { gdbpy_convert_exception (except); gdbpy_print_stack (); }
void bpfinishpy_pre_stop_hook (struct breakpoint_object *bp_obj) { struct finish_breakpoint_object *self_finishbp = (struct finish_breakpoint_object *) bp_obj; volatile struct gdb_exception except; /* Can compute return_value only once. */ gdb_assert (!self_finishbp->return_value); if (!self_finishbp->return_type) return; TRY_CATCH (except, RETURN_MASK_ALL) { struct value *function = value_object_to_value (self_finishbp->function_value); struct type *value_type = type_object_to_type (self_finishbp->return_type); struct value *ret = get_return_value (function, value_type); if (ret) { self_finishbp->return_value = value_to_value_object (ret); if (!self_finishbp->return_value) gdbpy_print_stack (); } else { Py_INCREF (Py_None); self_finishbp->return_value = Py_None; } } if (except.reason < 0) { gdbpy_convert_exception (except); gdbpy_print_stack (); } }