* python/python.c (gdbpy_solib_name): Use gdb_py_longest and

GDB_PY_LL_ARG.
	* python/python-internal.h (GDB_PY_LL_ARG, GDB_PY_LLU_ARG): New
	macros.
	(gdb_py_longest, gdb_py_ulongest): New typedefs.
	(gdb_py_long_from_longest, gdb_py_long_from_ulongest)
	(gdb_py_long_as_ulongest): New defines.
	(gdb_py_object_from_longest, gdb_py_object_from_ulongest)
	(gdb_py_int_as_long): Declare.
	* python/py-value.c (valpy_lazy_string): Use gdb_py_longest,
	GDB_PY_LL_ARG, gdb_py_object_from_longest.
	(valpy_long): Add comment.
	* python/py-utils.c (get_addr_from_python): Use
	gdb_py_long_as_ulongest.  Handle overflow properly.
	(gdb_py_object_from_longest): New function.
	(gdb_py_object_from_ulongest): Likewise.
	(gdb_py_int_as_long): Likewise.
	* python/py-type.c (typy_array): Use gdb_py_int_as_long.
	* python/py-symtab.c (salpy_get_pc): Use
	gdb_py_long_from_ulongest.
	(salpy_get_line): Use PyInt_FromLong.
	* python/py-param.c (set_parameter_value): Use
	gdb_py_int_as_long.
	* python/py-lazy-string.c (stpy_get_address): Use
	gdb_py_long_from_ulongest.
	* python/py-frame.c (frapy_pc): Use gdb_py_long_from_ulongest.
	* python/py-cmd.c (cmdpy_completer): Use gdb_py_int_as_long.
	* python/py-breakpoint.c (bppy_set_thread): Use
	gdb_py_int_as_long.
	(bppy_set_task): Likewise.
	(bppy_set_ignore_count): Likewise.
	(bppy_set_hit_count): Likewise.
	* python/py-block.c (blpy_get_start): Use
	gdb_py_object_from_ulongest.
	(blpy_get_end): Likewise.
	(gdbpy_block_for_pc): Use gdb_py_ulongest and GDB_PY_LLU_ARG.
This commit is contained in:
Tom Tromey 2011-01-26 20:53:45 +00:00
parent 6ec8b48eb8
commit 74aedc4602
13 changed files with 184 additions and 78 deletions

View file

@ -1,3 +1,42 @@
2011-01-26 Tom Tromey <tromey@redhat.com>
* python/python.c (gdbpy_solib_name): Use gdb_py_longest and
GDB_PY_LL_ARG.
* python/python-internal.h (GDB_PY_LL_ARG, GDB_PY_LLU_ARG): New
macros.
(gdb_py_longest, gdb_py_ulongest): New typedefs.
(gdb_py_long_from_longest, gdb_py_long_from_ulongest)
(gdb_py_long_as_ulongest): New defines.
(gdb_py_object_from_longest, gdb_py_object_from_ulongest)
(gdb_py_int_as_long): Declare.
* python/py-value.c (valpy_lazy_string): Use gdb_py_longest,
GDB_PY_LL_ARG, gdb_py_object_from_longest.
(valpy_long): Add comment.
* python/py-utils.c (get_addr_from_python): Use
gdb_py_long_as_ulongest. Handle overflow properly.
(gdb_py_object_from_longest): New function.
(gdb_py_object_from_ulongest): Likewise.
(gdb_py_int_as_long): Likewise.
* python/py-type.c (typy_array): Use gdb_py_int_as_long.
* python/py-symtab.c (salpy_get_pc): Use
gdb_py_long_from_ulongest.
(salpy_get_line): Use PyInt_FromLong.
* python/py-param.c (set_parameter_value): Use
gdb_py_int_as_long.
* python/py-lazy-string.c (stpy_get_address): Use
gdb_py_long_from_ulongest.
* python/py-frame.c (frapy_pc): Use gdb_py_long_from_ulongest.
* python/py-cmd.c (cmdpy_completer): Use gdb_py_int_as_long.
* python/py-breakpoint.c (bppy_set_thread): Use
gdb_py_int_as_long.
(bppy_set_task): Likewise.
(bppy_set_ignore_count): Likewise.
(bppy_set_hit_count): Likewise.
* python/py-block.c (blpy_get_start): Use
gdb_py_object_from_ulongest.
(blpy_get_end): Likewise.
(gdbpy_block_for_pc): Use gdb_py_ulongest and GDB_PY_LLU_ARG.
2011-01-25 Mathieu Lacage <mathieu.lacage@inria.fr> 2011-01-25 Mathieu Lacage <mathieu.lacage@inria.fr>
PR/symtab 11766: PR/symtab 11766:

View file

@ -109,7 +109,7 @@ blpy_get_start (PyObject *self, void *closure)
BLPY_REQUIRE_VALID (self, block); BLPY_REQUIRE_VALID (self, block);
return PyLong_FromUnsignedLongLong (BLOCK_START (block)); return gdb_py_object_from_ulongest (BLOCK_START (block));
} }
static PyObject * static PyObject *
@ -119,7 +119,7 @@ blpy_get_end (PyObject *self, void *closure)
BLPY_REQUIRE_VALID (self, block); BLPY_REQUIRE_VALID (self, block);
return PyLong_FromUnsignedLongLong (BLOCK_END (block)); return gdb_py_object_from_ulongest (BLOCK_END (block));
} }
static PyObject * static PyObject *
@ -268,12 +268,12 @@ blpy_block_syms_dealloc (PyObject *obj)
PyObject * PyObject *
gdbpy_block_for_pc (PyObject *self, PyObject *args) gdbpy_block_for_pc (PyObject *self, PyObject *args)
{ {
unsigned PY_LONG_LONG pc; gdb_py_ulongest pc;
struct block *block; struct block *block;
struct obj_section *section; struct obj_section *section;
struct symtab *symtab; struct symtab *symtab;
if (!PyArg_ParseTuple (args, "K", &pc)) if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc))
return NULL; return NULL;
section = find_pc_mapped_section (pc); section = find_pc_mapped_section (pc);

View file

@ -211,7 +211,7 @@ static int
bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure) bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
{ {
breakpoint_object *self_bp = (breakpoint_object *) self; breakpoint_object *self_bp = (breakpoint_object *) self;
int id; long id;
BPPY_SET_REQUIRE_VALID (self_bp); BPPY_SET_REQUIRE_VALID (self_bp);
@ -223,7 +223,9 @@ bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
} }
else if (PyInt_Check (newvalue)) else if (PyInt_Check (newvalue))
{ {
id = (int) PyInt_AsLong (newvalue); if (! gdb_py_int_as_long (newvalue, &id))
return -1;
if (! valid_thread_id (id)) if (! valid_thread_id (id))
{ {
PyErr_SetString (PyExc_RuntimeError, PyErr_SetString (PyExc_RuntimeError,
@ -250,7 +252,7 @@ static int
bppy_set_task (PyObject *self, PyObject *newvalue, void *closure) bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
{ {
breakpoint_object *self_bp = (breakpoint_object *) self; breakpoint_object *self_bp = (breakpoint_object *) self;
int id; long id;
BPPY_SET_REQUIRE_VALID (self_bp); BPPY_SET_REQUIRE_VALID (self_bp);
@ -262,7 +264,9 @@ bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
} }
else if (PyInt_Check (newvalue)) else if (PyInt_Check (newvalue))
{ {
id = (int) PyInt_AsLong (newvalue); if (! gdb_py_int_as_long (newvalue, &id))
return -1;
if (! valid_task_id (id)) if (! valid_task_id (id))
{ {
PyErr_SetString (PyExc_RuntimeError, PyErr_SetString (PyExc_RuntimeError,
@ -324,7 +328,9 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
return -1; return -1;
} }
value = PyInt_AsLong (newvalue); if (! gdb_py_int_as_long (newvalue, &value))
return -1;
if (value < 0) if (value < 0)
value = 0; value = 0;
set_ignore_count (self_bp->number, (int) value, 0); set_ignore_count (self_bp->number, (int) value, 0);
@ -346,11 +352,19 @@ bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
_("Cannot delete `hit_count' attribute.")); _("Cannot delete `hit_count' attribute."));
return -1; return -1;
} }
else if (! PyInt_Check (newvalue) || PyInt_AsLong (newvalue) != 0) else
{ {
PyErr_SetString (PyExc_AttributeError, long value;
_("The value of `hit_count' must be zero."));
return -1; if (! gdb_py_int_as_long (newvalue, &value))
return -1;
if (value != 0)
{
PyErr_SetString (PyExc_AttributeError,
_("The value of `hit_count' must be zero."));
return -1;
}
} }
self_bp->bp->hit_count = 0; self_bp->bp->hit_count = 0;

View file

@ -279,9 +279,14 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
{ {
/* User code may also return one of the completion constants, /* User code may also return one of the completion constants,
thus requesting that sort of completion. */ thus requesting that sort of completion. */
long value = PyInt_AsLong (resultobj); long value;
if (value >= 0 && value < (long) N_COMPLETERS) if (! gdb_py_int_as_long (resultobj, &value))
{
/* Ignore. */
PyErr_Clear ();
}
else if (value >= 0 && value < (long) N_COMPLETERS)
result = completers[value].completer (command, text, word); result = completers[value].completer (command, text, word);
} }

View file

@ -201,7 +201,7 @@ frapy_pc (PyObject *self, PyObject *args)
} }
GDB_PY_HANDLE_EXCEPTION (except); GDB_PY_HANDLE_EXCEPTION (except);
return PyLong_FromUnsignedLongLong (pc); return gdb_py_long_from_ulongest (pc);
} }
/* Implementation of gdb.Frame.block (self) -> gdb.Block. /* Implementation of gdb.Frame.block (self) -> gdb.Block.

View file

@ -54,7 +54,7 @@ stpy_get_address (PyObject *self, void *closure)
{ {
lazy_string_object *self_string = (lazy_string_object *) self; lazy_string_object *self_string = (lazy_string_object *) self;
return PyLong_FromUnsignedLongLong (self_string->address); return gdb_py_long_from_ulongest (self_string->address);
} }
static PyObject * static PyObject *

View file

@ -232,7 +232,9 @@ set_parameter_value (parmpy_object *self, PyObject *value)
return -1; return -1;
} }
l = PyInt_AsLong (value); if (! gdb_py_int_as_long (value, &l))
return -1;
if (self->type == var_uinteger) if (self->type == var_uinteger)
{ {
ok = (l >= 0 && l <= UINT_MAX); ok = (l >= 0 && l <= UINT_MAX);

View file

@ -186,7 +186,7 @@ salpy_get_pc (PyObject *self, void *closure)
SALPY_REQUIRE_VALID (self, sal); SALPY_REQUIRE_VALID (self, sal);
return PyLong_FromUnsignedLongLong (sal->pc); return gdb_py_long_from_ulongest (sal->pc);
} }
static PyObject * static PyObject *
@ -196,7 +196,7 @@ salpy_get_line (PyObject *self, void *closure)
SALPY_REQUIRE_VALID (self, sal); SALPY_REQUIRE_VALID (self, sal);
return PyLong_FromUnsignedLongLong (sal->line); return PyInt_FromLong (sal->line);
} }
static PyObject * static PyObject *

View file

@ -276,13 +276,13 @@ typy_strip_typedefs (PyObject *self, PyObject *args)
static PyObject * static PyObject *
typy_array (PyObject *self, PyObject *args) typy_array (PyObject *self, PyObject *args)
{ {
int n1, n2; long n1, n2;
PyObject *n2_obj = NULL; PyObject *n2_obj = NULL;
struct type *array = NULL; struct type *array = NULL;
struct type *type = ((type_object *) self)->type; struct type *type = ((type_object *) self)->type;
volatile struct gdb_exception except; volatile struct gdb_exception except;
if (! PyArg_ParseTuple (args, "i|O", &n1, &n2_obj)) if (! PyArg_ParseTuple (args, "l|O", &n1, &n2_obj))
return NULL; return NULL;
if (n2_obj) if (n2_obj)
@ -293,8 +293,8 @@ typy_array (PyObject *self, PyObject *args)
_("Array bound must be an integer")); _("Array bound must be an integer"));
return NULL; return NULL;
} }
n2 = (int) PyInt_AsLong (n2_obj);
if (PyErr_Occurred ()) if (! gdb_py_int_as_long (n2_obj, &n2))
return NULL; return NULL;
} }
else else

View file

@ -304,39 +304,73 @@ get_addr_from_python (PyObject *obj, CORE_ADDR *addr)
{ {
if (gdbpy_is_value_object (obj)) if (gdbpy_is_value_object (obj))
*addr = value_as_address (value_object_to_value (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 else
{ {
PyErr_SetString (PyExc_TypeError, PyObject *num = PyNumber_Long (obj);
_("Invalid type for address.")); gdb_py_ulongest val;
return 0;
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; return 1;
} }
/* Convert a LONGEST to the appropriate Python object -- either an
integer object or a long object, depending on its value. */
PyObject *
gdb_py_object_from_longest (LONGEST l)
{
#ifdef HAVE_LONG_LONG /* Defined by Python. */
/* If we have 'long long', and the value overflows a 'long', use a
Python Long; otherwise use a Python Int. */
if (sizeof (l) > sizeof (long)
&& (l > PyInt_GetMax () || l < (- (LONGEST) PyInt_GetMax ()) - 1))
return PyLong_FromLongLong (l);
#endif
return PyInt_FromLong (l);
}
/* Convert a ULONGEST to the appropriate Python object -- either an
integer object or a long object, depending on its value. */
PyObject *
gdb_py_object_from_ulongest (ULONGEST l)
{
#ifdef HAVE_LONG_LONG /* Defined by Python. */
/* If we have 'long long', and the value overflows a 'long', use a
Python Long; otherwise use a Python Int. */
if (sizeof (l) > sizeof (unsigned long) && l > PyInt_GetMax ())
return PyLong_FromUnsignedLongLong (l);
#endif
if (l > PyInt_GetMax ())
return PyLong_FromUnsignedLong (l);
return PyInt_FromLong (l);
}
/* Like PyInt_AsLong, but returns 0 on failure, 1 on success, and puts
the value into an out parameter. */
int
gdb_py_int_as_long (PyObject *obj, long *result)
{
*result = PyInt_AsLong (obj);
return ! (*result == -1 && PyErr_Occurred ());
}

View file

@ -307,13 +307,13 @@ valpy_get_dynamic_type (PyObject *self, void *closure)
static PyObject * static PyObject *
valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw) valpy_lazy_string (PyObject *self, PyObject *args, PyObject *kw)
{ {
int length = -1; gdb_py_longest length = -1;
struct value *value = ((value_object *) self)->value; struct value *value = ((value_object *) self)->value;
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;
if (!PyArg_ParseTupleAndKeywords (args, kw, "|si", keywords, if (!PyArg_ParseTupleAndKeywords (args, kw, "|s" GDB_PY_LL_ARG, keywords,
&user_encoding, &length)) &user_encoding, &length))
return NULL; return NULL;
@ -987,14 +987,7 @@ valpy_int (PyObject *self)
} }
GDB_PY_HANDLE_EXCEPTION (except); GDB_PY_HANDLE_EXCEPTION (except);
#ifdef HAVE_LONG_LONG /* Defined by Python. */ return gdb_py_object_from_longest (l);
/* If we have 'long long', and the value overflows a 'long', use a
Python Long; otherwise use a Python Int. */
if (sizeof (l) > sizeof (long) && (l > PyInt_GetMax ()
|| l < (- (LONGEST) PyInt_GetMax ()) - 1))
return PyLong_FromLongLong (l);
#endif
return PyInt_FromLong (l);
} }
/* Implements conversion to long. */ /* Implements conversion to long. */
@ -1019,11 +1012,7 @@ valpy_long (PyObject *self)
} }
GDB_PY_HANDLE_EXCEPTION (except); GDB_PY_HANDLE_EXCEPTION (except);
#ifdef HAVE_LONG_LONG /* Defined by Python. */ return gdb_py_long_from_longest (l);
return PyLong_FromLongLong (l);
#else
return PyLong_FromLong (l);
#endif
} }
/* Implements conversion to float. */ /* Implements conversion to float. */

View file

@ -73,6 +73,32 @@ typedef int Py_ssize_t;
#define PyEval_ReleaseLock() #define PyEval_ReleaseLock()
#endif #endif
/* Python supplies HAVE_LONG_LONG and some `long long' support when it
is available. These defines let us handle the differences more
cleanly. */
#ifdef HAVE_LONG_LONG
#define GDB_PY_LL_ARG "L"
#define GDB_PY_LLU_ARG "K"
typedef PY_LONG_LONG gdb_py_longest;
typedef unsigned PY_LONG_LONG gdb_py_ulongest;
#define gdb_py_long_from_longest PyLong_FromLongLong
#define gdb_py_long_from_ulongest PyLong_FromUnsignedLongLong
#define gdb_py_long_as_ulongest PyLong_AsUnsignedLongLong
#else /* HAVE_LONG_LONG */
#define GDB_PY_LL_ARG "L"
#define GDB_PY_LLU_ARG "K"
typedef long gdb_py_longest;
typedef unsigned long gdb_py_ulongest;
#define gdb_py_long_from_longest PyLong_FromLong
#define gdb_py_long_from_ulongest PyLong_FromUnsignedLong
#define gdb_py_long_as_ulongest PyLong_AsUnsignedLong
#endif /* HAVE_LONG_LONG */
/* In order to be able to parse symtab_and_line_to_sal_object function /* In order to be able to parse symtab_and_line_to_sal_object function
a real symtab_and_line structure is needed. */ a real symtab_and_line structure is needed. */
#include "symtab.h" #include "symtab.h"
@ -243,4 +269,8 @@ extern PyObject *gdbpy_convert_exception (struct gdb_exception);
int get_addr_from_python (PyObject *obj, CORE_ADDR *addr); int get_addr_from_python (PyObject *obj, CORE_ADDR *addr);
PyObject *gdb_py_object_from_longest (LONGEST l);
PyObject *gdb_py_object_from_ulongest (ULONGEST l);
int gdb_py_int_as_long (PyObject *, long *);
#endif /* GDB_PYTHON_INTERNAL_H */ #endif /* GDB_PYTHON_INTERNAL_H */

View file

@ -407,16 +407,9 @@ gdbpy_solib_name (PyObject *self, PyObject *args)
{ {
char *soname; char *soname;
PyObject *str_obj; PyObject *str_obj;
#ifdef PY_LONG_LONG gdb_py_longest pc;
unsigned PY_LONG_LONG pc;
/* To be compatible with Python 2.4 the format strings are not const. */
char *format = "K";
#else
unsigned long pc;
char *format = "k";
#endif
if (!PyArg_ParseTuple (args, format, &pc)) if (!PyArg_ParseTuple (args, GDB_PY_LL_ARG, &pc))
return NULL; return NULL;
soname = solib_name_from_address (current_program_space, pc); soname = solib_name_from_address (current_program_space, pc);