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);
     }
 }