Mercurial > jwe > octave
comparison libinterp/parse-tree/pt-bp.cc @ 21157:94fc5f13d51b
dbstop: conditional breakpoint, dbstop if caught error etc. (bug #46795)
* debug.cc (parse_dbfunction_params): Accept "in", "at" and "if" tokens.
Only breakpoints are returned; "dbstop if error" etc. are processed in
the parser.
* debug.cc (dbstop_process_map_ags, Fdbstop): set breakpoints etc. based on the
output of A=dbstatus. The structure of A is not Matlab compatible.
* debug.cc (do_add_breakpoint_1, do_get_breakpoint_list): Store file
(not subfunction) names in bp_set, to avoid crash in "dbclear all".
* debug.cc (dbclear_all_signals, condition_valid,
stop_on_err_warn_status): New function
* debug.cc (do_add_breakpoint): take "condition" parameter.
* debug.cc (do_get_breakpoint_list): Make invariant copy of bp_set (bug #44195)
* debug.cc (do_add_breakpoint, do_remove_breakpoint,
do_remove_all_breakpoints_in_file): More informative error messages.
* debug.cc (Fdbclear): clear break on signals (error, warning etc.)
* debug.cc (Fdbstatus): Return all breakpoints when debugging, so that
"s = dbstatus; ...; dbstop (s)" works.
(Related to bug #41338, bug #41556)
* debug.cc (Fdbstatus): Return structure with conditions, and "if error" etc.
* debug.h (debug_on_err, debug_on_caught, debug_on_warn): New functions
* debug.h: Rename "fname_line_map" to "fname_bp_map", as it has conditions
* error.cc (verror): Allow dbstop on selected errors, or errors in try/catch
* error.h New globals: Vdebug_on_caught, in_try_catch.
* toplev.cc: Experimental code for Matlab's "dbstop if naninf".
* symtab.cc (load_class_constructor): Add class constructors to list of
methods so they can be breakpointed
* pt-pb.{cc,h} (take_action): Add "condition" to set_breakpoint call,
track bp_cond_list.
* pt-eval.cc visit_.*_command: Ask if breakpoint condition is satisfied.
* pt-eval.cc (visit_try_catch_command): Count the number of levels of
try/catch we are in to allow "dbstop if caught error".
* pt-stmt.cc (set_breakpoint): Pass condition
* pt-stmt.cc (is_breakpoint): If new argument is true, only return true
if the condition is set.
* pt-stmt.cc (bp_cond, preakpoints_and_conds): new function
* pt-stmt.h: new declarations
* pt.{cc,h} (meets_bp_condition, bp_cond): New function
* octave-link.h (update_breakpoint): Accept condition
author | Lachlan Andrew <lachlanbis@gmail.com> |
---|---|
date | Sun, 24 Jan 2016 11:02:30 +1100 |
parents | 4197fc428c7d |
children | fcac5dbbf9ed |
comparison
equal
deleted
inserted
replaced
21156:80b69efcd960 | 21157:94fc5f13d51b |
---|---|
349 if (stmt.line () >= line) | 349 if (stmt.line () >= line) |
350 take_action (stmt); | 350 take_action (stmt); |
351 } | 351 } |
352 } | 352 } |
353 | 353 |
354 // Called by | |
355 // tree_statement_list::set_breakpoint (int line, std::string& condition) | |
356 // with lst consisting of a user function in which to set a breakpoint. | |
354 void | 357 void |
355 tree_breakpoint::visit_statement_list (tree_statement_list& lst) | 358 tree_breakpoint::visit_statement_list (tree_statement_list& lst) |
356 { | 359 { |
357 for (tree_statement_list::iterator p = lst.begin (); p != lst.end (); p++) | 360 for (tree_statement_list::iterator p = lst.begin (); p != lst.end (); p++) |
358 { | 361 { |
449 void | 452 void |
450 tree_breakpoint::take_action (tree& tr) | 453 tree_breakpoint::take_action (tree& tr) |
451 { | 454 { |
452 if (act == set) | 455 if (act == set) |
453 { | 456 { |
454 tr.set_breakpoint (); | 457 tr.set_breakpoint (condition); |
455 line = tr.line (); | 458 line = tr.line (); |
456 found = true; | 459 found = true; |
457 } | 460 } |
458 else if (act == clear) | 461 else if (act == clear) |
459 { | 462 { |
464 } | 467 } |
465 } | 468 } |
466 else if (act == list) | 469 else if (act == list) |
467 { | 470 { |
468 if (tr.is_breakpoint ()) | 471 if (tr.is_breakpoint ()) |
469 bp_list.append (octave_value (tr.line ())); | 472 { |
473 bp_list.append (octave_value (tr.line ())); | |
474 bp_cond_list.append (octave_value (tr.bp_cond ())); | |
475 } | |
470 } | 476 } |
471 else | 477 else |
472 panic_impossible (); | 478 panic_impossible (); |
473 } | 479 } |
474 | 480 |
477 { | 483 { |
478 int lineno = stmt.line (); | 484 int lineno = stmt.line (); |
479 | 485 |
480 if (act == set) | 486 if (act == set) |
481 { | 487 { |
482 stmt.set_breakpoint (); | 488 stmt.set_breakpoint (condition); |
483 line = lineno; | 489 line = lineno; |
484 found = true; | 490 found = true; |
485 } | 491 } |
486 else if (act == clear) | 492 else if (act == clear) |
487 { | 493 { |
492 } | 498 } |
493 } | 499 } |
494 else if (act == list) | 500 else if (act == list) |
495 { | 501 { |
496 if (stmt.is_breakpoint ()) | 502 if (stmt.is_breakpoint ()) |
497 bp_list.append (octave_value (lineno)); | 503 { |
504 bp_list.append (octave_value (lineno)); | |
505 bp_cond_list.append (octave_value (stmt.bp_cond ())); | |
506 } | |
498 } | 507 } |
499 else | 508 else |
500 panic_impossible (); | 509 panic_impossible (); |
501 } | 510 } |