# HG changeset patch # User John W. Eaton # Date 1249414334 14400 # Node ID bbe033dcfe132967fa7ba3e6963a42d4d75e8f6f # Parent 25c2e92ee03c19d3640005950026aaaddee726e9 make dbwhere work when called at keyboard prompt diff -r 25c2e92ee03c -r bbe033dcfe13 src/ChangeLog --- a/src/ChangeLog Tue Aug 04 12:59:16 2009 -0400 +++ b/src/ChangeLog Tue Aug 04 15:32:14 2009 -0400 @@ -1,3 +1,27 @@ +2009-08-04 John W. Eaton + + * debug.cc (Fdbwhere): Call octave_call_stack::goto_frame_relative + to move to user code frame. Get line and column information from + call stack. + * input.cc (Fkeyboard): Don't pass verbose flag to + octave_call_stack::goto_frame_relative. + (get_debug_input): Get line and column information from call stack. + * pt-eval.h, pt-eval.cc (tree_evaluator::debug_line, + tree_evaluator::debug_column, tree_evaluator::db_line, + tree_evaluator::db_column): Delete. + * pt-eval.cc (tree_evaluator::do_breakpoint): Don't print function + name and location info here. Delete line and column number args. + Change all callers. + + * toplev.h (octave_call_stack::do_current, + octave_call_stack::do_current_statement): New functions. + (octave_call_stack::current): Call do_current, not top. + (octave_call_stack::current_statement): Call do_current_statement, + not top_statement. + (octave_call_stack::top, octave_call_stack::top_statement, + octave_call_stack::do_top, octave_call_stack::do_top_statement): + Delete. + 2009-08-04 John W. Eaton * toplev.cc (octave_call_stack::do_goto_frame_relative): Allow diff -r 25c2e92ee03c -r bbe033dcfe13 src/debug.cc --- a/src/debug.cc Tue Aug 04 12:59:16 2009 -0400 +++ b/src/debug.cc Tue Aug 04 15:32:14 2009 -0400 @@ -661,13 +661,21 @@ octave_stdout << name << ":"; - int l = tree_evaluator::debug_line (); + unwind_protect::frame_id_t uwp_frame = unwind_protect::begin_frame (); + + unwind_protect::add_fcn (octave_call_stack::restore_frame, + octave_call_stack::current_frame ()); + + // Skip the frame assigned to the dbwhere function. + octave_call_stack::goto_frame_relative (0); + + int l = octave_call_stack::current_line (); if (l > 0) { octave_stdout << " line " << l; - int c = tree_evaluator::debug_column (); + int c = octave_call_stack::current_column (); if (c > 0) octave_stdout << ", column " << c; @@ -684,6 +692,8 @@ } else octave_stdout << " (unknown line)\n"; + + unwind_protect::run_frame (uwp_frame); } else error ("dbwhere: must be inside of a user function to use dbwhere\n"); diff -r 25c2e92ee03c -r bbe033dcfe13 src/input.cc --- a/src/input.cc Tue Aug 04 12:59:16 2009 -0400 +++ b/src/input.cc Tue Aug 04 15:32:14 2009 -0400 @@ -598,7 +598,7 @@ octave_user_code *caller = octave_call_stack::caller_user_code (); std::string nm; - int curr_debug_line = tree_evaluator::debug_line (); + int curr_debug_line = octave_call_stack::current_line (); bool have_file = false; @@ -649,12 +649,7 @@ std::string msg = buf.str (); if (! msg.empty ()) - { - if (! Vgud_mode) - std::cerr << "keyboard: "; - - std::cerr << msg << std::endl; - } + std::cerr << msg << std::endl; unwind_protect::frame_id_t uwp_frame = unwind_protect::begin_frame (); @@ -902,6 +897,12 @@ unwind_protect::add_fcn (octave_call_stack::restore_frame, octave_call_stack::current_frame ()); + // FIXME -- probably we just want to print one line, not the + // entire statement, which might span many lines... + // + // tree_print_code tpc (octave_stdout); + // stmt.accept (tpc); + Vsaving_history = true; Vdebugging = true; @@ -944,7 +945,7 @@ octave_call_stack::current_frame ()); // Skip the frame assigned to the keyboard function. - octave_call_stack::goto_frame_relative (0, true); + octave_call_stack::goto_frame_relative (0); do_keyboard (args); diff -r 25c2e92ee03c -r bbe033dcfe13 src/pt-eval.cc --- a/src/pt-eval.cc Tue Aug 04 12:59:16 2009 -0400 +++ b/src/pt-eval.cc Tue Aug 04 15:32:14 2009 -0400 @@ -57,9 +57,6 @@ bool tree_evaluator::in_loop_command = false; -int tree_evaluator::db_line = -1; -int tree_evaluator::db_column = -1; - // If TRUE, turn off printing of results in functions (as if a // semicolon has been appended to each statement). static bool Vsilent_functions = false; @@ -90,7 +87,7 @@ if (! error_state) { if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column ()); + do_breakpoint (cmd.is_breakpoint ()); tree_break_command::breaking = 1; } @@ -189,7 +186,7 @@ tree_evaluator::visit_global_command (tree_global_command& cmd) { if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column ()); + do_breakpoint (cmd.is_breakpoint ()); do_decl_init_list (do_global_init, cmd.initializer_list ()); } @@ -198,7 +195,7 @@ tree_evaluator::visit_static_command (tree_static_command& cmd) { if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column ()); + do_breakpoint (cmd.is_breakpoint ()); do_decl_init_list (do_static_init, cmd.initializer_list ()); } @@ -280,7 +277,7 @@ return; if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column ()); + do_breakpoint (cmd.is_breakpoint ()); unwind_protect::frame_id_t uwp_frame = unwind_protect::begin_frame (); @@ -402,7 +399,7 @@ return; if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column ()); + do_breakpoint (cmd.is_breakpoint ()); unwind_protect::frame_id_t uwp_frame = unwind_protect::begin_frame (); @@ -541,7 +538,7 @@ tree_expression *expr = tic->condition (); if (debug_mode && ! tic->is_else_clause ()) - do_breakpoint (tic->is_breakpoint (), tic->line (), tic->column ()); + do_breakpoint (tic->is_breakpoint ()); if (tic->is_else_clause () || expr->is_logically_true ("if")) { @@ -586,7 +583,7 @@ tree_evaluator::visit_no_op_command (tree_no_op_command& cmd) { if (debug_mode && cmd.is_end_of_fcn_or_script ()) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column (), true); + do_breakpoint (cmd.is_breakpoint (), true); } void @@ -625,7 +622,7 @@ if (! error_state) { if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), cmd.line (), cmd.column ()); + do_breakpoint (cmd.is_breakpoint ()); tree_return_command::returning = 1; } @@ -666,8 +663,7 @@ else { if (debug_mode) - do_breakpoint (expr->is_breakpoint (), expr->line (), - expr->column ()); + do_breakpoint (expr->is_breakpoint ()); if (in_fcn_or_script_body && Vsilent_functions) expr->set_print_flag (false); @@ -797,7 +793,7 @@ tree_switch_case *t = *p; if (debug_mode && ! t->is_default_case ()) - do_breakpoint (t->is_breakpoint (), t->line (), t->column ()); + do_breakpoint (t->is_breakpoint ()); if (t->is_default_case () || t->label_matches (val)) { @@ -1006,13 +1002,10 @@ if (! expr) panic_impossible (); - int l = expr->line (); - int c = expr->column (); - for (;;) { if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), l, c); + do_breakpoint (cmd.is_breakpoint ()); if (expr->is_logically_true ("while")) { @@ -1054,9 +1047,6 @@ if (! expr) panic_impossible (); - int l = expr->line (); - int c = expr->column (); - for (;;) { tree_statement_list *loop_body = cmd.body (); @@ -1073,7 +1063,7 @@ break; if (debug_mode) - do_breakpoint (cmd.is_breakpoint (), l, c); + do_breakpoint (cmd.is_breakpoint ()); if (expr->is_logically_true ("do-until")) break; @@ -1086,12 +1076,11 @@ void tree_evaluator::do_breakpoint (tree_statement& stmt) const { - do_breakpoint (stmt.is_breakpoint (), stmt.line (), stmt.column (), - stmt.is_end_of_fcn_or_script ()); + do_breakpoint (stmt.is_breakpoint (), stmt.is_end_of_fcn_or_script ()); } void -tree_evaluator::do_breakpoint (bool is_breakpoint, int l, int c, +tree_evaluator::do_breakpoint (bool is_breakpoint, bool is_end_of_fcn_or_script) const { bool break_on_this_statement = false; @@ -1160,25 +1149,7 @@ } if (break_on_this_statement) - { - octave_function *xfcn = octave_call_stack::current (); - - if (xfcn) - std::cerr << xfcn->name () << ": "; - - std::cerr << "line " << l << ", " << "column " << c << std::endl; - - db_line = l; - db_column = c; - - // FIXME -- probably we just want to print one line, not the - // entire statement, which might span many lines... - // - // tree_print_code tpc (octave_stdout); - // stmt.accept (tpc); - - do_keyboard (); - } + do_keyboard (); } DEFUN (silent_functions, args, nargout, diff -r 25c2e92ee03c -r bbe033dcfe13 src/pt-eval.h --- a/src/pt-eval.h Tue Aug 04 12:59:16 2009 -0400 +++ b/src/pt-eval.h Tue Aug 04 15:32:14 2009 -0400 @@ -132,10 +132,6 @@ void visit_do_until_command (tree_do_until_command&); - static int debug_line (void) { return db_line; } - - static int debug_column (void) { return db_column; } - // If > 0, stop executing at the (N-1)th stopping point, counting // from the the current execution point in the current frame. // @@ -160,12 +156,9 @@ void do_breakpoint (tree_statement& stmt) const; - void do_breakpoint (bool is_breakpoint, int l, int c, + void do_breakpoint (bool is_breakpoint, bool is_end_of_fcn_or_script = false) const; - static int db_line; - static int db_column; - // No copying! tree_evaluator (const tree_evaluator&); diff -r 25c2e92ee03c -r bbe033dcfe13 src/toplev.cc --- a/src/toplev.cc Tue Aug 04 12:59:16 2009 -0400 +++ b/src/toplev.cc Tue Aug 04 15:32:14 2009 -0400 @@ -104,7 +104,7 @@ int octave_call_stack::do_current_line (void) const { - tree_statement *stmt = do_top_statement (); + tree_statement *stmt = do_current_statement (); return stmt ? stmt->line () : -1; } @@ -112,7 +112,7 @@ int octave_call_stack::do_current_column (void) const { - tree_statement *stmt = do_top_statement (); + tree_statement *stmt = do_current_statement (); return stmt ? stmt->column () : -1; } diff -r 25c2e92ee03c -r bbe033dcfe13 src/toplev.h --- a/src/toplev.h Tue Aug 04 12:59:16 2009 -0400 +++ b/src/toplev.h Tue Aug 04 15:32:14 2009 -0400 @@ -135,10 +135,16 @@ } // Current function (top of stack). - static octave_function *current (void) { return top (); } + static octave_function *current (void) + { + return instance_ok () ? instance->do_current () : 0; + } // Current statement (top of stack). - static tree_statement *current_statement (void) { return top_statement (); } + static tree_statement *current_statement (void) + { + return instance_ok () ? instance->do_current_statement () : 0; + } // Current line in current function. static int current_line (void) @@ -226,16 +232,6 @@ instance->do_push (0, scope, context); } - static octave_function *top (void) - { - return instance_ok () ? instance->do_top (): 0; - } - - static tree_statement *top_statement (void) - { - return instance_ok () ? instance->do_top_statement (): 0; - } - static void set_statement (tree_statement *s) { if (instance_ok ()) @@ -358,26 +354,26 @@ symbol_table::set_scope_and_context (scope, context); } - octave_function *do_top (void) const + octave_function *do_current (void) const { octave_function *retval = 0; if (! cs.empty ()) { - const call_stack_elt& elt = cs.back (); + const call_stack_elt& elt = cs[curr_frame]; retval = elt.fcn; } return retval; } - tree_statement *do_top_statement (void) const + tree_statement *do_current_statement (void) const { tree_statement *retval = 0; if (! cs.empty ()) { - const call_stack_elt& elt = cs.back (); + const call_stack_elt& elt = cs[curr_frame]; retval = elt.stmt; }