2011-10-07 Phil Muldoon <pmuldoon@redhat.com>
PR python/13624 * python/py-value.c (valpy_call): Check that arguments are a tuple. (is_intlike): Remove call to CHECK_TYPEDEF. (valpy_nonzero): Catch GDB exceptions. (valpy_absolute): Ditto. (valpy_lazy_string): Ditto. (valpy_call): Ditto. (valpy_get_is_optimized_out): Ditto. (valpy_long): Ditto. (valpy_float): Ditto. (valpy_int): Call CHECK_TYPEDEF. Catch GDB exceptions. (valpy_richcompare): Ditto.
This commit is contained in:
parent
99f5279d98
commit
f287c1f320
2 changed files with 95 additions and 42 deletions
|
@ -1,3 +1,20 @@
|
||||||
|
2011-10-07 Phil Muldoon <pmuldoon@redhat.com>
|
||||||
|
|
||||||
|
PR python/13624
|
||||||
|
|
||||||
|
* python/py-value.c (valpy_call): Check that arguments are
|
||||||
|
a tuple.
|
||||||
|
(is_intlike): Remove call to CHECK_TYPEDEF.
|
||||||
|
(valpy_nonzero): Catch GDB exceptions.
|
||||||
|
(valpy_absolute): Ditto.
|
||||||
|
(valpy_lazy_string): Ditto.
|
||||||
|
(valpy_call): Ditto.
|
||||||
|
(valpy_get_is_optimized_out): Ditto.
|
||||||
|
(valpy_long): Ditto.
|
||||||
|
(valpy_float): Ditto.
|
||||||
|
(valpy_int): Call CHECK_TYPEDEF. Catch GDB exceptions.
|
||||||
|
(valpy_richcompare): Ditto.
|
||||||
|
|
||||||
2011-10-07 Ulrich Weigand <ulrich.weigand@linaro.org>
|
2011-10-07 Ulrich Weigand <ulrich.weigand@linaro.org>
|
||||||
|
|
||||||
* inferior.h (disable_randomization): Declare.
|
* inferior.h (disable_randomization): Declare.
|
||||||
|
|
|
@ -312,13 +312,18 @@ valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw)
|
||||||
const char *user_encoding = NULL;
|
const char *user_encoding = NULL;
|
||||||
static char *keywords[] = { "encoding", "length", NULL };
|
static char *keywords[] = { "encoding", "length", NULL };
|
||||||
PyObject *str_obj;
|
PyObject *str_obj;
|
||||||
|
volatile struct gdb_exception except;
|
||||||
|
|
||||||
if (!PyArg_ParseTupleAndKeywords (args, kw, "|s" GDB_PY_LL_ARG, keywords,
|
if (!PyArg_ParseTupleAndKeywords (args, kw, "|s" GDB_PY_LL_ARG, keywords,
|
||||||
&user_encoding, &length))
|
&user_encoding, &length))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
value = value_ind (value);
|
{
|
||||||
|
if (TYPE_CODE (value_type (value)) == TYPE_CODE_PTR)
|
||||||
|
value = value_ind (value);
|
||||||
|
}
|
||||||
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
str_obj = gdbpy_create_lazy_string_object (value_address (value), length,
|
str_obj = gdbpy_create_lazy_string_object (value_address (value), length,
|
||||||
user_encoding,
|
user_encoding,
|
||||||
|
@ -510,7 +515,13 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords)
|
||||||
volatile struct gdb_exception except;
|
volatile struct gdb_exception except;
|
||||||
struct value *function = ((value_object *) self)->value;
|
struct value *function = ((value_object *) self)->value;
|
||||||
struct value **vargs = NULL;
|
struct value **vargs = NULL;
|
||||||
struct type *ftype = check_typedef (value_type (function));
|
struct type *ftype;
|
||||||
|
|
||||||
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
|
{
|
||||||
|
ftype = check_typedef (value_type (function));
|
||||||
|
}
|
||||||
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
if (TYPE_CODE (ftype) != TYPE_CODE_FUNC)
|
if (TYPE_CODE (ftype) != TYPE_CODE_FUNC)
|
||||||
{
|
{
|
||||||
|
@ -519,6 +530,13 @@ valpy_call (PyObject *self, PyObject *args, PyObject *keywords)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! PyTuple_Check (args))
|
||||||
|
{
|
||||||
|
PyErr_SetString (PyExc_TypeError,
|
||||||
|
_("Inferior arguments must be provided in a tuple."));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
args_count = PyTuple_Size (args);
|
args_count = PyTuple_Size (args);
|
||||||
if (args_count > 0)
|
if (args_count > 0)
|
||||||
{
|
{
|
||||||
|
@ -584,8 +602,16 @@ static PyObject *
|
||||||
valpy_get_is_optimized_out (PyObject *self, void *closure)
|
valpy_get_is_optimized_out (PyObject *self, void *closure)
|
||||||
{
|
{
|
||||||
struct value *value = ((value_object *) self)->value;
|
struct value *value = ((value_object *) self)->value;
|
||||||
|
int opt = 0;
|
||||||
|
volatile struct gdb_exception except;
|
||||||
|
|
||||||
if (value_optimized_out (value))
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
|
{
|
||||||
|
opt = value_optimized_out (value);
|
||||||
|
}
|
||||||
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
|
if (opt)
|
||||||
Py_RETURN_TRUE;
|
Py_RETURN_TRUE;
|
||||||
|
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
|
@ -792,33 +818,53 @@ static PyObject *
|
||||||
valpy_absolute (PyObject *self)
|
valpy_absolute (PyObject *self)
|
||||||
{
|
{
|
||||||
struct value *value = ((value_object *) self)->value;
|
struct value *value = ((value_object *) self)->value;
|
||||||
|
volatile struct gdb_exception except;
|
||||||
|
int isabs = 1;
|
||||||
|
|
||||||
if (value_less (value, value_zero (value_type (value), not_lval)))
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
return valpy_negative (self);
|
{
|
||||||
else
|
if (value_less (value, value_zero (value_type (value), not_lval)))
|
||||||
|
isabs = 0;
|
||||||
|
}
|
||||||
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
|
if (isabs)
|
||||||
return valpy_positive (self);
|
return valpy_positive (self);
|
||||||
|
else
|
||||||
|
return valpy_negative (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Implements boolean evaluation of gdb.Value. */
|
/* Implements boolean evaluation of gdb.Value. */
|
||||||
static int
|
static int
|
||||||
valpy_nonzero (PyObject *self)
|
valpy_nonzero (PyObject *self)
|
||||||
{
|
{
|
||||||
|
volatile struct gdb_exception except;
|
||||||
value_object *self_value = (value_object *) self;
|
value_object *self_value = (value_object *) self;
|
||||||
struct type *type;
|
struct type *type;
|
||||||
|
int nonzero = 0; /* Appease GCC warning. */
|
||||||
|
|
||||||
type = check_typedef (value_type (self_value->value));
|
type = check_typedef (value_type (self_value->value));
|
||||||
|
|
||||||
if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
return !!value_as_long (self_value->value);
|
{
|
||||||
else if (TYPE_CODE (type) == TYPE_CODE_FLT)
|
if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR)
|
||||||
return value_as_double (self_value->value) != 0;
|
nonzero = !!value_as_long (self_value->value);
|
||||||
else if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
|
else if (TYPE_CODE (type) == TYPE_CODE_FLT)
|
||||||
return !decimal_is_zero (value_contents (self_value->value),
|
nonzero = value_as_double (self_value->value) != 0;
|
||||||
TYPE_LENGTH (type),
|
else if (TYPE_CODE (type) == TYPE_CODE_DECFLOAT)
|
||||||
gdbarch_byte_order (get_type_arch (type)));
|
nonzero = !decimal_is_zero (value_contents (self_value->value),
|
||||||
else
|
TYPE_LENGTH (type),
|
||||||
/* All other values are True. */
|
gdbarch_byte_order (get_type_arch (type)));
|
||||||
return 1;
|
else
|
||||||
|
/* All other values are True. */
|
||||||
|
nonzero = 1;
|
||||||
|
}
|
||||||
|
/* This is not documented in the Python documentation, but if this
|
||||||
|
function fails, return -1 as slot_nb_nonzero does (the default
|
||||||
|
Python nonzero function). */
|
||||||
|
GDB_PY_SET_HANDLE_EXCEPTION (except);
|
||||||
|
|
||||||
|
return nonzero;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Implements ~ for value objects. */
|
/* Implements ~ for value objects. */
|
||||||
|
@ -954,7 +1000,6 @@ valpy_richcompare (PyObject *self, PyObject *other, int op)
|
||||||
static int
|
static int
|
||||||
is_intlike (struct type *type, int ptr_ok)
|
is_intlike (struct type *type, int ptr_ok)
|
||||||
{
|
{
|
||||||
CHECK_TYPEDEF (type);
|
|
||||||
return (TYPE_CODE (type) == TYPE_CODE_INT
|
return (TYPE_CODE (type) == TYPE_CODE_INT
|
||||||
|| TYPE_CODE (type) == TYPE_CODE_ENUM
|
|| TYPE_CODE (type) == TYPE_CODE_ENUM
|
||||||
|| TYPE_CODE (type) == TYPE_CODE_BOOL
|
|| TYPE_CODE (type) == TYPE_CODE_BOOL
|
||||||
|
@ -971,16 +1016,12 @@ valpy_int (PyObject *self)
|
||||||
LONGEST l = 0;
|
LONGEST l = 0;
|
||||||
volatile struct gdb_exception except;
|
volatile struct gdb_exception except;
|
||||||
|
|
||||||
CHECK_TYPEDEF (type);
|
|
||||||
if (!is_intlike (type, 0))
|
|
||||||
{
|
|
||||||
PyErr_SetString (PyExc_RuntimeError,
|
|
||||||
_("Cannot convert value to int."));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRY_CATCH (except, RETURN_MASK_ALL)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
|
CHECK_TYPEDEF (type);
|
||||||
|
if (!is_intlike (type, 0))
|
||||||
|
error (_("Cannot convert value to int."));
|
||||||
|
|
||||||
l = value_as_long (value);
|
l = value_as_long (value);
|
||||||
}
|
}
|
||||||
GDB_PY_HANDLE_EXCEPTION (except);
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
@ -997,15 +1038,13 @@ valpy_long (PyObject *self)
|
||||||
LONGEST l = 0;
|
LONGEST l = 0;
|
||||||
volatile struct gdb_exception except;
|
volatile struct gdb_exception except;
|
||||||
|
|
||||||
if (!is_intlike (type, 1))
|
|
||||||
{
|
|
||||||
PyErr_SetString (PyExc_RuntimeError,
|
|
||||||
_("Cannot convert value to long."));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRY_CATCH (except, RETURN_MASK_ALL)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
|
CHECK_TYPEDEF (type);
|
||||||
|
|
||||||
|
if (!is_intlike (type, 1))
|
||||||
|
error (_("Cannot convert value to long."));
|
||||||
|
|
||||||
l = value_as_long (value);
|
l = value_as_long (value);
|
||||||
}
|
}
|
||||||
GDB_PY_HANDLE_EXCEPTION (except);
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
@ -1022,16 +1061,13 @@ valpy_float (PyObject *self)
|
||||||
double d = 0;
|
double d = 0;
|
||||||
volatile struct gdb_exception except;
|
volatile struct gdb_exception except;
|
||||||
|
|
||||||
CHECK_TYPEDEF (type);
|
|
||||||
if (TYPE_CODE (type) != TYPE_CODE_FLT)
|
|
||||||
{
|
|
||||||
PyErr_SetString (PyExc_RuntimeError,
|
|
||||||
_("Cannot convert value to float."));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRY_CATCH (except, RETURN_MASK_ALL)
|
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||||
{
|
{
|
||||||
|
CHECK_TYPEDEF (type);
|
||||||
|
|
||||||
|
if (TYPE_CODE (type) != TYPE_CODE_FLT)
|
||||||
|
error (_("Cannot convert value to float."));
|
||||||
|
|
||||||
d = value_as_double (value);
|
d = value_as_double (value);
|
||||||
}
|
}
|
||||||
GDB_PY_HANDLE_EXCEPTION (except);
|
GDB_PY_HANDLE_EXCEPTION (except);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue