public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-pmuldoon-python-backtrace: Add auto-loading tests.  Fix RAW option to backtrace.  Add error checks for a lot of invocation/module loading code.
@ 2012-06-22 14:27 pmuldoon
  0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-06-22 14:27 UTC (permalink / raw)
  To: archer-commits

The branch, archer-pmuldoon-python-backtrace has been updated
       via  01ab5c800ea2fc5ae1720880879c33a5ee2aef97 (commit)
      from  94426f022d3e5a4e9c7b7d0a25c57a334ab6497d (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 01ab5c800ea2fc5ae1720880879c33a5ee2aef97
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Fri Jun 22 15:26:46 2012 +0100

    Add auto-loading tests.  Fix RAW option to backtrace.  Add error
    checks for a lot of invocation/module loading code.

-----------------------------------------------------------------------

Summary of changes:
 gdb/python/py-framefilter.c                       |   15 ++++--
 gdb/stack.c                                       |   47 +++++++++++++--------
 gdb/testsuite/gdb.python/py-framefilter-gdb.py.in |   47 +++++++++++++++++++++
 gdb/testsuite/gdb.python/py-framefilter.exp       |   34 +++++++++++++--
 4 files changed, 116 insertions(+), 27 deletions(-)
 create mode 100644 gdb/testsuite/gdb.python/py-framefilter-gdb.py.in

First 500 lines of diff:
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 96a41a5..5f729f8 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -564,25 +564,30 @@ apply_frame_filter (struct frame_info *frame, int print_level,
 
   cleanups = ensure_python_env (gdbarch, current_language);
 
+  module = PyImport_ImportModule ("gdb.command.frame_filters");
+  if (! module)
+    goto done;
+  
   frame_obj = frame_info_to_frame_object (frame);
   if (! frame_obj)
     goto done;
 
-  module = PyImport_AddModule ("gdb.command.frame_filters");
-
   sort_func = PyObject_GetAttrString (module, "invoke");
   if (!sort_func)
     {
       Py_DECREF (module);
+      Py_DECREF (frame_obj);
       goto done;
     }
+  
   iterable = PyObject_CallFunctionObjArgs (sort_func, frame_obj, NULL);
+  Py_DECREF (module);
   Py_DECREF (sort_func);
   Py_DECREF (frame_obj);
-  Py_DECREF (module);
-  if (!iterable || PyErr_Occurred())
+  
+  if (!iterable)
     goto done;
- 
+  
   get_user_print_options (&opts);
 
   make_cleanup_py_decref (iterable);
diff --git a/gdb/stack.c b/gdb/stack.c
index 5055e99..78c2390 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1651,7 +1651,9 @@ frame_info (char *addr_exp, int from_tty)
    frames.  */
 
 static void
-backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
+backtrace_command_1 (char *count_exp, int show_locals, int raw, 
+		     int from_tty)
+
 {
   struct frame_info *fi;
   int count;
@@ -1719,11 +1721,12 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
 	  find_pc_sect_symtab_via_partial (pc, find_pc_mapped_section (pc));
 	}
     }
-
-  result = apply_frame_filter (trailing, 1, LOCATION, 1,
-			       print_frame_arguments, current_uiout,
-			       show_locals, count);
-
+  
+  if (! raw)
+    result = apply_frame_filter (trailing, 1, LOCATION, 1,
+				 print_frame_arguments, current_uiout,
+				 show_locals, count);
+  
   if (! result)
     {
       for (i = 0, fi = trailing; fi && count--; i++, fi = get_prev_frame (fi))
@@ -1765,7 +1768,8 @@ static void
 backtrace_command (char *arg, int from_tty)
 {
   struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
-  int fulltrace_arg = -1, arglen = 0, argc = 0;
+  int fulltrace_arg = -1, arglen = 0, argc = 0, raw_arg = -1;
+  int user_arg = 0;
 
   if (arg)
     {
@@ -1781,26 +1785,32 @@ backtrace_command (char *arg, int from_tty)
 
 	  for (j = 0; j < strlen (argv[i]); j++)
 	    argv[i][j] = tolower (argv[i][j]);
-
-	  if (fulltrace_arg < 0 && subset_compare (argv[i], "full"))
-	    fulltrace_arg = argc;
+	  
+	  if (raw_arg < 0 && subset_compare (argv[i], "raw"))
+	    raw_arg = argc;
 	  else
 	    {
-	      arglen += strlen (argv[i]);
-	      argc++;
+	      if (fulltrace_arg < 0 && subset_compare (argv[i], "full"))
+		fulltrace_arg = argc;
+	      else
+		{
+		  user_arg++;
+		  arglen += strlen (argv[i]);
+		}
 	    }
+	  argc++;
 	}
-      arglen += argc;
-      if (fulltrace_arg >= 0)
+      arglen += user_arg;
+      if (fulltrace_arg >= 0 || raw_arg >= 0)
 	{
 	  if (arglen > 0)
 	    {
 	      arg = xmalloc (arglen + 1);
 	      make_cleanup (xfree, arg);
 	      arg[0] = 0;
-	      for (i = 0; i < (argc + 1); i++)
+	      for (i = 0; i < argc; i++)
 		{
-		  if (i != fulltrace_arg)
+		  if (i != fulltrace_arg && i != raw_arg)
 		    {
 		      strcat (arg, argv[i]);
 		      strcat (arg, " ");
@@ -1812,7 +1822,8 @@ backtrace_command (char *arg, int from_tty)
 	}
     }
 
-  backtrace_command_1 (arg, fulltrace_arg >= 0 /* show_locals */, from_tty);
+  backtrace_command_1 (arg, fulltrace_arg >= 0 /* show_locals */,
+		       raw_arg >= 0 /* no frame-filters */, from_tty);
 
   do_cleanups (old_chain);
 }
@@ -1820,7 +1831,7 @@ backtrace_command (char *arg, int from_tty)
 static void
 backtrace_full_command (char *arg, int from_tty)
 {
-  backtrace_command_1 (arg, 1 /* show_locals */, from_tty);
+  backtrace_command_1 (arg, 1 /* show_locals */, 0, from_tty);
 }
 \f
 
diff --git a/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in b/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in
new file mode 100644
index 0000000..dc3d2f9
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in
@@ -0,0 +1,47 @@
+# Copyright (C) 2012 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is part of the GDB testsuite.  It tests Python-based
+# frame-filters.
+import gdb
+import itertools
+from gdb.FrameWrapper import FrameWrapper
+
+
+class FrameObjFile ():
+
+    def __init__ (self):
+        self.name = "Object File Filter 1"
+        self.priority = 1
+        self.enabled = False
+        gdb.current_progspace().frame_filters [self.name] = self
+
+    def filter (self, frame_iter):
+        return frame_iter
+
+class FrameObjFile2 ():
+
+    def __init__ (self):
+        self.name = "Object File Filter 2"
+        self.priority = 100
+        self.enabled = True
+        gdb.current_progspace().frame_filters [self.name] = self
+
+    def filter (self, frame_iter):
+        return frame_iter
+
+FrameObjFile()
+FrameObjFile2()
+
diff --git a/gdb/testsuite/gdb.python/py-framefilter.exp b/gdb/testsuite/gdb.python/py-framefilter.exp
index 7fd44d7..44b7de2 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.exp
+++ b/gdb/testsuite/gdb.python/py-framefilter.exp
@@ -22,26 +22,52 @@ set testfile "py-framefilter"
 set srcfile ${testfile}.c
 set binfile ${objdir}/${subdir}/${testfile}
 
-if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+# We cannot use prepare_for_testing as we have to set the safe-patch
+# to check objfile and progspace printers.
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+    untested "Couldn't compile ${srcfile}"
     return -1
 }
 
+# Start with a fresh gdb.
+gdb_exit
+gdb_start
+
 # Skip all tests if Python scripting is not enabled.
 if { [skip_python_tests] } { continue }
 
-set nl "\[\r\n\]+"
+# Make the -gdb.py script available to gdb, it is automagically loaded by gdb.
+# Care is taken to put it in the same directory as the binary so that
+# gdb will find it.
+set remote_obj_python_file [remote_download host ${srcdir}/${subdir}/${testfile}-gdb.py.in ${subdir}/${testfile}-gdb.py]
+
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_test_no_output "set auto-load safe-path ${remote_obj_python_file}" "set auto-load safe-path"
+gdb_load ${binfile}
+
+# Verify gdb loaded the script.
+gdb_test "info auto-load python-scripts" "Yes.*/${testfile}-gdb.py.*"
 
 if ![runto_main ] then {
     perror "couldn't run to breakpoint"
     return
 }
 
+# Load global frame-filters
 set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
 gdb_test_no_output "python execfile ('${remote_python_file}')"
 
 gdb_breakpoint [gdb_get_line_number "Backtrace end breakpoint"]
 gdb_continue_to_breakpoint "Backtrace end breakpoint"
 
-gdb_test "bt" "#-1.*in Dummy function.*#22.*in 1cnuf.*#27.*in niam ().*"
-gdb_test "bt" "#-1.*in Dummy function.*#22.*in 1cnuf.*#27.*in niam ().*"
+gdb_test "info frame-filter" \
+    {.*100.*Yes.*Reverse.*10.*Yes.*Add.*1.*No.*Object.*1.*}
+# Test raw
+gdb_test "bt raw" \
+    {.*#0.*end_func.*#22.*in func1.*#27.*in main ().*}
+gdb_test "bt" \
+    {.*in Dummy function.*#22.*in 1cnuf.*#27.*in niam ().*}
+gdb_test "bt" \
+    {.*in Dummy function.*#22.*in 1cnuf.*#27.*in niam ().*}
+
 remote_file host delete ${remote_python_file}


hooks/post-receive
--
Repository for Project Archer.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-06-22 14:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-22 14:27 [SCM] archer-pmuldoon-python-backtrace: Add auto-loading tests. Fix RAW option to backtrace. Add error checks for a lot of invocation/module loading code pmuldoon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).