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