1 /* Support for debug methods in Python.
3 Copyright (C) 2013-2015 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "arch-utils.h"
22 #include "extension-priv.h"
28 #include "python-internal.h"
30 static const char enabled_field_name
[] = "enabled";
31 static const char match_method_name
[] = "match";
32 static const char get_arg_types_method_name
[] = "get_arg_types";
33 static const char get_result_type_method_name
[] = "get_result_type";
34 static const char invoke_method_name
[] = "invoke";
35 static const char matchers_attr_str
[] = "xmethods";
37 static PyObject
*py_match_method_name
= NULL
;
38 static PyObject
*py_get_arg_types_method_name
= NULL
;
39 static PyObject
*py_get_result_type_method_name
= NULL
;
40 static PyObject
*py_invoke_method_name
= NULL
;
42 struct gdbpy_worker_data
48 static struct xmethod_worker
*new_python_xmethod_worker (PyObject
*item
,
49 PyObject
*py_obj_type
);
51 /* Implementation of free_xmethod_worker_data for Python. */
54 gdbpy_free_xmethod_worker_data (const struct extension_language_defn
*extlang
,
57 struct gdbpy_worker_data
*worker_data
= data
;
58 struct cleanup
*cleanups
;
60 gdb_assert (worker_data
->worker
!= NULL
&& worker_data
->this_type
!= NULL
);
62 /* We don't do much here, but we still need the GIL. */
63 cleanups
= ensure_python_env (get_current_arch (), current_language
);
65 Py_DECREF (worker_data
->worker
);
66 Py_DECREF (worker_data
->this_type
);
69 do_cleanups (cleanups
);
72 /* Implementation of clone_xmethod_worker_data for Python. */
75 gdbpy_clone_xmethod_worker_data (const struct extension_language_defn
*extlang
,
78 struct gdbpy_worker_data
*worker_data
= data
, *new_data
;
79 struct cleanup
*cleanups
;
81 gdb_assert (worker_data
->worker
!= NULL
&& worker_data
->this_type
!= NULL
);
83 /* We don't do much here, but we still need the GIL. */
84 cleanups
= ensure_python_env (get_current_arch (), current_language
);
86 new_data
= XCNEW (struct gdbpy_worker_data
);
87 new_data
->worker
= worker_data
->worker
;
88 new_data
->this_type
= worker_data
->this_type
;
89 Py_INCREF (new_data
->worker
);
90 Py_INCREF (new_data
->this_type
);
92 do_cleanups (cleanups
);
97 /* Invoke the "match" method of the MATCHER and return a new reference
98 to the result. Returns NULL on error. */
101 invoke_match_method (PyObject
*matcher
, PyObject
*py_obj_type
,
102 const char *xmethod_name
)
104 PyObject
*py_xmethod_name
;
105 PyObject
*match_method
, *enabled_field
, *match_result
;
106 struct cleanup
*cleanups
;
109 cleanups
= make_cleanup (null_cleanup
, NULL
);
111 enabled_field
= PyObject_GetAttrString (matcher
, enabled_field_name
);
112 if (enabled_field
== NULL
)
114 do_cleanups (cleanups
);
117 make_cleanup_py_decref (enabled_field
);
119 enabled
= PyObject_IsTrue (enabled_field
);
122 do_cleanups (cleanups
);
127 /* Return 'None' if the matcher is not enabled. */
128 do_cleanups (cleanups
);
132 match_method
= PyObject_GetAttrString (matcher
, match_method_name
);
133 if (match_method
== NULL
)
135 do_cleanups (cleanups
);
138 make_cleanup_py_decref (match_method
);
140 py_xmethod_name
= PyString_FromString (xmethod_name
);
141 if (py_xmethod_name
== NULL
)
143 do_cleanups (cleanups
);
146 make_cleanup_py_decref (py_xmethod_name
);
148 match_result
= PyObject_CallMethodObjArgs (matcher
,
149 py_match_method_name
,
154 do_cleanups (cleanups
);
159 /* Implementation of get_matching_xmethod_workers for Python. */
162 gdbpy_get_matching_xmethod_workers
163 (const struct extension_language_defn
*extlang
,
164 struct type
*obj_type
, const char *method_name
,
165 xmethod_worker_vec
**dm_vec
)
167 struct cleanup
*cleanups
;
168 struct objfile
*objfile
;
169 VEC (xmethod_worker_ptr
) *worker_vec
= NULL
;
170 PyObject
*py_type
, *py_progspace
;
171 PyObject
*py_xmethod_matcher_list
= NULL
, *list_iter
, *matcher
;
173 gdb_assert (obj_type
!= NULL
&& method_name
!= NULL
);
175 cleanups
= ensure_python_env (get_current_arch (), current_language
);
177 py_type
= type_to_type_object (obj_type
);
180 gdbpy_print_stack ();
181 do_cleanups (cleanups
);
183 return EXT_LANG_RC_ERROR
;
185 make_cleanup_py_decref (py_type
);
187 /* Create an empty list of debug methods. */
188 py_xmethod_matcher_list
= PyList_New (0);
189 if (py_xmethod_matcher_list
== NULL
)
191 gdbpy_print_stack ();
192 do_cleanups (cleanups
);
194 return EXT_LANG_RC_ERROR
;
197 /* Gather debug method matchers registered with the object files.
198 This could be done differently by iterating over each objfile's matcher
199 list individually, but there's no data yet to show it's needed. */
200 ALL_OBJFILES (objfile
)
202 PyObject
*py_objfile
= objfile_to_objfile_object (objfile
);
203 PyObject
*objfile_matchers
, *temp
= py_xmethod_matcher_list
;
205 if (py_objfile
== NULL
)
207 gdbpy_print_stack ();
208 Py_DECREF (py_xmethod_matcher_list
);
209 do_cleanups (cleanups
);
211 return EXT_LANG_RC_ERROR
;
214 objfile_matchers
= objfpy_get_xmethods (py_objfile
, NULL
);
215 py_xmethod_matcher_list
= PySequence_Concat (temp
, objfile_matchers
);
217 Py_DECREF (objfile_matchers
);
218 if (py_xmethod_matcher_list
== NULL
)
220 gdbpy_print_stack ();
221 do_cleanups (cleanups
);
223 return EXT_LANG_RC_ERROR
;
227 /* Gather debug methods matchers registered with the current program
229 py_progspace
= pspace_to_pspace_object (current_program_space
);
230 if (py_progspace
!= NULL
)
232 PyObject
*temp
= py_xmethod_matcher_list
;
233 PyObject
*pspace_matchers
= pspy_get_xmethods (py_progspace
, NULL
);
235 py_xmethod_matcher_list
= PySequence_Concat (temp
, pspace_matchers
);
237 Py_DECREF (pspace_matchers
);
238 if (py_xmethod_matcher_list
== NULL
)
240 gdbpy_print_stack ();
241 do_cleanups (cleanups
);
243 return EXT_LANG_RC_ERROR
;
248 gdbpy_print_stack ();
249 Py_DECREF (py_xmethod_matcher_list
);
250 do_cleanups (cleanups
);
252 return EXT_LANG_RC_ERROR
;
255 /* Gather debug method matchers registered globally. */
256 if (gdb_python_module
!= NULL
257 && PyObject_HasAttrString (gdb_python_module
, matchers_attr_str
))
259 PyObject
*gdb_matchers
;
260 PyObject
*temp
= py_xmethod_matcher_list
;
262 gdb_matchers
= PyObject_GetAttrString (gdb_python_module
,
264 if (gdb_matchers
!= NULL
)
266 py_xmethod_matcher_list
= PySequence_Concat (temp
, gdb_matchers
);
268 Py_DECREF (gdb_matchers
);
269 if (py_xmethod_matcher_list
== NULL
)
271 gdbpy_print_stack ();
272 do_cleanups (cleanups
);
274 return EXT_LANG_RC_ERROR
;
279 gdbpy_print_stack ();
280 Py_DECREF (py_xmethod_matcher_list
);
281 do_cleanups (cleanups
);
283 return EXT_LANG_RC_ERROR
;
287 /* Safe to make a cleanup for py_xmethod_matcher_list now as it
288 will not change any more. */
289 make_cleanup_py_decref (py_xmethod_matcher_list
);
291 list_iter
= PyObject_GetIter (py_xmethod_matcher_list
);
292 if (list_iter
== NULL
)
294 gdbpy_print_stack ();
295 do_cleanups (cleanups
);
297 return EXT_LANG_RC_ERROR
;
299 while ((matcher
= PyIter_Next (list_iter
)) != NULL
)
301 PyObject
*match_result
= invoke_match_method (matcher
, py_type
,
304 if (match_result
== NULL
)
306 gdbpy_print_stack ();
308 do_cleanups (cleanups
);
310 return EXT_LANG_RC_ERROR
;
312 if (match_result
== Py_None
)
313 ; /* This means there was no match. */
314 else if (PySequence_Check (match_result
))
316 PyObject
*iter
= PyObject_GetIter (match_result
);
321 gdbpy_print_stack ();
323 Py_DECREF (match_result
);
324 do_cleanups (cleanups
);
326 return EXT_LANG_RC_ERROR
;
328 while ((py_worker
= PyIter_Next (iter
)) != NULL
)
330 struct xmethod_worker
*worker
;
332 worker
= new_python_xmethod_worker (py_worker
, py_type
);
333 VEC_safe_push (xmethod_worker_ptr
, worker_vec
, worker
);
334 Py_DECREF (py_worker
);
337 /* Report any error that could have occurred while iterating. */
338 if (PyErr_Occurred ())
340 gdbpy_print_stack ();
342 Py_DECREF (match_result
);
343 do_cleanups (cleanups
);
345 return EXT_LANG_RC_ERROR
;
350 struct xmethod_worker
*worker
;
352 worker
= new_python_xmethod_worker (match_result
, py_type
);
353 VEC_safe_push (xmethod_worker_ptr
, worker_vec
, worker
);
356 Py_DECREF (match_result
);
359 Py_DECREF (list_iter
);
360 /* Report any error that could have occurred while iterating. */
361 if (PyErr_Occurred ())
363 gdbpy_print_stack ();
364 do_cleanups (cleanups
);
366 return EXT_LANG_RC_ERROR
;
369 do_cleanups (cleanups
);
370 *dm_vec
= worker_vec
;
372 return EXT_LANG_RC_OK
;
375 /* Implementation of get_xmethod_arg_types for Python. */
378 gdbpy_get_xmethod_arg_types (const struct extension_language_defn
*extlang
,
379 struct xmethod_worker
*worker
,
380 int *nargs
, struct type
***arg_types
)
382 struct gdbpy_worker_data
*worker_data
= worker
->data
;
383 PyObject
*py_worker
= worker_data
->worker
;
384 PyObject
*get_arg_types_method
;
385 PyObject
*py_argtype_list
, *list_iter
= NULL
, *item
;
386 struct cleanup
*cleanups
;
387 struct type
**type_array
, *obj_type
;
388 int i
= 1, arg_count
;
390 /* Set nargs to -1 so that any premature return from this function returns
391 an invalid/unusable number of arg types. */
394 cleanups
= ensure_python_env (get_current_arch (), current_language
);
396 get_arg_types_method
= PyObject_GetAttrString (py_worker
,
397 get_arg_types_method_name
);
398 if (get_arg_types_method
== NULL
)
400 gdbpy_print_stack ();
401 do_cleanups (cleanups
);
403 return EXT_LANG_RC_ERROR
;
405 make_cleanup_py_decref (get_arg_types_method
);
407 py_argtype_list
= PyObject_CallMethodObjArgs (py_worker
,
408 py_get_arg_types_method_name
,
410 if (py_argtype_list
== NULL
)
412 gdbpy_print_stack ();
413 do_cleanups (cleanups
);
415 return EXT_LANG_RC_ERROR
;
417 make_cleanup_py_decref (py_argtype_list
);
418 if (py_argtype_list
== Py_None
)
420 else if (PySequence_Check (py_argtype_list
))
422 arg_count
= PySequence_Size (py_argtype_list
);
425 gdbpy_print_stack ();
426 do_cleanups (cleanups
);
428 return EXT_LANG_RC_ERROR
;
431 list_iter
= PyObject_GetIter (py_argtype_list
);
432 if (list_iter
== NULL
)
434 gdbpy_print_stack ();
435 do_cleanups (cleanups
);
437 return EXT_LANG_RC_ERROR
;
439 make_cleanup_py_decref (list_iter
);
444 /* Include the 'this' argument in the size. */
445 type_array
= XCNEWVEC (struct type
*, arg_count
+ 1);
447 if (list_iter
!= NULL
)
449 while ((item
= PyIter_Next (list_iter
)) != NULL
)
451 struct type
*arg_type
= type_object_to_type (item
);
454 if (arg_type
== NULL
)
456 PyErr_SetString (PyExc_TypeError
,
457 _("Arg type returned by the get_arg_types "
458 "method of a debug method worker object is "
459 "not a gdb.Type object."));
463 type_array
[i
] = arg_type
;
467 else if (arg_count
== 1)
469 /* py_argtype_list is not actually a list but a single gdb.Type
471 struct type
*arg_type
= type_object_to_type (py_argtype_list
);
473 if (arg_type
== NULL
)
475 PyErr_SetString (PyExc_TypeError
,
476 _("Arg type returned by the get_arg_types method "
477 "of an xmethod worker object is not a gdb.Type "
482 type_array
[i
] = arg_type
;
486 if (PyErr_Occurred ())
488 gdbpy_print_stack ();
489 do_cleanups (cleanups
);
492 return EXT_LANG_RC_ERROR
;
495 /* Add the type of 'this' as the first argument. The 'this' pointer should
496 be a 'const' value. Hence, create a 'const' variant of the 'this' pointer
498 obj_type
= type_object_to_type (worker_data
->this_type
);
499 type_array
[0] = make_cv_type (1, 0, lookup_pointer_type (obj_type
), NULL
);
501 *arg_types
= type_array
;
502 do_cleanups (cleanups
);
504 return EXT_LANG_RC_OK
;
507 /* Implementation of get_xmethod_result_type for Python. */
510 gdbpy_get_xmethod_result_type (const struct extension_language_defn
*extlang
,
511 struct xmethod_worker
*worker
,
513 struct value
**args
, int nargs
,
514 struct type
**result_type_ptr
)
516 struct gdbpy_worker_data
*worker_data
= worker
->data
;
517 PyObject
*py_worker
= worker_data
->worker
;
518 PyObject
*py_value_obj
, *py_arg_tuple
, *py_result_type
;
519 PyObject
*get_result_type_method
;
520 struct type
*obj_type
, *this_type
;
521 struct cleanup
*cleanups
;
524 cleanups
= ensure_python_env (get_current_arch (), current_language
);
526 /* First see if there is a get_result_type method.
527 If not this could be an old xmethod (pre 7.9.1). */
528 get_result_type_method
529 = PyObject_GetAttrString (py_worker
, get_result_type_method_name
);
530 if (get_result_type_method
== NULL
)
533 do_cleanups (cleanups
);
534 *result_type_ptr
= NULL
;
535 return EXT_LANG_RC_OK
;
537 make_cleanup_py_decref (get_result_type_method
);
539 obj_type
= check_typedef (value_type (obj
));
540 this_type
= check_typedef (type_object_to_type (worker_data
->this_type
));
541 if (TYPE_CODE (obj_type
) == TYPE_CODE_PTR
)
543 struct type
*this_ptr
= lookup_pointer_type (this_type
);
545 if (!types_equal (obj_type
, this_ptr
))
546 obj
= value_cast (this_ptr
, obj
);
548 else if (TYPE_CODE (obj_type
) == TYPE_CODE_REF
)
550 struct type
*this_ref
= lookup_reference_type (this_type
);
552 if (!types_equal (obj_type
, this_ref
))
553 obj
= value_cast (this_ref
, obj
);
557 if (!types_equal (obj_type
, this_type
))
558 obj
= value_cast (this_type
, obj
);
560 py_value_obj
= value_to_value_object (obj
);
561 if (py_value_obj
== NULL
)
563 make_cleanup_py_decref (py_value_obj
);
565 py_arg_tuple
= PyTuple_New (nargs
+ 1);
566 if (py_arg_tuple
== NULL
)
568 make_cleanup_py_decref (py_arg_tuple
);
570 /* PyTuple_SET_ITEM steals the reference of the element. Hence INCREF the
571 reference to the 'this' object as we have a cleanup to DECREF it. */
572 Py_INCREF (py_value_obj
);
573 PyTuple_SET_ITEM (py_arg_tuple
, 0, py_value_obj
);
575 for (i
= 0; i
< nargs
; i
++)
577 PyObject
*py_value_arg
= value_to_value_object (args
[i
]);
579 if (py_value_arg
== NULL
)
581 PyTuple_SET_ITEM (py_arg_tuple
, i
+ 1, py_value_arg
);
584 py_result_type
= PyObject_CallObject (get_result_type_method
, py_arg_tuple
);
585 if (py_result_type
== NULL
)
587 make_cleanup_py_decref (py_result_type
);
589 *result_type_ptr
= type_object_to_type (py_result_type
);
590 if (*result_type_ptr
== NULL
)
592 PyErr_SetString (PyExc_TypeError
,
593 _("Type returned by the get_result_type method of an"
594 " xmethod worker object is not a gdb.Type object."));
598 do_cleanups (cleanups
);
599 return EXT_LANG_RC_OK
;
602 gdbpy_print_stack ();
603 do_cleanups (cleanups
);
604 return EXT_LANG_RC_ERROR
;
607 /* Implementation of invoke_xmethod for Python. */
610 gdbpy_invoke_xmethod (const struct extension_language_defn
*extlang
,
611 struct xmethod_worker
*worker
,
612 struct value
*obj
, struct value
**args
, int nargs
)
615 struct cleanup
*cleanups
;
616 PyObject
*py_value_obj
, *py_arg_tuple
, *py_result
;
617 struct type
*obj_type
, *this_type
;
618 struct value
*res
= NULL
;
619 struct gdbpy_worker_data
*worker_data
= worker
->data
;
620 PyObject
*xmethod_worker
= worker_data
->worker
;
622 cleanups
= ensure_python_env (get_current_arch (), current_language
);
624 obj_type
= check_typedef (value_type (obj
));
625 this_type
= check_typedef (type_object_to_type (worker_data
->this_type
));
626 if (TYPE_CODE (obj_type
) == TYPE_CODE_PTR
)
628 struct type
*this_ptr
= lookup_pointer_type (this_type
);
630 if (!types_equal (obj_type
, this_ptr
))
631 obj
= value_cast (this_ptr
, obj
);
633 else if (TYPE_CODE (obj_type
) == TYPE_CODE_REF
)
635 struct type
*this_ref
= lookup_reference_type (this_type
);
637 if (!types_equal (obj_type
, this_ref
))
638 obj
= value_cast (this_ref
, obj
);
642 if (!types_equal (obj_type
, this_type
))
643 obj
= value_cast (this_type
, obj
);
645 py_value_obj
= value_to_value_object (obj
);
646 if (py_value_obj
== NULL
)
648 gdbpy_print_stack ();
649 error (_("Error while executing Python code."));
651 make_cleanup_py_decref (py_value_obj
);
653 py_arg_tuple
= PyTuple_New (nargs
+ 1);
654 if (py_arg_tuple
== NULL
)
656 gdbpy_print_stack ();
657 error (_("Error while executing Python code."));
659 make_cleanup_py_decref (py_arg_tuple
);
661 /* PyTuple_SET_ITEM steals the reference of the element. Hence INCREF the
662 reference to the 'this' object as we have a cleanup to DECREF it. */
663 Py_INCREF (py_value_obj
);
664 PyTuple_SET_ITEM (py_arg_tuple
, 0, py_value_obj
);
666 for (i
= 0; i
< nargs
; i
++)
668 PyObject
*py_value_arg
= value_to_value_object (args
[i
]);
670 if (py_value_arg
== NULL
)
672 gdbpy_print_stack ();
673 error (_("Error while executing Python code."));
676 PyTuple_SET_ITEM (py_arg_tuple
, i
+ 1, py_value_arg
);
679 py_result
= PyObject_CallObject (xmethod_worker
, py_arg_tuple
);
680 if (py_result
== NULL
)
682 gdbpy_print_stack ();
683 error (_("Error while executing Python code."));
685 make_cleanup_py_decref (py_result
);
687 if (py_result
!= Py_None
)
689 res
= convert_value_from_python (py_result
);
692 gdbpy_print_stack ();
693 error (_("Error while executing Python code."));
698 res
= allocate_value (lookup_typename (python_language
, python_gdbarch
,
702 do_cleanups (cleanups
);
707 /* Creates a new Python xmethod_worker object.
708 The new object has data of type 'struct gdbpy_worker_data' composed
709 with the components PY_WORKER and THIS_TYPE. */
711 static struct xmethod_worker
*
712 new_python_xmethod_worker (PyObject
*py_worker
, PyObject
*this_type
)
714 struct gdbpy_worker_data
*data
;
716 gdb_assert (py_worker
!= NULL
&& this_type
!= NULL
);
718 data
= XCNEW (struct gdbpy_worker_data
);
719 data
->worker
= py_worker
;
720 data
->this_type
= this_type
;
721 Py_INCREF (py_worker
);
722 Py_INCREF (this_type
);
724 return new_xmethod_worker (&extension_language_python
, data
);
728 gdbpy_initialize_xmethods (void)
730 py_match_method_name
= PyString_FromString (match_method_name
);
731 if (py_match_method_name
== NULL
)
734 py_invoke_method_name
= PyString_FromString (invoke_method_name
);
735 if (py_invoke_method_name
== NULL
)
738 py_get_arg_types_method_name
739 = PyString_FromString (get_arg_types_method_name
);
740 if (py_get_arg_types_method_name
== NULL
)
743 py_get_result_type_method_name
744 = PyString_FromString (get_result_type_method_name
);
745 if (py_get_result_type_method_name
== NULL
)