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