Add back gdb_pretty_print_insn
[deliverable/binutils-gdb.git] / gdb / python / py-framefilter.c
CommitLineData
1e611234
PM
1/* Python frame filters
2
61baf725 3 Copyright (C) 2013-2017 Free Software Foundation, Inc.
1e611234
PM
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 "objfiles.h"
22#include "symtab.h"
23#include "language.h"
1e611234
PM
24#include "arch-utils.h"
25#include "python.h"
26#include "ui-out.h"
27#include "valprint.h"
28#include "annotate.h"
29#include "hashtab.h"
30#include "demangle.h"
31#include "mi/mi-cmds.h"
32#include "python-internal.h"
ee0a3fb8 33#include "py-ref.h"
1e611234
PM
34
35enum mi_print_types
36{
37 MI_PRINT_ARGS,
38 MI_PRINT_LOCALS
39};
40
41/* Helper function to extract a symbol, a name and a language
42 definition from a Python object that conforms to the "Symbol Value"
43 interface. OBJ is the Python object to extract the values from.
44 NAME is a pass-through argument where the name of the symbol will
45 be written. NAME is allocated in this function, but the caller is
46 responsible for clean up. SYM is a pass-through argument where the
63e43d3a
PMR
47 symbol will be written and SYM_BLOCK is a pass-through argument to
48 write the block where the symbol lies in. In the case of the API
49 returning a string, this will be set to NULL. LANGUAGE is also a
50 pass-through argument denoting the language attributed to the
51 Symbol. In the case of SYM being NULL, this will be set to the
52 current language. Returns EXT_LANG_BT_ERROR on error with the
53 appropriate Python exception set, and EXT_LANG_BT_OK on success. */
1e611234 54
6dddc817 55static enum ext_lang_bt_status
9b972014
TT
56extract_sym (PyObject *obj, gdb::unique_xmalloc_ptr<char> *name,
57 struct symbol **sym, struct block **sym_block,
58 const struct language_defn **language)
1e611234 59{
ee0a3fb8 60 gdbpy_ref result (PyObject_CallMethod (obj, "symbol", NULL));
1e611234
PM
61
62 if (result == NULL)
6dddc817 63 return EXT_LANG_BT_ERROR;
1e611234
PM
64
65 /* For 'symbol' callback, the function can return a symbol or a
66 string. */
ee0a3fb8 67 if (gdbpy_is_string (result.get ()))
1e611234 68 {
ee0a3fb8 69 *name = python_string_to_host_string (result.get ());
1e611234
PM
70
71 if (*name == NULL)
6dddc817 72 return EXT_LANG_BT_ERROR;
1e611234
PM
73 /* If the API returns a string (and not a symbol), then there is
74 no symbol derived language available and the frame filter has
75 either overridden the symbol with a string, or supplied a
76 entirely synthetic symbol/value pairing. In that case, use
77 python_language. */
78 *language = python_language;
79 *sym = NULL;
63e43d3a 80 *sym_block = NULL;
1e611234
PM
81 }
82 else
83 {
84 /* This type checks 'result' during the conversion so we
85 just call it unconditionally and check the return. */
ee0a3fb8 86 *sym = symbol_object_to_symbol (result.get ());
63e43d3a
PMR
87 /* TODO: currently, we have no way to recover the block in which SYMBOL
88 was found, so we have no block to return. Trying to evaluate SYMBOL
89 will yield an incorrect value when it's located in a FRAME and
90 evaluated from another frame (as permitted in nested functions). */
91 *sym_block = NULL;
1e611234 92
1e611234
PM
93 if (*sym == NULL)
94 {
95 PyErr_SetString (PyExc_RuntimeError,
96 _("Unexpected value. Expecting a "
97 "gdb.Symbol or a Python string."));
6dddc817 98 return EXT_LANG_BT_ERROR;
1e611234
PM
99 }
100
101 /* Duplicate the symbol name, so the caller has consistency
102 in garbage collection. */
9b972014 103 name->reset (xstrdup (SYMBOL_PRINT_NAME (*sym)));
1e611234
PM
104
105 /* If a symbol is specified attempt to determine the language
106 from the symbol. If mode is not "auto", then the language
107 has been explicitly set, use that. */
108 if (language_mode == language_mode_auto)
109 *language = language_def (SYMBOL_LANGUAGE (*sym));
110 else
111 *language = current_language;
112 }
113
6dddc817 114 return EXT_LANG_BT_OK;
1e611234
PM
115}
116
117/* Helper function to extract a value from an object that conforms to
118 the "Symbol Value" interface. OBJ is the Python object to extract
119 the value from. VALUE is a pass-through argument where the value
120 will be written. If the object does not have the value attribute,
121 or provides the Python None for a value, VALUE will be set to NULL
6dddc817
DE
122 and this function will return as successful. Returns EXT_LANG_BT_ERROR
123 on error with the appropriate Python exception set, and EXT_LANG_BT_OK on
1e611234
PM
124 success. */
125
6dddc817 126static enum ext_lang_bt_status
1e611234
PM
127extract_value (PyObject *obj, struct value **value)
128{
129 if (PyObject_HasAttrString (obj, "value"))
130 {
ee0a3fb8 131 gdbpy_ref vresult (PyObject_CallMethod (obj, "value", NULL));
1e611234
PM
132
133 if (vresult == NULL)
6dddc817 134 return EXT_LANG_BT_ERROR;
1e611234
PM
135
136 /* The Python code has returned 'None' for a value, so we set
137 value to NULL. This flags that GDB should read the
138 value. */
139 if (vresult == Py_None)
140 {
1e611234 141 *value = NULL;
6dddc817 142 return EXT_LANG_BT_OK;
1e611234
PM
143 }
144 else
145 {
ee0a3fb8 146 *value = convert_value_from_python (vresult.get ());
1e611234
PM
147
148 if (*value == NULL)
6dddc817 149 return EXT_LANG_BT_ERROR;
1e611234 150
6dddc817 151 return EXT_LANG_BT_OK;
1e611234
PM
152 }
153 }
154 else
155 *value = NULL;
156
6dddc817 157 return EXT_LANG_BT_OK;
1e611234
PM
158}
159
160/* MI prints only certain values according to the type of symbol and
161 also what the user has specified. SYM is the symbol to check, and
162 MI_PRINT_TYPES is an enum specifying what the user wants emitted
163 for the MI command in question. */
164static int
165mi_should_print (struct symbol *sym, enum mi_print_types type)
166{
167 int print_me = 0;
168
169 switch (SYMBOL_CLASS (sym))
170 {
171 default:
172 case LOC_UNDEF: /* catches errors */
173 case LOC_CONST: /* constant */
174 case LOC_TYPEDEF: /* local typedef */
175 case LOC_LABEL: /* local label */
176 case LOC_BLOCK: /* local function */
177 case LOC_CONST_BYTES: /* loc. byte seq. */
178 case LOC_UNRESOLVED: /* unresolved static */
179 case LOC_OPTIMIZED_OUT: /* optimized out */
180 print_me = 0;
181 break;
182
183 case LOC_ARG: /* argument */
184 case LOC_REF_ARG: /* reference arg */
185 case LOC_REGPARM_ADDR: /* indirect register arg */
186 case LOC_LOCAL: /* stack local */
187 case LOC_STATIC: /* static */
188 case LOC_REGISTER: /* register */
189 case LOC_COMPUTED: /* computed location */
190 if (type == MI_PRINT_LOCALS)
191 print_me = ! SYMBOL_IS_ARGUMENT (sym);
192 else
193 print_me = SYMBOL_IS_ARGUMENT (sym);
194 }
195 return print_me;
196}
197
198/* Helper function which outputs a type name extracted from VAL to a
199 "type" field in the output stream OUT. OUT is the ui-out structure
200 the type name will be output too, and VAL is the value that the
6dddc817
DE
201 type will be extracted from. Returns EXT_LANG_BT_ERROR on error, with
202 any GDB exceptions converted to a Python exception, or EXT_LANG_BT_OK on
1e611234
PM
203 success. */
204
6dddc817 205static enum ext_lang_bt_status
1e611234
PM
206py_print_type (struct ui_out *out, struct value *val)
207{
1e611234 208
492d29ea 209 TRY
1e611234 210 {
1e611234
PM
211 struct ui_file *stb;
212 struct cleanup *cleanup;
213
214 stb = mem_fileopen ();
215 cleanup = make_cleanup_ui_file_delete (stb);
78cc6c2d 216 check_typedef (value_type (val));
1e611234 217 type_print (value_type (val), "", stb, -1);
112e8700 218 out->field_stream ("type", stb);
1e611234
PM
219 do_cleanups (cleanup);
220 }
492d29ea 221 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
222 {
223 gdbpy_convert_exception (except);
6dddc817 224 return EXT_LANG_BT_ERROR;
1e611234 225 }
492d29ea 226 END_CATCH
1e611234 227
6dddc817 228 return EXT_LANG_BT_OK;
1e611234
PM
229}
230
231/* Helper function which outputs a value to an output field in a
232 stream. OUT is the ui-out structure the value will be output to,
233 VAL is the value that will be printed, OPTS contains the value
234 printing options, ARGS_TYPE is an enumerator describing the
235 argument format, and LANGUAGE is the language_defn that the value
6dddc817
DE
236 will be printed with. Returns EXT_LANG_BT_ERROR on error, with any GDB
237 exceptions converted to a Python exception, or EXT_LANG_BT_OK on
1e611234
PM
238 success. */
239
6dddc817 240static enum ext_lang_bt_status
1e611234
PM
241py_print_value (struct ui_out *out, struct value *val,
242 const struct value_print_options *opts,
243 int indent,
6dddc817 244 enum ext_lang_frame_args args_type,
1e611234
PM
245 const struct language_defn *language)
246{
247 int should_print = 0;
1e611234
PM
248
249 /* MI does not print certain values, differentiated by type,
250 depending on what ARGS_TYPE indicates. Test type against option.
251 For CLI print all values. */
252 if (args_type == MI_PRINT_SIMPLE_VALUES
253 || args_type == MI_PRINT_ALL_VALUES)
254 {
255 struct type *type = NULL;
256
492d29ea 257 TRY
1e611234
PM
258 {
259 type = check_typedef (value_type (val));
260 }
492d29ea 261 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
262 {
263 gdbpy_convert_exception (except);
6dddc817 264 return EXT_LANG_BT_ERROR;
1e611234 265 }
492d29ea 266 END_CATCH
1e611234
PM
267
268 if (args_type == MI_PRINT_ALL_VALUES)
269 should_print = 1;
270 else if (args_type == MI_PRINT_SIMPLE_VALUES
271 && TYPE_CODE (type) != TYPE_CODE_ARRAY
272 && TYPE_CODE (type) != TYPE_CODE_STRUCT
273 && TYPE_CODE (type) != TYPE_CODE_UNION)
274 should_print = 1;
275 }
276 else if (args_type != NO_VALUES)
277 should_print = 1;
278
279 if (should_print)
280 {
492d29ea 281 TRY
1e611234
PM
282 {
283 struct ui_file *stb;
284 struct cleanup *cleanup;
285
286 stb = mem_fileopen ();
287 cleanup = make_cleanup_ui_file_delete (stb);
288 common_val_print (val, stb, indent, opts, language);
112e8700 289 out->field_stream ("value", stb);
1e611234
PM
290 do_cleanups (cleanup);
291 }
492d29ea 292 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
293 {
294 gdbpy_convert_exception (except);
6dddc817 295 return EXT_LANG_BT_ERROR;
1e611234 296 }
492d29ea 297 END_CATCH
1e611234
PM
298 }
299
6dddc817 300 return EXT_LANG_BT_OK;
1e611234
PM
301}
302
303/* Helper function to call a Python method and extract an iterator
304 from the result. If the function returns anything but an iterator
305 the exception is preserved and NULL is returned. FILTER is the
306 Python object to call, and FUNC is the name of the method. Returns
307 a PyObject, or NULL on error with the appropriate exception set.
308 This function can return an iterator, or NULL. */
309
310static PyObject *
311get_py_iter_from_func (PyObject *filter, char *func)
312{
313 if (PyObject_HasAttrString (filter, func))
314 {
ee0a3fb8 315 gdbpy_ref result (PyObject_CallMethod (filter, func, NULL));
1e611234
PM
316
317 if (result != NULL)
318 {
319 if (result == Py_None)
320 {
ee0a3fb8 321 return result.release ();
1e611234
PM
322 }
323 else
324 {
ee0a3fb8 325 return PyObject_GetIter (result.get ());
1e611234
PM
326 }
327 }
328 }
329 else
330 Py_RETURN_NONE;
331
332 return NULL;
333}
334
335/* Helper function to output a single frame argument and value to an
336 output stream. This function will account for entry values if the
337 FV parameter is populated, the frame argument has entry values
338 associated with them, and the appropriate "set entry-value"
339 options are set. Will output in CLI or MI like format depending
340 on the type of output stream detected. OUT is the output stream,
341 SYM_NAME is the name of the symbol. If SYM_NAME is populated then
342 it must have an accompanying value in the parameter FV. FA is a
343 frame argument structure. If FA is populated, both SYM_NAME and
344 FV are ignored. OPTS contains the value printing options,
345 ARGS_TYPE is an enumerator describing the argument format,
346 PRINT_ARGS_FIELD is a flag which indicates if we output "ARGS=1"
347 in MI output in commands where both arguments and locals are
6dddc817
DE
348 printed. Returns EXT_LANG_BT_ERROR on error, with any GDB exceptions
349 converted to a Python exception, or EXT_LANG_BT_OK on success. */
1e611234 350
6dddc817 351static enum ext_lang_bt_status
1e611234
PM
352py_print_single_arg (struct ui_out *out,
353 const char *sym_name,
354 struct frame_arg *fa,
355 struct value *fv,
356 const struct value_print_options *opts,
6dddc817 357 enum ext_lang_frame_args args_type,
1e611234
PM
358 int print_args_field,
359 const struct language_defn *language)
360{
361 struct value *val;
c75bd3a2 362 enum ext_lang_bt_status retval = EXT_LANG_BT_OK;
1e611234
PM
363
364 if (fa != NULL)
365 {
c75bd3a2
JK
366 if (fa->val == NULL && fa->error == NULL)
367 return EXT_LANG_BT_OK;
1e611234
PM
368 language = language_def (SYMBOL_LANGUAGE (fa->sym));
369 val = fa->val;
370 }
371 else
372 val = fv;
373
492d29ea 374 TRY
1e611234
PM
375 {
376 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
377
378 /* MI has varying rules for tuples, but generally if there is only
379 one element in each item in the list, do not start a tuple. The
380 exception is -stack-list-variables which emits an ARGS="1" field
381 if the value is a frame argument. This is denoted in this
382 function with PRINT_ARGS_FIELD which is flag from the caller to
383 emit the ARGS field. */
112e8700 384 if (out->is_mi_like_p ())
1e611234
PM
385 {
386 if (print_args_field || args_type != NO_VALUES)
387 make_cleanup_ui_out_tuple_begin_end (out, NULL);
388 }
389
390 annotate_arg_begin ();
391
392 /* If frame argument is populated, check for entry-values and the
393 entry value options. */
394 if (fa != NULL)
395 {
396 struct ui_file *stb;
397
398 stb = mem_fileopen ();
399 make_cleanup_ui_file_delete (stb);
400 fprintf_symbol_filtered (stb, SYMBOL_PRINT_NAME (fa->sym),
401 SYMBOL_LANGUAGE (fa->sym),
402 DMGL_PARAMS | DMGL_ANSI);
403 if (fa->entry_kind == print_entry_values_compact)
404 {
405 fputs_filtered ("=", stb);
406
407 fprintf_symbol_filtered (stb, SYMBOL_PRINT_NAME (fa->sym),
408 SYMBOL_LANGUAGE (fa->sym),
409 DMGL_PARAMS | DMGL_ANSI);
410 }
411 if (fa->entry_kind == print_entry_values_only
412 || fa->entry_kind == print_entry_values_compact)
413 {
414 fputs_filtered ("@entry", stb);
415 }
112e8700 416 out->field_stream ("name", stb);
1e611234
PM
417 }
418 else
419 /* Otherwise, just output the name. */
112e8700 420 out->field_string ("name", sym_name);
1e611234
PM
421
422 annotate_arg_name_end ();
423
112e8700
SM
424 if (! out->is_mi_like_p ())
425 out->text ("=");
1e611234
PM
426
427 if (print_args_field)
112e8700 428 out->field_int ("arg", 1);
1e611234
PM
429
430 /* For MI print the type, but only for simple values. This seems
431 weird, but this is how MI choose to format the various output
432 types. */
c75bd3a2 433 if (args_type == MI_PRINT_SIMPLE_VALUES && val != NULL)
1e611234 434 {
6dddc817 435 if (py_print_type (out, val) == EXT_LANG_BT_ERROR)
1e611234 436 {
c75bd3a2 437 retval = EXT_LANG_BT_ERROR;
1e611234 438 do_cleanups (cleanups);
1e611234
PM
439 }
440 }
441
9c6595ab 442 if (retval != EXT_LANG_BT_ERROR)
1e611234 443 {
9c6595ab
PA
444 if (val != NULL)
445 annotate_arg_value (value_type (val));
446
447 /* If the output is to the CLI, and the user option "set print
448 frame-arguments" is set to none, just output "...". */
112e8700
SM
449 if (! out->is_mi_like_p () && args_type == NO_VALUES)
450 out->field_string ("value", "...");
9c6595ab 451 else
1e611234 452 {
9c6595ab
PA
453 /* Otherwise, print the value for both MI and the CLI, except
454 for the case of MI_PRINT_NO_VALUES. */
455 if (args_type != NO_VALUES)
1e611234 456 {
9c6595ab
PA
457 if (val == NULL)
458 {
459 gdb_assert (fa != NULL && fa->error != NULL);
112e8700 460 out->field_fmt ("value",
9c6595ab
PA
461 _("<error reading variable: %s>"),
462 fa->error);
463 }
464 else if (py_print_value (out, val, opts, 0, args_type, language)
465 == EXT_LANG_BT_ERROR)
466 retval = EXT_LANG_BT_ERROR;
1e611234
PM
467 }
468 }
1e611234 469
9c6595ab
PA
470 do_cleanups (cleanups);
471 }
1e611234 472 }
492d29ea
PA
473 CATCH (except, RETURN_MASK_ERROR)
474 {
475 gdbpy_convert_exception (except);
476 }
477 END_CATCH
1e611234 478
c75bd3a2 479 return retval;
1e611234
PM
480}
481
482/* Helper function to loop over frame arguments provided by the
483 "frame_arguments" Python API. Elements in the iterator must
484 conform to the "Symbol Value" interface. ITER is the Python
485 iterable object, OUT is the output stream, ARGS_TYPE is an
486 enumerator describing the argument format, PRINT_ARGS_FIELD is a
487 flag which indicates if we output "ARGS=1" in MI output in commands
488 where both arguments and locals are printed, and FRAME is the
6dddc817
DE
489 backing frame. Returns EXT_LANG_BT_ERROR on error, with any GDB
490 exceptions converted to a Python exception, or EXT_LANG_BT_OK on
1e611234
PM
491 success. */
492
6dddc817 493static enum ext_lang_bt_status
1e611234
PM
494enumerate_args (PyObject *iter,
495 struct ui_out *out,
6dddc817 496 enum ext_lang_frame_args args_type,
1e611234
PM
497 int print_args_field,
498 struct frame_info *frame)
499{
1e611234 500 struct value_print_options opts;
1e611234
PM
501
502 get_user_print_options (&opts);
503
504 if (args_type == CLI_SCALAR_VALUES)
505 {
506 /* True in "summary" mode, false otherwise. */
507 opts.summary = 1;
508 }
509
510 opts.deref_ref = 1;
511
492d29ea 512 TRY
1e611234
PM
513 {
514 annotate_frame_args ();
515 }
492d29ea 516 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
517 {
518 gdbpy_convert_exception (except);
06fc9bf7 519 return EXT_LANG_BT_ERROR;
1e611234 520 }
492d29ea 521 END_CATCH
1e611234
PM
522
523 /* Collect the first argument outside of the loop, so output of
524 commas in the argument output is correct. At the end of the
525 loop block collect another item from the iterator, and, if it is
526 not null emit a comma. */
06fc9bf7 527 gdbpy_ref item (PyIter_Next (iter));
1e611234 528 if (item == NULL && PyErr_Occurred ())
06fc9bf7 529 return EXT_LANG_BT_ERROR;
1e611234 530
06fc9bf7 531 while (item != NULL)
1e611234
PM
532 {
533 const struct language_defn *language;
9b972014 534 gdb::unique_xmalloc_ptr<char> sym_name;
1e611234 535 struct symbol *sym;
63e43d3a 536 struct block *sym_block;
1e611234 537 struct value *val;
6dddc817 538 enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
1e611234 539
06fc9bf7
TT
540 success = extract_sym (item.get (), &sym_name, &sym, &sym_block,
541 &language);
6dddc817 542 if (success == EXT_LANG_BT_ERROR)
06fc9bf7 543 return EXT_LANG_BT_ERROR;
1e611234 544
06fc9bf7 545 success = extract_value (item.get (), &val);
6dddc817 546 if (success == EXT_LANG_BT_ERROR)
06fc9bf7 547 return EXT_LANG_BT_ERROR;
1e611234 548
112e8700 549 if (sym && out->is_mi_like_p ()
1e611234 550 && ! mi_should_print (sym, MI_PRINT_ARGS))
9b972014 551 continue;
1e611234
PM
552
553 /* If the object did not provide a value, read it using
554 read_frame_args and account for entry values, if any. */
555 if (val == NULL)
556 {
557 struct frame_arg arg, entryarg;
558
559 /* If there is no value, and also no symbol, set error and
560 exit. */
561 if (sym == NULL)
562 {
563 PyErr_SetString (PyExc_RuntimeError,
564 _("No symbol or value provided."));
06fc9bf7 565 return EXT_LANG_BT_ERROR;
1e611234
PM
566 }
567
492d29ea 568 TRY
1e611234
PM
569 {
570 read_frame_arg (sym, frame, &arg, &entryarg);
571 }
492d29ea 572 CATCH (except, RETURN_MASK_ALL)
1e611234 573 {
1e611234 574 gdbpy_convert_exception (except);
06fc9bf7 575 return EXT_LANG_BT_ERROR;
1e611234 576 }
492d29ea 577 END_CATCH
1e611234
PM
578
579 /* The object has not provided a value, so this is a frame
580 argument to be read by GDB. In this case we have to
581 account for entry-values. */
582
583 if (arg.entry_kind != print_entry_values_only)
584 {
585 if (py_print_single_arg (out, NULL, &arg,
586 NULL, &opts,
587 args_type,
588 print_args_field,
6dddc817 589 NULL) == EXT_LANG_BT_ERROR)
1e611234
PM
590 {
591 xfree (arg.error);
592 xfree (entryarg.error);
06fc9bf7 593 return EXT_LANG_BT_ERROR;
1e611234
PM
594 }
595 }
596
597 if (entryarg.entry_kind != print_entry_values_no)
598 {
599 if (arg.entry_kind != print_entry_values_only)
600 {
492d29ea 601 TRY
1e611234 602 {
112e8700
SM
603 out->text (", ");
604 out->wrap_hint (" ");
1e611234 605 }
492d29ea 606 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
607 {
608 xfree (arg.error);
609 xfree (entryarg.error);
1e611234 610 gdbpy_convert_exception (except);
06fc9bf7 611 return EXT_LANG_BT_ERROR;
1e611234 612 }
492d29ea 613 END_CATCH
1e611234
PM
614 }
615
6dddc817
DE
616 if (py_print_single_arg (out, NULL, &entryarg, NULL, &opts,
617 args_type, print_args_field, NULL)
618 == EXT_LANG_BT_ERROR)
1e611234 619 {
06fc9bf7
TT
620 xfree (arg.error);
621 xfree (entryarg.error);
622 return EXT_LANG_BT_ERROR;
1e611234
PM
623 }
624 }
625
626 xfree (arg.error);
627 xfree (entryarg.error);
628 }
629 else
630 {
631 /* If the object has provided a value, we just print that. */
632 if (val != NULL)
633 {
9b972014 634 if (py_print_single_arg (out, sym_name.get (), NULL, val, &opts,
1e611234 635 args_type, print_args_field,
6dddc817 636 language) == EXT_LANG_BT_ERROR)
06fc9bf7 637 return EXT_LANG_BT_ERROR;
1e611234
PM
638 }
639 }
640
1e611234
PM
641 /* Collect the next item from the iterator. If
642 this is the last item, do not print the
643 comma. */
06fc9bf7 644 item.reset (PyIter_Next (iter));
1e611234
PM
645 if (item != NULL)
646 {
492d29ea 647 TRY
1e611234 648 {
112e8700 649 out->text (", ");
1e611234 650 }
492d29ea 651 CATCH (except, RETURN_MASK_ALL)
1e611234 652 {
1e611234 653 gdbpy_convert_exception (except);
06fc9bf7 654 return EXT_LANG_BT_ERROR;
1e611234 655 }
492d29ea 656 END_CATCH
1e611234
PM
657 }
658 else if (PyErr_Occurred ())
06fc9bf7 659 return EXT_LANG_BT_ERROR;
1e611234 660
492d29ea 661 TRY
1e611234
PM
662 {
663 annotate_arg_end ();
664 }
492d29ea 665 CATCH (except, RETURN_MASK_ALL)
1e611234 666 {
1e611234 667 gdbpy_convert_exception (except);
06fc9bf7 668 return EXT_LANG_BT_ERROR;
1e611234 669 }
492d29ea 670 END_CATCH
1e611234
PM
671 }
672
6dddc817 673 return EXT_LANG_BT_OK;
1e611234
PM
674}
675
676
677/* Helper function to loop over variables provided by the
678 "frame_locals" Python API. Elements in the iterable must conform
679 to the "Symbol Value" interface. ITER is the Python iterable
680 object, OUT is the output stream, INDENT is whether we should
681 indent the output (for CLI), ARGS_TYPE is an enumerator describing
682 the argument format, PRINT_ARGS_FIELD is flag which indicates
683 whether to output the ARGS field in the case of
684 -stack-list-variables and FRAME is the backing frame. Returns
6dddc817
DE
685 EXT_LANG_BT_ERROR on error, with any GDB exceptions converted to a Python
686 exception, or EXT_LANG_BT_OK on success. */
1e611234 687
6dddc817 688static enum ext_lang_bt_status
1e611234
PM
689enumerate_locals (PyObject *iter,
690 struct ui_out *out,
691 int indent,
6dddc817 692 enum ext_lang_frame_args args_type,
1e611234
PM
693 int print_args_field,
694 struct frame_info *frame)
695{
1e611234
PM
696 struct value_print_options opts;
697
698 get_user_print_options (&opts);
699 opts.deref_ref = 1;
700
13df46cc 701 while (true)
1e611234
PM
702 {
703 const struct language_defn *language;
9b972014 704 gdb::unique_xmalloc_ptr<char> sym_name;
1e611234 705 struct value *val;
6dddc817 706 enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
1e611234 707 struct symbol *sym;
63e43d3a 708 struct block *sym_block;
1e611234
PM
709 int local_indent = 8 + (8 * indent);
710 struct cleanup *locals_cleanups;
711
13df46cc
TT
712 gdbpy_ref item (PyIter_Next (iter));
713 if (item == NULL)
714 break;
1e611234 715
13df46cc
TT
716 locals_cleanups = make_cleanup (null_cleanup, NULL);
717
718 success = extract_sym (item.get (), &sym_name, &sym, &sym_block,
719 &language);
6dddc817 720 if (success == EXT_LANG_BT_ERROR)
1e611234
PM
721 {
722 do_cleanups (locals_cleanups);
723 goto error;
724 }
725
13df46cc 726 success = extract_value (item.get (), &val);
6dddc817 727 if (success == EXT_LANG_BT_ERROR)
1e611234
PM
728 {
729 do_cleanups (locals_cleanups);
730 goto error;
731 }
732
112e8700 733 if (sym != NULL && out->is_mi_like_p ()
1e611234
PM
734 && ! mi_should_print (sym, MI_PRINT_LOCALS))
735 {
736 do_cleanups (locals_cleanups);
737 continue;
738 }
739
740 /* If the object did not provide a value, read it. */
741 if (val == NULL)
742 {
492d29ea 743 TRY
1e611234 744 {
63e43d3a 745 val = read_var_value (sym, sym_block, frame);
1e611234 746 }
492d29ea 747 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
748 {
749 gdbpy_convert_exception (except);
750 do_cleanups (locals_cleanups);
751 goto error;
752 }
492d29ea 753 END_CATCH
1e611234
PM
754 }
755
756 /* With PRINT_NO_VALUES, MI does not emit a tuple normally as
757 each output contains only one field. The exception is
758 -stack-list-variables, which always provides a tuple. */
112e8700 759 if (out->is_mi_like_p ())
1e611234
PM
760 {
761 if (print_args_field || args_type != NO_VALUES)
762 make_cleanup_ui_out_tuple_begin_end (out, NULL);
763 }
492d29ea 764 TRY
1e611234 765 {
112e8700 766 if (! out->is_mi_like_p ())
1e611234
PM
767 {
768 /* If the output is not MI we indent locals. */
112e8700 769 out->spaces (local_indent);
1e611234
PM
770 }
771
112e8700 772 out->field_string ("name", sym_name.get ());
1e611234 773
112e8700
SM
774 if (! out->is_mi_like_p ())
775 out->text (" = ");
1e611234 776 }
492d29ea 777 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
778 {
779 gdbpy_convert_exception (except);
780 do_cleanups (locals_cleanups);
781 goto error;
782 }
492d29ea 783 END_CATCH
1e611234
PM
784
785 if (args_type == MI_PRINT_SIMPLE_VALUES)
786 {
6dddc817 787 if (py_print_type (out, val) == EXT_LANG_BT_ERROR)
1e611234
PM
788 {
789 do_cleanups (locals_cleanups);
790 goto error;
791 }
792 }
793
794 /* CLI always prints values for locals. MI uses the
795 simple/no/all system. */
112e8700 796 if (! out->is_mi_like_p ())
1e611234
PM
797 {
798 int val_indent = (indent + 1) * 4;
799
800 if (py_print_value (out, val, &opts, val_indent, args_type,
6dddc817 801 language) == EXT_LANG_BT_ERROR)
1e611234
PM
802 {
803 do_cleanups (locals_cleanups);
804 goto error;
805 }
806 }
807 else
808 {
809 if (args_type != NO_VALUES)
810 {
811 if (py_print_value (out, val, &opts, 0, args_type,
6dddc817 812 language) == EXT_LANG_BT_ERROR)
1e611234
PM
813 {
814 do_cleanups (locals_cleanups);
815 goto error;
816 }
817 }
818 }
819
820 do_cleanups (locals_cleanups);
821
492d29ea 822 TRY
1e611234 823 {
112e8700 824 out->text ("\n");
1e611234 825 }
492d29ea 826 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
827 {
828 gdbpy_convert_exception (except);
829 goto error;
830 }
492d29ea 831 END_CATCH
1e611234
PM
832 }
833
13df46cc
TT
834 if (!PyErr_Occurred ())
835 return EXT_LANG_BT_OK;
1e611234
PM
836
837 error:
6dddc817 838 return EXT_LANG_BT_ERROR;
1e611234
PM
839}
840
6dddc817
DE
841/* Helper function for -stack-list-variables. Returns EXT_LANG_BT_ERROR on
842 error, or EXT_LANG_BT_OK on success. */
1e611234 843
6dddc817 844static enum ext_lang_bt_status
1e611234
PM
845py_mi_print_variables (PyObject *filter, struct ui_out *out,
846 struct value_print_options *opts,
6dddc817 847 enum ext_lang_frame_args args_type,
1e611234
PM
848 struct frame_info *frame)
849{
850 struct cleanup *old_chain;
1e611234 851
13df46cc 852 gdbpy_ref args_iter (get_py_iter_from_func (filter, "frame_args"));
1e611234 853 if (args_iter == NULL)
13df46cc 854 return EXT_LANG_BT_ERROR;
1e611234 855
13df46cc 856 gdbpy_ref locals_iter (get_py_iter_from_func (filter, "frame_locals"));
1e611234 857 if (locals_iter == NULL)
13df46cc 858 return EXT_LANG_BT_ERROR;
1e611234 859
13df46cc 860 old_chain = make_cleanup_ui_out_list_begin_end (out, "variables");
1e611234
PM
861
862 if (args_iter != Py_None)
13df46cc 863 if (enumerate_args (args_iter.get (), out, args_type, 1, frame)
6dddc817 864 == EXT_LANG_BT_ERROR)
1e611234
PM
865 goto error;
866
867 if (locals_iter != Py_None)
13df46cc 868 if (enumerate_locals (locals_iter.get (), out, 1, args_type, 1, frame)
6dddc817 869 == EXT_LANG_BT_ERROR)
1e611234
PM
870 goto error;
871
872 do_cleanups (old_chain);
6dddc817 873 return EXT_LANG_BT_OK;
1e611234
PM
874
875 error:
876 do_cleanups (old_chain);
6dddc817 877 return EXT_LANG_BT_ERROR;
1e611234
PM
878}
879
880/* Helper function for printing locals. This function largely just
881 creates the wrapping tuple, and calls enumerate_locals. Returns
6dddc817 882 EXT_LANG_BT_ERROR on error, or EXT_LANG_BT_OK on success. */
1e611234 883
6dddc817 884static enum ext_lang_bt_status
1e611234
PM
885py_print_locals (PyObject *filter,
886 struct ui_out *out,
6dddc817 887 enum ext_lang_frame_args args_type,
1e611234
PM
888 int indent,
889 struct frame_info *frame)
890{
13df46cc 891 struct cleanup *old_chain;
1e611234 892
13df46cc 893 gdbpy_ref locals_iter (get_py_iter_from_func (filter, "frame_locals"));
1e611234 894 if (locals_iter == NULL)
13df46cc 895 return EXT_LANG_BT_ERROR;
1e611234 896
13df46cc 897 old_chain = make_cleanup_ui_out_list_begin_end (out, "locals");
1e611234
PM
898
899 if (locals_iter != Py_None)
13df46cc 900 if (enumerate_locals (locals_iter.get (), out, indent, args_type,
6dddc817 901 0, frame) == EXT_LANG_BT_ERROR)
1e611234
PM
902 goto locals_error;
903
904 do_cleanups (old_chain);
6dddc817 905 return EXT_LANG_BT_OK;
1e611234
PM
906
907 locals_error:
908 do_cleanups (old_chain);
6dddc817 909 return EXT_LANG_BT_ERROR;
1e611234
PM
910}
911
912/* Helper function for printing frame arguments. This function
913 largely just creates the wrapping tuple, and calls enumerate_args.
6dddc817
DE
914 Returns EXT_LANG_BT_ERROR on error, with any GDB exceptions converted to
915 a Python exception, or EXT_LANG_BT_OK on success. */
1e611234 916
6dddc817 917static enum ext_lang_bt_status
1e611234
PM
918py_print_args (PyObject *filter,
919 struct ui_out *out,
6dddc817 920 enum ext_lang_frame_args args_type,
1e611234
PM
921 struct frame_info *frame)
922{
13df46cc 923 struct cleanup *old_chain;
1e611234 924
13df46cc 925 gdbpy_ref args_iter (get_py_iter_from_func (filter, "frame_args"));
1e611234 926 if (args_iter == NULL)
13df46cc 927 return EXT_LANG_BT_ERROR;
1e611234 928
13df46cc 929 old_chain = make_cleanup_ui_out_list_begin_end (out, "args");
1e611234 930
492d29ea 931 TRY
1e611234
PM
932 {
933 annotate_frame_args ();
112e8700
SM
934 if (! out->is_mi_like_p ())
935 out->text (" (");
1e611234 936 }
492d29ea 937 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
938 {
939 gdbpy_convert_exception (except);
940 goto args_error;
941 }
492d29ea 942 END_CATCH
1e611234
PM
943
944 if (args_iter != Py_None)
13df46cc 945 if (enumerate_args (args_iter.get (), out, args_type, 0, frame)
6dddc817 946 == EXT_LANG_BT_ERROR)
1e611234
PM
947 goto args_error;
948
492d29ea 949 TRY
1e611234 950 {
112e8700
SM
951 if (! out->is_mi_like_p ())
952 out->text (")");
1e611234 953 }
492d29ea 954 CATCH (except, RETURN_MASK_ALL)
1e611234
PM
955 {
956 gdbpy_convert_exception (except);
957 goto args_error;
958 }
492d29ea 959 END_CATCH
1e611234
PM
960
961 do_cleanups (old_chain);
6dddc817 962 return EXT_LANG_BT_OK;
1e611234
PM
963
964 args_error:
965 do_cleanups (old_chain);
6dddc817 966 return EXT_LANG_BT_ERROR;
1e611234
PM
967}
968
969/* Print a single frame to the designated output stream, detecting
970 whether the output is MI or console, and formatting the output
971 according to the conventions of that protocol. FILTER is the
972 frame-filter associated with this frame. FLAGS is an integer
973 describing the various print options. The FLAGS variables is
974 described in "apply_frame_filter" function. ARGS_TYPE is an
975 enumerator describing the argument format. OUT is the output
976 stream to print, INDENT is the level of indention for this frame
977 (in the case of elided frames), and LEVELS_PRINTED is a hash-table
978 containing all the frames level that have already been printed.
979 If a frame level has been printed, do not print it again (in the
6dddc817
DE
980 case of elided frames). Returns EXT_LANG_BT_ERROR on error, with any
981 GDB exceptions converted to a Python exception, or EXT_LANG_BT_COMPLETED
b99bf4e3 982 on success. It can also throw an exception RETURN_QUIT. */
1e611234 983
6dddc817
DE
984static enum ext_lang_bt_status
985py_print_frame (PyObject *filter, int flags,
986 enum ext_lang_frame_args args_type,
1e611234
PM
987 struct ui_out *out, int indent, htab_t levels_printed)
988{
989 int has_addr = 0;
990 CORE_ADDR address = 0;
991 struct gdbarch *gdbarch = NULL;
992 struct frame_info *frame = NULL;
b99bf4e3 993 struct cleanup *cleanup_stack;
1e611234 994 struct value_print_options opts;
1e611234 995 int print_level, print_frame_info, print_args, print_locals;
9b972014 996 gdb::unique_xmalloc_ptr<char> function_to_free;
1e611234
PM
997
998 /* Extract print settings from FLAGS. */
999 print_level = (flags & PRINT_LEVEL) ? 1 : 0;
1000 print_frame_info = (flags & PRINT_FRAME_INFO) ? 1 : 0;
1001 print_args = (flags & PRINT_ARGS) ? 1 : 0;
1002 print_locals = (flags & PRINT_LOCALS) ? 1 : 0;
1003
1004 get_user_print_options (&opts);
1005
1006 /* Get the underlying frame. This is needed to determine GDB
1007 architecture, and also, in the cases of frame variables/arguments to
1008 read them if they returned filter object requires us to do so. */
74c49d45 1009 gdbpy_ref py_inf_frame (PyObject_CallMethod (filter, "inferior_frame", NULL));
1e611234 1010 if (py_inf_frame == NULL)
b99bf4e3 1011 return EXT_LANG_BT_ERROR;
1e611234 1012
74c49d45 1013 frame = frame_object_to_frame_info (py_inf_frame.get ());
1e611234 1014 if (frame == NULL)
b99bf4e3 1015 return EXT_LANG_BT_ERROR;
1e611234 1016
492d29ea 1017 TRY
1e611234
PM
1018 {
1019 gdbarch = get_frame_arch (frame);
1020 }
492d29ea 1021 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
1022 {
1023 gdbpy_convert_exception (except);
800eb1ce 1024 return EXT_LANG_BT_ERROR;
1e611234 1025 }
492d29ea 1026 END_CATCH
1e611234 1027
1e611234
PM
1028 /* stack-list-variables. */
1029 if (print_locals && print_args && ! print_frame_info)
1030 {
1031 if (py_mi_print_variables (filter, out, &opts,
6dddc817 1032 args_type, frame) == EXT_LANG_BT_ERROR)
b99bf4e3 1033 return EXT_LANG_BT_ERROR;
34019068 1034 return EXT_LANG_BT_COMPLETED;
1e611234
PM
1035 }
1036
b99bf4e3
JK
1037 cleanup_stack = make_cleanup (null_cleanup, NULL);
1038
1e611234
PM
1039 /* -stack-list-locals does not require a
1040 wrapping frame attribute. */
1041 if (print_frame_info || (print_args && ! print_locals))
1042 make_cleanup_ui_out_tuple_begin_end (out, "frame");
1043
1044 if (print_frame_info)
1045 {
1046 /* Elided frames are also printed with this function (recursively)
1047 and are printed with indention. */
1048 if (indent > 0)
1049 {
492d29ea 1050 TRY
8d4a54e2 1051 {
112e8700 1052 out->spaces (indent * 4);
8d4a54e2 1053 }
492d29ea 1054 CATCH (except, RETURN_MASK_ERROR)
8d4a54e2
JK
1055 {
1056 gdbpy_convert_exception (except);
800eb1ce
JK
1057 do_cleanups (cleanup_stack);
1058 return EXT_LANG_BT_ERROR;
8d4a54e2 1059 }
492d29ea 1060 END_CATCH
1e611234
PM
1061 }
1062
1063 /* The address is required for frame annotations, and also for
1064 address printing. */
1065 if (PyObject_HasAttrString (filter, "address"))
1066 {
74c49d45 1067 gdbpy_ref paddr (PyObject_CallMethod (filter, "address", NULL));
34019068
JK
1068
1069 if (paddr == NULL)
800eb1ce
JK
1070 {
1071 do_cleanups (cleanup_stack);
1072 return EXT_LANG_BT_ERROR;
1073 }
34019068
JK
1074
1075 if (paddr != Py_None)
1e611234 1076 {
74c49d45 1077 if (get_addr_from_python (paddr.get (), &address) < 0)
30a7bb83 1078 {
30a7bb83
TT
1079 do_cleanups (cleanup_stack);
1080 return EXT_LANG_BT_ERROR;
1081 }
1082
34019068 1083 has_addr = 1;
1e611234 1084 }
1e611234
PM
1085 }
1086 }
1087
1088 /* Print frame level. MI does not require the level if
1089 locals/variables only are being printed. */
1090 if ((print_frame_info || print_args) && print_level)
1091 {
1092 struct frame_info **slot;
1093 int level;
1e611234
PM
1094
1095 slot = (struct frame_info **) htab_find_slot (levels_printed,
1096 frame, INSERT);
492d29ea 1097 TRY
1e611234
PM
1098 {
1099 level = frame_relative_level (frame);
1100
1101 /* Check if this frame has already been printed (there are cases
1102 where elided synthetic dummy-frames have to 'borrow' the frame
1103 architecture from the eliding frame. If that is the case, do
1104 not print 'level', but print spaces. */
1105 if (*slot == frame)
112e8700 1106 out->field_skip ("level");
1e611234
PM
1107 else
1108 {
1109 *slot = frame;
1110 annotate_frame_begin (print_level ? level : 0,
1111 gdbarch, address);
112e8700
SM
1112 out->text ("#");
1113 out->field_fmt_int (2, ui_left, "level",
1e611234
PM
1114 level);
1115 }
1116 }
492d29ea 1117 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
1118 {
1119 gdbpy_convert_exception (except);
800eb1ce
JK
1120 do_cleanups (cleanup_stack);
1121 return EXT_LANG_BT_ERROR;
1e611234 1122 }
492d29ea 1123 END_CATCH
1e611234
PM
1124 }
1125
1126 if (print_frame_info)
1127 {
1128 /* Print address to the address field. If an address is not provided,
1129 print nothing. */
1130 if (opts.addressprint && has_addr)
1131 {
492d29ea 1132 TRY
1e611234
PM
1133 {
1134 annotate_frame_address ();
112e8700 1135 out->field_core_addr ("addr", gdbarch, address);
1e611234 1136 annotate_frame_address_end ();
112e8700 1137 out->text (" in ");
1e611234 1138 }
492d29ea 1139 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
1140 {
1141 gdbpy_convert_exception (except);
800eb1ce
JK
1142 do_cleanups (cleanup_stack);
1143 return EXT_LANG_BT_ERROR;
1e611234 1144 }
492d29ea 1145 END_CATCH
1e611234
PM
1146 }
1147
1148 /* Print frame function name. */
1149 if (PyObject_HasAttrString (filter, "function"))
1150 {
3b4e0e01 1151 gdbpy_ref py_func (PyObject_CallMethod (filter, "function", NULL));
34019068 1152 const char *function = NULL;
1e611234 1153
34019068 1154 if (py_func == NULL)
800eb1ce
JK
1155 {
1156 do_cleanups (cleanup_stack);
1157 return EXT_LANG_BT_ERROR;
1158 }
1e611234 1159
3b4e0e01 1160 if (gdbpy_is_string (py_func.get ()))
34019068 1161 {
3b4e0e01 1162 function_to_free = python_string_to_host_string (py_func.get ());
1e611234 1163
9b972014 1164 if (function_to_free == NULL)
1e611234 1165 {
800eb1ce
JK
1166 do_cleanups (cleanup_stack);
1167 return EXT_LANG_BT_ERROR;
1e611234 1168 }
9b972014
TT
1169
1170 function = function_to_free.get ();
34019068 1171 }
3b4e0e01 1172 else if (PyLong_Check (py_func.get ()))
34019068 1173 {
30a7bb83 1174 CORE_ADDR addr;
34019068 1175 struct bound_minimal_symbol msymbol;
1e611234 1176
3b4e0e01 1177 if (get_addr_from_python (py_func.get (), &addr) < 0)
800eb1ce
JK
1178 {
1179 do_cleanups (cleanup_stack);
1180 return EXT_LANG_BT_ERROR;
1181 }
34019068
JK
1182
1183 msymbol = lookup_minimal_symbol_by_pc (addr);
1184 if (msymbol.minsym != NULL)
1185 function = MSYMBOL_PRINT_NAME (msymbol.minsym);
1186 }
1187 else if (py_func != Py_None)
1188 {
1189 PyErr_SetString (PyExc_RuntimeError,
1190 _("FrameDecorator.function: expecting a " \
1191 "String, integer or None."));
800eb1ce
JK
1192 do_cleanups (cleanup_stack);
1193 return EXT_LANG_BT_ERROR;
1e611234 1194 }
34019068 1195
492d29ea 1196 TRY
34019068
JK
1197 {
1198 annotate_frame_function_name ();
1199 if (function == NULL)
112e8700 1200 out->field_skip ("func");
34019068 1201 else
112e8700 1202 out->field_string ("func", function);
34019068 1203 }
492d29ea 1204 CATCH (except, RETURN_MASK_ERROR)
34019068 1205 {
34019068 1206 gdbpy_convert_exception (except);
800eb1ce
JK
1207 do_cleanups (cleanup_stack);
1208 return EXT_LANG_BT_ERROR;
34019068 1209 }
492d29ea 1210 END_CATCH
1e611234 1211 }
1e611234
PM
1212 }
1213
1214
1215 /* Frame arguments. Check the result, and error if something went
1216 wrong. */
1217 if (print_args)
1218 {
6dddc817 1219 if (py_print_args (filter, out, args_type, frame) == EXT_LANG_BT_ERROR)
800eb1ce
JK
1220 {
1221 do_cleanups (cleanup_stack);
1222 return EXT_LANG_BT_ERROR;
1223 }
1e611234
PM
1224 }
1225
1226 /* File name/source/line number information. */
1227 if (print_frame_info)
1228 {
492d29ea 1229 TRY
1e611234
PM
1230 {
1231 annotate_frame_source_begin ();
1232 }
492d29ea 1233 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
1234 {
1235 gdbpy_convert_exception (except);
800eb1ce
JK
1236 do_cleanups (cleanup_stack);
1237 return EXT_LANG_BT_ERROR;
1e611234 1238 }
492d29ea 1239 END_CATCH
1e611234
PM
1240
1241 if (PyObject_HasAttrString (filter, "filename"))
1242 {
3b4e0e01 1243 gdbpy_ref py_fn (PyObject_CallMethod (filter, "filename", NULL));
8d4a54e2 1244
34019068 1245 if (py_fn == NULL)
800eb1ce
JK
1246 {
1247 do_cleanups (cleanup_stack);
1248 return EXT_LANG_BT_ERROR;
1249 }
34019068
JK
1250
1251 if (py_fn != Py_None)
1e611234 1252 {
9b972014 1253 gdb::unique_xmalloc_ptr<char>
3b4e0e01 1254 filename (python_string_to_host_string (py_fn.get ()));
1e611234 1255
34019068
JK
1256 if (filename == NULL)
1257 {
800eb1ce
JK
1258 do_cleanups (cleanup_stack);
1259 return EXT_LANG_BT_ERROR;
34019068 1260 }
8f28f522 1261
492d29ea 1262 TRY
34019068 1263 {
112e8700
SM
1264 out->wrap_hint (" ");
1265 out->text (" at ");
34019068 1266 annotate_frame_source_file ();
112e8700 1267 out->field_string ("file", filename.get ());
34019068
JK
1268 annotate_frame_source_file_end ();
1269 }
492d29ea 1270 CATCH (except, RETURN_MASK_ERROR)
34019068 1271 {
34019068 1272 gdbpy_convert_exception (except);
800eb1ce
JK
1273 do_cleanups (cleanup_stack);
1274 return EXT_LANG_BT_ERROR;
1e611234 1275 }
492d29ea 1276 END_CATCH
1e611234 1277 }
1e611234
PM
1278 }
1279
1280 if (PyObject_HasAttrString (filter, "line"))
1281 {
3b4e0e01 1282 gdbpy_ref py_line (PyObject_CallMethod (filter, "line", NULL));
1e611234
PM
1283 int line;
1284
34019068 1285 if (py_line == NULL)
800eb1ce
JK
1286 {
1287 do_cleanups (cleanup_stack);
1288 return EXT_LANG_BT_ERROR;
1289 }
34019068
JK
1290
1291 if (py_line != Py_None)
1e611234 1292 {
3b4e0e01 1293 line = PyLong_AsLong (py_line.get ());
30a7bb83
TT
1294 if (PyErr_Occurred ())
1295 {
1296 do_cleanups (cleanup_stack);
1297 return EXT_LANG_BT_ERROR;
1298 }
1299
492d29ea 1300 TRY
1e611234 1301 {
112e8700 1302 out->text (":");
34019068 1303 annotate_frame_source_line ();
112e8700 1304 out->field_int ("line", line);
34019068 1305 }
492d29ea 1306 CATCH (except, RETURN_MASK_ERROR)
34019068 1307 {
34019068 1308 gdbpy_convert_exception (except);
800eb1ce
JK
1309 do_cleanups (cleanup_stack);
1310 return EXT_LANG_BT_ERROR;
1e611234 1311 }
492d29ea 1312 END_CATCH
1e611234 1313 }
1e611234
PM
1314 }
1315 }
1316
1317 /* For MI we need to deal with the "children" list population of
1318 elided frames, so if MI output detected do not send newline. */
112e8700 1319 if (! out->is_mi_like_p ())
1e611234 1320 {
492d29ea 1321 TRY
1e611234
PM
1322 {
1323 annotate_frame_end ();
112e8700 1324 out->text ("\n");
1e611234 1325 }
492d29ea 1326 CATCH (except, RETURN_MASK_ERROR)
1e611234
PM
1327 {
1328 gdbpy_convert_exception (except);
800eb1ce
JK
1329 do_cleanups (cleanup_stack);
1330 return EXT_LANG_BT_ERROR;
1e611234 1331 }
492d29ea 1332 END_CATCH
1e611234
PM
1333 }
1334
1335 if (print_locals)
1336 {
1337 if (py_print_locals (filter, out, args_type, indent,
6dddc817 1338 frame) == EXT_LANG_BT_ERROR)
800eb1ce
JK
1339 {
1340 do_cleanups (cleanup_stack);
1341 return EXT_LANG_BT_ERROR;
1342 }
1e611234
PM
1343 }
1344
34019068 1345 {
34019068 1346 /* Finally recursively print elided frames, if any. */
3b4e0e01 1347 gdbpy_ref elided (get_py_iter_from_func (filter, "elided"));
34019068 1348 if (elided == NULL)
800eb1ce
JK
1349 {
1350 do_cleanups (cleanup_stack);
1351 return EXT_LANG_BT_ERROR;
1352 }
1e611234 1353
34019068
JK
1354 if (elided != Py_None)
1355 {
1356 PyObject *item;
1e611234 1357
34019068 1358 make_cleanup_ui_out_list_begin_end (out, "children");
1e611234 1359
112e8700 1360 if (! out->is_mi_like_p ())
34019068 1361 indent++;
1e611234 1362
3b4e0e01 1363 while ((item = PyIter_Next (elided.get ())))
34019068 1364 {
3b4e0e01 1365 gdbpy_ref item_ref (item);
b99bf4e3 1366
34019068
JK
1367 enum ext_lang_bt_status success = py_print_frame (item, flags,
1368 args_type, out,
1369 indent,
1370 levels_printed);
1e611234 1371
34019068
JK
1372 if (success == EXT_LANG_BT_ERROR)
1373 {
800eb1ce
JK
1374 do_cleanups (cleanup_stack);
1375 return EXT_LANG_BT_ERROR;
34019068 1376 }
34019068
JK
1377 }
1378 if (item == NULL && PyErr_Occurred ())
800eb1ce
JK
1379 {
1380 do_cleanups (cleanup_stack);
1381 return EXT_LANG_BT_ERROR;
1382 }
34019068 1383 }
b99bf4e3 1384 }
1e611234
PM
1385
1386 do_cleanups (cleanup_stack);
6dddc817 1387 return EXT_LANG_BT_COMPLETED;
1e611234
PM
1388}
1389
1390/* Helper function to initiate frame filter invocation at starting
1391 frame FRAME. */
1392
1393static PyObject *
1394bootstrap_python_frame_filters (struct frame_info *frame,
1395 int frame_low, int frame_high)
1396{
ee0a3fb8 1397 gdbpy_ref frame_obj (frame_info_to_frame_object (frame));
1e611234 1398 if (frame_obj == NULL)
ee0a3fb8 1399 return NULL;
1e611234 1400
ee0a3fb8 1401 gdbpy_ref module (PyImport_ImportModule ("gdb.frames"));
1e611234 1402 if (module == NULL)
ee0a3fb8 1403 return NULL;
1e611234 1404
ee0a3fb8
TT
1405 gdbpy_ref sort_func (PyObject_GetAttrString (module.get (),
1406 "execute_frame_filters"));
1e611234 1407 if (sort_func == NULL)
ee0a3fb8 1408 return NULL;
1e611234 1409
ee0a3fb8 1410 gdbpy_ref py_frame_low (PyInt_FromLong (frame_low));
1e611234 1411 if (py_frame_low == NULL)
ee0a3fb8 1412 return NULL;
1e611234 1413
ee0a3fb8 1414 gdbpy_ref py_frame_high (PyInt_FromLong (frame_high));
1e611234 1415 if (py_frame_high == NULL)
ee0a3fb8 1416 return NULL;
1e611234 1417
ee0a3fb8
TT
1418 gdbpy_ref iterable (PyObject_CallFunctionObjArgs (sort_func.get (),
1419 frame_obj.get (),
1420 py_frame_low.get (),
1421 py_frame_high.get (),
1422 NULL));
1e611234 1423 if (iterable == NULL)
ee0a3fb8 1424 return NULL;
1e611234
PM
1425
1426 if (iterable != Py_None)
ee0a3fb8 1427 return PyObject_GetIter (iterable.get ());
1e611234 1428 else
ee0a3fb8 1429 return iterable.release ();
1e611234
PM
1430}
1431
1432/* This is the only publicly exported function in this file. FRAME
1433 is the source frame to start frame-filter invocation. FLAGS is an
1434 integer holding the flags for printing. The following elements of
1435 the FRAME_FILTER_FLAGS enum denotes the make-up of FLAGS:
1436 PRINT_LEVEL is a flag indicating whether to print the frame's
1437 relative level in the output. PRINT_FRAME_INFO is a flag that
1438 indicates whether this function should print the frame
1439 information, PRINT_ARGS is a flag that indicates whether to print
1440 frame arguments, and PRINT_LOCALS, likewise, with frame local
1441 variables. ARGS_TYPE is an enumerator describing the argument
1442 format, OUT is the output stream to print. FRAME_LOW is the
1443 beginning of the slice of frames to print, and FRAME_HIGH is the
6dddc817
DE
1444 upper limit of the frames to count. Returns EXT_LANG_BT_ERROR on error,
1445 or EXT_LANG_BT_COMPLETED on success. */
1446
1447enum ext_lang_bt_status
1448gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
1449 struct frame_info *frame, int flags,
1450 enum ext_lang_frame_args args_type,
1451 struct ui_out *out, int frame_low, int frame_high)
1e611234
PM
1452{
1453 struct gdbarch *gdbarch = NULL;
6dddc817 1454 enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
1e611234 1455
8ee002df 1456 if (!gdb_python_initialized)
6dddc817 1457 return EXT_LANG_BT_NO_FILTERS;
8ee002df 1458
492d29ea 1459 TRY
1e611234
PM
1460 {
1461 gdbarch = get_frame_arch (frame);
1462 }
492d29ea 1463 CATCH (except, RETURN_MASK_ALL)
1e611234 1464 {
21909fa1 1465 /* Let gdb try to print the stack trace. */
6dddc817 1466 return EXT_LANG_BT_NO_FILTERS;
1e611234 1467 }
492d29ea 1468 END_CATCH
1e611234 1469
6349f452 1470 gdbpy_enter enter_py (gdbarch, current_language);
21909fa1 1471
6349f452
TT
1472 gdbpy_ref iterable (bootstrap_python_frame_filters (frame, frame_low,
1473 frame_high));
1e611234
PM
1474
1475 if (iterable == NULL)
8ee002df
PM
1476 {
1477 /* Normally if there is an error GDB prints the exception,
1478 abandons the backtrace and exits. The user can then call "bt
1479 no-filters", and get a default backtrace (it would be
1480 confusing to automatically start a standard backtrace halfway
1481 through a Python filtered backtrace). However in the case
1482 where GDB cannot initialize the frame filters (most likely
1483 due to incorrect auto-load paths), GDB has printed nothing.
1484 In this case it is OK to print the default backtrace after
6dddc817 1485 printing the error message. GDB returns EXT_LANG_BT_NO_FILTERS
8ee002df
PM
1486 here to signify there are no filters after printing the
1487 initialization error. This return code will trigger a
1488 default backtrace. */
1489
1490 gdbpy_print_stack ();
6dddc817 1491 return EXT_LANG_BT_NO_FILTERS;
8ee002df 1492 }
1e611234
PM
1493
1494 /* If iterable is None, then there are no frame filters registered.
1495 If this is the case, defer to default GDB printing routines in MI
1496 and CLI. */
1e611234 1497 if (iterable == Py_None)
6349f452 1498 return EXT_LANG_BT_NO_FILTERS;
1e611234 1499
6349f452
TT
1500 htab_up levels_printed (htab_create (20,
1501 htab_hash_pointer,
1502 htab_eq_pointer,
1503 NULL));
1e611234 1504
6349f452 1505 while (true)
1e611234 1506 {
6349f452 1507 gdbpy_ref item (PyIter_Next (iterable.get ()));
b99bf4e3 1508
6349f452
TT
1509 if (item == NULL)
1510 {
1511 if (PyErr_Occurred ())
1512 {
1513 gdbpy_print_stack ();
1514 return EXT_LANG_BT_ERROR;
1515 }
1516 break;
1517 }
1e611234 1518
6349f452
TT
1519 success = py_print_frame (item.get (), flags, args_type, out, 0,
1520 levels_printed.get ());
b99bf4e3 1521
1e611234
PM
1522 /* Do not exit on error printing a single frame. Print the
1523 error and continue with other frames. */
6dddc817 1524 if (success == EXT_LANG_BT_ERROR)
1e611234 1525 gdbpy_print_stack ();
1e611234
PM
1526 }
1527
1e611234 1528 return success;
1e611234 1529}
This page took 0.50323 seconds and 4 git commands to generate.