changeset 24349:4ced2bfd737e

deprecate defun_isargout functions * pt-eval.h, pt-eval.cc (tree_evaluator::isargout): New functions, adapted from defun_isargout. (tree_evaluator::lvalue_list): Now const. (tree_evaluator::ignored_fcn_outputs: Use lvalue_list. * defun-int.h (defun_isargout): Mark as deprecated in 4.4. * defun.cc (defun_isargout): Call tree_evaluator::isargout to do the work.
author John W. Eaton <jwe@octave.org>
date Wed, 29 Nov 2017 15:08:37 -0500
parents 64691264dd21
children b991accccd4c
files libinterp/corefcn/defun-int.h libinterp/corefcn/defun.cc libinterp/parse-tree/pt-eval.cc libinterp/parse-tree/pt-eval.h
diffstat 4 files changed, 72 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/defun-int.h	Tue Nov 28 12:43:25 2017 -0500
+++ b/libinterp/corefcn/defun-int.h	Wed Nov 29 15:08:37 2017 -0500
@@ -103,15 +103,16 @@
 OCTAVE_DEPRECATED (4.4, "use 'octave::auto_shlib' instead")
 typedef octave::auto_shlib octave_auto_shlib;
 
-#endif
-
-
+OCTAVE_DEPRECATED (4.4, "use 'tree_evaluator::isargout' instead")
 extern OCTINTERP_API bool
 defun_isargout (int, int);
 
+OCTAVE_DEPRECATED (4.4, "use 'tree_evaluator::isargout' instead")
 extern OCTINTERP_API void
 defun_isargout (int, int, bool *);
 
+#endif
+
 #define FORWARD_DECLARE_FUNX(name)              \
   extern OCTAVE_EXPORT octave_value_list        \
   name (const octave_value_list&, int)
--- a/libinterp/corefcn/defun.cc	Tue Nov 28 12:43:25 2017 -0500
+++ b/libinterp/corefcn/defun.cc	Wed Nov 29 15:08:37 2017 -0500
@@ -213,26 +213,7 @@
 {
   octave::tree_evaluator& tw = octave::__get_evaluator__ ("defun_isargout");
 
-  const std::list<octave_lvalue> *lvalue_list = tw.lvalue_list ();
-
-  if (iout >= std::max (nargout, 1))
-    return false;
-  else if (lvalue_list)
-    {
-      int k = 0;
-      for (const auto& lval : *lvalue_list)
-        {
-          if (k == iout)
-            return ! lval.is_black_hole ();
-          k += lval.numel ();
-          if (k > iout)
-            break;
-        }
-
-      return true;
-    }
-  else
-    return true;
+  return tw.isargout (nargout, iout);
 }
 
 void
@@ -240,28 +221,5 @@
 {
   octave::tree_evaluator& tw = octave::__get_evaluator__ ("defun_isargout");
 
-  const std::list<octave_lvalue> *lvalue_list = tw.lvalue_list ();
-
-  if (lvalue_list)
-    {
-      int k = 0;
-      for (const auto& lval : *lvalue_list)
-        {
-          if (lval.is_black_hole ())
-            isargout[k++] = false;
-          else
-            {
-              int l = std::min (k + lval.numel (),
-                                static_cast<octave_idx_type> (nout));
-              while (k < l)
-                isargout[k++] = true;
-            }
-        }
-    }
-  else
-    for (int i = 0; i < nout; i++)
-      isargout[i] = true;
-
-  for (int i = std::max (nargout, 1); i < nout; i++)
-    isargout[i] = false;
+  return tw.isargout (nargout, nout, isargout);
 }
--- a/libinterp/parse-tree/pt-eval.cc	Tue Nov 28 12:43:25 2017 -0500
+++ b/libinterp/parse-tree/pt-eval.cc	Wed Nov 29 15:08:37 2017 -0500
@@ -439,17 +439,14 @@
   {
     Matrix retval;
 
-    if (m_lvalue_list_stack.empty ())
-      return retval;
-
-    const std::list<octave_lvalue> *lvalue_list = m_lvalue_list_stack.top ();
-
-    if (! lvalue_list)
+    const std::list<octave_lvalue> *lvalues = lvalue_list ();
+
+    if (! lvalues)
       return retval;
 
     octave_idx_type nbh = 0;
 
-    for (const auto& lval : *lvalue_list)
+    for (const auto& lval : *lvalues)
       nbh += lval.is_black_hole ();
 
     if (nbh > 0)
@@ -459,7 +456,7 @@
         octave_idx_type k = 0;
         octave_idx_type l = 0;
 
-        for (const auto& lval : *lvalue_list)
+        for (const auto& lval : *lvalues)
           {
             if (lval.is_black_hole ())
               retval(l++) = k+1;
@@ -471,6 +468,60 @@
     return retval;
   }
 
+  bool
+  tree_evaluator::isargout (int nargout, int iout) const
+  {
+    const std::list<octave_lvalue> *lvalues = lvalue_list ();
+
+    if (iout >= std::max (nargout, 1))
+      return false;
+    else if (lvalues)
+      {
+        int k = 0;
+        for (const auto& lval : *lvalues)
+          {
+            if (k == iout)
+              return ! lval.is_black_hole ();
+            k += lval.numel ();
+            if (k > iout)
+              break;
+          }
+
+        return true;
+      }
+    else
+      return true;
+  }
+
+  void
+  tree_evaluator::isargout (int nargout, int nout, bool *isargout) const
+  {
+    const std::list<octave_lvalue> *lvalues = lvalue_list ();
+
+    if (lvalues)
+      {
+        int k = 0;
+        for (const auto& lval : *lvalues)
+          {
+            if (lval.is_black_hole ())
+              isargout[k++] = false;
+            else
+              {
+                int l = std::min (k + lval.numel (),
+                                  static_cast<octave_idx_type> (nout));
+                while (k < l)
+                  isargout[k++] = true;
+              }
+          }
+      }
+    else
+      for (int i = 0; i < nout; i++)
+        isargout[i] = true;
+
+    for (int i = std::max (nargout, 1); i < nout; i++)
+      isargout[i] = false;
+  }
+
   octave_value
   tree_evaluator::evaluate (tree_decl_elt *elt)
   {
--- a/libinterp/parse-tree/pt-eval.h	Tue Nov 28 12:43:25 2017 -0500
+++ b/libinterp/parse-tree/pt-eval.h	Wed Nov 29 15:08:37 2017 -0500
@@ -259,9 +259,14 @@
 
     Matrix ignored_fcn_outputs (void) const;
 
-    const std::list<octave_lvalue> * lvalue_list (void)
+    bool isargout (int nargout, int iout) const;
+
+    void isargout (int nargout, int nout, bool *isargout) const;
+
+    const std::list<octave_lvalue> * lvalue_list (void) const
     {
-      return m_lvalue_list_stack.empty () ? nullptr : m_lvalue_list_stack.top ();
+      return (m_lvalue_list_stack.empty ()
+              ? nullptr : m_lvalue_list_stack.top ());
     }
 
     octave_value evaluate (tree_expression *expr, int nargout = 1)