git.delta.rocks / jrsonnet / refs/commits / cc58898dc7b5

difftreelog

fix(evaluator) correct handling of true || expr

Лач2020-06-04parent: #55e13f5.patch.diff
in: master

1 file changed

modifiedcrates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
68 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}
89
90pub 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}
87109
88pub 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()?)?,
92
93 (a, BinaryOpType::Add, b) => evaluate_add_op(a, b)?,117 (a, BinaryOpType::Add, b) => evaluate_add_op(a, b)?,
94118
306 .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 context
335 .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) => {