gdb/copyright.py: Remove testsuite/gdb.base/step-line.{c,inp} special handling
[deliverable/binutils-gdb.git] / gdb / python / py-xmethods.c
CommitLineData
883964a7
SC
1/* Support for debug methods in Python.
2
61baf725 3 Copyright (C) 2013-2017 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"
572a5524 29#include "py-ref.h"
883964a7
SC
30
31static const char enabled_field_name[] = "enabled";
32static const char match_method_name[] = "match";
33static const char get_arg_types_method_name[] = "get_arg_types";
2ce1cdbf 34static const char get_result_type_method_name[] = "get_result_type";
883964a7
SC
35static const char matchers_attr_str[] = "xmethods";
36
37static PyObject *py_match_method_name = NULL;
38static PyObject *py_get_arg_types_method_name = NULL;
883964a7
SC
39
40struct gdbpy_worker_data
41{
42 PyObject *worker;
43 PyObject *this_type;
44};
45
46static 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
51void
52gdbpy_free_xmethod_worker_data (const struct extension_language_defn *extlang,
53 void *data)
54{
19ba03f4 55 struct gdbpy_worker_data *worker_data = (struct gdbpy_worker_data *) data;
883964a7
SC
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. */
f18e226f 60 gdbpy_enter enter_py (get_current_arch (), current_language);
883964a7
SC
61
62 Py_DECREF (worker_data->worker);
63 Py_DECREF (worker_data->this_type);
64 xfree (worker_data);
883964a7
SC
65}
66
67/* Implementation of clone_xmethod_worker_data for Python. */
68
69void *
70gdbpy_clone_xmethod_worker_data (const struct extension_language_defn *extlang,
71 void *data)
72{
19ba03f4
SM
73 struct gdbpy_worker_data *worker_data
74 = (struct gdbpy_worker_data *) data, *new_data;
883964a7
SC
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. */
f18e226f 79 gdbpy_enter enter_py (get_current_arch (), current_language);
883964a7
SC
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
883964a7
SC
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
93static PyObject *
94invoke_match_method (PyObject *matcher, PyObject *py_obj_type,
95 const char *xmethod_name)
96{
883964a7
SC
97 int enabled;
98
7780f186
TT
99 gdbpy_ref<> enabled_field (PyObject_GetAttrString (matcher,
100 enabled_field_name));
883964a7 101 if (enabled_field == NULL)
bf1ca3b9 102 return NULL;
883964a7 103
bf1ca3b9 104 enabled = PyObject_IsTrue (enabled_field.get ());
883964a7 105 if (enabled == -1)
bf1ca3b9 106 return NULL;
883964a7
SC
107 if (enabled == 0)
108 {
109 /* Return 'None' if the matcher is not enabled. */
883964a7
SC
110 Py_RETURN_NONE;
111 }
112
7780f186
TT
113 gdbpy_ref<> match_method (PyObject_GetAttrString (matcher,
114 match_method_name));
883964a7 115 if (match_method == NULL)
bf1ca3b9 116 return NULL;
883964a7 117
7780f186 118 gdbpy_ref<> py_xmethod_name (PyString_FromString (xmethod_name));
883964a7 119 if (py_xmethod_name == NULL)
bf1ca3b9 120 return NULL;
883964a7 121
bf1ca3b9
TT
122 return PyObject_CallMethodObjArgs (matcher, py_match_method_name,
123 py_obj_type, py_xmethod_name.get (),
124 NULL);
883964a7
SC
125}
126
127/* Implementation of get_matching_xmethod_workers for Python. */
128
129enum ext_lang_rc
130gdbpy_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{
883964a7
SC
135 struct objfile *objfile;
136 VEC (xmethod_worker_ptr) *worker_vec = NULL;
572a5524 137 PyObject *py_progspace;
883964a7
SC
138
139 gdb_assert (obj_type != NULL && method_name != NULL);
140
572a5524 141 gdbpy_enter enter_py (get_current_arch (), current_language);
883964a7 142
7780f186 143 gdbpy_ref<> py_type (type_to_type_object (obj_type));
883964a7
SC
144 if (py_type == NULL)
145 {
146 gdbpy_print_stack ();
883964a7
SC
147 return EXT_LANG_RC_ERROR;
148 }
883964a7
SC
149
150 /* Create an empty list of debug methods. */
7780f186 151 gdbpy_ref<> py_xmethod_matcher_list (PyList_New (0));
883964a7
SC
152 if (py_xmethod_matcher_list == NULL)
153 {
154 gdbpy_print_stack ();
883964a7
SC
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);
883964a7
SC
164
165 if (py_objfile == NULL)
166 {
167 gdbpy_print_stack ();
883964a7
SC
168 return EXT_LANG_RC_ERROR;
169 }
170
7780f186
TT
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 ()));
572a5524 174 if (temp == NULL)
883964a7
SC
175 {
176 gdbpy_print_stack ();
883964a7
SC
177 return EXT_LANG_RC_ERROR;
178 }
572a5524
TT
179
180 py_xmethod_matcher_list = std::move (temp);
883964a7
SC
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 {
7780f186 188 gdbpy_ref<> pspace_matchers (pspy_get_xmethods (py_progspace, NULL));
883964a7 189
7780f186
TT
190 gdbpy_ref<> temp (PySequence_Concat (py_xmethod_matcher_list.get (),
191 pspace_matchers.get ()));
572a5524 192 if (temp == NULL)
883964a7
SC
193 {
194 gdbpy_print_stack ();
883964a7
SC
195 return EXT_LANG_RC_ERROR;
196 }
572a5524
TT
197
198 py_xmethod_matcher_list = std::move (temp);
883964a7
SC
199 }
200 else
201 {
202 gdbpy_print_stack ();
883964a7
SC
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 {
7780f186
TT
210 gdbpy_ref<> gdb_matchers (PyObject_GetAttrString (gdb_python_module,
211 matchers_attr_str));
883964a7
SC
212 if (gdb_matchers != NULL)
213 {
7780f186
TT
214 gdbpy_ref<> temp (PySequence_Concat (py_xmethod_matcher_list.get (),
215 gdb_matchers.get ()));
572a5524 216 if (temp == NULL)
883964a7
SC
217 {
218 gdbpy_print_stack ();
883964a7
SC
219 return EXT_LANG_RC_ERROR;
220 }
572a5524
TT
221
222 py_xmethod_matcher_list = std::move (temp);
883964a7
SC
223 }
224 else
225 {
226 gdbpy_print_stack ();
883964a7
SC
227 return EXT_LANG_RC_ERROR;
228 }
229 }
230
7780f186 231 gdbpy_ref<> list_iter (PyObject_GetIter (py_xmethod_matcher_list.get ()));
883964a7
SC
232 if (list_iter == NULL)
233 {
234 gdbpy_print_stack ();
883964a7
SC
235 return EXT_LANG_RC_ERROR;
236 }
572a5524 237 while (true)
883964a7 238 {
7780f186 239 gdbpy_ref<> matcher (PyIter_Next (list_iter.get ()));
572a5524
TT
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
7780f186
TT
250 gdbpy_ref<> match_result (invoke_match_method (matcher.get (),
251 py_type.get (),
252 method_name));
883964a7
SC
253
254 if (match_result == NULL)
255 {
256 gdbpy_print_stack ();
883964a7
SC
257 return EXT_LANG_RC_ERROR;
258 }
259 if (match_result == Py_None)
260 ; /* This means there was no match. */
572a5524 261 else if (PySequence_Check (match_result.get ()))
883964a7 262 {
7780f186 263 gdbpy_ref<> iter (PyObject_GetIter (match_result.get ()));
883964a7
SC
264
265 if (iter == NULL)
266 {
267 gdbpy_print_stack ();
883964a7
SC
268 return EXT_LANG_RC_ERROR;
269 }
572a5524 270 while (true)
883964a7
SC
271 {
272 struct xmethod_worker *worker;
273
7780f186 274 gdbpy_ref<> py_worker (PyIter_Next (iter.get ()));
572a5524
TT
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 ());
883964a7 287 VEC_safe_push (xmethod_worker_ptr, worker_vec, worker);
883964a7
SC
288 }
289 }
290 else
291 {
292 struct xmethod_worker *worker;
293
572a5524
TT
294 worker = new_python_xmethod_worker (match_result.get (),
295 py_type.get ());
883964a7
SC
296 VEC_safe_push (xmethod_worker_ptr, worker_vec, worker);
297 }
883964a7 298 }
883964a7 299
883964a7
SC
300 *dm_vec = worker_vec;
301
302 return EXT_LANG_RC_OK;
303}
304
305/* Implementation of get_xmethod_arg_types for Python. */
306
307enum ext_lang_rc
308gdbpy_get_xmethod_arg_types (const struct extension_language_defn *extlang,
309 struct xmethod_worker *worker,
310 int *nargs, struct type ***arg_types)
311{
b1ce6568
SM
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);
19ba03f4
SM
315 struct gdbpy_worker_data *worker_data
316 = (struct gdbpy_worker_data *) worker->data;
883964a7 317 PyObject *py_worker = worker_data->worker;
14b122bf 318 struct type *obj_type;
883964a7 319 int i = 1, arg_count;
7780f186 320 gdbpy_ref<> list_iter;
883964a7
SC
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
7780f186 326 gdbpy_ref<> get_arg_types_method
14b122bf 327 (PyObject_GetAttrString (py_worker, get_arg_types_method_name));
883964a7
SC
328 if (get_arg_types_method == NULL)
329 {
330 gdbpy_print_stack ();
883964a7
SC
331 return EXT_LANG_RC_ERROR;
332 }
883964a7 333
7780f186 334 gdbpy_ref<> py_argtype_list
14b122bf
TT
335 (PyObject_CallMethodObjArgs (py_worker, py_get_arg_types_method_name,
336 NULL));
883964a7
SC
337 if (py_argtype_list == NULL)
338 {
339 gdbpy_print_stack ();
883964a7
SC
340 return EXT_LANG_RC_ERROR;
341 }
14b122bf 342
883964a7
SC
343 if (py_argtype_list == Py_None)
344 arg_count = 0;
14b122bf 345 else if (PySequence_Check (py_argtype_list.get ()))
883964a7 346 {
14b122bf 347 arg_count = PySequence_Size (py_argtype_list.get ());
883964a7
SC
348 if (arg_count == -1)
349 {
350 gdbpy_print_stack ();
883964a7
SC
351 return EXT_LANG_RC_ERROR;
352 }
353
14b122bf 354 list_iter.reset (PyObject_GetIter (py_argtype_list.get ()));
883964a7
SC
355 if (list_iter == NULL)
356 {
357 gdbpy_print_stack ();
883964a7
SC
358 return EXT_LANG_RC_ERROR;
359 }
883964a7
SC
360 }
361 else
362 arg_count = 1;
363
364 /* Include the 'this' argument in the size. */
14b122bf
TT
365 gdb::unique_xmalloc_ptr<struct type *> type_array
366 (XCNEWVEC (struct type *, arg_count + 1));
883964a7
SC
367 i = 1;
368 if (list_iter != NULL)
369 {
14b122bf 370 while (true)
883964a7 371 {
7780f186 372 gdbpy_ref<> item (PyIter_Next (list_iter.get ()));
14b122bf
TT
373 if (item == NULL)
374 {
375 if (PyErr_Occurred ())
376 {
377 gdbpy_print_stack ();
378 return EXT_LANG_RC_ERROR;
379 }
380 break;
381 }
883964a7 382
14b122bf 383 struct type *arg_type = type_object_to_type (item.get ());
883964a7
SC
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."));
14b122bf 390 return EXT_LANG_RC_ERROR;
883964a7
SC
391 }
392
14b122bf 393 (type_array.get ())[i] = arg_type;
883964a7
SC
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. */
14b122bf 401 struct type *arg_type = type_object_to_type (py_argtype_list.get ());
883964a7
SC
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."));
14b122bf 409 return EXT_LANG_RC_ERROR;
883964a7
SC
410 }
411 else
412 {
14b122bf 413 (type_array.get ())[i] = arg_type;
883964a7
SC
414 i++;
415 }
416 }
883964a7
SC
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);
14b122bf
TT
422 (type_array.get ())[0] = make_cv_type (1, 0, lookup_pointer_type (obj_type),
423 NULL);
883964a7 424 *nargs = i;
14b122bf 425 *arg_types = type_array.release ();
883964a7
SC
426
427 return EXT_LANG_RC_OK;
428}
429
2ce1cdbf
DE
430/* Implementation of get_xmethod_result_type for Python. */
431
432enum ext_lang_rc
433gdbpy_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{
19ba03f4
SM
439 struct gdbpy_worker_data *worker_data
440 = (struct gdbpy_worker_data *) worker->data;
2ce1cdbf 441 PyObject *py_worker = worker_data->worker;
2ce1cdbf 442 struct type *obj_type, *this_type;
2ce1cdbf
DE
443 int i;
444
14b122bf 445 gdbpy_enter enter_py (get_current_arch (), current_language);
2ce1cdbf
DE
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). */
7780f186 449 gdbpy_ref<> get_result_type_method
14b122bf 450 (PyObject_GetAttrString (py_worker, get_result_type_method_name));
2ce1cdbf
DE
451 if (get_result_type_method == NULL)
452 {
453 PyErr_Clear ();
2ce1cdbf
DE
454 *result_type_ptr = NULL;
455 return EXT_LANG_RC_OK;
456 }
2ce1cdbf
DE
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 }
3fcf899d 467 else if (TYPE_IS_REFERENCE (obj_type))
2ce1cdbf 468 {
3fcf899d
AV
469 struct type *this_ref
470 = lookup_reference_type (this_type, TYPE_CODE (obj_type));
2ce1cdbf
DE
471
472 if (!types_equal (obj_type, this_ref))
473 obj = value_cast (this_ref, obj);
474 }
475 else
476 {
477 if (!types_equal (obj_type, this_type))
478 obj = value_cast (this_type, obj);
479 }
7780f186 480 gdbpy_ref<> py_value_obj (value_to_value_object (obj));
2ce1cdbf 481 if (py_value_obj == NULL)
14b122bf
TT
482 {
483 gdbpy_print_stack ();
484 return EXT_LANG_RC_ERROR;
485 }
2ce1cdbf 486
7780f186 487 gdbpy_ref<> py_arg_tuple (PyTuple_New (nargs + 1));
2ce1cdbf 488 if (py_arg_tuple == NULL)
14b122bf
TT
489 {
490 gdbpy_print_stack ();
491 return EXT_LANG_RC_ERROR;
492 }
2ce1cdbf 493
14b122bf
TT
494 /* PyTuple_SET_ITEM steals the reference of the element, hence the
495 release. */
496 PyTuple_SET_ITEM (py_arg_tuple.get (), 0, py_value_obj.release ());
2ce1cdbf
DE
497
498 for (i = 0; i < nargs; i++)
499 {
500 PyObject *py_value_arg = value_to_value_object (args[i]);
501
502 if (py_value_arg == NULL)
14b122bf
TT
503 {
504 gdbpy_print_stack ();
505 return EXT_LANG_RC_ERROR;
506 }
507 PyTuple_SET_ITEM (py_arg_tuple.get (), i + 1, py_value_arg);
2ce1cdbf
DE
508 }
509
7780f186 510 gdbpy_ref<> py_result_type
14b122bf 511 (PyObject_CallObject (get_result_type_method.get (), py_arg_tuple.get ()));
2ce1cdbf 512 if (py_result_type == NULL)
14b122bf
TT
513 {
514 gdbpy_print_stack ();
515 return EXT_LANG_RC_ERROR;
516 }
2ce1cdbf 517
14b122bf 518 *result_type_ptr = type_object_to_type (py_result_type.get ());
2ce1cdbf
DE
519 if (*result_type_ptr == NULL)
520 {
521 PyErr_SetString (PyExc_TypeError,
522 _("Type returned by the get_result_type method of an"
523 " xmethod worker object is not a gdb.Type object."));
14b122bf
TT
524 gdbpy_print_stack ();
525 return EXT_LANG_RC_ERROR;
2ce1cdbf
DE
526 }
527
2ce1cdbf 528 return EXT_LANG_RC_OK;
2ce1cdbf
DE
529}
530
883964a7
SC
531/* Implementation of invoke_xmethod for Python. */
532
533struct value *
534gdbpy_invoke_xmethod (const struct extension_language_defn *extlang,
535 struct xmethod_worker *worker,
536 struct value *obj, struct value **args, int nargs)
537{
538 int i;
883964a7
SC
539 struct type *obj_type, *this_type;
540 struct value *res = NULL;
19ba03f4
SM
541 struct gdbpy_worker_data *worker_data
542 = (struct gdbpy_worker_data *) worker->data;
883964a7
SC
543 PyObject *xmethod_worker = worker_data->worker;
544
14b122bf 545 gdbpy_enter enter_py (get_current_arch (), current_language);
883964a7
SC
546
547 obj_type = check_typedef (value_type (obj));
548 this_type = check_typedef (type_object_to_type (worker_data->this_type));
549 if (TYPE_CODE (obj_type) == TYPE_CODE_PTR)
550 {
551 struct type *this_ptr = lookup_pointer_type (this_type);
552
553 if (!types_equal (obj_type, this_ptr))
554 obj = value_cast (this_ptr, obj);
555 }
a65cfae5 556 else if (TYPE_IS_REFERENCE (obj_type))
883964a7 557 {
a65cfae5
AV
558 struct type *this_ref
559 = lookup_reference_type (this_type, TYPE_CODE (obj_type));
883964a7
SC
560
561 if (!types_equal (obj_type, this_ref))
562 obj = value_cast (this_ref, obj);
563 }
564 else
565 {
566 if (!types_equal (obj_type, this_type))
567 obj = value_cast (this_type, obj);
568 }
7780f186 569 gdbpy_ref<> py_value_obj (value_to_value_object (obj));
883964a7
SC
570 if (py_value_obj == NULL)
571 {
572 gdbpy_print_stack ();
573 error (_("Error while executing Python code."));
574 }
883964a7 575
7780f186 576 gdbpy_ref<> py_arg_tuple (PyTuple_New (nargs + 1));
883964a7
SC
577 if (py_arg_tuple == NULL)
578 {
579 gdbpy_print_stack ();
580 error (_("Error while executing Python code."));
581 }
883964a7 582
14b122bf
TT
583 /* PyTuple_SET_ITEM steals the reference of the element, hence the
584 release. */
585 PyTuple_SET_ITEM (py_arg_tuple.get (), 0, py_value_obj.release ());
883964a7
SC
586
587 for (i = 0; i < nargs; i++)
588 {
589 PyObject *py_value_arg = value_to_value_object (args[i]);
590
591 if (py_value_arg == NULL)
592 {
593 gdbpy_print_stack ();
594 error (_("Error while executing Python code."));
595 }
596
14b122bf 597 PyTuple_SET_ITEM (py_arg_tuple.get (), i + 1, py_value_arg);
883964a7
SC
598 }
599
7780f186
TT
600 gdbpy_ref<> py_result (PyObject_CallObject (xmethod_worker,
601 py_arg_tuple.get ()));
883964a7
SC
602 if (py_result == NULL)
603 {
604 gdbpy_print_stack ();
605 error (_("Error while executing Python code."));
606 }
883964a7
SC
607
608 if (py_result != Py_None)
609 {
14b122bf 610 res = convert_value_from_python (py_result.get ());
883964a7
SC
611 if (res == NULL)
612 {
613 gdbpy_print_stack ();
614 error (_("Error while executing Python code."));
615 }
616 }
617 else
618 {
619 res = allocate_value (lookup_typename (python_language, python_gdbarch,
620 "void", NULL, 0));
621 }
622
883964a7
SC
623 return res;
624}
625
626/* Creates a new Python xmethod_worker object.
627 The new object has data of type 'struct gdbpy_worker_data' composed
628 with the components PY_WORKER and THIS_TYPE. */
629
630static struct xmethod_worker *
631new_python_xmethod_worker (PyObject *py_worker, PyObject *this_type)
632{
633 struct gdbpy_worker_data *data;
634
635 gdb_assert (py_worker != NULL && this_type != NULL);
636
637 data = XCNEW (struct gdbpy_worker_data);
638 data->worker = py_worker;
639 data->this_type = this_type;
640 Py_INCREF (py_worker);
641 Py_INCREF (this_type);
642
643 return new_xmethod_worker (&extension_language_python, data);
644}
645
646int
647gdbpy_initialize_xmethods (void)
648{
649 py_match_method_name = PyString_FromString (match_method_name);
650 if (py_match_method_name == NULL)
651 return -1;
652
883964a7
SC
653 py_get_arg_types_method_name
654 = PyString_FromString (get_arg_types_method_name);
655 if (py_get_arg_types_method_name == NULL)
656 return -1;
657
658 return 1;
659}
This page took 0.410827 seconds and 4 git commands to generate.