diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 640998b..fb73e9d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2009-02-03 Zoltan Varga + + * cil-script.c python/python-cmd.c: Allow registration of pre/post hooks from + python. + + * symfile.c (add_symbol_file_command): Comment out verbose messages. + 2009-02-03 Thiago Jung Bauermann * gdb/c-lang.c (c_get_string): Remove superfluous parenthesis from diff --git a/gdb/cli/cli-script.c b/gdb/cli/cli-script.c index 835d29c..3941aa5 100644 --- a/gdb/cli/cli-script.c +++ b/gdb/cli/cli-script.c @@ -299,6 +299,13 @@ execute_user_command (struct cmd_list_element *c, char *args) static int user_call_depth = 0; extern int max_user_call_depth; + /* Might be a user defined command implemented in Python */ + if (!c->user_commands && c->func) + { + (*c->func) (c, args, FALSE); + return; + } + old_chain = setup_user_args (args); cmdlines = c->user_commands; diff --git a/gdb/python/python-cmd.c b/gdb/python/python-cmd.c index 61d5e5d..a3fbc08 100644 --- a/gdb/python/python-cmd.c +++ b/gdb/python/python-cmd.c @@ -339,7 +339,8 @@ gdbpy_parse_command_name (char *text, struct cmd_list_element ***base_list, /* Object initializer; sets up gdb-side structures for command. - Use: __init__(NAME, CMDCLASS, [COMPLETERCLASS, [PREFIX]]). + Use: __init__(NAME, CMDCLASS, [completerclass=COMPLETERCLASS, prefix=PREFIX, + pre_hook_of=PREHOOK_OF, post_hook_of=POSTHOOK_OF]). NAME is the name of the command. It may consist of multiple words, in which case the final word is the name of the new command, and @@ -354,6 +355,11 @@ gdbpy_parse_command_name (char *text, struct cmd_list_element ***base_list, If PREFIX is True, then this command is a prefix command. + PREHOOK_OF is the name of a gdb command this command becomes a + pre-execution hook of, same as if this command was defined using + "define hook-" + POSTHOOK_OF is the same for post-execution hooks. + The documentation for the command is taken from the doc string for the python class. @@ -362,15 +368,18 @@ static int cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) { cmdpy_object *obj = (cmdpy_object *) self; - char *name; + char *name, *pre_hook_of = NULL, *post_hook_of = NULL; int cmdtype; int completetype = -1; char *docstring = NULL; volatile struct gdb_exception except; struct cmd_list_element **cmd_list; + struct cmd_list_element *pre_hookc = NULL, *post_hookc = NULL; char *cmd_name, *pfx_name; PyObject *is_prefix = NULL; int cmp; + static char *kwlist[] = {"name", "cmdclass", "completerclass", "prefix", + "pre_hook_of", "post_hook_of", NULL}; if (obj->command) { @@ -381,8 +390,9 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) return -1; } - if (! PyArg_ParseTuple (args, "si|iO", &name, &cmdtype, - &completetype, &is_prefix)) + if (! PyArg_ParseTupleAndKeywords (args, kwds, "si|iOss", kwlist, &name, &cmdtype, + &completetype, &is_prefix, &pre_hook_of, + &post_hook_of)) return -1; if (cmdtype != no_class && cmdtype != class_run @@ -402,6 +412,30 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) return -1; } + if (pre_hook_of) + { + char *text = pre_hook_of; + + pre_hookc = lookup_cmd_1 (&text, cmdlist, NULL, 1); + if (! pre_hookc) + { + PyErr_Format (PyExc_RuntimeError, _("command name given by pre_hook argument not found")); + return -1; + } + } + + if (post_hook_of) + { + char *text = post_hook_of; + + post_hookc = lookup_cmd_1 (&text, cmdlist, NULL, 1); + if (! post_hookc) + { + PyErr_Format (PyExc_RuntimeError, _("command name given by post_hook argument not found")); + return -1; + } + } + cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist); if (! cmd_name) return -1; @@ -470,6 +504,18 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds) cmd->func = cmdpy_function; cmd->destroyer = cmdpy_destroyer; + if (pre_hookc) + { + pre_hookc->hook_pre = cmd; + cmd->hookee_pre = pre_hookc; + } + + if (post_hookc) + { + post_hookc->hook_post = cmd; + cmd->hookee_post = post_hookc; + } + obj->command = cmd; set_cmd_context (cmd, self); set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer diff --git a/gdb/symfile.c b/gdb/symfile.c index 14cb7b8..6d0bb40 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2196,7 +2196,7 @@ add_symbol_file_command (char *args, int from_tty) statements because hex_string returns a local static string. */ - printf_unfiltered (_("add symbol table from file \"%s\" at\n"), filename); + /* printf_unfiltered (_("add symbol table from file \"%s\" at\n"), filename); */ section_addrs = alloc_section_addr_info (section_index); make_cleanup (xfree, section_addrs); for (i = 0; i < section_index; i++) @@ -2211,7 +2211,7 @@ add_symbol_file_command (char *args, int from_tty) entered on the command line. */ section_addrs->other[sec_num].name = sec; section_addrs->other[sec_num].addr = addr; - printf_unfiltered ("\t%s_addr = %s\n", sec, paddress (addr)); + /* printf_unfiltered ("\t%s_addr = %s\n", sec, paddress (addr)); */ sec_num++; /* The object's sections are initialized when a