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