# HG changeset patch # User jwe # Date 1142285407 0 # Node ID 775e065f7dc404487593ff7edd977c5421d174c8 # Parent 1c334f7e7bef1d5e91ac367a2ff18bce7c4d8d3e [project @ 2006-03-13 21:30:06 by jwe] diff -r 1c334f7e7bef -r 775e065f7dc4 src/ChangeLog --- a/src/ChangeLog Fri Mar 10 20:27:00 2006 +0000 +++ b/src/ChangeLog Mon Mar 13 21:30:07 2006 +0000 @@ -1,3 +1,10 @@ +2006-03-13 John W. Eaton + + * variables.cc (fcn_out_of_date): No longer static. + * ov-fcn-handle.cc (warn_reload): New function. + (octave_fcn_handle::subsref): Implement basic logic for updating + when pointed-to function changes. + 2006-03-10 John W. Eaton * xpow.cc (elem_xpow): Only use complex pow if really necessary. diff -r 1c334f7e7bef -r 775e065f7dc4 src/ov-fcn-handle.cc --- a/src/ov-fcn-handle.cc Fri Mar 10 20:27:00 2006 +0000 +++ b/src/ov-fcn-handle.cc Mon Mar 13 21:30:07 2006 +0000 @@ -31,6 +31,7 @@ #include "defun.h" #include "error.h" #include "gripes.h" +#include "input.h" #include "oct-map.h" #include "ov-base.h" #include "ov-fcn-handle.h" @@ -56,6 +57,18 @@ "function handle", "function handle"); +void +octave_fcn_handle::reload_warning (const std::string& fcn_type) const +{ + if (warn_reload) + { + warn_reload = false; + + warning ("reloading %s functions referenced by function handles is not implemented", + fcn_type.c_str ()); + } +} + octave_value_list octave_fcn_handle::subsref (const std::string& type, const std::list& idx, @@ -69,20 +82,35 @@ { octave_function *f = function_value (); - // XXX FIXME XXX -- need to check to see if the function has a - // new definition. The following does not work for function - // handles that refer to subfunctions or functions defined on - // the command line. - // - // if (function_out_of_date (f)) - // { - // octave_value tmp = lookup_function (fcn_name ()); - // - // octave_function *ftmp = tmp.function_value (true); - // - // if (ftmp) - // f = ftmp; - // } + if (f && f->time_checked () < Vlast_prompt_time) + { + std::string ff_nm = f->fcn_file_name (); + + time_t tp = f->time_parsed (); + + if (ff_nm.empty ()) + { + // XXX FIXME XXX -- need to handle inline and + // command-line functions here. + } + else + { + if (fcn_out_of_date (f, ff_nm, tp)) + { + // XXX FIXME XXX -- there is currently no way to + // parse a .m file or reload a .oct file that + // leaves the fbi symbol table untouched. We need + // a function that will parse the file and return + // a pointer to the new function definition + // without altering the symbol table. + + if (f->is_nested_function ()) + reload_warning ("nested"); + else + reload_warning ("functions"); + } + } + } if (f) retval = f->subsref (type, idx, nargout); diff -r 1c334f7e7bef -r 775e065f7dc4 src/ov-fcn-handle.h --- a/src/ov-fcn-handle.h Fri Mar 10 20:27:00 2006 +0000 +++ b/src/ov-fcn-handle.h Mon Mar 13 21:30:07 2006 +0000 @@ -41,16 +41,17 @@ { public: octave_fcn_handle (void) - : fcn (), nm () { } + : warn_reload (true), fcn (), nm () { } octave_fcn_handle (const std::string& n) - : fcn (), nm (n) { } + : warn_reload (true), fcn (), nm (n) { } octave_fcn_handle (const octave_value& f, const std::string& n) - : fcn (f), nm (n) { } + : warn_reload (true), fcn (f), nm (n) { } octave_fcn_handle (const octave_fcn_handle& fh) - : octave_base_value (fh), fcn (fh.fcn), nm (fh.nm) { } + : octave_base_value (fh), warn_reload (fh.warn_reload), + fcn (fh.fcn), nm (fh.nm) { } ~octave_fcn_handle (void) { } @@ -109,6 +110,13 @@ DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA + // If TRUE, print a warning if the pointed-to fucntion is out of + // date. This variable may be removed when updating is properly + // implemented. + mutable bool warn_reload; + + void reload_warning (const std::string& fcn_type) const; + protected: // The function we are handling. diff -r 1c334f7e7bef -r 775e065f7dc4 src/variables.cc --- a/src/variables.cc Fri Mar 10 20:27:00 2006 +0000 +++ b/src/variables.cc Mon Mar 13 21:30:07 2006 +0000 @@ -980,7 +980,7 @@ return (f_fs.ino () == g_fs.ino () && f_fs.dev () == g_fs.dev ()); } -static bool +bool fcn_out_of_date (octave_function *fcn, const std::string& ff, time_t tp) { bool retval = false; diff -r 1c334f7e7bef -r 775e065f7dc4 src/variables.h --- a/src/variables.h Fri Mar 10 20:27:00 2006 +0000 +++ b/src/variables.h Mon Mar 13 21:30:07 2006 +0000 @@ -82,6 +82,9 @@ extern std::string unique_symbol_name (const std::string& basename); +extern bool +fcn_out_of_date (octave_function *fcn, const std::string& ff, time_t tp); + extern bool lookup (symbol_record *s, bool exec_script = true); extern symbol_record *