2011-10-27 Phil Muldoon <pmuldoon@redhat.com>

PR python/13331

	* python/py-function.c (fnpy_call): Check 'args' is not NULL.
	(convert_values_to_python): Return on Python tuple allocation
	failure.  Return NULL on value conversion error.
This commit is contained in:
Phil Muldoon 2011-10-27 10:29:58 +00:00
parent c28a9f4951
commit f77b9a5df0
2 changed files with 32 additions and 10 deletions

View file

@ -1,3 +1,11 @@
2011-10-27 Phil Muldoon <pmuldoon@redhat.com>
PR python/13331
* python/py-function.c (fnpy_call): Check 'args' is not NULL.
(convert_values_to_python): Return on Python tuple allocation
failure. Return NULL on value conversion error.
2011-10-27 Phil Muldoon <pmuldoon@redhat.com>
* python/py-breakpoint.c (bppy_set_enabled): Use TRY_CATCH.

View file

@ -38,6 +38,9 @@ convert_values_to_python (int argc, struct value **argv)
{
int i;
PyObject *result = PyTuple_New (argc);
if (! result)
return NULL;
for (i = 0; i < argc; ++i)
{
@ -45,7 +48,7 @@ convert_values_to_python (int argc, struct value **argv)
if (! elt)
{
Py_DECREF (result);
error (_("Could not convert value to Python object."));
return NULL;
}
PyTuple_SetItem (result, i, elt);
}
@ -59,23 +62,34 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
void *cookie, int argc, struct value **argv)
{
struct value *value = NULL;
PyObject *result, *callable, *args;
/* 'result' must be set to NULL, this initially indicates whether
the function was called, or not. */
PyObject *result = NULL;
PyObject *callable, *args;
struct cleanup *cleanup;
cleanup = ensure_python_env (gdbarch, language);
args = convert_values_to_python (argc, argv);
/* convert_values_to_python can return NULL on error. If we
encounter this, do not call the function, but allow the Python ->
error code conversion below to deal with the Python exception.
Note, that this is different if the function simply does not
have arguments. */
callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
if (! callable)
if (args)
{
Py_DECREF (args);
error (_("No method named 'invoke' in object."));
}
callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke");
if (! callable)
{
Py_DECREF (args);
error (_("No method named 'invoke' in object."));
}
result = PyObject_Call (callable, args, NULL);
Py_DECREF (callable);
Py_DECREF (args);
result = PyObject_Call (callable, args, NULL);
Py_DECREF (callable);
Py_DECREF (args);
}
if (!result)
{