Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gdb-python.diff « gdb-pre7.0 « data - github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 464a8bed1a857f79980c190e90b28afa1c8f9b57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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  <vargaz@gmail.com>
+
+	* 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  <bauerman@br.ibm.com>
 
 	* 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-<cmdname>"
+   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