Mercurial > octave
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.