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 }