Mercurial > hg > octave-lyh
diff src/variables.cc @ 10637:9cd5aa83fa62
implement 'local' parameter to pseudo-variables
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 17 May 2010 13:46:57 +0200 |
parents | 4d1fc073fbb7 |
children | e1559a8a60b4 |
line wrap: on
line diff
--- a/src/variables.cc +++ b/src/variables.cc @@ -638,6 +638,42 @@ // Variable values. +static bool +wants_local_change (const octave_value_list& args, int& nargin) +{ + bool retval = false; + + if (nargin == 2) + { + if (args(1).is_string () && args(1).string_value () == "local") + { + nargin = 1; + retval = true; + } + else + { + error_with_cfn ("expecting second argument to be \"local\""); + nargin = 0; + } + } + + return retval; +} + +template <class T> +bool try_local_protect (T& var) +{ + octave_user_code *curr_usr_code = octave_call_stack::caller_user_code (); + octave_user_function *curr_usr_fcn = 0; + if (curr_usr_code && curr_usr_code->is_user_function ()) + curr_usr_fcn = dynamic_cast<octave_user_function *> (curr_usr_code); + + if (curr_usr_fcn && curr_usr_fcn->local_protect (var)) + return true; + else + return false; +} + octave_value set_internal_variable (bool& var, const octave_value_list& args, int nargout, const char *nm) @@ -649,6 +685,12 @@ if (nargout > 0 || nargin == 0) retval = var; + if (wants_local_change (args, nargin)) + { + if (! try_local_protect (var)) + warning ("\"local\" has no effect outside a function"); + } + if (nargin == 1) { bool bval = args(0).bool_value (); @@ -675,6 +717,12 @@ if (nargout > 0 || nargin == 0) retval = var; + if (wants_local_change (args, nargin)) + { + if (! try_local_protect (var)) + warning ("\"local\" has no effect outside a function"); + } + if (nargin == 1) { std::string sval = args(0).string_value (); @@ -717,6 +765,12 @@ if (nargout > 0 || nargin == 0) retval = var; + if (wants_local_change (args, nargin)) + { + if (! try_local_protect (var)) + warning ("\"local\" has no effect outside a function"); + } + if (nargin == 1) { int ival = args(0).int_value (); @@ -752,6 +806,12 @@ if (nargout > 0 || nargin == 0) retval = var; + if (wants_local_change (args, nargin)) + { + if (! try_local_protect (var)) + warning ("\"local\" has no effect outside a function"); + } + if (nargin == 1) { double dval = args(0).scalar_value (); @@ -785,6 +845,12 @@ if (nargout > 0 || nargin == 0) retval = var; + if (wants_local_change (args, nargin)) + { + if (! try_local_protect (var)) + warning ("\"local\" has no effect outside a function"); + } + if (nargin == 1) { std::string sval = args(0).string_value ();