public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-pmuldoon-python-backtrace: Clean up py-frame.c.  Add frame.locals(), frame.arguments() and FrameIterator tests.
@ 2012-04-11 16:46 pmuldoon
  0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-04-11 16:46 UTC (permalink / raw)
  To: archer-commits

The branch, archer-pmuldoon-python-backtrace has been updated
       via  6560e7ffa74235e628c2817727b7393c6bd14e99 (commit)
      from  47273bee437d6fc46889eeaa67f9eb6fed76ff46 (commit)

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

- Log -----------------------------------------------------------------
commit 6560e7ffa74235e628c2817727b7393c6bd14e99
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Wed Apr 11 17:46:10 2012 +0100

    Clean up py-frame.c.  Add frame.locals(), frame.arguments() and
    FrameIterator tests.

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

Summary of changes:
 gdb/python/py-frame.c                 |   32 +++++++++-------
 gdb/testsuite/gdb.python/py-frame.c   |    6 +++
 gdb/testsuite/gdb.python/py-frame.exp |   62 +++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+), 14 deletions(-)

First 500 lines of diff:
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index 3374531..17a6825 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -871,7 +871,7 @@ frapy_frame_iter_init (PyObject *self, PyObject *args, PyObject *kw)
   PyObject *frame;
   struct frame_info *fi;
   const char *regex = NULL;
-  int reverse;
+  int reverse = 0;
 
   if (! PyArg_ParseTupleAndKeywords (args, kw, "O|si",
 				     keywords, &frame, &regex, &reverse))
@@ -894,8 +894,11 @@ frapy_frame_iter_init (PyObject *self, PyObject *args, PyObject *kw)
 	  int code = regcomp (&iter_obj->pattern, regex, REG_NOSUB);
 	  if (code != 0)
 	    {
-	      char *re_err = get_regcomp_error (code, &iter_obj->pattern);
-	      PyErr_Format (PyExc_RuntimeError, "Invalid regex: %s",
+	      char *re_err = get_regcomp_error (code,
+						&iter_obj->pattern);
+
+	      PyErr_Format (PyExc_RuntimeError,
+			    "Invalid FrameIterator regexp: %s",
 			    re_err);
 	      xfree (re_err);
 	      return -1;
@@ -945,7 +948,8 @@ gdbpy_initialize_frames (void)
   Py_INCREF (&frame_iterator_object_type);
 
   PyModule_AddObject (gdb_module, "Frame", (PyObject *) &frame_object_type);
-  PyModule_AddObject (gdb_module, "FrameIterator", (PyObject *) &frame_iterator_object_type);  
+  PyModule_AddObject (gdb_module, "FrameIterator",
+		      (PyObject *) &frame_iterator_object_type);
 }
 
 \f
@@ -1040,7 +1044,7 @@ static PyTypeObject frame_iterator_object_type = {
   PyObject_HEAD_INIT (NULL)
   0,				  /*ob_size*/
   "gdb.FrameIterator",		  /*tp_name*/
-  sizeof (frame_iterator_object),	      /*tp_basicsize*/
+  sizeof (frame_iterator_object), /*tp_basicsize*/
   0,				  /*tp_itemsize*/
   frapy_iterator_dealloc,	  /*tp_dealloc*/
   0,				  /*tp_print*/
@@ -1066,13 +1070,13 @@ static PyTypeObject frame_iterator_object_type = {
   frapy_frame_iter,               /*tp_iter */
   frapy_iternext,                 /*tp_iternext */
   0,                              /*tp_methods */
-  0,				  /* tp_members */
-  0,				  /* tp_getset */
-  0,				  /* tp_base */
-  0,				  /* tp_dict */
-  0,				  /* tp_descr_get */
-  0,				  /* tp_descr_set */
-  0,				  /* tp_dictoffset */
-  frapy_frame_iter_init,	  /* tp_init */
-  0,				  /* tp_alloc */
+  0,				  /*tp_members */
+  0,				  /*tp_getset */
+  0,				  /*tp_base */
+  0,				  /*tp_dict */
+  0,				  /*tp_descr_get */
+  0,				  /*tp_descr_set */
+  0,				  /*tp_dictoffset */
+  frapy_frame_iter_init,	  /*tp_init */
+  0,				  /*tp_alloc */
 };
diff --git a/gdb/testsuite/gdb.python/py-frame.c b/gdb/testsuite/gdb.python/py-frame.c
index 82db341..9674576 100644
--- a/gdb/testsuite/gdb.python/py-frame.c
+++ b/gdb/testsuite/gdb.python/py-frame.c
@@ -1,5 +1,11 @@
+int f3 (int b)
+{
+  return b;
+}
+
 int f2 (int a)
 {
+  f3 (a);
   return ++a;
 }
 
diff --git a/gdb/testsuite/gdb.python/py-frame.exp b/gdb/testsuite/gdb.python/py-frame.exp
index 83ff8fe..728d8a1 100644
--- a/gdb/testsuite/gdb.python/py-frame.exp
+++ b/gdb/testsuite/gdb.python/py-frame.exp
@@ -58,6 +58,29 @@ gdb_py_test_silent_cmd "python sb = sb.superblock" "get superblock" 0
 gdb_test "python print bf1.read_var(\"i\", sb)" "99" "test i = 99"
 gdb_test "python print bf1.read_var(\"i\", sb).type" "int" "test int i"
 
+# Test frame.locals and frame.arg
+gdb_py_test_multiple "simple frame print" \
+  "python" "" \
+  "def print_var (iterator, frame):" "" \
+  "   for i in iterator:" "" \
+  "      print str(i),\"=\", frame.read_var (i)" "" \
+  "end" ""
+gdb_py_test_silent_cmd "python fframe = gdb.selected_frame ()" "get frame" 0
+gdb_py_test_silent_cmd "python flocals = fframe.locals()" "get locals" 0
+gdb_test "python print_var(flocals,fframe)" \
+    "i =.*\"stuff\".*f =.*\"foo\".*b =.*\"bar\".*i = 1.1.*f = 2.2.*i = 99.*" \
+    "test locals output"
+gdb_py_test_silent_cmd "python fargs = fframe.arguments()" "get arguments" 0
+gdb_test "python print fargs" "None" "Test arguments, with no arguments"
+gdb_test "up" ".*" ""
+gdb_py_test_silent_cmd "python fframe = gdb.selected_frame ()" "get frame" 0
+gdb_py_test_silent_cmd "python flocals = fframe.locals()" "get locals" 0
+gdb_test "python print flocals" "None" "Test locals(), with mo locals"
+gdb_py_test_silent_cmd "python fargs = fframe.arguments()" "get arguments" 0
+gdb_test "python print_var(fargs,fframe)" \
+    "argc = .*argv = .*" \
+    "test arguments() output"
+
 gdb_breakpoint "f2"
 gdb_continue_to_breakpoint "breakpoint at f2"
 gdb_py_test_silent_cmd "python bframe = gdb.selected_frame()" \
@@ -90,3 +113,42 @@ gdb_test "python print 'result =', f0.read_var ('variable_which_surely_doesnt_ex
 gdb_test "python print 'result =', f0.read_var ('a')" " = 1" "test Frame.read_var - success"
 
 gdb_test "python print 'result =', gdb.selected_frame () == f1" " = True" "test gdb.selected_frame"
+
+# Test FrameIterator.  This tests both the inbuilt iterator, and the
+# seperate class.
+gdb_breakpoint "f3"
+gdb_continue_to_breakpoint "breakpoint at f3"
+gdb_py_test_silent_cmd "python it = gdb.FrameIterator (gdb.newest_frame())" \
+    "get iterator from newest frame" 0
+gdb_py_test_multiple "simple frame print" \
+  "python" "" \
+  "def print_function (iterator):" "" \
+  "   for i in iterator:" "" \
+  "      print str(i.function())" "" \
+  "end" ""
+gdb_test "python print_function(it)" \
+    "f3.*f2.*f1.*main.*" "test vanilla frame iterator"
+gdb_test "python print_function(gdb.newest_frame())" \
+    "f3.*f2.*f1.*main.*" "test vanilla inbuilt frame iterator"
+gdb_test "select 3" ".*" ""
+gdb_py_test_silent_cmd "python it = gdb.FrameIterator (gdb.selected_frame(), reverse=True)" \
+    "get iterator from selected frame" 0
+gdb_test "python print_function(it)" \
+    "main.*f1.*f2.*f3.*" "test reverse traversal vanilla frame iterator"
+gdb_py_test_silent_cmd "python it = gdb.FrameIterator(gdb.newest_frame(), regex=\"f\[0-9\]\")" \
+    "get iterator from newest frame" 0
+gdb_test "python print_function(it)" \
+    "f3.*f2.*f1.*" "test traversal with a regex filtered iterator"
+gdb_py_test_silent_cmd "python it = gdb.FrameIterator(gdb.selected_frame(), regex=\"f\[0-9\]\", reverse=True)" \
+    "get iterator from newest frame" 0
+gdb_test "python print_function(it)" \
+    "f1.*f2.*f3.*" "test reverse traversal with a regex filtered iterator"
+gdb_py_test_silent_cmd "python it = gdb.FrameIterator(gdb.selected_frame(), regex=\"nothing\")" \
+    "get iterator from newest frame" 0
+gdb_test "python print_function(it)" \
+    "" "test regex iterator that returns nothing"
+gdb_test  "python ite = gdb.FrameIterator(gdb.selected_frame(), regex=\"\[\")" \
+    "Traceback.*Invalid regex.*Invalid regular expression.*" "test invalid regex"
+gdb_test "python print ite" \
+    ".*NameError.*name.*ite.*is not defined.*" \
+    "test invalid iterator did not return an iterator"


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


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

only message in thread, other threads:[~2012-04-11 16:46 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-11 16:46 [SCM] archer-pmuldoon-python-backtrace: Clean up py-frame.c. Add frame.locals(), frame.arguments() and FrameIterator tests 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).