Mercurial > octave
changeset 23502:c6714ae1c06c
eliminate remaining do_multi_index_op methods
For function (and function-like) objects, define a call meethod
instead of do_multi_index_op. For data value objects, remove
do_multi_index_op as it is no longer used for indexing operations.
* ov-fcn.h (octave_function::call): New pure virtual function.
* ov-builtin.cc, ov-builtin.h (octave_builtin::call):
Rename from do_multi_index_op. Change all uses.
* ov-mex-fcn.cc, ov-mex-fcn.h (octave_mex_function::call):
Rename from do_multi_index_op. Change all uses.
* ov-usr-fcn.cc, ov-usr-fcn.h (octave_user_script::call):
Rename from do_multi_index_op. Change all uses.
(octave_user_fcn::call): Likewise.
* ov-classdef.cc (octave_classdef_meta::call):
Rename from do_multi_index_op. Change all uses.
(octave_classdef_superclass_ref::call): Likewise.
* ov-fcn-handle.cc, ov-fcn-handle.h (octave_fcn_handle::call):
Rename from do_multi_index_op. Now a protected virtual function.
(octave_fcn_binder::call): Rename from do_multi_index_op. Now a
protected function.
* ov-class.h (octave_class::do_multi_index_op): Delete.
* ov-base-mat.h (octave_base_matrix::do_multi_index_op): Delete.
* ov-base-scalar.h (octave_base_scalar::do_multi_index_op): Delete.
* ov-base.cc, ov-base.h (octave_base_value::do_multi_index_op):
Delete.
* ov.cc, ov.h (octave_value::do_multi_index_op): Delete.
* oct-parse.in.yy (source_file): Use call instead of
do_multi_index_op.
(feval (const std::string&, const octave_value_list&, int)): Likewise.
(feval (octave_function *, const octave_value_list&, int)): Likewise.
(feval (octave_value&, const octave_value_list&, int)): Instead of
do_multi_index_op, use call for function objects and subsref for
function_handle objects. Also handle named functions.
(feval (const octave_value_list&, int)): Simply extract first argument
and forward to feval (octave_value&, const octave_value_list&, int).
* pt-eval.cc (tree_evaluator::visit_identifier,
tree_evaluator::visit_index_expression,
tree_evaluator::visit_funcall): Use call instead of do_multi_index_op.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 17 May 2017 14:34:05 -0400 |
parents | 1ee4b394a687 |
children | 6a2fed2d39ac |
files | libinterp/octave-value/ov-base-mat.h libinterp/octave-value/ov-base-scalar.h libinterp/octave-value/ov-base.cc libinterp/octave-value/ov-base.h libinterp/octave-value/ov-builtin.cc libinterp/octave-value/ov-builtin.h libinterp/octave-value/ov-class.h libinterp/octave-value/ov-classdef.cc libinterp/octave-value/ov-fcn-handle.cc libinterp/octave-value/ov-fcn-handle.h libinterp/octave-value/ov-fcn.h libinterp/octave-value/ov-mex-fcn.cc libinterp/octave-value/ov-mex-fcn.h libinterp/octave-value/ov-usr-fcn.cc libinterp/octave-value/ov-usr-fcn.h libinterp/octave-value/ov.cc libinterp/octave-value/ov.h libinterp/parse-tree/oct-parse.in.yy libinterp/parse-tree/parse.h libinterp/parse-tree/pt-eval.cc |
diffstat | 20 files changed, 76 insertions(+), 119 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/octave-value/ov-base-mat.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-base-mat.h Wed May 17 14:34:05 2017 -0400 @@ -89,9 +89,6 @@ octave_value do_index_op (const octave_value_list& idx, bool resize_ok = false); - octave_value_list do_multi_index_op (int, const octave_value_list& idx) - { return do_index_op (idx); } - // FIXME: should we import the functions from the base class and // overload them here, or should we use a different name so we don't // have to do this? Without the using declaration or a name change,
--- a/libinterp/octave-value/ov-base-scalar.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-base-scalar.h Wed May 17 14:34:05 2017 -0400 @@ -72,9 +72,6 @@ const std::list<octave_value_list>& idx, const octave_value& rhs); - octave_value_list do_multi_index_op (int, const octave_value_list& idx) - { return do_index_op (idx); } - bool is_constant (void) const { return true; } bool is_defined (void) const { return true; }
--- a/libinterp/octave-value/ov-base.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-base.cc Wed May 17 14:34:05 2017 -0400 @@ -245,13 +245,6 @@ error ("can't perform indexing operations for %s type", nm.c_str ()); } -octave_value_list -octave_base_value::do_multi_index_op (int, const octave_value_list&) -{ - std::string nm = type_name (); - error ("can't perform indexing operations for %s type", nm.c_str ()); -} - idx_vector octave_base_value::index_vector (bool /* require_integers */) const {
--- a/libinterp/octave-value/ov-base.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-base.h Wed May 17 14:34:05 2017 -0400 @@ -278,9 +278,6 @@ virtual octave_value do_index_op (const octave_value_list& idx, bool resize_ok = false); - virtual octave_value_list - do_multi_index_op (int nargout, const octave_value_list& idx); - virtual void assign (const std::string&, const octave_value&) { } virtual octave_value
--- a/libinterp/octave-value/ov-builtin.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-builtin.cc Wed May 17 14:34:05 2017 -0400 @@ -52,7 +52,7 @@ { int tmp_nargout = (type.length () > 1 && nargout == 0) ? 1 : nargout; - retval = do_multi_index_op (tmp_nargout, idx.front ()); + retval = call (tmp_nargout, idx.front ()); } break; @@ -85,7 +85,7 @@ } octave_value_list -octave_builtin::do_multi_index_op (int nargout, const octave_value_list& args) +octave_builtin::call (int nargout, const octave_value_list& args) { octave_value_list retval;
--- a/libinterp/octave-value/ov-builtin.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-builtin.h Wed May 17 14:34:05 2017 -0400 @@ -81,8 +81,7 @@ bool is_builtin_function (void) const { return true; } - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& args); + octave_value_list call (int nargout, const octave_value_list& args); jit_type * to_jit (void) const;
--- a/libinterp/octave-value/ov-class.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-class.h Wed May 17 14:34:05 2017 -0400 @@ -94,12 +94,6 @@ const std::list<octave_value_list>& idx, int nargout); - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& idx) - { - return subsref ("(", std::list<octave_value_list> (1, idx), nargout); - } - static octave_value numeric_conv (const Cell& val, const std::string& type);
--- a/libinterp/octave-value/ov-classdef.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-classdef.cc Wed May 17 14:34:05 2017 -0400 @@ -1021,8 +1021,7 @@ return (retval.length () > 0 ? retval(0) : octave_value ()); } - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& idx) + octave_value_list call (int nargout, const octave_value_list& idx) { // Emulate ()-type meta subsref @@ -1084,11 +1083,10 @@ { case '(': skip = 1; - retval = do_multi_index_op (type.length () > 1 ? 1 : nargout, - idx.front ()); + retval = call (type.length () > 1 ? 1 : nargout, idx.front ()); break; default: - retval = do_multi_index_op (1, octave_value_list ()); + retval = call (1, octave_value_list ()); break; } @@ -1111,7 +1109,7 @@ } octave_value_list - do_multi_index_op (int nargout, const octave_value_list& idx) + call (int nargout, const octave_value_list& idx) { octave_value_list retval;
--- a/libinterp/octave-value/ov-fcn-handle.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-fcn-handle.cc Wed May 17 14:34:05 2017 -0400 @@ -104,7 +104,7 @@ { int tmp_nargout = (type.length () > 1 && nargout == 0) ? 1 : nargout; - retval = do_multi_index_op (tmp_nargout, idx.front ()); + retval = call (tmp_nargout, idx.front ()); } break; @@ -131,8 +131,7 @@ } octave_value_list -octave_fcn_handle::do_multi_index_op (int nargout, - const octave_value_list& args) +octave_fcn_handle::call (int nargout, const octave_value_list& args) { octave_value_list retval; @@ -2068,8 +2067,7 @@ */ octave_value_list -octave_fcn_binder::do_multi_index_op (int nargout, - const octave_value_list& args) +octave_fcn_binder::call (int nargout, const octave_value_list& args) { octave_value_list retval; @@ -2088,7 +2086,7 @@ retval = octave::feval (root_handle, tmp, nargout); } else - retval = octave_fcn_handle::do_multi_index_op (nargout, args); + retval = octave_fcn_handle::call (nargout, args); return retval; }
--- a/libinterp/octave-value/ov-fcn-handle.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-fcn-handle.h Wed May 17 14:34:05 2017 -0400 @@ -90,9 +90,6 @@ const std::list<octave_value_list>& idx, int nargout); - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& args); - bool is_defined (void) const { return true; } bool is_function_handle (void) const { return true; } @@ -177,6 +174,8 @@ // Overloads for other classes. str_ov_map overloads; + virtual octave_value_list call (int nargout, const octave_value_list& args); + friend octave_value make_fcn_handle (const std::string &, bool); }; @@ -199,10 +198,9 @@ static octave_fcn_handle * maybe_binder (const octave_value& f, octave::tree_evaluator *tw); - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& args); +protected: -protected: + octave_value_list call (int nargout, const octave_value_list& args); octave_value root_handle; octave_value_list arg_template;
--- a/libinterp/octave-value/ov-fcn.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-fcn.h Wed May 17 14:34:05 2017 -0400 @@ -198,6 +198,10 @@ virtual bool is_postfix_index_handled (char type) const { return (type == '(' || type == '{'); } + virtual octave_value_list + call (int nargout = 0, + const octave_value_list& args = octave_value_list ()) = 0; + protected: octave_function (const std::string& nm,
--- a/libinterp/octave-value/ov-mex-fcn.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-mex-fcn.cc Wed May 17 14:34:05 2017 -0400 @@ -90,7 +90,7 @@ { int tmp_nargout = (type.length () > 1 && nargout == 0) ? 1 : nargout; - retval = do_multi_index_op (tmp_nargout, idx.front ()); + retval = call (tmp_nargout, idx.front ()); } break; @@ -128,8 +128,7 @@ int nargout); octave_value_list -octave_mex_function::do_multi_index_op (int nargout, - const octave_value_list& args) +octave_mex_function::call (int nargout, const octave_value_list& args) { octave_value_list retval;
--- a/libinterp/octave-value/ov-mex-fcn.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-mex-fcn.h Wed May 17 14:34:05 2017 -0400 @@ -91,8 +91,7 @@ bool is_mex_function (void) const { return true; } - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& args); + octave_value_list call (int nargout, const octave_value_list& args); void atexit (void (*fcn) (void)) { m_exit_fcn_ptr = fcn; }
--- a/libinterp/octave-value/ov-usr-fcn.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-usr-fcn.cc Wed May 17 14:34:05 2017 -0400 @@ -119,8 +119,7 @@ } octave_value_list -octave_user_script::do_multi_index_op (int nargout, - const octave_value_list& args) +octave_user_script::call (int nargout, const octave_value_list& args) { octave_value_list retval; @@ -418,7 +417,7 @@ { int tmp_nargout = (type.length () > 1 && nargout == 0) ? 1 : nargout; - retval = do_multi_index_op (tmp_nargout, idx.front ()); + retval = call (tmp_nargout, idx.front ()); } break; @@ -445,8 +444,7 @@ } octave_value_list -octave_user_function::do_multi_index_op (int nargout, - const octave_value_list& _args) +octave_user_function::call (int nargout, const octave_value_list& _args) { octave_value_list retval;
--- a/libinterp/octave-value/ov-usr-fcn.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov-usr-fcn.h Wed May 17 14:34:05 2017 -0400 @@ -145,8 +145,7 @@ const std::list<octave_value_list>& idx, int nargout); - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& args); + octave_value_list call (int nargout, const octave_value_list& args); octave::tree_statement_list * body (void) { return cmd_list; } @@ -371,8 +370,7 @@ const std::list<octave_value_list>& idx, int nargout); - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& args); + octave_value_list call (int nargout, const octave_value_list& args); octave::tree_parameter_list * parameter_list (void) { return param_list; }
--- a/libinterp/octave-value/ov.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov.cc Wed May 17 14:34:05 2017 -0400 @@ -1445,10 +1445,7 @@ octave_value::subsref (const std::string& type, const std::list<octave_value_list>& idx, int nargout) { - if (nargout == 1) - return rep->subsref (type, idx); - else - return rep->subsref (type, idx, nargout); + return rep->subsref (type, idx, nargout); } octave_value @@ -1499,12 +1496,6 @@ return *this; } -octave_value_list -octave_value::do_multi_index_op (int nargout, const octave_value_list& idx) -{ - return rep->do_multi_index_op (nargout, idx); -} - octave_value octave_value::subsasgn (const std::string& type, const std::list<octave_value_list>& idx,
--- a/libinterp/octave-value/ov.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/octave-value/ov.h Wed May 17 14:34:05 2017 -0400 @@ -448,9 +448,6 @@ bool resize_ok = false) { return rep->do_index_op (idx, resize_ok); } - octave_value_list - do_multi_index_op (int nargout, const octave_value_list& idx); - octave_value subsasgn (const std::string& type, const std::list<octave_value_list>& idx, const octave_value& rhs);
--- a/libinterp/parse-tree/oct-parse.in.yy Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/parse-tree/oct-parse.in.yy Wed May 17 14:34:05 2017 -0400 @@ -4802,16 +4802,13 @@ error ("source: %s is not a script", full_name.c_str ()); } - // Parameter checking is over. Now run. - octave_value_list args; - if (verbose) { std::cout << "executing commands from " << full_name << " ... "; std::cout.flush (); } - fcn->do_multi_index_op (0, args); + fcn->call (); if (verbose) std::cout << "done." << std::endl; @@ -4939,7 +4936,11 @@ octave_value fcn = symbol_table::find_function (name, args); if (fcn.is_defined ()) - retval = fcn.do_multi_index_op (nargout, args); + { + octave_function *of = fcn.function_value (); + + retval = of->call (nargout, args); + } else error ("feval: function '%s' not found", name.c_str ()); @@ -4947,21 +4948,42 @@ } octave_value_list - feval (octave_value& fcn, const octave_value_list& args, int nargout) - { - return fcn.do_multi_index_op (nargout, args); - } - - octave_value_list feval (octave_function *fcn, const octave_value_list& args, int nargout) { octave_value_list retval; if (fcn) - retval = fcn->do_multi_index_op (nargout, args); + retval = fcn->call (nargout, args); return retval; } + + octave_value_list + feval (octave_value& val, const octave_value_list& args, int nargout) + { + if (val.is_function ()) + { + return octave::feval (val.function_value (), args, nargout); + } + else if (val.is_function_handle ()) + { + // This covers function handles, inline functions, and anonymous + // functions. + + std::list<octave_value_list> arg_list; + arg_list.push_back (args); + + return val.subsref ("(", arg_list, nargout); + } + else if (val.is_string ()) + { + return octave::feval (val.string_value (), args, nargout); + } + else + error ("feval: first argument must be a string, inline function, or a function handle"); + + return ovl (); + } } static octave_value_list @@ -4987,33 +5009,18 @@ octave_value_list feval (const octave_value_list& args, int nargout) { - octave_value_list retval; - if (args.length () > 0) { octave_value f_arg = args(0); - if (f_arg.is_string ()) - { - std::string name = f_arg.string_value (); - - octave_value_list tmp_args = get_feval_args (args); - - retval = octave::feval (name, tmp_args, nargout); - } - else if (f_arg.is_function_handle () - || f_arg.is_anonymous_function () - || f_arg.is_inline_function ()) - { - 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"); + octave_value_list tmp_args = get_feval_args (args); + + return octave::feval (f_arg, tmp_args, nargout); } - - return retval; + else + error ("feval: first argument must be a string, inline function, or a function handle"); + + return ovl (); } }
--- a/libinterp/parse-tree/parse.h Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/parse-tree/parse.h Wed May 17 14:34:05 2017 -0400 @@ -553,12 +553,12 @@ int nargout = 0); extern OCTINTERP_API octave_value_list - feval (octave_value& fcn, + feval (octave_function *fcn, const octave_value_list& args = octave_value_list (), int nargout = 0); extern OCTINTERP_API octave_value_list - feval (octave_function *fcn, + feval (octave_value& val, const octave_value_list& args = octave_value_list (), int nargout = 0);
--- a/libinterp/parse-tree/pt-eval.cc Wed May 17 11:17:42 2017 -0400 +++ b/libinterp/parse-tree/pt-eval.cc Wed May 17 14:34:05 2017 -0400 @@ -979,7 +979,7 @@ if (fcn && ! (expr.is_postfix_indexed () && fcn->is_postfix_index_handled (expr.postfix_index ()))) { - retval = val.do_multi_index_op (nargout, octave_value_list ()); + retval = fcn->call (nargout); } else { @@ -1199,9 +1199,8 @@ if (fcn && ! fcn->is_postfix_index_handled (type[i])) { - octave_value_list empty_args; - - tmp_list = tmp.do_multi_index_op (1, empty_args); + tmp_list = fcn->call (1); + tmp = (tmp_list.length () ? tmp_list(0) : octave_value ()); @@ -1263,11 +1262,7 @@ octave_function *fcn = val.function_value (true); if (fcn) - { - octave_value_list empty_args; - - retval = val.do_multi_index_op (nargout, empty_args); - } + retval = fcn->call (nargout); } m_value_stack.push (retval); @@ -1745,9 +1740,7 @@ if (f && ! (expr.is_postfix_indexed () && f->is_postfix_index_handled (expr.postfix_index ()))) { - octave_value_list tmp_args; - - retval = val.do_multi_index_op (nargout, tmp_args); + retval = f->call (nargout); } }