difftreelog
fix(evaluator) correct handling of true || expr
in: master
1 file changed
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth68 Ok(match (op, b) {68 Ok(match (op, b) {69 (o, Val::Lazy(l)) => evaluate_unary_op(o, &l.evaluate()?)?,69 (o, Val::Lazy(l)) => evaluate_unary_op(o, &l.evaluate()?)?,70 (UnaryOpType::Not, Val::Bool(v)) => Val::Bool(!v),70 (UnaryOpType::Not, Val::Bool(v)) => Val::Bool(!v),71 (UnaryOpType::Minus, Val::Num(n)) => Val::Num(-*n),72 (UnaryOpType::BitNot, Val::Num(n)) => Val::Num(!(*n as i32) as f64),71 (op, o) => panic!("unary op not implemented: {:?} {:?}", op, o),73 (op, o) => panic!("unary op not implemented: {:?} {:?}", op, o),72 })74 })73}75}85 })87 })86}88}8990pub fn evaluate_binary_op_special(91 context: Context,92 a: &LocExpr,93 op: BinaryOpType,94 b: &LocExpr,95) -> Result<Val> {96 Ok(97 match (evaluate(context.clone(), &a)?.unwrap_if_lazy()?, op, b) {98 (Val::Bool(true), BinaryOpType::Or, _o) => Val::Bool(true),99 (Val::Bool(false), BinaryOpType::And, _o) => Val::Bool(false),100 (a, op, eb) => evaluate_binary_op_normal(101 context.clone(),102 &a,103 op,104 &evaluate(context, eb)?.unwrap_if_lazy()?,105 )?,106 },107 )108}8710988pub fn evaluate_binary_op(context: Context, a: &Val, op: BinaryOpType, b: &Val) -> Result<Val> {110pub fn evaluate_binary_op_normal(111 context: Context,112 a: &Val,113 op: BinaryOpType,114 b: &Val,115) -> Result<Val> {89 Ok(match (a, op, b) {116 Ok(match (a, op, b) {90 (Val::Lazy(a), o, b) => evaluate_binary_op(context, &a.evaluate()?, o, b)?,91 (a, o, Val::Lazy(b)) => evaluate_binary_op(context, a, o, &b.evaluate()?)?,9293 (a, BinaryOpType::Add, b) => evaluate_add_op(a, b)?,117 (a, BinaryOpType::Add, b) => evaluate_add_op(a, b)?,94118306 .clone()330 .clone()307 .unwrap_or_else(|| panic!("super not found")),331 .unwrap_or_else(|| panic!("super not found")),308 ),332 ),333 Literal(LiteralType::Dollar) => Val::Obj(334 context335 .dollar()336 .clone()337 .unwrap_or_else(|| panic!("dollar not found")),338 ),309 Literal(LiteralType::True) => Val::Bool(true),339 Literal(LiteralType::True) => Val::Bool(true),310 Literal(LiteralType::False) => Val::Bool(false),340 Literal(LiteralType::False) => Val::Bool(false),311 Literal(LiteralType::Null) => Val::Null,341 Literal(LiteralType::Null) => Val::Null,312 Parened(e) => evaluate(context, e)?,342 Parened(e) => evaluate(context, e)?,313 Str(v) => Val::Str(v.clone()),343 Str(v) => Val::Str(v.clone()),314 Num(v) => Val::Num(*v),344 Num(v) => Val::Num(*v),315 BinaryOp(v1, o, v2) => {345 BinaryOp(v1, o, v2) => evaluate_binary_op_special(context, &v1, *o, &v2)?,316 let a = evaluate(context.clone(), v1)?.unwrap_if_lazy()?;317 let op = *o;318 let b = evaluate(context.clone(), v2)?.unwrap_if_lazy()?;319 evaluate_binary_op(context, &a, op, &b)?320 }321 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?,346 UnaryOp(o, v) => evaluate_unary_op(*o, &evaluate(context, v)?)?,322 Var(name) => Val::Lazy(context.binding(&name)).unwrap_if_lazy()?,347 Var(name) => Val::Lazy(context.binding(&name)).unwrap_if_lazy()?,323 Index(value, index) => {348 Index(value, index) => {