diff libinterp/parse-tree/pt-binop.cc @ 31394:7781b1e77406

use separate class for braindead shortcircuit evaluation Change adapted from patch #10238 by Petter Tomner <tomner@kth.se>. * parse.h, oct-parse.yy (base_parser::maybe_convert_to_braindead_shortcircuit): New function. (if_cmd_list1, elseif_clause, loop_command): Use it to convert expressions that could be evaluated using Matlab-style short-circuit rules to be tree_braindead_shortcircuit_binary_expression objects instead of simple tree_binary_expression objects. * pt-exp.h (tree_expression::mark_braindead_shortcircuit): Delete. * pt-binop.h (tree_binary_expression::mark_braindead_shortcircuit): Delete. * pt-binop.h, pt-binop.cc (tree_braindead_shortcircuit_binary_expression): New class to evaluate Matlab-style short-circuit expressions. * pt-binop.h, pt-binop.cc (tree_binary_expression::preserve_operands): New function. (tree_binary_expression::m_preserve_operands): New private data member. (tree_binary_expression::m_eligible_for_braindead_shortcircuit): Delete data member. (tree_binary_expression::is_eligible_for_braindead_shortcircuit): Delete function. (tree_binary_expression::mark_braindead_shortcircuit): Delete function. (tree_binary_expression::~tree_binary_expression): Don't delete m_lhs or m_rhs if m_preserve_operands is true. (tree_binary_expression::evaluate): Don't check for or process Matlab-style short-circuit expressions here.
author John W. Eaton <jwe@octave.org>
date Thu, 03 Nov 2022 17:50:24 -0400
parents c3ed2ad87aca
children e88a07dec498
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-binop.cc	Thu Nov 03 14:47:18 2022 -0400
+++ b/libinterp/parse-tree/pt-binop.cc	Thu Nov 03 17:50:24 2022 -0400
@@ -69,49 +69,6 @@
   octave_value
   tree_binary_expression::evaluate (tree_evaluator& tw, int)
   {
-    octave_value val;
-
-    if (is_eligible_for_braindead_shortcircuit ())
-      {
-        if (m_lhs)
-          {
-            octave_value a = m_lhs->evaluate (tw);
-
-            if (a.ndims () == 2 && a.rows () == 1 && a.columns () == 1)
-              {
-                bool result = false;
-
-                bool a_true = a.is_true ();
-
-                if (a_true)
-                  {
-                    if (m_etype == octave_value::op_el_or)
-                      {
-                        matlab_style_short_circuit_warning ("|");
-                        return octave_value (true);
-                      }
-                  }
-                else
-                  {
-                    if (m_etype == octave_value::op_el_and)
-                      {
-                        matlab_style_short_circuit_warning ("&");
-                        return octave_value (false);
-                      }
-                  }
-
-                if (m_rhs)
-                  {
-                    octave_value b = m_rhs->evaluate (tw);
-
-                    result = b.is_true ();
-                  }
-
-                return octave_value (result);
-              }
-          }
-      }
-
     if (m_lhs)
       {
         octave_value a = m_lhs->evaluate (tw);
@@ -135,12 +92,73 @@
 
                 type_info& ti = interp.get_type_info ();
 
-                val = binary_op (ti, m_etype, a, b);
+                return binary_op (ti, m_etype, a, b);
               }
           }
       }
 
-    return val;
+    return octave_value ();
+  }
+
+  tree_expression *
+  tree_braindead_shortcircuit_binary_expression::dup (symbol_scope& scope) const
+  {
+    tree_braindead_shortcircuit_binary_expression *new_be
+      = new tree_braindead_shortcircuit_binary_expression
+          (m_lhs ? m_lhs->dup (scope) : nullptr,
+           m_rhs ? m_rhs->dup (scope) : nullptr,
+           line (), column (), op_type ());
+
+    new_be->copy_base (*this);
+
+    return new_be;
+  }
+
+  octave_value
+  tree_braindead_shortcircuit_binary_expression::evaluate (tree_evaluator& tw,
+                                                           int)
+  {
+    if (m_lhs)
+      {
+        octave_value a = m_lhs->evaluate (tw);
+
+        if (a.ndims () == 2 && a.rows () == 1 && a.columns () == 1)
+          {
+            bool result = false;
+
+            bool a_true = a.is_true ();
+
+            octave_value::binary_op oper_type = op_type ();
+
+            if (a_true)
+              {
+                if (oper_type == octave_value::op_el_or)
+                  {
+                    matlab_style_short_circuit_warning ("|");
+                    return octave_value (true);
+                  }
+              }
+            else
+              {
+                if (oper_type == octave_value::op_el_and)
+                  {
+                    matlab_style_short_circuit_warning ("&");
+                    return octave_value (false);
+                  }
+              }
+
+            if (m_rhs)
+              {
+                octave_value b = m_rhs->evaluate (tw);
+
+                result = b.is_true ();
+              }
+
+            return octave_value (result);
+          }
+      }
+
+    return octave_value ();
   }
 
   // Boolean expressions.