Change gdb test suite's TERM setting
[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
76c939ac 202 type will be extracted from. */
1e611234 203
76c939ac 204static void
1e611234
PM
205py_print_type (struct ui_out *out, struct value *val)
206{
76c939ac 207 check_typedef (value_type (val));
1e611234 208
76c939ac
TT
209 string_file stb;
210 type_print (value_type (val), "", &stb, -1);
211 out->field_stream ("type", stb);
1e611234
PM
212}
213
214/* Helper function which outputs a value to an output field in a
215 stream. OUT is the ui-out structure the value will be output to,
216 VAL is the value that will be printed, OPTS contains the value
217 printing options, ARGS_TYPE is an enumerator describing the
218 argument format, and LANGUAGE is the language_defn that the value
76c939ac 219 will be printed with. */
1e611234 220
76c939ac 221static void
1e611234
PM
222py_print_value (struct ui_out *out, struct value *val,
223 const struct value_print_options *opts,
224 int indent,
6dddc817 225 enum ext_lang_frame_args args_type,
1e611234
PM
226 const struct language_defn *language)
227{
228 int should_print = 0;
1e611234
PM
229
230 /* MI does not print certain values, differentiated by type,
231 depending on what ARGS_TYPE indicates. Test type against option.
232 For CLI print all values. */
233 if (args_type == MI_PRINT_SIMPLE_VALUES
234 || args_type == MI_PRINT_ALL_VALUES)
235 {
76c939ac 236 struct type *type = check_typedef (value_type (val));
1e611234
PM
237
238 if (args_type == MI_PRINT_ALL_VALUES)
239 should_print = 1;
240 else if (args_type == MI_PRINT_SIMPLE_VALUES
241 && TYPE_CODE (type) != TYPE_CODE_ARRAY
242 && TYPE_CODE (type) != TYPE_CODE_STRUCT
243 && TYPE_CODE (type) != TYPE_CODE_UNION)
244 should_print = 1;
245 }
246 else if (args_type != NO_VALUES)
247 should_print = 1;
248
249 if (should_print)
250 {
76c939ac 251 string_file stb;
1e611234 252
76c939ac
TT
253 common_val_print (val, &stb, indent, opts, language);
254 out->field_stream ("value", stb);
1e611234 255 }
1e611234
PM
256}
257
258/* Helper function to call a Python method and extract an iterator
259 from the result. If the function returns anything but an iterator
260 the exception is preserved and NULL is returned. FILTER is the
261 Python object to call, and FUNC is the name of the method. Returns
262 a PyObject, or NULL on error with the appropriate exception set.
263 This function can return an iterator, or NULL. */
264
265static PyObject *
a121b7c1 266get_py_iter_from_func (PyObject *filter, const char *func)
1e611234
PM
267{
268 if (PyObject_HasAttrString (filter, func))
269 {
7780f186 270 gdbpy_ref<> result (PyObject_CallMethod (filter, func, NULL));
1e611234
PM
271
272 if (result != NULL)
273 {
274 if (result == Py_None)
275 {
ee0a3fb8 276 return result.release ();
1e611234
PM
277 }
278 else
279 {
ee0a3fb8 280 return PyObject_GetIter (result.get ());
1e611234
PM
281 }
282 }
283 }
284 else
285 Py_RETURN_NONE;
286
287 return NULL;
288}
289
290/* Helper function to output a single frame argument and value to an
291 output stream. This function will account for entry values if the
292 FV parameter is populated, the frame argument has entry values
293 associated with them, and the appropriate "set entry-value"
294 options are set. Will output in CLI or MI like format depending
295 on the type of output stream detected. OUT is the output stream,
296 SYM_NAME is the name of the symbol. If SYM_NAME is populated then
297 it must have an accompanying value in the parameter FV. FA is a
298 frame argument structure. If FA is populated, both SYM_NAME and
299 FV are ignored. OPTS contains the value printing options,
300 ARGS_TYPE is an enumerator describing the argument format,
301 PRINT_ARGS_FIELD is a flag which indicates if we output "ARGS=1"
302 in MI output in commands where both arguments and locals are
76c939ac 303 printed. */
1e611234 304
76c939ac 305static void
1e611234
PM
306py_print_single_arg (struct ui_out *out,
307 const char *sym_name,
308 struct frame_arg *fa,
309 struct value *fv,
310 const struct value_print_options *opts,
6dddc817 311 enum ext_lang_frame_args args_type,
1e611234
PM
312 int print_args_field,
313 const struct language_defn *language)
314{
315 struct value *val;
1e611234
PM
316
317 if (fa != NULL)
318 {
c75bd3a2 319 if (fa->val == NULL && fa->error == NULL)
76c939ac 320 return;
1e611234
PM
321 language = language_def (SYMBOL_LANGUAGE (fa->sym));
322 val = fa->val;
323 }
324 else
325 val = fv;
326
76c939ac 327 gdb::optional<ui_out_emit_tuple> maybe_tuple;
1e611234 328
76c939ac 329 /* MI has varying rules for tuples, but generally if there is only
1e611234
PM
330 one element in each item in the list, do not start a tuple. The
331 exception is -stack-list-variables which emits an ARGS="1" field
332 if the value is a frame argument. This is denoted in this
333 function with PRINT_ARGS_FIELD which is flag from the caller to
334 emit the ARGS field. */
76c939ac
TT
335 if (out->is_mi_like_p ())
336 {
337 if (print_args_field || args_type != NO_VALUES)
338 maybe_tuple.emplace (out, nullptr);
339 }
1e611234 340
76c939ac
TT
341 annotate_arg_begin ();
342
343 /* If frame argument is populated, check for entry-values and the
344 entry value options. */
345 if (fa != NULL)
346 {
347 string_file stb;
1e611234 348
76c939ac
TT
349 fprintf_symbol_filtered (&stb, SYMBOL_PRINT_NAME (fa->sym),
350 SYMBOL_LANGUAGE (fa->sym),
351 DMGL_PARAMS | DMGL_ANSI);
352 if (fa->entry_kind == print_entry_values_compact)
1e611234 353 {
76c939ac 354 stb.puts ("=");
1e611234 355
d7e74731 356 fprintf_symbol_filtered (&stb, SYMBOL_PRINT_NAME (fa->sym),
1e611234
PM
357 SYMBOL_LANGUAGE (fa->sym),
358 DMGL_PARAMS | DMGL_ANSI);
1e611234 359 }
76c939ac
TT
360 if (fa->entry_kind == print_entry_values_only
361 || fa->entry_kind == print_entry_values_compact)
362 stb.puts ("@entry");
363 out->field_stream ("name", stb);
364 }
365 else
366 /* Otherwise, just output the name. */
367 out->field_string ("name", sym_name);
1e611234 368
76c939ac 369 annotate_arg_name_end ();
1e611234 370
2038b7fd 371 out->text ("=");
1e611234 372
76c939ac
TT
373 if (print_args_field)
374 out->field_int ("arg", 1);
1e611234 375
76c939ac
TT
376 /* For MI print the type, but only for simple values. This seems
377 weird, but this is how MI choose to format the various output
378 types. */
379 if (args_type == MI_PRINT_SIMPLE_VALUES && val != NULL)
380 py_print_type (out, val);
1e611234 381
76c939ac
TT
382 if (val != NULL)
383 annotate_arg_value (value_type (val));
9c6595ab 384
76c939ac
TT
385 /* If the output is to the CLI, and the user option "set print
386 frame-arguments" is set to none, just output "...". */
387 if (! out->is_mi_like_p () && args_type == NO_VALUES)
388 out->field_string ("value", "...");
389 else
390 {
391 /* Otherwise, print the value for both MI and the CLI, except
392 for the case of MI_PRINT_NO_VALUES. */
393 if (args_type != NO_VALUES)
394 {
395 if (val == NULL)
1e611234 396 {
76c939ac
TT
397 gdb_assert (fa != NULL && fa->error != NULL);
398 out->field_fmt ("value",
399 _("<error reading variable: %s>"),
400 fa->error);
1e611234 401 }
76c939ac
TT
402 else
403 py_print_value (out, val, opts, 0, args_type, language);
9c6595ab 404 }
1e611234 405 }
1e611234
PM
406}
407
408/* Helper function to loop over frame arguments provided by the
409 "frame_arguments" Python API. Elements in the iterator must
410 conform to the "Symbol Value" interface. ITER is the Python
411 iterable object, OUT is the output stream, ARGS_TYPE is an
412 enumerator describing the argument format, PRINT_ARGS_FIELD is a
413 flag which indicates if we output "ARGS=1" in MI output in commands
414 where both arguments and locals are printed, and FRAME is the
6dddc817
DE
415 backing frame. Returns EXT_LANG_BT_ERROR on error, with any GDB
416 exceptions converted to a Python exception, or EXT_LANG_BT_OK on
1e611234
PM
417 success. */
418
6dddc817 419static enum ext_lang_bt_status
1e611234
PM
420enumerate_args (PyObject *iter,
421 struct ui_out *out,
6dddc817 422 enum ext_lang_frame_args args_type,
1e611234
PM
423 int print_args_field,
424 struct frame_info *frame)
425{
1e611234 426 struct value_print_options opts;
1e611234
PM
427
428 get_user_print_options (&opts);
429
430 if (args_type == CLI_SCALAR_VALUES)
431 {
432 /* True in "summary" mode, false otherwise. */
433 opts.summary = 1;
434 }
435
436 opts.deref_ref = 1;
437
76c939ac 438 annotate_frame_args ();
1e611234
PM
439
440 /* Collect the first argument outside of the loop, so output of
441 commas in the argument output is correct. At the end of the
442 loop block collect another item from the iterator, and, if it is
443 not null emit a comma. */
7780f186 444 gdbpy_ref<> item (PyIter_Next (iter));
1e611234 445 if (item == NULL && PyErr_Occurred ())
06fc9bf7 446 return EXT_LANG_BT_ERROR;
1e611234 447
06fc9bf7 448 while (item != NULL)
1e611234
PM
449 {
450 const struct language_defn *language;
9b972014 451 gdb::unique_xmalloc_ptr<char> sym_name;
1e611234 452 struct symbol *sym;
63e43d3a 453 struct block *sym_block;
1e611234 454 struct value *val;
6dddc817 455 enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
1e611234 456
06fc9bf7
TT
457 success = extract_sym (item.get (), &sym_name, &sym, &sym_block,
458 &language);
6dddc817 459 if (success == EXT_LANG_BT_ERROR)
06fc9bf7 460 return EXT_LANG_BT_ERROR;
1e611234 461
06fc9bf7 462 success = extract_value (item.get (), &val);
6dddc817 463 if (success == EXT_LANG_BT_ERROR)
06fc9bf7 464 return EXT_LANG_BT_ERROR;
1e611234 465
112e8700 466 if (sym && out->is_mi_like_p ()
1e611234 467 && ! mi_should_print (sym, MI_PRINT_ARGS))
9b972014 468 continue;
1e611234
PM
469
470 /* If the object did not provide a value, read it using
471 read_frame_args and account for entry values, if any. */
472 if (val == NULL)
473 {
474 struct frame_arg arg, entryarg;
475
476 /* If there is no value, and also no symbol, set error and
477 exit. */
478 if (sym == NULL)
479 {
480 PyErr_SetString (PyExc_RuntimeError,
481 _("No symbol or value provided."));
06fc9bf7 482 return EXT_LANG_BT_ERROR;
1e611234
PM
483 }
484
76c939ac 485 read_frame_arg (sym, frame, &arg, &entryarg);
1e611234 486
7a630bc2
TT
487 gdb::unique_xmalloc_ptr<char> arg_holder (arg.error);
488 gdb::unique_xmalloc_ptr<char> entry_holder (entryarg.error);
489
1e611234
PM
490 /* The object has not provided a value, so this is a frame
491 argument to be read by GDB. In this case we have to
492 account for entry-values. */
493
494 if (arg.entry_kind != print_entry_values_only)
495 {
76c939ac
TT
496 py_print_single_arg (out, NULL, &arg,
497 NULL, &opts,
498 args_type,
499 print_args_field,
500 NULL);
1e611234
PM
501 }
502
503 if (entryarg.entry_kind != print_entry_values_no)
504 {
505 if (arg.entry_kind != print_entry_values_only)
506 {
76c939ac
TT
507 out->text (", ");
508 out->wrap_hint (" ");
1e611234
PM
509 }
510
76c939ac
TT
511 py_print_single_arg (out, NULL, &entryarg, NULL, &opts,
512 args_type, print_args_field, NULL);
1e611234 513 }
1e611234
PM
514 }
515 else
516 {
517 /* If the object has provided a value, we just print that. */
518 if (val != NULL)
76c939ac
TT
519 py_print_single_arg (out, sym_name.get (), NULL, val, &opts,
520 args_type, print_args_field,
521 language);
1e611234
PM
522 }
523
1e611234
PM
524 /* Collect the next item from the iterator. If
525 this is the last item, do not print the
526 comma. */
06fc9bf7 527 item.reset (PyIter_Next (iter));
1e611234 528 if (item != NULL)
76c939ac 529 out->text (", ");
1e611234 530 else if (PyErr_Occurred ())
06fc9bf7 531 return EXT_LANG_BT_ERROR;
1e611234 532
76c939ac 533 annotate_arg_end ();
1e611234
PM
534 }
535
6dddc817 536 return EXT_LANG_BT_OK;
1e611234
PM
537}
538
539
540/* Helper function to loop over variables provided by the
541 "frame_locals" Python API. Elements in the iterable must conform
542 to the "Symbol Value" interface. ITER is the Python iterable
543 object, OUT is the output stream, INDENT is whether we should
544 indent the output (for CLI), ARGS_TYPE is an enumerator describing
545 the argument format, PRINT_ARGS_FIELD is flag which indicates
546 whether to output the ARGS field in the case of
547 -stack-list-variables and FRAME is the backing frame. Returns
6dddc817
DE
548 EXT_LANG_BT_ERROR on error, with any GDB exceptions converted to a Python
549 exception, or EXT_LANG_BT_OK on success. */
1e611234 550
6dddc817 551static enum ext_lang_bt_status
1e611234
PM
552enumerate_locals (PyObject *iter,
553 struct ui_out *out,
554 int indent,
6dddc817 555 enum ext_lang_frame_args args_type,
1e611234
PM
556 int print_args_field,
557 struct frame_info *frame)
558{
1e611234
PM
559 struct value_print_options opts;
560
561 get_user_print_options (&opts);
562 opts.deref_ref = 1;
563
13df46cc 564 while (true)
1e611234
PM
565 {
566 const struct language_defn *language;
9b972014 567 gdb::unique_xmalloc_ptr<char> sym_name;
1e611234 568 struct value *val;
6dddc817 569 enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
1e611234 570 struct symbol *sym;
63e43d3a 571 struct block *sym_block;
1e611234 572 int local_indent = 8 + (8 * indent);
d4b0bb18 573 gdb::optional<ui_out_emit_tuple> tuple;
1e611234 574
7780f186 575 gdbpy_ref<> item (PyIter_Next (iter));
13df46cc
TT
576 if (item == NULL)
577 break;
1e611234 578
13df46cc
TT
579 success = extract_sym (item.get (), &sym_name, &sym, &sym_block,
580 &language);
6dddc817 581 if (success == EXT_LANG_BT_ERROR)
d4b0bb18 582 return EXT_LANG_BT_ERROR;
1e611234 583
13df46cc 584 success = extract_value (item.get (), &val);
6dddc817 585 if (success == EXT_LANG_BT_ERROR)
d4b0bb18 586 return EXT_LANG_BT_ERROR;
1e611234 587
112e8700 588 if (sym != NULL && out->is_mi_like_p ()
1e611234 589 && ! mi_should_print (sym, MI_PRINT_LOCALS))
d4b0bb18 590 continue;
1e611234
PM
591
592 /* If the object did not provide a value, read it. */
593 if (val == NULL)
76c939ac 594 val = read_var_value (sym, sym_block, frame);
1e611234
PM
595
596 /* With PRINT_NO_VALUES, MI does not emit a tuple normally as
597 each output contains only one field. The exception is
598 -stack-list-variables, which always provides a tuple. */
112e8700 599 if (out->is_mi_like_p ())
1e611234
PM
600 {
601 if (print_args_field || args_type != NO_VALUES)
d4b0bb18 602 tuple.emplace (out, nullptr);
1e611234 603 }
1e611234 604
2038b7fd
TT
605 /* If the output is not MI we indent locals. */
606 out->spaces (local_indent);
76c939ac 607 out->field_string ("name", sym_name.get ());
2038b7fd 608 out->text (" = ");
1e611234
PM
609
610 if (args_type == MI_PRINT_SIMPLE_VALUES)
76c939ac 611 py_print_type (out, val);
1e611234
PM
612
613 /* CLI always prints values for locals. MI uses the
614 simple/no/all system. */
112e8700 615 if (! out->is_mi_like_p ())
1e611234
PM
616 {
617 int val_indent = (indent + 1) * 4;
618
76c939ac
TT
619 py_print_value (out, val, &opts, val_indent, args_type,
620 language);
1e611234
PM
621 }
622 else
623 {
624 if (args_type != NO_VALUES)
76c939ac
TT
625 py_print_value (out, val, &opts, 0, args_type,
626 language);
1e611234
PM
627 }
628
76c939ac 629 out->text ("\n");
1e611234
PM
630 }
631
13df46cc
TT
632 if (!PyErr_Occurred ())
633 return EXT_LANG_BT_OK;
1e611234 634
6dddc817 635 return EXT_LANG_BT_ERROR;
1e611234
PM
636}
637
6dddc817
DE
638/* Helper function for -stack-list-variables. Returns EXT_LANG_BT_ERROR on
639 error, or EXT_LANG_BT_OK on success. */
1e611234 640
6dddc817 641static enum ext_lang_bt_status
1e611234
PM
642py_mi_print_variables (PyObject *filter, struct ui_out *out,
643 struct value_print_options *opts,
6dddc817 644 enum ext_lang_frame_args args_type,
1e611234
PM
645 struct frame_info *frame)
646{
7780f186 647 gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args"));
1e611234 648 if (args_iter == NULL)
13df46cc 649 return EXT_LANG_BT_ERROR;
1e611234 650
7780f186 651 gdbpy_ref<> locals_iter (get_py_iter_from_func (filter, "frame_locals"));
1e611234 652 if (locals_iter == NULL)
13df46cc 653 return EXT_LANG_BT_ERROR;
1e611234 654
d4b0bb18 655 ui_out_emit_list list_emitter (out, "variables");
1e611234 656
d4b0bb18
TT
657 if (args_iter != Py_None
658 && (enumerate_args (args_iter.get (), out, args_type, 1, frame)
659 == EXT_LANG_BT_ERROR))
660 return EXT_LANG_BT_ERROR;
1e611234 661
d4b0bb18
TT
662 if (locals_iter != Py_None
663 && (enumerate_locals (locals_iter.get (), out, 1, args_type, 1, frame)
664 == EXT_LANG_BT_ERROR))
665 return EXT_LANG_BT_ERROR;
1e611234 666
6dddc817 667 return EXT_LANG_BT_OK;
1e611234
PM
668}
669
670/* Helper function for printing locals. This function largely just
671 creates the wrapping tuple, and calls enumerate_locals. Returns
6dddc817 672 EXT_LANG_BT_ERROR on error, or EXT_LANG_BT_OK on success. */
1e611234 673
6dddc817 674static enum ext_lang_bt_status
1e611234
PM
675py_print_locals (PyObject *filter,
676 struct ui_out *out,
6dddc817 677 enum ext_lang_frame_args args_type,
1e611234
PM
678 int indent,
679 struct frame_info *frame)
680{
7780f186 681 gdbpy_ref<> locals_iter (get_py_iter_from_func (filter, "frame_locals"));
1e611234 682 if (locals_iter == NULL)
13df46cc 683 return EXT_LANG_BT_ERROR;
1e611234 684
d4b0bb18 685 ui_out_emit_list list_emitter (out, "locals");
1e611234 686
d4b0bb18
TT
687 if (locals_iter != Py_None
688 && (enumerate_locals (locals_iter.get (), out, indent, args_type,
689 0, frame) == EXT_LANG_BT_ERROR))
690 return EXT_LANG_BT_ERROR;
1e611234 691
6dddc817 692 return EXT_LANG_BT_OK;
1e611234
PM
693}
694
695/* Helper function for printing frame arguments. This function
696 largely just creates the wrapping tuple, and calls enumerate_args.
6dddc817
DE
697 Returns EXT_LANG_BT_ERROR on error, with any GDB exceptions converted to
698 a Python exception, or EXT_LANG_BT_OK on success. */
1e611234 699
6dddc817 700static enum ext_lang_bt_status
1e611234
PM
701py_print_args (PyObject *filter,
702 struct ui_out *out,
6dddc817 703 enum ext_lang_frame_args args_type,
1e611234
PM
704 struct frame_info *frame)
705{
7780f186 706 gdbpy_ref<> args_iter (get_py_iter_from_func (filter, "frame_args"));
1e611234 707 if (args_iter == NULL)
13df46cc 708 return EXT_LANG_BT_ERROR;
1e611234 709
d4b0bb18 710 ui_out_emit_list list_emitter (out, "args");
1e611234 711
76c939ac
TT
712 out->wrap_hint (" ");
713 annotate_frame_args ();
2038b7fd 714 out->text (" (");
1e611234 715
d4b0bb18
TT
716 if (args_iter != Py_None
717 && (enumerate_args (args_iter.get (), out, args_type, 0, frame)
718 == EXT_LANG_BT_ERROR))
719 return EXT_LANG_BT_ERROR;
1e611234 720
2038b7fd 721 out->text (")");
1e611234 722
6dddc817 723 return EXT_LANG_BT_OK;
1e611234
PM
724}
725
726/* Print a single frame to the designated output stream, detecting
727 whether the output is MI or console, and formatting the output
728 according to the conventions of that protocol. FILTER is the
729 frame-filter associated with this frame. FLAGS is an integer
730 describing the various print options. The FLAGS variables is
731 described in "apply_frame_filter" function. ARGS_TYPE is an
732 enumerator describing the argument format. OUT is the output
733 stream to print, INDENT is the level of indention for this frame
734 (in the case of elided frames), and LEVELS_PRINTED is a hash-table
735 containing all the frames level that have already been printed.
736 If a frame level has been printed, do not print it again (in the
6dddc817 737 case of elided frames). Returns EXT_LANG_BT_ERROR on error, with any
63283d4a 738 GDB exceptions converted to a Python exception, or EXT_LANG_BT_OK
b99bf4e3 739 on success. It can also throw an exception RETURN_QUIT. */
1e611234 740
6dddc817 741static enum ext_lang_bt_status
d4dd3282 742py_print_frame (PyObject *filter, frame_filter_flags flags,
6dddc817 743 enum ext_lang_frame_args args_type,
1e611234
PM
744 struct ui_out *out, int indent, htab_t levels_printed)
745{
746 int has_addr = 0;
747 CORE_ADDR address = 0;
748 struct gdbarch *gdbarch = NULL;
749 struct frame_info *frame = NULL;
1e611234 750 struct value_print_options opts;
1e611234 751 int print_level, print_frame_info, print_args, print_locals;
9b972014 752 gdb::unique_xmalloc_ptr<char> function_to_free;
1e611234
PM
753
754 /* Extract print settings from FLAGS. */
755 print_level = (flags & PRINT_LEVEL) ? 1 : 0;
756 print_frame_info = (flags & PRINT_FRAME_INFO) ? 1 : 0;
757 print_args = (flags & PRINT_ARGS) ? 1 : 0;
758 print_locals = (flags & PRINT_LOCALS) ? 1 : 0;
759
760 get_user_print_options (&opts);
761
762 /* Get the underlying frame. This is needed to determine GDB
763 architecture, and also, in the cases of frame variables/arguments to
764 read them if they returned filter object requires us to do so. */
7780f186
TT
765 gdbpy_ref<> py_inf_frame (PyObject_CallMethod (filter, "inferior_frame",
766 NULL));
1e611234 767 if (py_inf_frame == NULL)
b99bf4e3 768 return EXT_LANG_BT_ERROR;
1e611234 769
74c49d45 770 frame = frame_object_to_frame_info (py_inf_frame.get ());
1e611234 771 if (frame == NULL)
b99bf4e3 772 return EXT_LANG_BT_ERROR;
1e611234 773
76c939ac 774 gdbarch = get_frame_arch (frame);
1e611234 775
1e611234
PM
776 /* stack-list-variables. */
777 if (print_locals && print_args && ! print_frame_info)
778 {
779 if (py_mi_print_variables (filter, out, &opts,
6dddc817 780 args_type, frame) == EXT_LANG_BT_ERROR)
b99bf4e3 781 return EXT_LANG_BT_ERROR;
63283d4a 782 return EXT_LANG_BT_OK;
1e611234
PM
783 }
784
d4b0bb18 785 gdb::optional<ui_out_emit_tuple> tuple;
b99bf4e3 786
1e611234
PM
787 /* -stack-list-locals does not require a
788 wrapping frame attribute. */
789 if (print_frame_info || (print_args && ! print_locals))
d4b0bb18 790 tuple.emplace (out, "frame");
1e611234
PM
791
792 if (print_frame_info)
793 {
794 /* Elided frames are also printed with this function (recursively)
795 and are printed with indention. */
796 if (indent > 0)
76c939ac 797 out->spaces (indent * 4);
1e611234
PM
798
799 /* The address is required for frame annotations, and also for
800 address printing. */
801 if (PyObject_HasAttrString (filter, "address"))
802 {
7780f186 803 gdbpy_ref<> paddr (PyObject_CallMethod (filter, "address", NULL));
34019068
JK
804
805 if (paddr == NULL)
d4b0bb18 806 return EXT_LANG_BT_ERROR;
34019068
JK
807
808 if (paddr != Py_None)
1e611234 809 {
74c49d45 810 if (get_addr_from_python (paddr.get (), &address) < 0)
d4b0bb18 811 return EXT_LANG_BT_ERROR;
30a7bb83 812
34019068 813 has_addr = 1;
1e611234 814 }
1e611234
PM
815 }
816 }
817
818 /* Print frame level. MI does not require the level if
819 locals/variables only are being printed. */
820 if ((print_frame_info || print_args) && print_level)
821 {
822 struct frame_info **slot;
823 int level;
1e611234
PM
824
825 slot = (struct frame_info **) htab_find_slot (levels_printed,
826 frame, INSERT);
76c939ac
TT
827
828 level = frame_relative_level (frame);
829
830 /* Check if this frame has already been printed (there are cases
831 where elided synthetic dummy-frames have to 'borrow' the frame
832 architecture from the eliding frame. If that is the case, do
833 not print 'level', but print spaces. */
834 if (*slot == frame)
835 out->field_skip ("level");
836 else
1e611234 837 {
76c939ac
TT
838 *slot = frame;
839 annotate_frame_begin (print_level ? level : 0,
840 gdbarch, address);
841 out->text ("#");
842 out->field_fmt_int (2, ui_left, "level",
843 level);
1e611234
PM
844 }
845 }
846
847 if (print_frame_info)
848 {
849 /* Print address to the address field. If an address is not provided,
850 print nothing. */
851 if (opts.addressprint && has_addr)
852 {
76c939ac
TT
853 annotate_frame_address ();
854 out->field_core_addr ("addr", gdbarch, address);
855 annotate_frame_address_end ();
856 out->text (" in ");
1e611234
PM
857 }
858
859 /* Print frame function name. */
860 if (PyObject_HasAttrString (filter, "function"))
861 {
7780f186 862 gdbpy_ref<> py_func (PyObject_CallMethod (filter, "function", NULL));
34019068 863 const char *function = NULL;
1e611234 864
34019068 865 if (py_func == NULL)
d4b0bb18 866 return EXT_LANG_BT_ERROR;
1e611234 867
3b4e0e01 868 if (gdbpy_is_string (py_func.get ()))
34019068 869 {
3b4e0e01 870 function_to_free = python_string_to_host_string (py_func.get ());
1e611234 871
9b972014 872 if (function_to_free == NULL)
d4b0bb18 873 return EXT_LANG_BT_ERROR;
9b972014
TT
874
875 function = function_to_free.get ();
34019068 876 }
3b4e0e01 877 else if (PyLong_Check (py_func.get ()))
34019068 878 {
30a7bb83 879 CORE_ADDR addr;
34019068 880 struct bound_minimal_symbol msymbol;
1e611234 881
3b4e0e01 882 if (get_addr_from_python (py_func.get (), &addr) < 0)
d4b0bb18 883 return EXT_LANG_BT_ERROR;
34019068
JK
884
885 msymbol = lookup_minimal_symbol_by_pc (addr);
886 if (msymbol.minsym != NULL)
887 function = MSYMBOL_PRINT_NAME (msymbol.minsym);
888 }
889 else if (py_func != Py_None)
890 {
891 PyErr_SetString (PyExc_RuntimeError,
892 _("FrameDecorator.function: expecting a " \
893 "String, integer or None."));
800eb1ce 894 return EXT_LANG_BT_ERROR;
1e611234 895 }
34019068 896
76c939ac
TT
897 annotate_frame_function_name ();
898 if (function == NULL)
899 out->field_skip ("func");
900 else
901 out->field_string ("func", function);
1e611234 902 }
1e611234
PM
903 }
904
905
906 /* Frame arguments. Check the result, and error if something went
907 wrong. */
908 if (print_args)
909 {
6dddc817 910 if (py_print_args (filter, out, args_type, frame) == EXT_LANG_BT_ERROR)
d4b0bb18 911 return EXT_LANG_BT_ERROR;
1e611234
PM
912 }
913
914 /* File name/source/line number information. */
915 if (print_frame_info)
916 {
76c939ac 917 annotate_frame_source_begin ();
1e611234
PM
918
919 if (PyObject_HasAttrString (filter, "filename"))
920 {
7780f186 921 gdbpy_ref<> py_fn (PyObject_CallMethod (filter, "filename", NULL));
8d4a54e2 922
34019068 923 if (py_fn == NULL)
d4b0bb18 924 return EXT_LANG_BT_ERROR;
34019068
JK
925
926 if (py_fn != Py_None)
1e611234 927 {
9b972014 928 gdb::unique_xmalloc_ptr<char>
3b4e0e01 929 filename (python_string_to_host_string (py_fn.get ()));
1e611234 930
34019068 931 if (filename == NULL)
d4b0bb18 932 return EXT_LANG_BT_ERROR;
8f28f522 933
76c939ac
TT
934 out->wrap_hint (" ");
935 out->text (" at ");
936 annotate_frame_source_file ();
937 out->field_string ("file", filename.get ());
938 annotate_frame_source_file_end ();
1e611234 939 }
1e611234
PM
940 }
941
942 if (PyObject_HasAttrString (filter, "line"))
943 {
7780f186 944 gdbpy_ref<> py_line (PyObject_CallMethod (filter, "line", NULL));
1e611234
PM
945 int line;
946
34019068 947 if (py_line == NULL)
d4b0bb18 948 return EXT_LANG_BT_ERROR;
34019068
JK
949
950 if (py_line != Py_None)
1e611234 951 {
3b4e0e01 952 line = PyLong_AsLong (py_line.get ());
30a7bb83 953 if (PyErr_Occurred ())
d4b0bb18 954 return EXT_LANG_BT_ERROR;
30a7bb83 955
76c939ac
TT
956 out->text (":");
957 annotate_frame_source_line ();
958 out->field_int ("line", line);
1e611234 959 }
1e611234 960 }
3bf9c013
JV
961 if (out->is_mi_like_p ())
962 out->field_string ("arch",
963 (gdbarch_bfd_arch_info (gdbarch))->printable_name);
1e611234
PM
964 }
965
966 /* For MI we need to deal with the "children" list population of
967 elided frames, so if MI output detected do not send newline. */
112e8700 968 if (! out->is_mi_like_p ())
1e611234 969 {
76c939ac
TT
970 annotate_frame_end ();
971 out->text ("\n");
1e611234
PM
972 }
973
974 if (print_locals)
975 {
976 if (py_print_locals (filter, out, args_type, indent,
6dddc817 977 frame) == EXT_LANG_BT_ERROR)
d4b0bb18 978 return EXT_LANG_BT_ERROR;
1e611234
PM
979 }
980
978d6c75
TT
981 if ((flags & PRINT_HIDE) == 0)
982 {
983 /* Finally recursively print elided frames, if any. */
984 gdbpy_ref<> elided (get_py_iter_from_func (filter, "elided"));
985 if (elided == NULL)
986 return EXT_LANG_BT_ERROR;
1e611234 987
978d6c75
TT
988 if (elided != Py_None)
989 {
990 PyObject *item;
1e611234 991
978d6c75 992 ui_out_emit_list inner_list_emiter (out, "children");
1e611234 993
2038b7fd 994 indent++;
1e611234 995
978d6c75
TT
996 while ((item = PyIter_Next (elided.get ())))
997 {
998 gdbpy_ref<> item_ref (item);
b99bf4e3 999
978d6c75
TT
1000 enum ext_lang_bt_status success
1001 = py_print_frame (item, flags, args_type, out, indent,
1002 levels_printed);
1e611234 1003
978d6c75
TT
1004 if (success == EXT_LANG_BT_ERROR)
1005 return EXT_LANG_BT_ERROR;
1006 }
1007 if (item == NULL && PyErr_Occurred ())
1008 return EXT_LANG_BT_ERROR;
1009 }
1010 }
1e611234 1011
63283d4a 1012 return EXT_LANG_BT_OK;
1e611234
PM
1013}
1014
1015/* Helper function to initiate frame filter invocation at starting
1016 frame FRAME. */
1017
1018static PyObject *
1019bootstrap_python_frame_filters (struct frame_info *frame,
1020 int frame_low, int frame_high)
1021{
7780f186 1022 gdbpy_ref<> frame_obj (frame_info_to_frame_object (frame));
1e611234 1023 if (frame_obj == NULL)
ee0a3fb8 1024 return NULL;
1e611234 1025
7780f186 1026 gdbpy_ref<> module (PyImport_ImportModule ("gdb.frames"));
1e611234 1027 if (module == NULL)
ee0a3fb8 1028 return NULL;
1e611234 1029
7780f186
TT
1030 gdbpy_ref<> sort_func (PyObject_GetAttrString (module.get (),
1031 "execute_frame_filters"));
1e611234 1032 if (sort_func == NULL)
ee0a3fb8 1033 return NULL;
1e611234 1034
7780f186 1035 gdbpy_ref<> py_frame_low (PyInt_FromLong (frame_low));
1e611234 1036 if (py_frame_low == NULL)
ee0a3fb8 1037 return NULL;
1e611234 1038
7780f186 1039 gdbpy_ref<> py_frame_high (PyInt_FromLong (frame_high));
1e611234 1040 if (py_frame_high == NULL)
ee0a3fb8 1041 return NULL;
1e611234 1042
7780f186
TT
1043 gdbpy_ref<> iterable (PyObject_CallFunctionObjArgs (sort_func.get (),
1044 frame_obj.get (),
1045 py_frame_low.get (),
1046 py_frame_high.get (),
1047 NULL));
1e611234 1048 if (iterable == NULL)
ee0a3fb8 1049 return NULL;
1e611234
PM
1050
1051 if (iterable != Py_None)
ee0a3fb8 1052 return PyObject_GetIter (iterable.get ());
1e611234 1053 else
ee0a3fb8 1054 return iterable.release ();
1e611234
PM
1055}
1056
1057/* This is the only publicly exported function in this file. FRAME
1058 is the source frame to start frame-filter invocation. FLAGS is an
1059 integer holding the flags for printing. The following elements of
1060 the FRAME_FILTER_FLAGS enum denotes the make-up of FLAGS:
1061 PRINT_LEVEL is a flag indicating whether to print the frame's
1062 relative level in the output. PRINT_FRAME_INFO is a flag that
1063 indicates whether this function should print the frame
1064 information, PRINT_ARGS is a flag that indicates whether to print
1065 frame arguments, and PRINT_LOCALS, likewise, with frame local
1066 variables. ARGS_TYPE is an enumerator describing the argument
1067 format, OUT is the output stream to print. FRAME_LOW is the
1068 beginning of the slice of frames to print, and FRAME_HIGH is the
6dddc817 1069 upper limit of the frames to count. Returns EXT_LANG_BT_ERROR on error,
63283d4a 1070 or EXT_LANG_BT_OK on success. */
6dddc817
DE
1071
1072enum ext_lang_bt_status
1073gdbpy_apply_frame_filter (const struct extension_language_defn *extlang,
d4dd3282 1074 struct frame_info *frame, frame_filter_flags flags,
6dddc817
DE
1075 enum ext_lang_frame_args args_type,
1076 struct ui_out *out, int frame_low, int frame_high)
1e611234
PM
1077{
1078 struct gdbarch *gdbarch = NULL;
6dddc817 1079 enum ext_lang_bt_status success = EXT_LANG_BT_ERROR;
1e611234 1080
8ee002df 1081 if (!gdb_python_initialized)
6dddc817 1082 return EXT_LANG_BT_NO_FILTERS;
8ee002df 1083
492d29ea 1084 TRY
1e611234
PM
1085 {
1086 gdbarch = get_frame_arch (frame);
1087 }
92256134 1088 CATCH (except, RETURN_MASK_ERROR)
1e611234 1089 {
21909fa1 1090 /* Let gdb try to print the stack trace. */
6dddc817 1091 return EXT_LANG_BT_NO_FILTERS;
1e611234 1092 }
492d29ea 1093 END_CATCH
1e611234 1094
6349f452 1095 gdbpy_enter enter_py (gdbarch, current_language);
21909fa1 1096
6893c19a
TT
1097 /* When we're limiting the number of frames, be careful to request
1098 one extra frame, so that we can print a message if there are more
1099 frames. */
1100 int frame_countdown = -1;
1101 if ((flags & PRINT_MORE_FRAMES) != 0 && frame_low >= 0 && frame_high >= 0)
1102 {
1103 ++frame_high;
1104 /* This has an extra +1 because it is checked before a frame is
1105 printed. */
1106 frame_countdown = frame_high - frame_low + 1;
1107 }
1108
7780f186
TT
1109 gdbpy_ref<> iterable (bootstrap_python_frame_filters (frame, frame_low,
1110 frame_high));
1e611234
PM
1111
1112 if (iterable == NULL)
8ee002df
PM
1113 {
1114 /* Normally if there is an error GDB prints the exception,
1115 abandons the backtrace and exits. The user can then call "bt
1116 no-filters", and get a default backtrace (it would be
1117 confusing to automatically start a standard backtrace halfway
1118 through a Python filtered backtrace). However in the case
1119 where GDB cannot initialize the frame filters (most likely
1120 due to incorrect auto-load paths), GDB has printed nothing.
1121 In this case it is OK to print the default backtrace after
6dddc817 1122 printing the error message. GDB returns EXT_LANG_BT_NO_FILTERS
8ee002df
PM
1123 here to signify there are no filters after printing the
1124 initialization error. This return code will trigger a
1125 default backtrace. */
1126
6ef2312a 1127 gdbpy_print_stack_or_quit ();
6dddc817 1128 return EXT_LANG_BT_NO_FILTERS;
8ee002df 1129 }
1e611234
PM
1130
1131 /* If iterable is None, then there are no frame filters registered.
1132 If this is the case, defer to default GDB printing routines in MI
1133 and CLI. */
1e611234 1134 if (iterable == Py_None)
6349f452 1135 return EXT_LANG_BT_NO_FILTERS;
1e611234 1136
6349f452
TT
1137 htab_up levels_printed (htab_create (20,
1138 htab_hash_pointer,
1139 htab_eq_pointer,
1140 NULL));
1e611234 1141
6349f452 1142 while (true)
1e611234 1143 {
7780f186 1144 gdbpy_ref<> item (PyIter_Next (iterable.get ()));
b99bf4e3 1145
6349f452
TT
1146 if (item == NULL)
1147 {
1148 if (PyErr_Occurred ())
1149 {
6ef2312a 1150 gdbpy_print_stack_or_quit ();
6349f452
TT
1151 return EXT_LANG_BT_ERROR;
1152 }
1153 break;
1154 }
1e611234 1155
6893c19a
TT
1156 if (frame_countdown != -1)
1157 {
1158 gdb_assert ((flags & PRINT_MORE_FRAMES) != 0);
1159 --frame_countdown;
1160 if (frame_countdown == 0)
1161 {
1162 /* We've printed all the frames we were asked to
1163 print, but more frames existed. */
1164 printf_filtered (_("(More stack frames follow...)\n"));
1165 break;
1166 }
1167 }
1168
76c939ac
TT
1169 TRY
1170 {
1171 success = py_print_frame (item.get (), flags, args_type, out, 0,
1172 levels_printed.get ());
1173 }
1174 CATCH (except, RETURN_MASK_ERROR)
1175 {
1176 gdbpy_convert_exception (except);
1177 success = EXT_LANG_BT_ERROR;
1178 }
1179 END_CATCH
b99bf4e3 1180
1e611234
PM
1181 /* Do not exit on error printing a single frame. Print the
1182 error and continue with other frames. */
6dddc817 1183 if (success == EXT_LANG_BT_ERROR)
6ef2312a 1184 gdbpy_print_stack_or_quit ();
1e611234
PM
1185 }
1186
1e611234 1187 return success;
1e611234 1188}
This page took 0.854291 seconds and 4 git commands to generate.