From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31193 invoked by alias); 14 Feb 2012 07:57:41 -0000 Received: (qmail 31175 invoked by uid 22791); 14 Feb 2012 07:57:39 -0000 X-SWARE-Spam-Status: No, hits=1.0 required=5.0 tests=AWL,BAYES_50,TW_MD,TW_RG,TW_SJ,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com) (208.91.2.13) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 14 Feb 2012 07:57:23 +0000 Received: from sc9-mailhost1.vmware.com (sc9-mailhost1.vmware.com [10.113.161.71]) by smtp-outbound-2.vmware.com (Postfix) with ESMTP id 7BF7928C3F; Mon, 13 Feb 2012 23:57:23 -0800 (PST) Received: from sc9-exht06.vmware.com (sc9-exht06.vmware.com [10.113.190.36]) by sc9-mailhost1.vmware.com (Postfix) with ESMTP id 7796D18377; Mon, 13 Feb 2012 23:57:23 -0800 (PST) Received: from exch-mbx-111.vmware.com ([10.113.190.111]) by sc9-exht06.vmware.com ([10.113.190.36]) with mapi; Mon, 13 Feb 2012 23:57:23 -0800 From: Scott Goldman To: Doug Evans CC: "gdb-patches@sourceware.org" Date: Tue, 14 Feb 2012 07:57:00 -0000 Subject: RE: [PATCH] Allow user-defined as a category for python gdb macros (resend) Message-ID: <03E840D17E263A48A5766AD576E0423A03D72B6543@exch-mbx-111.vmware.com> References: <03E840D17E263A48A5766AD576E0423A03D72B653F@exch-mbx-111.vmware.com>, In-Reply-To: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-02/txt/msg00251.txt.bz2 Hi Doug. I appreciate the comments. > At the very least, I think this requires a proper comment explaining > why one needs to test c->user_commands. done. > Also, this patch feels like it's incomplete. > If I can see "user" python "macros" [sic] then happens if I do "show > user foo"? (a user may reasonably ask) > And given that that won't work, we'll have to explain(document) why. I added the relevant documentation specifying the behavior. I'm not sure ho= w I would explain it other than "because Python doesn't provide a way to re= trieve the code" and I wasn't sure if this was sufficiently useful informat= ion to be worth documenting, so i just stuck to clarifying that the command= s were only relevant for user-defined non-python commands. I would prefer to just get the `show user ...` functionality to work for py= thon commands. The python `inspect` module sounds promising, but unfortunat= ely seems to just throw an exception when I use it on a class. I'll fool ar= ound with it some more. Maybe I can make it work for certain limited cases. > Plus one now needs to explain that "document" and > "max-user-call-depth" don't apply to these commands=20 `document` actually seems to work fine, but yeah `max-user-call-depth` is n= ot relevant for python commands. I updated the documentation to reflect tha= t. I'd be happy to further develop the change based on more feedback. My only = real goal is to be able to have all the user-defined commands listed in one= place.=20 -sjg 2012-02-13 Scott J. Goldman * gdb.texinfo: put example python macro in COMMAND_USER category rather than COMMAND_OBSCURE. * gdb.texinfo: update documentation to clarify set/show max-user-ca= ll-depth and show user don't apply to * python commands. 2012-02-13 Scott J. Goldman * cli-cmds.c (show_user): print error when used on a python command. * (init_cli_cmds): update documentation strings for show user and s= et/show max-user-call-depth * to clarify that it does not apply to python commands. * py-cmd.c (cmdpy_init): treat class_user as a valid class in error= check (gdbpy_initialize_commands): Add COMMAND_USER as a constant in gdb python api. * top.c (execute_command): only execute a user-defined command as a legacy macro if c->user_commands is set. diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 983f017..49808b6 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1241,7 +1241,8 @@ show_user (char *args, int from_tty) char *comname =3D args; =20 c =3D lookup_cmd (&comname, cmdlist, "", 0, 1); - if (c->class !=3D class_user) + /* c->user_commands would be NULL if it's a python command */ + if (c->class !=3D class_user || !c->user_commands) error (_("Not a user command.")); show_user_1 (c, "", args, gdb_stdout); } @@ -1912,7 +1913,7 @@ Two arguments (separated by a comma) are taken as a r= ange of memory to dump,\n\ Run the ``make'' program using the rest of the line as arguments.")); set_cmd_completer (c, filename_completer); add_cmd ("user", no_class, show_user, _("\ -Show definitions of user defined commands.\n\ +Show definitions of non-python user defined commands.\n\ Argument is the name of the user defined command.\n\ With no argument, show definitions of all user defined commands."), &showl= ist); add_com ("apropos", class_support, apropos_command, @@ -1920,8 +1921,8 @@ With no argument, show definitions of all user define= d commands."), &showlist); =20 add_setshow_integer_cmd ("max-user-call-depth", no_class, &max_user_call_depth, _("\ -Set the max call depth for user-defined commands."), _("\ -Show the max call depth for user-defined commands."), NULL, +Set the max call depth for non-python user-defined commands."), _("\ +Show the max call depth for non-python user-defined commands."), NULL, NULL, show_max_user_call_depth, &setlist, &showlist); diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 9edc6ad..988d3d3 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -21061,7 +21061,8 @@ List all user-defined commands, with the first line= of the documentation @itemx show user @var{commandname} Display the @value{GDBN} commands used to define @var{commandname} (but not its documentation). If no @var{commandname} is given, display the -definitions for all user-defined commands. +definitions for all user-defined commands. This does not work for user-de= fined +python commands. =20 @cindex infinite recursion in user-defined commands @kindex show max-user-call-depth @@ -21070,7 +21071,8 @@ definitions for all user-defined commands. @itemx set max-user-call-depth The value of @code{max-user-call-depth} controls how many recursion levels are allowed in user-defined commands before @value{GDBN} suspects an -infinite recursion and aborts the command. +infinite recursion and aborts the command. This does not apply to user-de= fined +python commands. @end table =20 In addition to the above commands, user-defined commands frequently @@ -21871,7 +21873,7 @@ to handle this case. Example: >class HelloWorld (gdb.Command): > """Greet the whole world.""" > def __init__ (self): -> super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_OBSCURE) +> super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_USER) > def invoke (self, args, from_tty): > argv =3D gdb.string_to_argv (args) > if len (argv) !=3D 0: @@ -23311,7 +23313,7 @@ class HelloWorld (gdb.Command): """Greet the whole world.""" =20 def __init__ (self): - super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_OBSCURE) + super (HelloWorld, self).__init__ ("hello-world", gdb.COMMAND_USER) =20 def invoke (self, arg, from_tty): print "Hello, World!" diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index aad1ab4..04476db 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -436,7 +436,7 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *k= w) && cmdtype !=3D class_files && cmdtype !=3D class_support && cmdtype !=3D class_info && cmdtype !=3D class_breakpoint && cmdtype !=3D class_trace && cmdtype !=3D class_obscure - && cmdtype !=3D class_maintenance) + && cmdtype !=3D class_maintenance && cmdtype !=3D class_user) { PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument.= ")); return -1; @@ -578,7 +578,8 @@ gdbpy_initialize_commands (void) || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE", class_obscure) < 0 || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE", - class_maintenance) < 0) + class_maintenance) < 0 + || PyModule_AddIntConstant (gdb_module, "COMMAND_USER", class_user) = < 0) return; =20 for (i =3D 0; i < N_COMPLETERS; ++i) diff --git a/gdb/top.c b/gdb/top.c index e41f56c..e73a772 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -470,7 +470,8 @@ execute_command (char *p, int from_tty) if (c->flags & DEPRECATED_WARN_USER) deprecated_cmd_warning (&line); =20 - if (c->class =3D=3D class_user) + /* c->user_commands would be NULL in the case of a python command. */ + if (c->class =3D=3D class_user && c->user_commands) execute_user_command (c, arg); else if (c->type =3D=3D set_cmd || c->type =3D=3D show_cmd) do_setshow_command (arg, from_tty, c);