diff libinterp/parse-tree/pt-binop.h @ 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.h	Thu Nov 03 14:47:18 2022 -0400
+++ b/libinterp/parse-tree/pt-binop.h	Thu Nov 03 17:50:24 2022 -0400
@@ -51,7 +51,7 @@
                             octave_value::binary_op t
                             = octave_value::unknown_binary_op)
       : tree_expression (l, c), m_lhs (nullptr), m_rhs (nullptr), m_etype (t),
-        m_eligible_for_braindead_shortcircuit (false)
+        m_preserve_operands (false)
     { }
 
     tree_binary_expression (tree_expression *a, tree_expression *b,
@@ -59,7 +59,7 @@
                             octave_value::binary_op t
                             = octave_value::unknown_binary_op)
       : tree_expression (l, c), m_lhs (a), m_rhs (b), m_etype (t),
-        m_eligible_for_braindead_shortcircuit (false)
+        m_preserve_operands (false)
     { }
 
     // No copying!
@@ -70,21 +70,14 @@
 
     ~tree_binary_expression (void)
     {
-      delete m_lhs;
-      delete m_rhs;
+      if (! m_preserve_operands)
+        {
+          delete m_lhs;
+          delete m_rhs;
+        }
     }
 
-    void mark_braindead_shortcircuit (void)
-    {
-      if (m_etype == octave_value::op_el_and
-          || m_etype == octave_value::op_el_or)
-        {
-          m_eligible_for_braindead_shortcircuit = true;
-
-          m_lhs->mark_braindead_shortcircuit ();
-          m_rhs->mark_braindead_shortcircuit ();
-        }
-    }
+    void preserve_operands (void) { m_preserve_operands = true; }
 
     bool is_binary_expression (void) const { return true; }
 
@@ -97,11 +90,6 @@
     tree_expression * lhs (void) { return m_lhs; }
     tree_expression * rhs (void) { return m_rhs; }
 
-    bool is_eligible_for_braindead_shortcircuit (void) const
-    {
-      return m_eligible_for_braindead_shortcircuit;
-    }
-
     tree_expression * dup (symbol_scope& scope) const;
 
     octave_value evaluate (tree_evaluator&, int nargout = 1);
@@ -131,9 +119,37 @@
     // The type of the expression.
     octave_value::binary_op m_etype;
 
-    // TRUE if this is an | or & expression in the condition of an IF
-    // or WHILE statement.
-    bool m_eligible_for_braindead_shortcircuit;
+    // If TRUE, don't delete m_lhs and m_rhs in destructor;
+    bool m_preserve_operands;
+  };
+
+  class tree_braindead_shortcircuit_binary_expression
+    : public tree_binary_expression
+  {
+  public:
+
+    tree_braindead_shortcircuit_binary_expression (tree_expression *a,
+                                                   tree_expression *b,
+                                                   int l, int c,
+                                                   octave_value::binary_op t)
+      : tree_binary_expression (a, b, l, c, t)
+    { }
+
+    // No copying!
+
+    tree_braindead_shortcircuit_binary_expression
+      (const tree_braindead_shortcircuit_binary_expression&) = delete;
+
+    tree_braindead_shortcircuit_binary_expression&
+    operator = (const tree_braindead_shortcircuit_binary_expression&) = delete;
+
+    ~tree_braindead_shortcircuit_binary_expression (void) = default;
+
+    tree_expression * dup (symbol_scope& scope) const;
+
+    octave_value evaluate (tree_evaluator&, int nargout = 1);
+
+    using tree_binary_expression::evaluate_n;
   };
 
   // Boolean expressions.