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