# HG changeset patch # User John W. Eaton # Date 1674678520 18000 # Node ID e995783d78e745d4be775b0246606a2ff8e94bac # Parent c0df18c13a7727102b8c2b409b6ec69f650ca3e6 capture modified operands when rewriting binary expressions in parse tree * pt-binop.h (tree_binary_expression::lhs, tree_binary_expression::rhs): New functions. * oct-parse.yy (base_parser::maybe_convert_to_braindead_shortcircuit): Reset binary expression object operands after recursive call. diff -r c0df18c13a77 -r e995783d78e7 libinterp/parse-tree/oct-parse.yy --- a/libinterp/parse-tree/oct-parse.yy Wed Jan 25 14:38:20 2023 +0100 +++ b/libinterp/parse-tree/oct-parse.yy Wed Jan 25 15:28:40 2023 -0500 @@ -3164,6 +3164,10 @@ maybe_convert_to_braindead_shortcircuit (lhs); maybe_convert_to_braindead_shortcircuit (rhs); + // Operands may have changed. + binexp->lhs (lhs); + binexp->rhs (rhs); + octave_value::binary_op op_type = binexp->op_type (); if (op_type == octave_value::op_el_and || op_type == octave_value::op_el_or) diff -r c0df18c13a77 -r e995783d78e7 libinterp/parse-tree/pt-binop.h --- a/libinterp/parse-tree/pt-binop.h Wed Jan 25 14:38:20 2023 +0100 +++ b/libinterp/parse-tree/pt-binop.h Wed Jan 25 15:28:40 2023 -0500 @@ -90,6 +90,9 @@ tree_expression * lhs (void) { return m_lhs; } tree_expression * rhs (void) { return m_rhs; } + void lhs (tree_expression *expr) { m_lhs = expr; } + void rhs (tree_expression *expr) { m_rhs = expr; } + tree_expression * dup (symbol_scope& scope) const; octave_value evaluate (tree_evaluator&, int nargout = 1);