public inbox for archer-commits@sourceware.org help / color / mirror / Atom feed
From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] archer-pmuldoon-python-backtrace: Clean up py-frame.c. Add frame.locals(), frame.arguments() and FrameIterator tests. Date: Wed, 11 Apr 2012 16:46:00 -0000 [thread overview] Message-ID: <20120411164651.9625.qmail@sourceware.org> (raw) 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.
reply other threads:[~2012-04-11 16:46 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20120411164651.9625.qmail@sourceware.org \ --to=pmuldoon@sourceware.org \ --cc=archer-commits@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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).