diff src/symtab.cc @ 9413:5cd879a0d8c4

speed-up function call by caching its name lookup
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 01 Jul 2009 10:42:58 +0200
parents d8f9588c6ba1
children 2d73b19c5507
line wrap: on
line diff
--- a/src/symtab.cc	Wed Jul 01 08:37:24 2009 +0200
+++ b/src/symtab.cc	Wed Jul 01 10:42:58 2009 +0200
@@ -104,17 +104,29 @@
   octave_value retval;
 
   if (is_global ())
-    return symbol_table::global_varref (name ());
+    retval = symbol_table::global_varref (name ());
   else
     {
-      octave_value val = varval ();
+      retval = varval ();
 
-      if (val.is_defined ())
-	return val;
+      if (retval.is_undefined ())
+        {
+          // Use cached fcn_info pointer if possible.
+          if (rep->finfo)
+            retval = rep->finfo->find (args, arg_names,
+                                       evaluated_args, args_evaluated);
+          else
+            { 
+              retval = symbol_table::find_function (name (), args, arg_names,
+                                                    evaluated_args, args_evaluated);
+
+              if (retval.is_defined ())
+                rep->finfo = get_fcn_info (name ());
+            }
+        }
     }
 
-  return symbol_table::find_function (name (), args, arg_names,
-				      evaluated_args, args_evaluated);
+  return retval;
 }
 
 // Check the load path to see if file that defined this is still