1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

expr: short-circuit evaluation for &

This commit is contained in:
Zhuoxun Yang 2023-10-14 01:56:38 +08:00
parent 5f4305df6f
commit ae1c4ccfd2

View file

@ -166,17 +166,27 @@ impl AstNode {
{
let mut out = Vec::with_capacity(operands.len());
let mut operands = operands.iter();
// check the first value before `|`, stop evaluate and return directly if it is true.
// push dummy to pass the check of `len() == 2`
if op_type == "|" {
if let Some(value) = operands.next() {
let value = value.evaluate()?;
out.push(value.clone());
// short-circuit evaluation for `|` and `&`
// push dummy to pass `assert!(values.len() == 2);`
match op_type.as_ref() {
"|" => {
if value_as_bool(&value) {
out.push(String::from("dummy"));
return Ok(out);
}
}
"&" => {
if !value_as_bool(&value) {
out.push(String::from("dummy"));
return Ok(out);
}
}
_ => {}
}
}
for operand in operands {