Add `thread_from_thread_handle' method to (Python) gdb.Inferior

gdb/ChangeLog:
	* python/py-inferior.c (gdbpy_thread_from_thread_handle): New
	function.
	(inferior_object_methods): Add gdbpy_thread_from_thread_handle.
	* python/python-internal.h (thread_object_type): Declare.
This commit is contained in:
Kevin Buettner 2016-05-04 16:23:08 -07:00
parent e04ee09e24
commit fbbe5337a6
3 changed files with 63 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2017-09-21 Kevin Buettner <kevinb@redhat.com>
* python/py-inferior.c (gdbpy_thread_from_thread_handle): New
function.
(inferior_object_methods): Add gdbpy_thread_from_thread_handle.
* python/python-internal.h (thread_object_type): Declare.
2017-09-21 Kevin Buettner <kevinb@redhat.com>
* target.h (struct target_ops): Add to_thread_handle_to_thread_info.

View File

@ -814,6 +814,56 @@ infpy_is_valid (PyObject *self, PyObject *args)
Py_RETURN_TRUE;
}
/* Implementation of gdb.Inferior.thread_from_thread_handle (self, handle)
-> gdb.InferiorThread. */
PyObject *
infpy_thread_from_thread_handle (PyObject *self, PyObject *args, PyObject *kw)
{
PyObject *handle_obj, *result;
inferior_object *inf_obj = (inferior_object *) self;
static const char *keywords[] = { "thread_handle", NULL };
INFPY_REQUIRE_VALID (inf_obj);
if (! gdb_PyArg_ParseTupleAndKeywords (args, kw, "O", keywords, &handle_obj))
return NULL;
result = Py_None;
if (!gdbpy_is_value_object (handle_obj))
{
PyErr_SetString (PyExc_TypeError,
_("Argument 'handle_obj' must be a thread handle object."));
return NULL;
}
else
{
TRY
{
struct thread_info *thread_info;
struct value *val = value_object_to_value (handle_obj);
thread_info = find_thread_by_handle (val, inf_obj->inferior);
if (thread_info != NULL)
{
result = (PyObject *) find_thread_object (thread_info->ptid);
if (result != NULL)
Py_INCREF (result);
}
}
CATCH (except, RETURN_MASK_ALL)
{
GDB_PY_HANDLE_EXCEPTION (except);
}
END_CATCH
}
return result;
}
static void
infpy_dealloc (PyObject *obj)
{
@ -926,6 +976,10 @@ Write the given buffer object to the inferior's memory." },
METH_VARARGS | METH_KEYWORDS,
"search_memory (address, length, pattern) -> long\n\
Return a long with the address of a match, or None." },
{ "thread_from_thread_handle", (PyCFunction) infpy_thread_from_thread_handle,
METH_VARARGS | METH_KEYWORDS,
"thread_from_thread_handle (handle) -> gdb.InferiorThread.\n\
Return thread object corresponding to thread handle." },
{ NULL }
};

View File

@ -377,6 +377,8 @@ extern PyTypeObject breakpoint_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("breakpoint_object");
extern PyTypeObject frame_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("frame_object");
extern PyTypeObject thread_object_type
CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("thread_object");
typedef struct gdbpy_breakpoint_object
{