# HG changeset patch # User Jaroslav Hajek # Date 1246437778 -7200 # Node ID 5cd879a0d8c4500a9450af50b0f25f71258e4c16 # Parent ddcc0da700b8898d85dcbbee54b50006429e9076 speed-up function call by caching its name lookup diff -r ddcc0da700b8 -r 5cd879a0d8c4 src/ChangeLog --- a/src/ChangeLog Wed Jul 01 08:37:24 2009 +0200 +++ b/src/ChangeLog Wed Jul 01 10:42:58 2009 +0200 @@ -1,3 +1,10 @@ +2009-07-01 Jaroslav Hajek + + * symtab.h (symbol_table::get_fcn_info): New private static method. + (symbol_record_rep::finfo): New field. + * symtab.cc (symbol_record::find): Use cached finfo if possible, + cache on successful queries. + 2008-07-01 David Bateman * pr-output.cc (static inline std::string rational_approx (double, diff -r ddcc0da700b8 -r 5cd879a0d8c4 src/symtab.cc --- 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 diff -r ddcc0da700b8 -r 5cd879a0d8c4 src/symtab.h --- a/src/symtab.h Wed Jul 01 08:37:24 2009 +0200 +++ b/src/symtab.h Wed Jul 01 10:42:58 2009 +0200 @@ -155,6 +155,8 @@ } }; + class fcn_info; + class symbol_record { @@ -194,7 +196,7 @@ symbol_record_rep (const std::string& nm, const octave_value& v, unsigned int sc) - : name (nm), value_stack (), storage_class (sc), count (1) + : name (nm), value_stack (), storage_class (sc), finfo (), count (1) { value_stack.push_back (v); } @@ -372,6 +374,8 @@ unsigned int storage_class; + fcn_info *finfo; + size_t count; private: @@ -1988,6 +1992,12 @@ } } + static fcn_info *get_fcn_info (const std::string& name) + { + fcn_table_iterator p = fcn_table.find (name); + return p != fcn_table.end () ? &p->second : 0; + } + octave_value do_find (const std::string& name, tree_argument_list *args, const string_vector& arg_names,