diff src/symtab.h @ 7489:8e4592e49fa7

don't clear locked functions
author John W. Eaton <jwe@octave.org>
date Mon, 18 Feb 2008 14:54:10 -0500
parents 4ff9611147ba
children 40c428ea3408
line wrap: on
line diff
--- a/src/symtab.h	Fri Feb 15 19:54:25 2008 -0500
+++ b/src/symtab.h	Mon Feb 18 14:54:10 2008 -0500
@@ -407,28 +407,56 @@
 	built_in_function = f;
       }
 
-      void clear (void)
+      template <class T>
+      void
+      clear_unlocked (std::map<T, octave_value>& map)
       {
-	subfunctions.clear ();
-	private_functions.clear ();
-	class_constructors.clear ();
-	class_methods.clear ();
-	cmdline_function = octave_value ();
-	autoload_function = octave_value ();
-	function_on_path = octave_value ();
+	typename std::map<T, octave_value>::iterator p = map.begin ();
+
+	while (p != map.end ())
+	  {
+	    if (p->second.islocked ())
+	      p++;
+	    else
+	      map.erase (p++);
+	  }
+      }
+
+      void clear_cmdline_function (void)
+      {
+	if (! cmdline_function.islocked ())
+	  cmdline_function = octave_value ();
+      }
+
+      void clear_autoload_function (void)
+      {
+	if (! autoload_function.islocked ())
+	  autoload_function = octave_value ();
       }
 
       // FIXME -- should this also clear the cmdline and other "user
       // defined" functions?
       void clear_user_function (void)
       {
-	function_on_path = octave_value ();
+	if (! function_on_path.islocked ())
+	  function_on_path = octave_value ();
       }
 
       void clear_mex_function (void)
       {
 	if (function_on_path.is_mex_function ())
-	  function_on_path = octave_value ();
+	  clear_user_function ();
+      }
+
+      void clear (void)
+      {
+	clear_unlocked (subfunctions);
+	clear_unlocked (private_functions);
+	clear_unlocked (class_constructors);
+	clear_unlocked (class_methods);
+	clear_cmdline_function ();
+	clear_autoload_function ();
+	clear_user_function ();
       }
 
       void add_dispatch (const std::string& type, const std::string& fname)