Mercurial > octave
diff libinterp/interpfcn/toplev.cc @ 16354:fb27f1e08297
track line and column info directly in call stack (bug #38556)
* toplev.h, toplev.cc (octave_call_stack::call_stack_elt::line,
octave_call_stack::call_stack_elt::column): New data members.
(octave_call_stack::call_stack_elt::stmt): Delete.
Change all uses.
(octave_call_stack::set_location, octave_call_stack::do_set_location,
(octave_call_stack::set_line, octave_call_stack::do_set_line,
(octave_call_stack::set_column, octave_call_stack::do_set_column):
New functions.
(octave_call_stack::set_statement,
octave_call_stack::do_set_statement):
Delete. Change all callers to use set_location or set_line and
set_column.
* pt-eval.cc (tree_evaluator::visit_if_command): Never call
do_breakpoint here.
(tree_evaluator::visit_if_command_list): Set call stack location for
each if/elseif clause.
(tree_evaluator::visit_switch_command): Don't call do_breakpoint for
individual cases.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 21 Mar 2013 16:30:00 -0400 |
parents | bf8397caeff1 |
children | 8b783661e03f |
line wrap: on
line diff
--- a/libinterp/interpfcn/toplev.cc Thu Mar 21 07:45:04 2013 -0700 +++ b/libinterp/interpfcn/toplev.cc Thu Mar 21 16:30:00 2013 -0400 @@ -118,17 +118,29 @@ int octave_call_stack::do_current_line (void) const { - tree_statement *stmt = do_current_statement (); + int retval = -1; - return stmt ? stmt->line () : -1; + if (! cs.empty ()) + { + const call_stack_elt& elt = cs[curr_frame]; + retval = elt.line; + } + + return retval; } int octave_call_stack::do_current_column (void) const { - tree_statement *stmt = do_current_statement (); + int retval = -1; - return stmt ? stmt->column () : -1; + if (! cs.empty ()) + { + const call_stack_elt& elt = cs[curr_frame]; + retval = elt.column; + } + + return retval; } int @@ -146,11 +158,9 @@ if (f && f->is_user_code ()) { - tree_statement *stmt = elt.stmt; - - if (stmt) + if (elt.line > 0) { - retval = stmt->line (); + retval = elt.line; break; } } @@ -174,11 +184,9 @@ if (f && f->is_user_code ()) { - tree_statement *stmt = elt.stmt; - - if (stmt) + if (elt.column) { - retval = stmt->column (); + retval = elt.column; break; } } @@ -310,18 +318,8 @@ else name(k) = f->parent_fcn_name () + Vfilemarker + f->name (); - tree_statement *stmt = elt.stmt; - - if (stmt) - { - line(k) = stmt->line (); - column(k) = stmt->column (); - } - else - { - line(k) = -1; - column(k) = -1; - } + line(k) = elt.line; + column(k) = elt.column; k++; } @@ -352,17 +350,9 @@ octave_function *f = elt.fcn; std::string nm = f ? f->name () : std::string ("<unknown>"); - tree_statement *s = elt.stmt; - int l = -1; - int c = -1; - if (s) - { - l = s->line (); - c = s->column (); - } - octave_stdout << "stopped in " << nm - << " at line " << l << " column " << c + << " at line " << elt.line + << " column " << elt.column << " (" << elt.scope << "[" << elt.context << "])" << std::endl; } @@ -416,14 +406,8 @@ std::ostringstream buf; if (f) - { - tree_statement *s = elt.stmt; - - int l = s ? s->line () : -1; - - buf << "stopped in " << f->name () - << " at line " << l << std::endl; - } + buf << "stopped in " << f->name () + << " at line " << elt.line << std::endl; else buf << "at top level" << std::endl; @@ -509,7 +493,6 @@ const call_stack_elt& elt = cs.back (); octave_function *fcn = elt.fcn; - tree_statement *stmt = elt.stmt; std::string fcn_name = "?unknown?"; @@ -521,11 +504,8 @@ fcn_name = fcn->name (); } - int line = stmt ? stmt->line () : -1; - int column = stmt ? stmt->column () : -1; - error (" %s at line %d, column %d", - fcn_name.c_str (), line, column); + fcn_name.c_str (), elt.line, elt.column); } }