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, ®ex, &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).