Use gdbpy_enter in fnpy_call

This changes fnpy_call to use gdbpy_enter and gdbpy_ref.

2017-01-10  Tom Tromey  <tom@tromey.com>

	* python/py-function.c (fnpy_call): Use gdbpy_enter, gdbpy_ref.
This commit is contained in:
Tom Tromey 2016-11-12 11:15:46 -07:00
parent 12a5cedd4f
commit 0e9dcc7587
2 changed files with 15 additions and 21 deletions

View file

@ -1,3 +1,7 @@
2017-01-10 Tom Tromey <tom@tromey.com>
* python/py-function.c (fnpy_call): Use gdbpy_enter, gdbpy_ref.
2017-01-10 Tom Tromey <tom@tromey.com> 2017-01-10 Tom Tromey <tom@tromey.com>
* python/py-cmd.c (cmdpy_function): Use gdbpy_enter, gdbpy_ref. * python/py-cmd.c (cmdpy_function): Use gdbpy_enter, gdbpy_ref.

View file

@ -62,34 +62,28 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
struct value *value = NULL; struct value *value = NULL;
/* 'result' must be set to NULL, this initially indicates whether /* 'result' must be set to NULL, this initially indicates whether
the function was called, or not. */ the function was called, or not. */
PyObject *result = NULL; gdbpy_ref result;
PyObject *callable, *args;
struct cleanup *cleanup;
cleanup = ensure_python_env (gdbarch, language); gdbpy_enter enter_py (gdbarch, language);
args = convert_values_to_python (argc, argv); gdbpy_ref args (convert_values_to_python (argc, argv));
/* convert_values_to_python can return NULL on error. If we /* convert_values_to_python can return NULL on error. If we
encounter this, do not call the function, but allow the Python -> encounter this, do not call the function, but allow the Python ->
error code conversion below to deal with the Python exception. error code conversion below to deal with the Python exception.
Note, that this is different if the function simply does not Note, that this is different if the function simply does not
have arguments. */ have arguments. */
if (args) if (args != NULL)
{ {
callable = PyObject_GetAttrString ((PyObject *) cookie, "invoke"); gdbpy_ref callable (PyObject_GetAttrString ((PyObject *) cookie,
if (! callable) "invoke"));
{ if (callable == NULL)
Py_DECREF (args);
error (_("No method named 'invoke' in object.")); error (_("No method named 'invoke' in object."));
result.reset (PyObject_Call (callable.get (), args.get (), NULL));
} }
result = PyObject_Call (callable, args, NULL); if (result == NULL)
Py_DECREF (callable);
Py_DECREF (args);
}
if (!result)
{ {
PyObject *ptype, *pvalue, *ptraceback; PyObject *ptype, *pvalue, *ptraceback;
@ -141,17 +135,13 @@ fnpy_call (struct gdbarch *gdbarch, const struct language_defn *language,
} }
} }
value = convert_value_from_python (result); value = convert_value_from_python (result.get ());
if (value == NULL) if (value == NULL)
{ {
Py_DECREF (result);
gdbpy_print_stack (); gdbpy_print_stack ();
error (_("Error while executing Python code.")); error (_("Error while executing Python code."));
} }
Py_DECREF (result);
do_cleanups (cleanup);
return value; return value;
} }