Mercurial > hg > octave-jordi
annotate src/debug.cc @ 7752:40c428ea3408
initial implementation of dbup and dbdown
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sun, 04 May 2008 03:42:19 -0400 |
parents | a059b5679fbb |
children | 6b521b1e3631 |
rev | line source |
---|---|
3805 | 1 /* |
2 | |
7348 | 3 Copyright (C) 2007, 2008 John Swensen |
4 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Ben Sapp | |
3805 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
3805 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
3805 | 21 |
22 */ | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
3895 | 27 #include <iostream> |
28 #include <fstream> | |
3948 | 29 #include <string> |
7082 | 30 #include <set> |
31 | |
3805 | 32 #include "defun.h" |
33 #include "error.h" | |
7082 | 34 #include "help.h" |
3805 | 35 #include "input.h" |
36 #include "pager.h" | |
37 #include "oct-obj.h" | |
38 #include "utils.h" | |
39 #include "parse.h" | |
40 #include "symtab.h" | |
41 #include "gripes.h" | |
42 #include "ov.h" | |
43 #include "ov-usr-fcn.h" | |
44 #include "ov-fcn.h" | |
7082 | 45 #include "ov-list.h" |
46 #include "ov-struct.h" | |
3805 | 47 #include "pt-pr-code.h" |
48 #include "pt.h" | |
49 #include "pt-bp.h" | |
50 #include "pt-stmt.h" | |
51 #include "toplev.h" | |
52 #include "unwind-prot.h" | |
53 #include "variables.h" | |
54 | |
7082 | 55 #include "debug.h" |
56 | |
57 // Initialize the singleton object | |
7083 | 58 bp_table *bp_table::instance = 0; |
7082 | 59 |
5743 | 60 // Return a pointer to the user-defined function FNAME. If FNAME is |
61 // empty, search backward for the first user-defined function in the | |
62 // current call stack. | |
7083 | 63 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
64 static octave_user_code * |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
65 get_user_code (const std::string& fname = std::string ()) |
3805 | 66 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
67 octave_user_code *dbg_fcn = 0; |
3805 | 68 |
7083 | 69 if (fname.empty ()) |
5744 | 70 dbg_fcn = octave_call_stack::caller_user_function (); |
5743 | 71 else |
3805 | 72 { |
7539
3e107d73aeb4
debug.cc: use find_function instead of find_user_function
John Swensen
parents:
7348
diff
changeset
|
73 octave_value fcn = symbol_table::find_function (fname); |
3946 | 74 |
7539
3e107d73aeb4
debug.cc: use find_function instead of find_user_function
John Swensen
parents:
7348
diff
changeset
|
75 if (fcn.is_defined ()) |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
76 dbg_fcn = fcn.user_code_value (); |
3805 | 77 } |
78 | |
79 return dbg_fcn; | |
80 } | |
81 | |
7082 | 82 static void |
7348 | 83 parse_dbfunction_params (const char *who, const octave_value_list& args, |
84 std::string& symbol_name, bp_table::intmap& lines) | |
7082 | 85 { |
86 int nargin = args.length (); | |
87 int idx = 0; | |
88 int list_idx = 0; | |
89 symbol_name = std::string (); | |
7348 | 90 lines = bp_table::intmap (); |
91 | |
92 if (args.length () == 0) | |
93 return; | |
7082 | 94 |
7083 | 95 // If we are already in a debugging function. |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
96 if (octave_call_stack::caller_user_code ()) |
7348 | 97 { |
98 idx = 0; | |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
99 symbol_name = get_user_code ()->name (); |
7348 | 100 } |
101 else if (args(0).is_map ()) | |
7082 | 102 { |
7348 | 103 // Problem because parse_dbfunction_params() can only pass out a |
104 // single function | |
105 } | |
106 else if (args(0).is_string()) | |
107 { | |
108 symbol_name = args(0).string_value (); | |
7082 | 109 if (error_state) |
110 return; | |
111 idx = 1; | |
112 } | |
7348 | 113 else |
114 error ("%s: invalid parameter specified", who); | |
7082 | 115 |
116 for (int i = idx; i < nargin; i++ ) | |
117 { | |
7348 | 118 if (args(i).is_string ()) |
7082 | 119 { |
7083 | 120 int line = atoi (args(i).string_value().c_str ()); |
7082 | 121 if (error_state) |
7083 | 122 break; |
7082 | 123 lines[list_idx++] = line; |
124 } | |
7348 | 125 else if (args(i).is_map ()) |
126 octave_stdout << who << ": accepting a struct" << std::endl; | |
7082 | 127 else |
128 { | |
7083 | 129 const NDArray arg = args(i).array_value (); |
7082 | 130 |
131 if (error_state) | |
132 break; | |
133 | |
7083 | 134 for (octave_idx_type j = 0; j < arg.nelem (); j++) |
7082 | 135 { |
136 int line = static_cast<int> (arg.elem (j)); | |
137 if (error_state) | |
138 break; | |
139 lines[list_idx++] = line; | |
140 } | |
141 | |
142 if (error_state) | |
143 break; | |
144 } | |
145 } | |
146 } | |
147 | |
7083 | 148 bp_table::intmap |
149 bp_table::do_add_breakpoint (const std::string& fname, | |
150 const bp_table::intmap& line) | |
7082 | 151 { |
7083 | 152 intmap retval; |
7082 | 153 |
154 octave_idx_type len = line.size (); | |
7083 | 155 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
156 octave_user_code *dbg_fcn = get_user_code (fname); |
7082 | 157 |
158 if (dbg_fcn) | |
159 { | |
160 tree_statement_list *cmds = dbg_fcn->body (); | |
7083 | 161 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
162 if (cmds) |
7082 | 163 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
164 for (int i = 0; i < len; i++) |
7082 | 165 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
166 const_intmap_iterator p = line.find (i); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
167 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
168 if (p != line.end ()) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
169 { |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
170 int lineno = p->second; |
7083 | 171 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
172 retval[i] = cmds->set_breakpoint (lineno); |
7083 | 173 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
174 if (retval[i] != 0) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
175 bp_map[fname] = dbg_fcn; |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
176 } |
7082 | 177 } |
178 } | |
179 } | |
180 else | |
181 error ("add_breakpoint: unable to find the function requested\n"); | |
182 | |
183 return retval; | |
184 } | |
185 | |
186 | |
187 int | |
7083 | 188 bp_table::do_remove_breakpoint (const std::string& fname, |
189 const bp_table::intmap& line) | |
7082 | 190 { |
7083 | 191 int retval = 0; |
7082 | 192 |
193 octave_idx_type len = line.size (); | |
194 | |
195 if (len == 0) | |
196 { | |
197 intmap results = remove_all_breakpoints_in_file (fname); | |
198 retval = results.size (); | |
199 } | |
200 else | |
201 { | |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
202 octave_user_code *dbg_fcn = get_user_code (fname); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
203 |
7082 | 204 if (dbg_fcn) |
205 { | |
206 tree_statement_list *cmds = dbg_fcn->body (); | |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
207 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
208 if (cmds) |
7082 | 209 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
210 octave_value_list results = cmds->list_breakpoints (); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
211 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
212 if (results.length () > 0) |
7348 | 213 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
214 for (int i = 0; i < len; i++) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
215 { |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
216 const_intmap_iterator p = line.find (i); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
217 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
218 if (p != line.end ()) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
219 cmds->delete_breakpoint (p->second); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
220 } |
7083 | 221 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
222 results = cmds->list_breakpoints (); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
223 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
224 breakpoint_map_iterator it = bp_map.find (fname); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
225 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
226 if (results.length () == 0 && it != bp_map.end ()) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
227 bp_map.erase (it); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
228 } |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
229 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
230 retval = results.length (); |
7082 | 231 } |
232 } | |
233 else | |
234 error ("remove_breakpoint: unable to find the function requested\n"); | |
235 } | |
236 return retval; | |
237 } | |
238 | |
239 | |
7083 | 240 bp_table::intmap |
241 bp_table::do_remove_all_breakpoints_in_file (const std::string& fname) | |
7082 | 242 { |
7083 | 243 intmap retval; |
7082 | 244 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
245 octave_user_code *dbg_fcn = get_user_code (fname); |
7082 | 246 |
247 if (dbg_fcn) | |
248 { | |
249 tree_statement_list *cmds = dbg_fcn->body (); | |
7083 | 250 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
251 if (cmds) |
7082 | 252 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
253 octave_value_list bkpts = cmds->list_breakpoints (); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
254 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
255 for (int i = 0; i < bkpts.length (); i++) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
256 { |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
257 int lineno = static_cast<int> (bkpts(i).int_value ()); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
258 cmds->delete_breakpoint (lineno); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
259 retval[i] = lineno; |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
260 } |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
261 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
262 breakpoint_map_iterator it = bp_map.find (fname); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
263 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
264 if (it != bp_map.end ()) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
265 bp_map.erase (it); |
7082 | 266 } |
267 } | |
268 else | |
269 error ("remove_all_breakpoint_in_file: " | |
270 "unable to find the function requested\n"); | |
271 | |
272 return retval; | |
273 } | |
274 | |
275 void | |
7083 | 276 bp_table::do_remove_all_breakpoints (void) |
7082 | 277 { |
7083 | 278 for (const_breakpoint_map_iterator it = bp_map.begin (); |
279 it != bp_map.end (); it++) | |
280 remove_all_breakpoints_in_file (it->first); | |
7082 | 281 } |
282 | |
283 std::string | |
284 do_find_bkpt_list (octave_value_list slist, | |
285 std::string match) | |
286 { | |
287 std::string retval; | |
7083 | 288 |
7082 | 289 for (int i = 0; i < slist.length (); i++) |
290 { | |
291 if (slist (i).string_value () == match) | |
292 { | |
7083 | 293 retval = slist(i).string_value (); |
7082 | 294 break; |
295 } | |
296 } | |
297 return retval; | |
298 } | |
299 | |
300 | |
7083 | 301 bp_table::fname_line_map |
302 bp_table::do_get_breakpoint_list (const octave_value_list& fname_list) | |
7082 | 303 { |
7083 | 304 fname_line_map retval; |
7082 | 305 |
306 // Iterate through each of the files in the map and get the | |
7083 | 307 // name and list of breakpoints. |
308 | |
309 for (breakpoint_map_iterator it = bp_map.begin (); it != bp_map.end (); it++) | |
7082 | 310 { |
7083 | 311 if (fname_list.length () == 0 |
312 || do_find_bkpt_list (fname_list, it->first) != "") | |
7082 | 313 { |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
314 octave_user_code *f = it->second; |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
315 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
316 tree_statement_list *cmds = f->body (); |
7083 | 317 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
318 if (cmds) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
319 { |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
320 octave_value_list bkpts = cmds->list_breakpoints (); |
7083 | 321 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
322 octave_idx_type len = bkpts.length (); |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
323 |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
324 bp_table::intmap bkpts_vec; |
7083 | 325 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
326 for (int i = 0; i < len; i++) |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
327 bkpts_vec[i] = bkpts (i).double_value (); |
7083 | 328 |
7719
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
329 retval[it->first] = bkpts_vec; |
87eda1f8faaa
octave_user_code: new base class for octave_user_script and octave_user_function
John W. Eaton <jwe@octave.org>
parents:
7539
diff
changeset
|
330 } |
7082 | 331 } |
332 } | |
7083 | 333 |
7082 | 334 return retval; |
335 } | |
336 | |
337 static octave_value | |
7083 | 338 intmap_to_ov (const bp_table::intmap& line) |
7082 | 339 { |
340 int idx = 0; | |
7083 | 341 |
342 NDArray retval (dim_vector (1, line.size ())); | |
343 | |
344 for (size_t i = 0; i < line.size (); i++) | |
7082 | 345 { |
7083 | 346 bp_table::const_intmap_iterator p = line.find (i); |
347 | |
7082 | 348 if (p != line.end ()) |
349 { | |
350 int lineno = p->second; | |
7083 | 351 retval(idx++) = lineno; |
7082 | 352 } |
353 } | |
7083 | 354 |
7082 | 355 retval.resize (dim_vector (1, idx)); |
7083 | 356 |
7082 | 357 return retval; |
358 } | |
3895 | 359 |
4208 | 360 DEFCMD (dbstop, args, , |
3805 | 361 "-*- texinfo -*-\n\ |
7752
40c428ea3408
initial implementation of dbup and dbdown
John W. Eaton <jwe@octave.org>
parents:
7736
diff
changeset
|
362 @deftypefn {Loadable Function} {@var{rline} =} dbstop (@var{func}, @var{line}, @dots{})\n\ |
3805 | 363 Set a breakpoint in a function\n\ |
364 @table @code\n\ | |
365 @item func\n\ | |
366 String representing the function name. When already in debug\n\ | |
367 mode this should be left out and only the line should be given.\n\ | |
368 @item line\n\ | |
6646 | 369 Line you would like the breakpoint to be set on. Multiple\n\ |
7001 | 370 lines might be given as separate arguments or as a vector.\n\ |
3805 | 371 @end table\n\ |
372 \n\ | |
373 The rline returned is the real line that the breakpoint was set at.\n\ | |
5642 | 374 @seealso{dbclear, dbstatus, dbnext}\n\ |
375 @end deftypefn") | |
3805 | 376 { |
7083 | 377 bp_table::intmap retval; |
378 std::string symbol_name; | |
379 bp_table::intmap lines; | |
380 | |
7348 | 381 parse_dbfunction_params ("dbstop", args, symbol_name, lines); |
6646 | 382 |
7083 | 383 if (! error_state) |
7082 | 384 retval = bp_table::add_breakpoint (symbol_name, lines); |
3805 | 385 |
7083 | 386 return intmap_to_ov (retval); |
3805 | 387 } |
388 | |
4208 | 389 DEFCMD (dbclear, args, , |
3805 | 390 "-*- texinfo -*-\n\ |
7083 | 391 @deftypefn {Loadable Function} {} dbclear (@var{func}, @var{line}, @dots{})\n\ |
3805 | 392 Delete a breakpoint in a function\n\ |
393 @table @code\n\ | |
394 @item func\n\ | |
395 String representing the function name. When already in debug\n\ | |
396 mode this should be left out and only the line should be given.\n\ | |
397 @item line\n\ | |
6653 | 398 Line where you would like to remove the breakpoint. Multiple\n\ |
7001 | 399 lines might be given as separate arguments or as a vector.\n\ |
3805 | 400 @end table\n\ |
401 No checking is done to make sure that the line you requested is really\n\ | |
6646 | 402 a breakpoint. If you get the wrong line nothing will happen.\n\ |
5642 | 403 @seealso{dbstop, dbstatus, dbwhere}\n\ |
404 @end deftypefn") | |
3805 | 405 { |
406 octave_value retval; | |
407 std::string symbol_name = ""; | |
7083 | 408 bp_table::intmap lines; |
409 | |
7348 | 410 parse_dbfunction_params ("dbclear", args, symbol_name, lines); |
7082 | 411 |
7083 | 412 if (! error_state) |
7082 | 413 bp_table::remove_breakpoint (symbol_name, lines); |
3805 | 414 |
415 return retval; | |
416 } | |
417 | |
7082 | 418 DEFCMD (dbstatus, args, nargout, |
3805 | 419 "-*- texinfo -*-\n\ |
7083 | 420 @deftypefn {Loadable Function} {lst =} dbstatus (@var{func})\n\ |
3805
44386b0e53da
[project @ 2001-03-01 16:54:31 by jwe] |