mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 23:39:35 +08:00
Use gdbpy_ref in py-framefilter.c
This changes some code in py-framefilter.c to use gdbpy_ref. 2017-01-10 Tom Tromey <tom@tromey.com> * python/py-framefilter.c (extract_sym, extract_value) (get_py_iter_from_func, bootstrap_python_frame_filters): Use gdbpy_ref.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2017-01-10 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* python/py-framefilter.c (extract_sym, extract_value)
|
||||||
|
(get_py_iter_from_func, bootstrap_python_frame_filters): Use
|
||||||
|
gdbpy_ref.
|
||||||
|
|
||||||
2017-01-10 Tom Tromey <tom@tromey.com>
|
2017-01-10 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* python/py-breakpoint.c (gdbpy_breakpoints): Use gdbpy_ref.
|
* python/py-breakpoint.c (gdbpy_breakpoints): Use gdbpy_ref.
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "demangle.h"
|
#include "demangle.h"
|
||||||
#include "mi/mi-cmds.h"
|
#include "mi/mi-cmds.h"
|
||||||
#include "python-internal.h"
|
#include "python-internal.h"
|
||||||
|
#include "py-ref.h"
|
||||||
|
|
||||||
enum mi_print_types
|
enum mi_print_types
|
||||||
{
|
{
|
||||||
@ -56,17 +57,16 @@ extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr<char> *name,
|
|||||||
struct symbol **sym, struct block **sym_block,
|
struct symbol **sym, struct block **sym_block,
|
||||||
const struct language_defn **language)
|
const struct language_defn **language)
|
||||||
{
|
{
|
||||||
PyObject *result = PyObject_CallMethod (obj, "symbol", NULL);
|
gdbpy_ref result (PyObject_CallMethod (obj, "symbol", NULL));
|
||||||
|
|
||||||
if (result == NULL)
|
if (result == NULL)
|
||||||
return EXT_LANG_BT_ERROR;
|
return EXT_LANG_BT_ERROR;
|
||||||
|
|
||||||
/* For 'symbol' callback, the function can return a symbol or a
|
/* For 'symbol' callback, the function can return a symbol or a
|
||||||
string. */
|
string. */
|
||||||
if (gdbpy_is_string (result))
|
if (gdbpy_is_string (result.get ()))
|
||||||
{
|
{
|
||||||
*name = python_string_to_host_string (result);
|
*name = python_string_to_host_string (result.get ());
|
||||||
Py_DECREF (result);
|
|
||||||
|
|
||||||
if (*name == NULL)
|
if (*name == NULL)
|
||||||
return EXT_LANG_BT_ERROR;
|
return EXT_LANG_BT_ERROR;
|
||||||
@ -83,15 +83,13 @@ extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr<char> *name,
|
|||||||
{
|
{
|
||||||
/* This type checks 'result' during the conversion so we
|
/* This type checks 'result' during the conversion so we
|
||||||
just call it unconditionally and check the return. */
|
just call it unconditionally and check the return. */
|
||||||
*sym = symbol_object_to_symbol (result);
|
*sym = symbol_object_to_symbol (result.get ());
|
||||||
/* TODO: currently, we have no way to recover the block in which SYMBOL
|
/* TODO: currently, we have no way to recover the block in which SYMBOL
|
||||||
was found, so we have no block to return. Trying to evaluate SYMBOL
|
was found, so we have no block to return. Trying to evaluate SYMBOL
|
||||||
will yield an incorrect value when it's located in a FRAME and
|
will yield an incorrect value when it's located in a FRAME and
|
||||||
evaluated from another frame (as permitted in nested functions). */
|
evaluated from another frame (as permitted in nested functions). */
|
||||||
*sym_block = NULL;
|
*sym_block = NULL;
|
||||||
|
|
||||||
Py_DECREF (result);
|
|
||||||
|
|
||||||
if (*sym == NULL)
|
if (*sym == NULL)
|
||||||
{
|
{
|
||||||
PyErr_SetString (PyExc_RuntimeError,
|
PyErr_SetString (PyExc_RuntimeError,
|
||||||
@ -130,7 +128,7 @@ extract_value (PyObject *obj, struct value **value)
|
|||||||
{
|
{
|
||||||
if (PyObject_HasAttrString (obj, "value"))
|
if (PyObject_HasAttrString (obj, "value"))
|
||||||
{
|
{
|
||||||
PyObject *vresult = PyObject_CallMethod (obj, "value", NULL);
|
gdbpy_ref vresult (PyObject_CallMethod (obj, "value", NULL));
|
||||||
|
|
||||||
if (vresult == NULL)
|
if (vresult == NULL)
|
||||||
return EXT_LANG_BT_ERROR;
|
return EXT_LANG_BT_ERROR;
|
||||||
@ -140,14 +138,12 @@ extract_value (PyObject *obj, struct value **value)
|
|||||||
value. */
|
value. */
|
||||||
if (vresult == Py_None)
|
if (vresult == Py_None)
|
||||||
{
|
{
|
||||||
Py_DECREF (vresult);
|
|
||||||
*value = NULL;
|
*value = NULL;
|
||||||
return EXT_LANG_BT_OK;
|
return EXT_LANG_BT_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*value = convert_value_from_python (vresult);
|
*value = convert_value_from_python (vresult.get ());
|
||||||
Py_DECREF (vresult);
|
|
||||||
|
|
||||||
if (*value == NULL)
|
if (*value == NULL)
|
||||||
return EXT_LANG_BT_ERROR;
|
return EXT_LANG_BT_ERROR;
|
||||||
@ -316,20 +312,17 @@ get_py_iter_from_func (PyObject *filter, char *func)
|
|||||||
{
|
{
|
||||||
if (PyObject_HasAttrString (filter, func))
|
if (PyObject_HasAttrString (filter, func))
|
||||||
{
|
{
|
||||||
PyObject *result = PyObject_CallMethod (filter, func, NULL);
|
gdbpy_ref result (PyObject_CallMethod (filter, func, NULL));
|
||||||
|
|
||||||
if (result != NULL)
|
if (result != NULL)
|
||||||
{
|
{
|
||||||
if (result == Py_None)
|
if (result == Py_None)
|
||||||
{
|
{
|
||||||
return result;
|
return result.release ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PyObject *iterator = PyObject_GetIter (result);
|
return PyObject_GetIter (result.get ());
|
||||||
|
|
||||||
Py_DECREF (result);
|
|
||||||
return iterator;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1441,60 +1434,39 @@ static PyObject *
|
|||||||
bootstrap_python_frame_filters (struct frame_info *frame,
|
bootstrap_python_frame_filters (struct frame_info *frame,
|
||||||
int frame_low, int frame_high)
|
int frame_low, int frame_high)
|
||||||
{
|
{
|
||||||
struct cleanup *cleanups =
|
gdbpy_ref frame_obj (frame_info_to_frame_object (frame));
|
||||||
make_cleanup (null_cleanup, NULL);
|
|
||||||
PyObject *module, *sort_func, *iterable, *frame_obj, *iterator;
|
|
||||||
PyObject *py_frame_low, *py_frame_high;
|
|
||||||
|
|
||||||
frame_obj = frame_info_to_frame_object (frame);
|
|
||||||
if (frame_obj == NULL)
|
if (frame_obj == NULL)
|
||||||
goto error;
|
return NULL;
|
||||||
make_cleanup_py_decref (frame_obj);
|
|
||||||
|
|
||||||
module = PyImport_ImportModule ("gdb.frames");
|
gdbpy_ref module (PyImport_ImportModule ("gdb.frames"));
|
||||||
if (module == NULL)
|
if (module == NULL)
|
||||||
goto error;
|
return NULL;
|
||||||
make_cleanup_py_decref (module);
|
|
||||||
|
|
||||||
sort_func = PyObject_GetAttrString (module, "execute_frame_filters");
|
gdbpy_ref sort_func (PyObject_GetAttrString (module.get (),
|
||||||
|
"execute_frame_filters"));
|
||||||
if (sort_func == NULL)
|
if (sort_func == NULL)
|
||||||
goto error;
|
return NULL;
|
||||||
make_cleanup_py_decref (sort_func);
|
|
||||||
|
|
||||||
py_frame_low = PyInt_FromLong (frame_low);
|
gdbpy_ref py_frame_low (PyInt_FromLong (frame_low));
|
||||||
if (py_frame_low == NULL)
|
if (py_frame_low == NULL)
|
||||||
goto error;
|
return NULL;
|
||||||
make_cleanup_py_decref (py_frame_low);
|
|
||||||
|
|
||||||
py_frame_high = PyInt_FromLong (frame_high);
|
gdbpy_ref py_frame_high (PyInt_FromLong (frame_high));
|
||||||
if (py_frame_high == NULL)
|
if (py_frame_high == NULL)
|
||||||
goto error;
|
return NULL;
|
||||||
make_cleanup_py_decref (py_frame_high);
|
|
||||||
|
|
||||||
iterable = PyObject_CallFunctionObjArgs (sort_func, frame_obj,
|
gdbpy_ref iterable (PyObject_CallFunctionObjArgs (sort_func.get (),
|
||||||
py_frame_low,
|
frame_obj.get (),
|
||||||
py_frame_high,
|
py_frame_low.get (),
|
||||||
NULL);
|
py_frame_high.get (),
|
||||||
|
NULL));
|
||||||
if (iterable == NULL)
|
if (iterable == NULL)
|
||||||
goto error;
|
return NULL;
|
||||||
|
|
||||||
do_cleanups (cleanups);
|
|
||||||
|
|
||||||
if (iterable != Py_None)
|
if (iterable != Py_None)
|
||||||
{
|
return PyObject_GetIter (iterable.get ());
|
||||||
iterator = PyObject_GetIter (iterable);
|
|
||||||
Py_DECREF (iterable);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
return iterable.release ();
|
||||||
return iterable;
|
|
||||||
}
|
|
||||||
|
|
||||||
return iterator;
|
|
||||||
|
|
||||||
error:
|
|
||||||
do_cleanups (cleanups);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is the only publicly exported function in this file. FRAME
|
/* This is the only publicly exported function in this file. FRAME
|
||||||
|
Reference in New Issue
Block a user