Mercurial > octave
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