Use RAII to save and restore scalars
[deliverable/binutils-gdb.git] / gdb / python / py-xmethods.c
CommitLineData
883964a7
SC
1/* Support for debug methods in Python.
2
618f726f 3 Copyright (C) 2013-2016 Free Software Foundation, Inc.
883964a7
SC
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20#include "defs.h"
21#include "arch-utils.h"
22#include "extension-priv.h"
23#include "objfiles.h"
24#include "value.h"
25#include "language.h"
26
27#include "python.h"
28#include "python-internal.h"
29
30static const char enabled_field_name[] = "enabled";
31static const char match_method_name[] = "match";
32static const char get_arg_types_method_name[] = "get_arg_types";
2ce1cdbf 33static const char get_result_type_method_name[] = "get_result_type";
883964a7
SC
34static const char matchers_attr_str[] = "xmethods";
35
36static PyObject *py_match_method_name = NULL;
37static PyObject *py_get_arg_types_method_name = NULL;
883964a7
SC
38
39struct gdbpy_worker_data
40{
41 PyObject *worker;
42 PyObject *this_type;
43};
44
45static struct xmethod_worker *new_python_xmethod_worker (PyObject *item,
46 PyObject *py_obj_type);
47
48/* Implementation of free_xmethod_worker_data for Python. */
49
50void
51gdbpy_free_xmethod_worker_data (const struct extension_language_defn *extlang,
52 void *data)
53{
19ba03f4 54 struct gdbpy_worker_data *worker_data = (struct gdbpy_worker_data *) data;
883964a7
SC
55 struct cleanup *cleanups;
56
57 gdb_assert (worker_data->worker != NULL && worker_data->this_type != NULL);
58
59 /* We don't do much here, but we still need the GIL. */
60 cleanups = ensure_python_env (get_current_arch (), current_language);
61
62 Py_DECREF (worker_data->worker);
63 Py_DECREF (worker_data->this_type);
64 xfree (worker_data);
65
66 do_cleanups (cleanups);
67}
68
69/* Implementation of clone_xmethod_worker_data for Python. */
70
71void *
72gdbpy_clone_xmethod_worker_data (const struct extension_language_defn *extlang,
73 void *data)
74{
19ba03f4
SM
75 struct gdbpy_worker_data *worker_data
76 = (struct gdbpy_worker_data *) data, *new_data;
883964a7
SC
77 struct cleanup *cleanups;
78
79 gdb_assert (worker_data->worker != NULL && worker_data->this_type != NULL);
80
81 /* We don't do much here, but we still need the GIL. */
82 cleanups = ensure_python_env (get_current_arch (), current_language);
83
84 new_data = XCNEW (struct gdbpy_worker_data);
85 new_data->worker = worker_data->worker;
86 new_data->this_type = worker_data->this_type;
87 Py_INCREF (new_data->worker);
88 Py_INCREF (new_data->this_type);
89
90 do_cleanups (cleanups);
91
92 return new_data;
93}
94
95/* Invoke the "match" method of the MATCHER and return a new reference
96 to the result. Returns NULL on error. */
97
98static PyObject *
99invoke_match_method (PyObject *matcher, PyObject *py_obj_type,
100 const char *xmethod_name)
101{
102 PyObject *py_xmethod_name;
103 PyObject *match_method, *enabled_field, *match_result;
104 struct cleanup *cleanups;
105 int enabled;
106
107 cleanups = make_cleanup (null_cleanup, NULL);
108
109 enabled_field = PyObject_GetAttrString (matcher, enabled_field_name);
110 if (enabled_field == NULL)
111 {
112 do_cleanups (cleanups);
113 return NULL;
114 }
115 make_cleanup_py_decref (enabled_field);
116
117 enabled = PyObject_IsTrue (enabled_field);
118 if (enabled == -1)
119 {
120 do_cleanups (cleanups);
121 return NULL;
122 }
123 if (enabled == 0)
124 {
125 /* Return 'None' if the matcher is not enabled. */
126 do_cleanups (cleanups);
127 Py_RETURN_NONE;
128 }
129
130 match_method = PyObject_GetAttrString (matcher, match_method_name);
131 if (match_method == NULL)
132 {
133 do_cleanups (cleanups);
134 return NULL;
135 }
136 make_cleanup_py_decref (match_method);
137
138 py_xmethod_name = PyString_FromString (xmethod_name);
139 if (py_xmethod_name == NULL)
140 {
141 do_cleanups (cleanups);
142 return NULL;
143 }
144 make_cleanup_py_decref (py_xmethod_name);
145
146 match_result = PyObject_CallMethodObjArgs (matcher,
147 py_match_method_name,
148 py_obj_type,
149 py_xmethod_name,
150 NULL);
151
152 do_cleanups (cleanups);
153
154 return match_result;
155}
156
157/* Implementation of get_matching_xmethod_workers for Python. */
158
159enum ext_lang_rc
160gdbpy_get_matching_xmethod_workers
161 (const struct extension_language_defn *extlang,
162 struct type *obj_type, const char *method_name,
163 xmethod_worker_vec **dm_vec)
164{
165 struct cleanup *cleanups;
166 struct objfile *objfile;
167 VEC (xmethod_worker_ptr) *worker_vec = NULL;
168 PyObject *py_type, *py_progspace;
169 PyObject *py_xmethod_matcher_list = NULL, *list_iter, *matcher;
170
171 gdb_assert (obj_type != NULL && method_name != NULL);
172
173 cleanups = ensure_python_env (get_current_arch (), current_language);
174
175 py_type = type_to_type_object (obj_type);
176 if (py_type == NULL)
177 {
178 gdbpy_print_stack ();
179 do_cleanups (cleanups);
180
181 return EXT_LANG_RC_ERROR;
182 }
183 make_cleanup_py_decref (py_type);
184
185 /* Create an empty list of debug methods. */
186 py_xmethod_matcher_list = PyList_New (0);
187 if (py_xmethod_matcher_list == NULL)
188 {
189 gdbpy_print_stack ();
190 do_cleanups (cleanups);
191
192 return EXT_LANG_RC_ERROR;
193 }
194
195 /* Gather debug method matchers registered with the object files.
196 This could be done differently by iterating over each objfile's matcher
197 list individually, but there's no data yet to show it's needed. */
198 ALL_OBJFILES (objfile)
199 {
200 PyObject *py_objfile = objfile_to_objfile_object (objfile);
201 PyObject *objfile_matchers, *temp = py_xmethod_matcher_list;
202
203 if (py_objfile == NULL)
204 {
205 gdbpy_print_stack ();
206 Py_DECREF (py_xmethod_matcher_list);
207 do_cleanups (cleanups);
208
209 return EXT_LANG_RC_ERROR;
210 }
211
212 objfile_matchers = objfpy_get_xmethods (py_objfile, NULL);
213 py_xmethod_matcher_list = PySequence_Concat (temp, objfile_matchers);
214 Py_DECREF (temp);
215 Py_DECREF (objfile_matchers);
216 if (py_xmethod_matcher_list == NULL)
217 {
218 gdbpy_print_stack ();
219 do_cleanups (cleanups);
220
221 return EXT_LANG_RC_ERROR;
222 }
223 }
224
225 /* Gather debug methods matchers registered with the current program
226 space. */
227 py_progspace = pspace_to_pspace_object (current_program_space);
228 if (py_progspace != NULL)
229 {
230 PyObject *temp = py_xmethod_matcher_list;
231 PyObject *pspace_matchers = pspy_get_xmethods (py_progspace, NULL);
232
233 py_xmethod_matcher_list = PySequence_Concat (temp, pspace_matchers);
234 Py_DECREF (temp);
235 Py_DECREF (pspace_matchers);
236 if (py_xmethod_matcher_list == NULL)
237 {
238 gdbpy_print_stack ();
239 do_cleanups (cleanups);
240
241 return EXT_LANG_RC_ERROR;
242 }
243 }
244 else
245 {
246 gdbpy_print_stack ();
247 Py_DECREF (py_xmethod_matcher_list);
248 do_cleanups (cleanups);
249
250 return EXT_LANG_RC_ERROR;
251 }
252
253 /* Gather debug method matchers registered globally. */
254 if (gdb_python_module != NULL
255 && PyObject_HasAttrString (gdb_python_module, matchers_attr_str))
256 {
257 PyObject *gdb_matchers;
258 PyObject *temp = py_xmethod_matcher_list;
259
260 gdb_matchers = PyObject_GetAttrString (gdb_python_module,
261 matchers_attr_str);
262 if (gdb_matchers != NULL)
263 {
264 py_xmethod_matcher_list = PySequence_Concat (temp, gdb_matchers);
265 Py_DECREF (temp);
266 Py_DECREF (gdb_matchers);
267 if (py_xmethod_matcher_list == NULL)
268 {
269 gdbpy_print_stack ();
270 do_cleanups (cleanups);
271
272 return EXT_LANG_RC_ERROR;
273 }
274 }
275 else
276 {
277 gdbpy_print_stack ();
278 Py_DECREF (py_xmethod_matcher_list);
279 do_cleanups (cleanups);
280
281 return EXT_LANG_RC_ERROR;
282 }
283 }
284
285 /* Safe to make a cleanup for py_xmethod_matcher_list now as it
286 will not change any more. */
287 make_cleanup_py_decref (py_xmethod_matcher_list);
288
289 list_iter = PyObject_GetIter (py_xmethod_matcher_list);
290 if (list_iter == NULL)
291 {
292 gdbpy_print_stack ();
293 do_cleanups (cleanups);
294
295 return EXT_LANG_RC_ERROR;
296 }
297 while ((matcher = PyIter_Next (list_iter)) != NULL)
298 {
299 PyObject *match_result = invoke_match_method (matcher, py_type,
300 method_name);
301
302 if (match_result == NULL)
303 {
304 gdbpy_print_stack ();
305 Py_DECREF (matcher);
306 do_cleanups (cleanups);
307
308 return EXT_LANG_RC_ERROR;
309 }
310 if (match_result == Py_None)
311 ; /* This means there was no match. */
312 else if (PySequence_Check (match_result))
313 {
314 PyObject *iter = PyObject_GetIter (match_result);
315 PyObject *py_worker;
316
317 if (iter == NULL)
318 {
319 gdbpy_print_stack ();
320 Py_DECREF (matcher);
321 Py_DECREF (match_result);
322 do_cleanups (cleanups);
323
324 return EXT_LANG_RC_ERROR;
325 }
326 while ((py_worker = PyIter_Next (iter)) != NULL)
327 {
328 struct xmethod_worker *worker;
329
330 worker = new_python_xmethod_worker (py_worker, py_type);
331 VEC_safe_push (xmethod_worker_ptr, worker_vec, worker);
332 Py_DECREF (py_worker);
333 }
334 Py_DECREF (iter);
335 /* Report any error that could have occurred while iterating. */
336 if (PyErr_Occurred ())
337 {
338 gdbpy_print_stack ();
339 Py_DECREF (matcher);
340 Py_DECREF (match_result);
341 do_cleanups (cleanups);
342
343 return EXT_LANG_RC_ERROR;
344 }
345 }
346 else
347 {
348 struct xmethod_worker *worker;
349
350 worker = new_python_xmethod_worker (match_result, py_type);
351 VEC_safe_push (xmethod_worker_ptr, worker_vec, worker);
352 }
353
354 Py_DECREF (match_result);
355 Py_DECREF (matcher);
356 }
357 Py_DECREF (list_iter);
358 /* Report any error that could have occurred while iterating. */
359 if (PyErr_Occurred ())
360 {
361 gdbpy_print_stack ();
362 do_cleanups (cleanups);
363
364 return EXT_LANG_RC_ERROR;
365 }
366
367 do_cleanups (cleanups);
368 *dm_vec = worker_vec;
369
370 return EXT_LANG_RC_OK;
371}
372
373/* Implementation of get_xmethod_arg_types for Python. */
374
375enum ext_lang_rc
376gdbpy_get_xmethod_arg_types (const struct extension_language_defn *extlang,
377 struct xmethod_worker *worker,
378 int *nargs, struct type ***arg_types)
379{
19ba03f4
SM
380 struct gdbpy_worker_data *worker_data
381 = (struct gdbpy_worker_data *) worker->data;
883964a7
SC
382 PyObject *py_worker = worker_data->worker;
383 PyObject *get_arg_types_method;
384 PyObject *py_argtype_list, *list_iter = NULL, *item;
385 struct cleanup *cleanups;
386 struct type **type_array, *obj_type;
387 int i = 1, arg_count;
388
389 /* Set nargs to -1 so that any premature return from this function returns
390 an invalid/unusable number of arg types. */
391 *nargs = -1;
392
393 cleanups = ensure_python_env (get_current_arch (), current_language);
394
395 get_arg_types_method = PyObject_GetAttrString (py_worker,
396 get_arg_types_method_name);
397 if (get_arg_types_method == NULL)
398 {
399 gdbpy_print_stack ();
400 do_cleanups (cleanups);
401
402 return EXT_LANG_RC_ERROR;
403 }
404 make_cleanup_py_decref (get_arg_types_method);
405
406 py_argtype_list = PyObject_CallMethodObjArgs (py_worker,
407 py_get_arg_types_method_name,
408 NULL);
409 if (py_argtype_list == NULL)
410 {
411 gdbpy_print_stack ();
412 do_cleanups (cleanups);
413
414 return EXT_LANG_RC_ERROR;
415 }
416 make_cleanup_py_decref (py_argtype_list);
417 if (py_argtype_list == Py_None)
418 arg_count = 0;
419 else if (PySequence_Check (py_argtype_list))
420 {
421 arg_count = PySequence_Size (py_argtype_list);
422 if (arg_count == -1)
423 {
424 gdbpy_print_stack ();
425 do_cleanups (cleanups);
426
427 return EXT_LANG_RC_ERROR;
428 }
429
430 list_iter = PyObject_GetIter (py_argtype_list);
431 if (list_iter == NULL)
432 {
433 gdbpy_print_stack ();
434 do_cleanups (cleanups);
435
436 return EXT_LANG_RC_ERROR;
437 }
438 make_cleanup_py_decref (list_iter);
439 }
440 else
441 arg_count = 1;
442
443 /* Include the 'this' argument in the size. */
444 type_array = XCNEWVEC (struct type *, arg_count + 1);
445 i = 1;
446 if (list_iter != NULL)
447 {
448 while ((item = PyIter_Next (list_iter)) != NULL)
449 {
450 struct type *arg_type = type_object_to_type (item);
451
452 Py_DECREF (item);
453 if (arg_type == NULL)
454 {
455 PyErr_SetString (PyExc_TypeError,
456 _("Arg type returned by the get_arg_types "
457 "method of a debug method worker object is "
458 "not a gdb.Type object."));
459 break;
460 }
461
462 type_array[i] = arg_type;
463 i++;
464 }
465 }
466 else if (arg_count == 1)
467 {
468 /* py_argtype_list is not actually a list but a single gdb.Type
469 object. */
470 struct type *arg_type = type_object_to_type (py_argtype_list);
471
472 if (arg_type == NULL)
473 {
474 PyErr_SetString (PyExc_TypeError,
475 _("Arg type returned by the get_arg_types method "
476 "of an xmethod worker object is not a gdb.Type "
477 "object."));
478 }
479 else
480 {
481 type_array[i] = arg_type;
482 i++;
483 }
484 }
485 if (PyErr_Occurred ())
486 {
487 gdbpy_print_stack ();
488 do_cleanups (cleanups);
489 xfree (type_array);
490
491 return EXT_LANG_RC_ERROR;
492 }
493
494 /* Add the type of 'this' as the first argument. The 'this' pointer should
495 be a 'const' value. Hence, create a 'const' variant of the 'this' pointer
496 type. */
497 obj_type = type_object_to_type (worker_data->this_type);
498 type_array[0] = make_cv_type (1, 0, lookup_pointer_type (obj_type), NULL);
499 *nargs = i;
500 *arg_types = type_array;
501 do_cleanups (cleanups);
502
503 return EXT_LANG_RC_OK;
504}
505
2ce1cdbf
DE
506/* Implementation of get_xmethod_result_type for Python. */
507
508enum ext_lang_rc
509gdbpy_get_xmethod_result_type (const struct extension_language_defn *extlang,
510 struct xmethod_worker *worker,
511 struct value *obj,
512 struct value **args, int nargs,
513 struct type **result_type_ptr)
514{
19ba03f4
SM
515 struct gdbpy_worker_data *worker_data
516 = (struct gdbpy_worker_data *) worker->data;
2ce1cdbf
DE
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;
522 int i;
523
524 cleanups = ensure_python_env (get_current_arch (), current_language);
525
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)
531 {
532 PyErr_Clear ();
533 do_cleanups (cleanups);
534 *result_type_ptr = NULL;
535 return EXT_LANG_RC_OK;
536 }
537 make_cleanup_py_decref (get_result_type_method);
538
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)
542 {
543 struct type *this_ptr = lookup_pointer_type (this_type);
544
545 if (!types_equal (obj_type, this_ptr))
546 obj = value_cast (this_ptr, obj);
547 }
548 else if (TYPE_CODE (obj_type) == TYPE_CODE_REF)
549 {
550 struct type *this_ref = lookup_reference_type (this_type);
551
552 if (!types_equal (obj_type, this_ref))
553 obj = value_cast (this_ref, obj);
554 }
555 else
556 {
557 if (!types_equal (obj_type, this_type))
558 obj = value_cast (this_type, obj);
559 }
560 py_value_obj = value_to_value_object (obj);
561 if (py_value_obj == NULL)
562 goto Fail;
563 make_cleanup_py_decref (py_value_obj);
564
565 py_arg_tuple = PyTuple_New (nargs + 1);
566 if (py_arg_tuple == NULL)
567 goto Fail;
568 make_cleanup_py_decref (py_arg_tuple);
569
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);
574
575 for (i = 0; i < nargs; i++)
576 {
577 PyObject *py_value_arg = value_to_value_object (args[i]);
578
579 if (py_value_arg == NULL)
580 goto Fail;
581 PyTuple_SET_ITEM (py_arg_tuple, i + 1, py_value_arg);
582 }
583
584 py_result_type = PyObject_CallObject (get_result_type_method, py_arg_tuple);
585 if (py_result_type == NULL)
586 goto Fail;
587 make_cleanup_py_decref (py_result_type);
588
589 *result_type_ptr = type_object_to_type (py_result_type);
590 if (*result_type_ptr == NULL)
591 {
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."));
595 goto Fail;
596 }
597
598 do_cleanups (cleanups);
599 return EXT_LANG_RC_OK;
600
601 Fail:
602 gdbpy_print_stack ();
603 do_cleanups (cleanups);
604 return EXT_LANG_RC_ERROR;
605}
606
883964a7
SC
607/* Implementation of invoke_xmethod for Python. */
608
609struct value *
610gdbpy_invoke_xmethod (const struct extension_language_defn *extlang,
611 struct xmethod_worker *worker,
612 struct value *obj, struct value **args, int nargs)
613{
614 int i;
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;
19ba03f4
SM
619 struct gdbpy_worker_data *worker_data
620 = (struct gdbpy_worker_data *) worker->data;
883964a7
SC
621 PyObject *xmethod_worker = worker_data->worker;
622
623 cleanups = ensure_python_env (get_current_arch (), current_language);
624
625 obj_type = check_typedef (value_type (obj));
626 this_type = check_typedef (type_object_to_type (worker_data->this_type));
627 if (TYPE_CODE (obj_type) == TYPE_CODE_PTR)
628 {
629 struct type *this_ptr = lookup_pointer_type (this_type);
630
631 if (!types_equal (obj_type, this_ptr))
632 obj = value_cast (this_ptr, obj);
633 }
634 else if (TYPE_CODE (obj_type) == TYPE_CODE_REF)
635 {
636 struct type *this_ref = lookup_reference_type (this_type);
637
638 if (!types_equal (obj_type, this_ref))
639 obj = value_cast (this_ref, obj);
640 }
641 else
642 {
643 if (!types_equal (obj_type, this_type))
644 obj = value_cast (this_type, obj);
645 }
646 py_value_obj = value_to_value_object (obj);
647 if (py_value_obj == NULL)
648 {
649 gdbpy_print_stack ();
650 error (_("Error while executing Python code."));
651 }
652 make_cleanup_py_decref (py_value_obj);
653
654 py_arg_tuple = PyTuple_New (nargs + 1);
655 if (py_arg_tuple == NULL)
656 {
657 gdbpy_print_stack ();
658 error (_("Error while executing Python code."));
659 }
660 make_cleanup_py_decref (py_arg_tuple);
661
662 /* PyTuple_SET_ITEM steals the reference of the element. Hence INCREF the
663 reference to the 'this' object as we have a cleanup to DECREF it. */
664 Py_INCREF (py_value_obj);
665 PyTuple_SET_ITEM (py_arg_tuple, 0, py_value_obj);
666
667 for (i = 0; i < nargs; i++)
668 {
669 PyObject *py_value_arg = value_to_value_object (args[i]);
670
671 if (py_value_arg == NULL)
672 {
673 gdbpy_print_stack ();
674 error (_("Error while executing Python code."));
675 }
676
677 PyTuple_SET_ITEM (py_arg_tuple, i + 1, py_value_arg);
678 }
679
680 py_result = PyObject_CallObject (xmethod_worker, py_arg_tuple);
681 if (py_result == NULL)
682 {
683 gdbpy_print_stack ();
684 error (_("Error while executing Python code."));
685 }
686 make_cleanup_py_decref (py_result);
687
688 if (py_result != Py_None)
689 {
690 res = convert_value_from_python (py_result);
691 if (res == NULL)
692 {
693 gdbpy_print_stack ();
694 error (_("Error while executing Python code."));
695 }
696 }
697 else
698 {
699 res = allocate_value (lookup_typename (python_language, python_gdbarch,
700 "void", NULL, 0));
701 }
702
703 do_cleanups (cleanups);
704
705 return res;
706}
707
708/* Creates a new Python xmethod_worker object.
709 The new object has data of type 'struct gdbpy_worker_data' composed
710 with the components PY_WORKER and THIS_TYPE. */
711
712static struct xmethod_worker *
713new_python_xmethod_worker (PyObject *py_worker, PyObject *this_type)
714{
715 struct gdbpy_worker_data *data;
716
717 gdb_assert (py_worker != NULL && this_type != NULL);
718
719 data = XCNEW (struct gdbpy_worker_data);
720 data->worker = py_worker;
721 data->this_type = this_type;
722 Py_INCREF (py_worker);
723 Py_INCREF (this_type);
724
725 return new_xmethod_worker (&extension_language_python, data);
726}
727
728int
729gdbpy_initialize_xmethods (void)
730{
731 py_match_method_name = PyString_FromString (match_method_name);
732 if (py_match_method_name == NULL)
733 return -1;
734
883964a7
SC
735 py_get_arg_types_method_name
736 = PyString_FromString (get_arg_types_method_name);
737 if (py_get_arg_types_method_name == NULL)
738 return -1;
739
740 return 1;
741}
This page took 0.254279 seconds and 4 git commands to generate.