From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21287 invoked by alias); 1 Aug 2012 16:58:58 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 21257 invoked by uid 9514); 1 Aug 2012 16:58:56 -0000 Date: Wed, 01 Aug 2012 16:58:00 -0000 Message-ID: <20120801165856.21242.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-pmuldoon-python-backtrace: Add -stack-list-arguments support. Add some tests for MI. Rewrite py_print_frame to cope with frame/args/local request differences between MI and CLI. X-Git-Refname: refs/heads/archer-pmuldoon-python-backtrace X-Git-Reftype: branch X-Git-Oldrev: 69d61b34b067f3be63fe01f99c6904d1b2e38200 X-Git-Newrev: 3655d06a8c222a30b01dcae78315f443f8401da2 X-SW-Source: 2012-q3/txt/msg00022.txt.bz2 List-Id: The branch, archer-pmuldoon-python-backtrace has been updated via 3655d06a8c222a30b01dcae78315f443f8401da2 (commit) from 69d61b34b067f3be63fe01f99c6904d1b2e38200 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 3655d06a8c222a30b01dcae78315f443f8401da2 Author: Phil Muldoon Date: Wed Aug 1 17:57:54 2012 +0100 Add -stack-list-arguments support. Add some tests for MI. Rewrite py_print_frame to cope with frame/args/local request differences between MI and CLI. ----------------------------------------------------------------------- Summary of changes: gdb/mi/mi-cmd-stack.c | 81 ++++-- gdb/python/py-framefilter.c | 391 ++++++++++++++---------- gdb/python/python.h | 13 +- gdb/stack.c | 13 +- gdb/testsuite/gdb.python/py-framefilter-mi.exp | 35 ++- 5 files changed, 342 insertions(+), 191 deletions(-) First 500 lines of diff: diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index 82451bc..c69be24 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -113,9 +113,16 @@ mi_cmd_stack_list_frames (char *command, char **argv, int argc) if (frame_high != -1) count = (frame_high - frame_low) + 1; - result = apply_frame_filter (fi, 1, LOC_AND_ADDRESS, 0, - 0 /* print args */, current_uiout, - 0 /* show locals */, count); + result = apply_frame_filter (fi,/* frame */ + 1, /* print_level */ + LOC_AND_ADDRESS, /* print_what */ + 1, /* print_frame_info */ + 0, /* print_args */ + 0, /* mi_print_args_type */ + 0, /* cli_print_args_type */ + current_uiout, /* out */ + 0, /* print_locals */ + count /* count */); } /* Run the inbuilt backtrace if there are no filters registered, or @@ -215,15 +222,28 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc) struct cleanup *cleanup_stack_args; enum print_values print_values; struct ui_out *uiout = current_uiout; + int raw_arg = 0; + int result = 0; + + if (argc > 1) + { + int j; + /* Find 'raw-frames' at argv[1] if passed as an argument */ + for (j = 0; j < strlen (argv[1]); j++) + argv[1][j] = tolower (argv[1][j]); + + if (subset_compare (argv[1], "raw-frames")) + raw_arg = 1; + } - if (argc < 1 || argc > 3 || argc == 2) + if (argc < 1 || (argc > 3 && ! raw_arg) || (argc == 2 && ! raw_arg)) error (_("-stack-list-arguments: Usage: " - "PRINT_VALUES [FRAME_LOW FRAME_HIGH]")); + "PRINT_VALUES [RAW FRAME_LOW FRAME_HIGH]")); - if (argc == 3) + if (argc >= 3) { - frame_low = atoi (argv[1]); - frame_high = atoi (argv[2]); + frame_low = atoi (argv[1] + raw_arg); + frame_high = atoi (argv[2] + raw_arg); } else { @@ -248,21 +268,44 @@ mi_cmd_stack_list_args (char *command, char **argv, int argc) cleanup_stack_args = make_cleanup_ui_out_list_begin_end (uiout, "stack-args"); - /* Now let's print the frames up to frame_high, or until there are - frames in the stack. */ - for (; - fi && (i <= frame_high || frame_high == -1); - i++, fi = get_prev_frame (fi)) + if (! raw_arg && frame_filters) { - struct cleanup *cleanup_frame; + int count = frame_high; + + if (frame_high != -1) + count = (frame_high - frame_low) + 1; - QUIT; - cleanup_frame = make_cleanup_ui_out_tuple_begin_end (uiout, "frame"); - ui_out_field_int (uiout, "level", i); - list_args_or_locals (arguments, print_values, fi); - do_cleanups (cleanup_frame); + result = apply_frame_filter (fi,/* frame */ + 1, /* print_level */ + LOC_AND_ADDRESS, /* print_what */ + 0, /* print_frame_info */ + 1, /* print_args */ + print_values, /* mi_print_args_type */ + 0, /* cli_print_args_type */ + current_uiout, /* out */ + 0, /* print_locals */ + count /* count */); } + if (! frame_filters || raw_arg || result == PY_BT_ERROR + || result == PY_BT_NO_FILTERS) + { + + /* Now let's print the frames up to frame_high, or until there are + frames in the stack. */ + for (; + fi && (i <= frame_high || frame_high == -1); + i++, fi = get_prev_frame (fi)) + { + struct cleanup *cleanup_frame; + + QUIT; + cleanup_frame = make_cleanup_ui_out_tuple_begin_end (uiout, "frame"); + ui_out_field_int (uiout, "level", i); + list_args_or_locals (arguments, print_values, fi); + do_cleanups (cleanup_frame); + } + } do_cleanups (cleanup_stack_args); } diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c index 7dd7aaa..05db015 100644 --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c @@ -29,6 +29,7 @@ #include "valprint.h" #include "annotate.h" #include "hashtab.h" +#include "mi/mi-cmds.h" #ifdef HAVE_PYTHON #include "python-internal.h" @@ -210,16 +211,21 @@ py_print_locals (PyObject *filter, static int py_print_args (PyObject *filter, - struct ui_out *out, - struct value_print_options opts, - const char *print_args_type) + struct ui_out *out, + struct value_print_options opts, + int print_type, + const char *print_args_type) { - struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); + struct cleanup *old_chain; PyObject *result = NULL; + old_chain = make_cleanup_ui_out_list_begin_end (out, "args"); + /* Frame arguments. */ annotate_frame_args (); - ui_out_text (out, " ("); + + if (! ui_out_is_mi_like_p (out)) + ui_out_text (out, " ("); if (PyObject_HasAttrString (filter, "frame_args")) { @@ -264,6 +270,8 @@ py_print_args (PyObject *filter, int value_success = 0; volatile struct gdb_exception except; struct ui_file *stb; + struct cleanup *inner_cleanup = + make_cleanup (null_cleanup, NULL); value_success = extract_sym_and_value (item, &sym_name, @@ -275,31 +283,71 @@ py_print_args (PyObject *filter, if (! value_success) goto args_error; + if (ui_out_is_mi_like_p (out)) + { + if(print_type != PRINT_NO_VALUES) + { + inner_cleanup = + make_cleanup_ui_out_tuple_begin_end (out, + NULL); + } + } + annotate_arg_begin (); ui_out_field_string (out, "name", sym_name); - ui_out_text (out, "="); - annotate_arg_value (value_type (val)); - opts.deref_ref = 1; - /* True in "summary" mode, false otherwise. */ - opts.summary = !strcmp (print_args_type, "scalars"); + if (! ui_out_is_mi_like_p (out)) + ui_out_text (out, "="); - stb = mem_fileopen (); - make_cleanup_ui_file_delete (stb); + annotate_arg_value (value_type (val)); + opts.deref_ref = 1; - TRY_CATCH (except, RETURN_MASK_ALL) + if (ui_out_is_mi_like_p (out) + && print_type == PRINT_SIMPLE_VALUES) { - common_val_print (val, stb, 2, &opts, language); + TRY_CATCH (except, RETURN_MASK_ALL) + { + struct type *type; + stb = mem_fileopen (); + make_cleanup_ui_file_delete (stb); + type = check_typedef (value_type (val)); + type_print (type, "", stb, -1); + ui_out_field_stream (out, "type", stb); + } + if (except.reason > 0) + { + PyErr_SetString (PyExc_RuntimeError, + except.message); + goto args_error; + } } - if (except.reason > 0) + + if (! ui_out_is_mi_like_p (out)) { - PyErr_SetString (PyExc_RuntimeError, - except.message); - goto args_error; + opts.summary = !strcmp (print_args_type, "scalars"); } - ui_out_field_stream (out, "value", stb); + if (ui_out_is_mi_like_p (out) + && print_type != PRINT_NO_VALUES) + { + stb = mem_fileopen (); + make_cleanup_ui_file_delete (stb); + + TRY_CATCH (except, RETURN_MASK_ALL) + { + common_val_print (val, stb, 2, &opts, language); + } + if (except.reason > 0) + { + PyErr_SetString (PyExc_RuntimeError, + except.message); + goto args_error; + } + + ui_out_field_stream (out, "value", stb); + } + do_cleanups (inner_cleanup); /* Collect the next item from the iterator. If this is the last item, we do not print the ",". */ @@ -319,7 +367,8 @@ py_print_args (PyObject *filter, goto args_error; } - ui_out_text (out, ")"); + if (! ui_out_is_mi_like_p (out)) + ui_out_text (out, ")"); do_cleanups (old_chain); return 1; @@ -355,7 +404,9 @@ static int py_print_frame (PyObject *filter, int print_level, enum print_what print_what, + int print_frame_info, int print_args, + int mi_print_args_type, const char *print_args_type, int print_locals, struct ui_out *out, @@ -367,6 +418,9 @@ py_print_frame (PyObject *filter, CORE_ADDR address = 0; struct gdbarch *gdbarch = NULL; struct frame_info *frame = NULL; + struct cleanup *cleanup_stack = make_cleanup (null_cleanup, NULL); + + cleanup_stack = make_cleanup_ui_out_tuple_begin_end (out, "frame"); /* Get the underlying frame. */ if (PyObject_HasAttrString (filter, "inferior_frame")) @@ -392,29 +446,32 @@ py_print_frame (PyObject *filter, goto error; } - /* Elided frames are also printed with this function (recursively) - and are printed with indention. */ - if (indent > 0) - ui_out_spaces (out, indent); - - /* The address is required for frame annotations, and also for - address printing. */ - if (PyObject_HasAttrString (filter, "address")) + if (print_frame_info) { - PyObject *paddr = PyObject_CallMethod (filter, "address", NULL); - if (paddr) + /* Elided frames are also printed with this function (recursively) + and are printed with indention. */ + if (indent > 0) + ui_out_spaces (out, indent); + + /* The address is required for frame annotations, and also for + address printing. */ + if (PyObject_HasAttrString (filter, "address")) { - if (paddr != Py_None) + PyObject *paddr = PyObject_CallMethod (filter, "address", NULL); + if (paddr) { - address = PyLong_AsLong (paddr); - has_addr = 1; + if (paddr != Py_None) + { + address = PyLong_AsLong (paddr); + has_addr = 1; + } + Py_DECREF (paddr); } - Py_DECREF (paddr); + else + goto error; } - else - goto error; - } + } /* Print frame level. */ if (print_level) { @@ -446,107 +503,113 @@ py_print_frame (PyObject *filter, } } - /* Print address to the address field. If an address is not provided, - print nothing. */ - if (opts.addressprint && has_addr) + if (print_frame_info) { - annotate_frame_address (); - ui_out_field_core_addr (out, "addr", gdbarch, address); - annotate_frame_address_end (); - } - - ui_out_text (out, " in "); + /* Print address to the address field. If an address is not provided, + print nothing. */ + if (opts.addressprint && has_addr) + { + annotate_frame_address (); + ui_out_field_core_addr (out, "addr", gdbarch, address); + annotate_frame_address_end (); + } - /* Print frame function. */ - if (PyObject_HasAttrString (filter, "function")) - { - PyObject *result = PyObject_CallMethod (filter, "function", NULL); + ui_out_text (out, " in "); - if (result) + /* Print frame function. */ + if (PyObject_HasAttrString (filter, "function")) { - if (result != Py_None) - { - char *func = NULL; - char *dup = PyString_AsString (result); + PyObject *result = PyObject_CallMethod (filter, "function", NULL); - if (! dup) + if (result) + { + if (result != Py_None) { - Py_DECREF (result); - goto error; - } + char *func = NULL; + char *dup = PyString_AsString (result); - func = xstrdup (dup); - annotate_frame_function_name (); - ui_out_field_string (out, "func", func); - xfree (func); + if (! dup) + { + Py_DECREF (result); + goto error; + } + + func = xstrdup (dup); + annotate_frame_function_name (); + ui_out_field_string (out, "func", func); + xfree (func); + } + Py_DECREF (result); } - Py_DECREF (result); + else + goto error; } - else - goto error; } + /* Frame arguments. */ if (print_args) { - if (! py_print_args (filter, out, opts, print_args_type)) + if (! py_print_args (filter, out, opts, mi_print_args_type, print_args_type)) goto error; } - annotate_frame_source_begin (); - - if (PyObject_HasAttrString (filter, "filename")) + if (print_frame_info) { - PyObject *result = PyObject_CallMethod (filter, "filename", - NULL); - if (result) + annotate_frame_source_begin (); + + if (PyObject_HasAttrString (filter, "filename")) { - if (result != Py_None) + PyObject *result = PyObject_CallMethod (filter, "filename", + NULL); + if (result) { - char *filename = NULL; - char *dup = PyString_AsString (result); - - if (! dup) + if (result != Py_None) { - Py_DECREF (result); - goto error; - } + char *filename = NULL; + char *dup = PyString_AsString (result); + + if (! dup) + { + Py_DECREF (result); + goto error; + } - filename = xstrdup (dup); - ui_out_wrap_hint (out, " "); - ui_out_text (out, " at "); - annotate_frame_source_file (); - ui_out_field_string (out, "file", filename); - annotate_frame_source_file_end (); - xfree (filename); + filename = xstrdup (dup); + ui_out_wrap_hint (out, " "); + ui_out_text (out, " at "); + annotate_frame_source_file (); + ui_out_field_string (out, "file", filename); + annotate_frame_source_file_end (); + xfree (filename); + } + Py_DECREF (result); } - Py_DECREF (result); - } - else + else goto error; - } - - if (PyObject_HasAttrString (filter, "line")) - { - PyObject *result = PyObject_CallMethod (filter, "line", NULL); - int line; + } - if (result) + if (PyObject_HasAttrString (filter, "line")) { - if (result != Py_None) + PyObject *result = PyObject_CallMethod (filter, "line", NULL); + int line; + + if (result) { - line = PyLong_AsLong (result); - ui_out_text (out, ":"); - annotate_frame_source_line (); - ui_out_field_int (out, "line", line); + if (result != Py_None) + { + line = PyLong_AsLong (result); + ui_out_text (out, ":"); + annotate_frame_source_line (); + ui_out_field_int (out, "line", line); + } + Py_DECREF (result); hooks/post-receive -- Repository for Project Archer.