2011-11-28 Phil Muldoon <pmuldoon@redhat.com>

PR python/13369
	PR python/13374

	* python/python.c (gdbpy_decode_line): Do not acquire GIL.
	* python/py-inferior.c (inferior_to_inferior_object): Ditto.
	* python/py-value.c (valpy_nonzero): Use TRY_CATCH to catch GDB
	exceptions.
	* python/py-type.c (typy_strip_typedefs): Ditto.
	(typy_legacy_template_argument): Ditto.
	* python/py-inferior.c (inferior_to_inferior_object): Ditto.
	* python/py-breakpoint.c (bppy_set_ignore_count): Ditto.
This commit is contained in:
Phil Muldoon
2011-11-28 15:49:43 +00:00
parent 641c924047
commit 5d9c59954f
7 changed files with 57 additions and 21 deletions

View File

@@ -1,3 +1,17 @@
2011-11-28 Phil Muldoon <pmuldoon@redhat.com>
PR python/13369
PR python/13374
* python/python.c (gdbpy_decode_line): Do not acquire GIL.
* python/py-inferior.c (inferior_to_inferior_object): Ditto.
* python/py-value.c (valpy_nonzero): Use TRY_CATCH to catch GDB
exceptions.
* python/py-type.c (typy_strip_typedefs): Ditto.
(typy_legacy_template_argument): Ditto.
* python/py-inferior.c (inferior_to_inferior_object): Ditto.
* python/py-breakpoint.c (bppy_set_ignore_count): Ditto.
2011-11-27 Joel Brobecker <brobecker@acacore.com> 2011-11-27 Joel Brobecker <brobecker@acacore.com>
* remote.c (remote_get_tracepoint_status): Delete addrbuf * remote.c (remote_get_tracepoint_status): Delete addrbuf

View File

@@ -371,14 +371,20 @@ gdbpy_block_for_pc (PyObject *self, PyObject *args)
{ {
gdb_py_ulongest pc; gdb_py_ulongest pc;
struct block *block; struct block *block;
struct obj_section *section; struct obj_section *section = NULL;
struct symtab *symtab; struct symtab *symtab = NULL;
volatile struct gdb_exception except;
if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc)) if (!PyArg_ParseTuple (args, GDB_PY_LLU_ARG, &pc))
return NULL; return NULL;
section = find_pc_mapped_section (pc); TRY_CATCH (except, RETURN_MASK_ALL)
symtab = find_pc_sect_symtab (pc, section); {
section = find_pc_mapped_section (pc);
symtab = find_pc_sect_symtab (pc, section);
}
GDB_PY_HANDLE_EXCEPTION (except);
if (!symtab || symtab->objfile == NULL) if (!symtab || symtab->objfile == NULL)
{ {
PyErr_SetString (PyExc_RuntimeError, PyErr_SetString (PyExc_RuntimeError,

View File

@@ -334,6 +334,7 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
{ {
breakpoint_object *self_bp = (breakpoint_object *) self; breakpoint_object *self_bp = (breakpoint_object *) self;
long value; long value;
volatile struct gdb_exception except;
BPPY_SET_REQUIRE_VALID (self_bp); BPPY_SET_REQUIRE_VALID (self_bp);
@@ -355,7 +356,12 @@ bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
if (value < 0) if (value < 0)
value = 0; value = 0;
set_ignore_count (self_bp->number, (int) value, 0);
TRY_CATCH (except, RETURN_MASK_ALL)
{
set_ignore_count (self_bp->number, (int) value, 0);
}
GDB_PY_SET_HANDLE_EXCEPTION (except);
return 0; return 0;
} }

View File

@@ -157,15 +157,9 @@ inferior_to_inferior_object (struct inferior *inferior)
inf_obj = inferior_data (inferior, infpy_inf_data_key); inf_obj = inferior_data (inferior, infpy_inf_data_key);
if (!inf_obj) if (!inf_obj)
{ {
struct cleanup *cleanup;
cleanup = ensure_python_env (python_gdbarch, python_language);
inf_obj = PyObject_New (inferior_object, &inferior_object_type); inf_obj = PyObject_New (inferior_object, &inferior_object_type);
if (!inf_obj) if (!inf_obj)
{
do_cleanups (cleanup);
return NULL; return NULL;
}
inf_obj->inferior = inferior; inf_obj->inferior = inferior;
inf_obj->threads = NULL; inf_obj->threads = NULL;
@@ -173,7 +167,6 @@ inferior_to_inferior_object (struct inferior *inferior)
set_inferior_data (inferior, infpy_inf_data_key, inf_obj); set_inferior_data (inferior, infpy_inf_data_key, inf_obj);
do_cleanups (cleanup);
} }
else else
Py_INCREF ((PyObject *)inf_obj); Py_INCREF ((PyObject *)inf_obj);
@@ -266,10 +259,15 @@ delete_thread_object (struct thread_info *tp, int ignore)
inferior_object *inf_obj; inferior_object *inf_obj;
thread_object *thread_obj; thread_object *thread_obj;
struct threadlist_entry **entry, *tmp; struct threadlist_entry **entry, *tmp;
cleanup = ensure_python_env (python_gdbarch, python_language);
inf_obj = (inferior_object *) find_inferior_object (PIDGET(tp->ptid)); inf_obj = (inferior_object *) find_inferior_object (PIDGET(tp->ptid));
if (!inf_obj) if (!inf_obj)
return; {
do_cleanups (cleanup);
return;
}
/* Find thread entry in its inferior's thread_list. */ /* Find thread entry in its inferior's thread_list. */
for (entry = &inf_obj->threads; *entry != NULL; entry = for (entry = &inf_obj->threads; *entry != NULL; entry =
@@ -280,11 +278,10 @@ delete_thread_object (struct thread_info *tp, int ignore)
if (!*entry) if (!*entry)
{ {
Py_DECREF (inf_obj); Py_DECREF (inf_obj);
do_cleanups (cleanup);
return; return;
} }
cleanup = ensure_python_env (python_gdbarch, python_language);
tmp = *entry; tmp = *entry;
tmp->thread_obj->thread = NULL; tmp->thread_obj->thread = NULL;

View File

@@ -395,6 +395,13 @@ static PyObject *
typy_strip_typedefs (PyObject *self, PyObject *args) typy_strip_typedefs (PyObject *self, PyObject *args)
{ {
struct type *type = ((type_object *) self)->type; struct type *type = ((type_object *) self)->type;
volatile struct gdb_exception except;
TRY_CATCH (except, RETURN_MASK_ALL)
{
type = check_typedef (type);
}
GDB_PY_HANDLE_EXCEPTION (except);
return type_to_type_object (check_typedef (type)); return type_to_type_object (check_typedef (type));
} }
@@ -768,10 +775,11 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
{ {
int i; int i;
struct demangle_component *demangled; struct demangle_component *demangled;
struct demangle_parse_info *info; struct demangle_parse_info *info = NULL;
const char *err; const char *err;
struct type *argtype; struct type *argtype;
struct cleanup *cleanup; struct cleanup *cleanup;
volatile struct gdb_exception except;
if (TYPE_NAME (type) == NULL) if (TYPE_NAME (type) == NULL)
{ {
@@ -779,8 +787,13 @@ typy_legacy_template_argument (struct type *type, const struct block *block,
return NULL; return NULL;
} }
/* Note -- this is not thread-safe. */ TRY_CATCH (except, RETURN_MASK_ALL)
info = cp_demangled_name_to_comp (TYPE_NAME (type), &err); {
/* Note -- this is not thread-safe. */
info = cp_demangled_name_to_comp (TYPE_NAME (type), &err);
}
GDB_PY_HANDLE_EXCEPTION (except);
if (! info) if (! info)
{ {
PyErr_SetString (PyExc_RuntimeError, err); PyErr_SetString (PyExc_RuntimeError, err);

View File

@@ -880,10 +880,10 @@ valpy_nonzero (PyObject *self)
struct type *type; struct type *type;
int nonzero = 0; /* Appease GCC warning. */ int nonzero = 0; /* Appease GCC warning. */
type = check_typedef (value_type (self_value->value));
TRY_CATCH (except, RETURN_MASK_ALL) TRY_CATCH (except, RETURN_MASK_ALL)
{ {
type = check_typedef (value_type (self_value->value));
if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR) if (is_integral_type (type) || TYPE_CODE (type) == TYPE_CODE_PTR)
nonzero = !!value_as_long (self_value->value); nonzero = !!value_as_long (self_value->value);
else if (TYPE_CODE (type) == TYPE_CODE_FLT) else if (TYPE_CODE (type) == TYPE_CODE_FLT)

View File

@@ -504,7 +504,7 @@ gdbpy_decode_line (PyObject *self, PyObject *args)
if (! PyArg_ParseTuple (args, "|s", &arg)) if (! PyArg_ParseTuple (args, "|s", &arg))
return NULL; return NULL;
cleanups = ensure_python_env (get_current_arch (), current_language); cleanups = make_cleanup (null_cleanup, NULL);
TRY_CATCH (except, RETURN_MASK_ALL) TRY_CATCH (except, RETURN_MASK_ALL)
{ {