# HG changeset patch # User Jaroslav Hajek # Date 1270628158 -7200 # Node ID a6b64a7a37693c30f92e93c13a957b5e6ccb41e8 # Parent 077fef5da460989098e2cc21bfae9e2b63d6bb9f make feval work with overloaded handles diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,8 @@ +2010-04-07 Jaroslav Hajek + + * str-vec.h (string_vector::string_vector (const Array)): + New constructor. + 2010-04-06 Jaroslav Hajek * idx-vector.cc (idx_vector::complement): Rewrite. diff --git a/liboctave/str-vec.h b/liboctave/str-vec.h --- a/liboctave/str-vec.h +++ b/liboctave/str-vec.h @@ -51,6 +51,9 @@ string_vector (const std::set& lst); + string_vector (const Array& s) + : Array (s.as_column ()) { } + string_vector (const char * const *s); string_vector (const char * const *s, octave_idx_type n); diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2010-04-07 Jaroslav Hajek + + * oct-parse.yy (feval): Use do_multi_index_op on handles. + (get_feval_args): Use array slicing functions rather than loops. + 2010-04-06 Jaroslav Hajek * ov-base-sparse.cc (octave_base_sparse::delete_elements): Rewrite. diff --git a/src/oct-parse.yy b/src/oct-parse.yy --- a/src/oct-parse.yy +++ b/src/oct-parse.yy @@ -4057,28 +4057,13 @@ static octave_value_list get_feval_args (const octave_value_list& args) { - int tmp_nargin = args.length () - 1; - - octave_value_list retval (tmp_nargin, octave_value ()); - - for (int i = 0; i < tmp_nargin; i++) - retval(i) = args(i+1); + octave_value_list retval = args.slice (1, args.length () - 1); string_vector arg_names = args.name_tags (); - if (! arg_names.empty ()) + if (arg_names.length () > 1) { - // tmp_nargin and arg_names.length () - 1 may differ if - // we are passed all_va_args. - - int n = arg_names.length () - 1; - - int len = n > tmp_nargin ? tmp_nargin : n; - - string_vector tmp_arg_names (len); - - for (int i = 0; i < len; i++) - tmp_arg_names(i) = arg_names(i+1); + string_vector tmp_arg_names = arg_names.linear_slice (1, args.length () - 1); retval.stash_name_tags (tmp_arg_names); } @@ -4115,17 +4100,14 @@ retval = feval (name, tmp_args, nargout); } } - else + else if (f_arg.is_function_handle () || f_arg.is_inline_function ()) { - octave_function *fcn = f_arg.function_value (); - - if (fcn) - { - octave_value_list tmp_args = get_feval_args (args); - - retval = feval (fcn, tmp_args, nargout); - } + const octave_value_list tmp_args = get_feval_args (args); + + retval = f_arg.do_multi_index_op (nargout, tmp_args); } + else + error ("feval: first argument must be a string, inline function or a function handle"); } return retval;