changeset 16530:7ca7e7d5eb91

remove breakpoints when clearing function * pt-stmt.h, pt-stmt.cc (tree_statement_list::add_breakpoint, tree_statement_list::remove_all_breakpoints): New functions. * debug.cc (bp_table::do_add_breakpoint): Call cmds->remove_all_breakpoints. (bp_table::do_remove_all_breakpoints_in_file): Call cmds->remove_all_breakpoints. * ov-usr-fcn.cc (octave_user_script::~octave_user_script, octave_user_function::~octave_user_function): Call cmd_list->remove_all_breakpoints.
author John W. Eaton <jwe@octave.org>
date Wed, 17 Apr 2013 02:54:40 -0400
parents faccc20d5f39
children f3a63fdbd725
files libinterp/interpfcn/debug.cc libinterp/octave-value/ov-usr-fcn.cc libinterp/parse-tree/pt-stmt.cc libinterp/parse-tree/pt-stmt.h
diffstat 4 files changed, 75 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/interpfcn/debug.cc	Wed Apr 17 00:57:07 2013 -0400
+++ b/libinterp/interpfcn/debug.cc	Wed Apr 17 02:54:40 2013 -0400
@@ -280,38 +280,16 @@
 {
   intmap retval;
 
-  octave_idx_type len = line.size ();
-
   octave_user_code *dbg_fcn = get_user_code (fname);
 
   if (dbg_fcn)
     {
       tree_statement_list *cmds = dbg_fcn->body ();
 
-      if (cmds)
-        {
-          for (int i = 0; i < len; i++)
-            {
-              const_intmap_iterator p = line.find (i);
-
-              if (p != line.end ())
-                {
-                  int lineno = p->second;
-
-                  retval[i] = cmds->set_breakpoint (lineno);
+      std::string file = dbg_fcn->fcn_file_name ();
 
-                  if (retval[i] != 0)
-                    {
-                      bp_set.insert (fname);
-
-                      std::string file = dbg_fcn->fcn_file_name ();
-
-                      if (! file.empty ())
-                        octave_link::update_breakpoint (true, file, retval[i]);
-                    }
-                }
-            }
-        }
+      if (cmds)
+        retval = cmds->add_breakpoint (file, line);
     }
   else
     error ("add_breakpoint: unable to find the requested function\n");
@@ -345,6 +323,8 @@
 
           tree_statement_list *cmds = dbg_fcn->body ();
 
+          // FIXME -- move the operation on cmds to the
+          // tree_statement_list class?
           if (cmds)
             {
               octave_value_list results = cmds->list_breakpoints ();
@@ -402,17 +382,7 @@
 
       if (cmds)
         {
-          octave_value_list bkpts = cmds->list_breakpoints ();
-
-          for (int i = 0; i < bkpts.length (); i++)
-            {
-              int lineno = static_cast<int> (bkpts(i).int_value ());
-              cmds->delete_breakpoint (lineno);
-              retval[i] = lineno;
-
-              if (! file.empty ())
-                octave_link::update_breakpoint (false, file, lineno);
-            }
+          retval = cmds->remove_all_breakpoints (file);
 
           bp_set_iterator it = bp_set.find (fname);
           if (it != bp_set.end ())
@@ -473,6 +443,8 @@
             {
               tree_statement_list *cmds = f->body ();
 
+              // FIXME -- move the operation on cmds to the
+              // tree_statement_list class?
               if (cmds)
                 {
                   octave_value_list bkpts = cmds->list_breakpoints ();
--- a/libinterp/octave-value/ov-usr-fcn.cc	Wed Apr 17 00:57:07 2013 -0400
+++ b/libinterp/octave-value/ov-usr-fcn.cc	Wed Apr 17 02:54:40 2013 -0400
@@ -97,6 +97,9 @@
 
 octave_user_script::~octave_user_script (void)
 {
+  if (cmd_list)
+    cmd_list->remove_all_breakpoints (file_name);
+
   delete cmd_list;
 }
 
@@ -207,6 +210,9 @@
 
 octave_user_function::~octave_user_function (void)
 {
+  if (cmd_list)
+    cmd_list->remove_all_breakpoints (file_name);
+
   delete param_list;
   delete ret_list;
   delete cmd_list;
--- a/libinterp/parse-tree/pt-stmt.cc	Wed Apr 17 00:57:07 2013 -0400
+++ b/libinterp/parse-tree/pt-stmt.cc	Wed Apr 17 02:54:40 2013 -0400
@@ -32,6 +32,7 @@
 #include "error.h"
 #include "gripes.h"
 #include "ov.h"
+#include "octave-link.h"
 #include "oct-lvalue.h"
 #include "input.h"
 #include "pager.h"
@@ -191,6 +192,60 @@
   return tbp.get_list ();
 }
 
+bp_table::intmap
+tree_statement_list::add_breakpoint (const std::string& file,
+                                     const bp_table::intmap& line)
+{
+  bp_table::intmap retval;
+
+  octave_idx_type len = line.size ();
+
+  for (int i = 0; i < len; i++)
+    {
+      const_intmap_iterator p = line.find (i);
+
+      if (p != line.end ())
+        {
+          int lineno = p->second;
+
+          retval[i] = set_breakpoint (lineno);
+
+          if (retval[i] != 0)
+            {
+              bp_set.insert (fname);
+
+              if (! file.empty ())
+                octave_link::update_breakpoint (true, file, retval[i]);
+            }
+        }
+    }
+
+  return retval;
+}
+
+bp_table::intmap
+tree_statement_list::remove_all_breakpoints (const std::string& file)
+{
+  bp_table::intmap retval;
+
+  octave_value_list bkpts = list_breakpoints ();
+
+  for (int i = 0; i < bkpts.length (); i++)
+    {
+      int lineno = static_cast<int> (bkpts(i).int_value ());
+
+      delete_breakpoint (lineno);
+
+      retval[i] = lineno;
+
+      if (! file.empty ())
+        octave_link::update_breakpoint (false, file, lineno);
+    }
+
+  return retval;
+}
+
+
 tree_statement_list *
 tree_statement_list::dup (symbol_table::scope_id scope,
                           symbol_table::context_id context) const
--- a/libinterp/parse-tree/pt-stmt.h	Wed Apr 17 00:57:07 2013 -0400
+++ b/libinterp/parse-tree/pt-stmt.h	Wed Apr 17 02:54:40 2013 -0400
@@ -34,6 +34,7 @@
 
 #include "base-list.h"
 #include "comment-list.h"
+#include "debug.h"
 #include "symtab.h"
 #include "pt.h"
 
@@ -160,6 +161,11 @@
 
   octave_value_list list_breakpoints (void);
 
+  bp_table::intmap add_breakpoint (const std::string& file,
+                                   const bp_table::intmap& line);
+
+  bp_table::intmap remove_all_breakpoints (const std::string& file);
+
   tree_statement_list *dup (symbol_table::scope_id scope,
                             symbol_table::context_id context) const;