From patchwork Sat May 21 05:00:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 12438 Received: (qmail 124183 invoked by alias); 21 May 2016 05:01:18 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 124169 invoked by uid 89); 21 May 2016 05:01:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.5 required=5.0 tests=AWL, BAYES_50, FSL_HELO_HOME, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=no version=3.3.2 spammy=presents, H*m:tromey, menu, H*MI:tom X-HELO: gproxy7-pub.mail.unifiedlayer.com Received: from gproxy7-pub.mail.unifiedlayer.com (HELO gproxy7-pub.mail.unifiedlayer.com) (70.40.196.235) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with SMTP; Sat, 21 May 2016 05:01:07 +0000 Received: (qmail 11372 invoked by uid 0); 21 May 2016 05:01:05 -0000 Received: from unknown (HELO cmgw4) (10.0.90.85) by gproxy7.mail.unifiedlayer.com with SMTP; 21 May 2016 05:01:05 -0000 Received: from box522.bluehost.com ([74.220.219.122]) by cmgw4 with id wt0z1s0072f2jeq01t12CF; Fri, 20 May 2016 23:01:05 -0600 X-Authority-Analysis: v=2.1 cv=EftbHpWC c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=PnD2wP_eR3oA:10 a=_v2sUkyEFrwA:10 a=yrkiwgmsf1kA:10 a=zstS-IiYAAAA:8 a=0FD05c-RAAAA:8 a=AO0rJODxo7WdMy-w9kkA:9 a=4G6NA9xxw8l3yy4pmD5M:22 a=l1rpMCqCXRGZwUSuRcM3:22 Received: from [71.215.116.141] (port=54358 helo=bapiya.Home) by box522.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1b3z22-0006mu-VH; Fri, 20 May 2016 23:00:59 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA] PR python/13598 - add before_prompt event Date: Fri, 20 May 2016 23:00:50 -0600 Message-Id: <1463806850-11001-1-git-send-email-tom@tromey.com> X-Identified-User: {36111:box522.bluehost.com:elynrobi:tromey.com} {sentby:smtp auth 71.215.116.141 authed with tom+tromey.com} This adds an event that is emitted just before GDB presents a prompt to the user. This provides Python code a way to react to whatever changes might have been made by the previous command. For example, in my GUI I use this to track changes to the selected frame and reflect them in the UI. Built and regtested on x86-64 Fedora 23. 2016-05-20 Tom Tromey PR python/13598: * python/python.c (gdbpy_before_prompt_hook): Emit before_prompt event. * python/py-evts.c (gdbpy_initialize_py_events): Add before_prompt registry. * python/py-events.h (events_object) : New field. 2016-05-20 Tom Tromey PR python/13598: * python.texi (Events In Python): Document events.before_prompt. 2016-05-20 Tom Tromey PR python/13598: * gdb.python/py-events.exp: Add before_prompt event tests. --- gdb/ChangeLog | 9 +++++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/python.texi | 4 ++++ gdb/python/py-events.h | 1 + gdb/python/py-evts.c | 3 +++ gdb/python/python.c | 5 +++++ gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.python/py-events.exp | 25 +++++++++++++++++++++++++ 8 files changed, 57 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0968b85..c0b6b06 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2016-05-20 Tom Tromey + + PR python/13598: + * python/python.c (gdbpy_before_prompt_hook): Emit before_prompt + event. + * python/py-evts.c (gdbpy_initialize_py_events): Add + before_prompt registry. + * python/py-events.h (events_object) : New field. + 2016-05-19 Andreas Schwab * ia64-libunwind-tdep.c (libunwind_descr): Add cast from void *. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index fe2e3be..fa14b67 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2016-05-20 Tom Tromey + + PR python/13598: + * python.texi (Events In Python): Document events.before_prompt. + 2016-05-17 Tom Tromey * gdb.texinfo (Supported Languages): Mention Rust. Update menu. diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index ffbf89a..e655db8 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -2962,6 +2962,10 @@ A gdb.Frame object representing the frame in which the register was modified. Denotes which register was modified. @end defvar +@item events.before_prompt +This event carries no payload. It is emitted each time @value{GDBN} +presents a prompt to the user. + @end table @node Threads In Python diff --git a/gdb/python/py-events.h b/gdb/python/py-events.h index 9ecee4c..b969c15 100644 --- a/gdb/python/py-events.h +++ b/gdb/python/py-events.h @@ -50,6 +50,7 @@ typedef struct eventregistry_object *inferior_call; eventregistry_object *memory_changed; eventregistry_object *register_changed; + eventregistry_object *before_prompt; PyObject *module; diff --git a/gdb/python/py-evts.c b/gdb/python/py-evts.c index 95827e4..d388282 100644 --- a/gdb/python/py-evts.c +++ b/gdb/python/py-evts.c @@ -89,6 +89,9 @@ gdbpy_initialize_py_events (void) if (add_new_registry (&gdb_py_events.clear_objfiles, "clear_objfiles") < 0) return -1; + if (add_new_registry (&gdb_py_events.before_prompt, "before_prompt") < 0) + return -1; + if (gdb_pymodule_addobject (gdb_module, "events", (PyObject *) gdb_py_events.module) < 0) diff --git a/gdb/python/python.c b/gdb/python/python.c index c706644..d22f8dd 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -36,6 +36,7 @@ #include #include "location.h" #include "ser-event.h" +#include "py-event.h" /* Declared constants and enum for python stack printing. */ static const char python_excp_none[] = "none"; @@ -1029,6 +1030,10 @@ gdbpy_before_prompt_hook (const struct extension_language_defn *extlang, cleanup = ensure_python_env (get_current_arch (), current_language); + if (!evregpy_no_listeners_p (gdb_py_events.before_prompt) + && evpy_emit_event (NULL, gdb_py_events.before_prompt) < 0) + goto fail; + if (gdb_python_module && PyObject_HasAttrString (gdb_python_module, "prompt_hook")) { diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a773c63..3f585f3 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-20 Tom Tromey + + PR python/13598: + * gdb.python/py-events.exp: Add before_prompt event tests. + 2016-05-18 Simon Marchi * gdb.mi/mi-threads-interrupt.c: New file. diff --git a/gdb/testsuite/gdb.python/py-events.exp b/gdb/testsuite/gdb.python/py-events.exp index de8de07..592367d 100644 --- a/gdb/testsuite/gdb.python/py-events.exp +++ b/gdb/testsuite/gdb.python/py-events.exp @@ -210,3 +210,28 @@ gdb_test "continue" ".*event type: continue.* .*exit code: 12.* .*exit inf: 2.* dir ok: True.*" "Inferior 2 terminated." + + +# Test before_prompt event. +gdb_py_test_multiple "define new user command" \ + "define xxz" "End with a line saying just .end.." \ + "set variable \$x = 72" "" \ + "set variable \$y = 93" "" \ + "end" "" + +gdb_py_test_multiple "add before_prompt listener" \ + "python" "" \ + "count = 0" "" \ + "def listener():" "" \ + " global count" "" \ + " count = count + 1" "" \ + "gdb.events.before_prompt.connect(listener)" "" \ + "end" "" + +gdb_test_no_output "set variable \$x = 32" "do something" +# Result is due to one emitted before "set var" and one emitted before +# this command. +gdb_test "python print(count)" 2 "check for before_prompt event" + +gdb_test_no_output "xxz" "run a canned sequence" +gdb_test "python print(count)" 4 "check for before_prompt event"