Mercurial > octave-nkf
diff libinterp/interpfcn/toplev.h @ 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 | a7669b4d27f6 |
children | 8b783661e03f |
line wrap: on
line diff
--- a/libinterp/interpfcn/toplev.h Thu Mar 21 07:45:04 2013 -0700 +++ b/libinterp/interpfcn/toplev.h Thu Mar 21 16:30:00 2013 -0400 @@ -84,14 +84,17 @@ { call_stack_elt (octave_function *f, symbol_table::scope_id s, symbol_table::context_id c, size_t p = 0) - : fcn (f), stmt (0), scope (s), context (c), prev (p) { } + : fcn (f), line (-1), column (-1), scope (s), context (c), prev (p) + { } call_stack_elt (const call_stack_elt& elt) - : fcn (elt.fcn), stmt (elt.stmt), scope (elt.scope), - context (elt.context), prev (elt.prev) { } + : fcn (elt.fcn), line (elt.line), column (elt.column), + scope (elt.scope), context (elt.context), prev (elt.prev) + { } octave_function *fcn; - tree_statement *stmt; + int line; + int column; symbol_table::scope_id scope; symbol_table::context_id context; size_t prev; @@ -134,12 +137,6 @@ return instance_ok () ? instance->do_current () : 0; } - // Current statement (top of stack). - 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,10 +223,22 @@ instance->do_push (0, scope, context); } - static void set_statement (tree_statement *s) + static void set_location (int l, int c) { if (instance_ok ()) - instance->do_set_statement (s); + instance->do_set_location (l, c); + } + + static void set_line (int l) + { + if (instance_ok ()) + instance->do_set_line (l); + } + + static void set_column (int c) + { + if (instance_ok ()) + instance->do_set_column (c); } static bool goto_frame (size_t n = 0, bool verbose = false) @@ -365,25 +374,34 @@ return retval; } - tree_statement *do_current_statement (void) const - { - tree_statement *retval = 0; - - if (! cs.empty ()) - { - const call_stack_elt& elt = cs[curr_frame]; - retval = elt.stmt; - } - - return retval; - } - - void do_set_statement (tree_statement *s) + void do_set_location (int l, int c) { if (! cs.empty ()) { call_stack_elt& elt = cs.back (); - elt.stmt = s; + + elt.line = l; + elt.column = c; + } + } + + void do_set_line (int l) + { + if (! cs.empty ()) + { + call_stack_elt& elt = cs.back (); + + elt.line = l; + } + } + + void do_set_column (int c) + { + if (! cs.empty ()) + { + call_stack_elt& elt = cs.back (); + + elt.column = c; } }