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);
           }
       }