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

difftreelog

fix bitwise ops, unary plus

Yaroslav Bolyukin2023-08-10parent: #2029865.patch.diff
in: master

4 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth
17 use UnaryOpType::*;17 use UnaryOpType::*;
18 use Val::*;18 use Val::*;
19 Ok(match (op, b) {19 Ok(match (op, b) {
20 (Plus, Num(n)) => Num(*n),
21 (Minus, Num(n)) => Num(-*n),
20 (Not, Bool(v)) => Bool(!v),22 (Not, Bool(v)) => Bool(!v),
21 (Minus, Num(n)) => Num(-*n),
22 (BitNot, Num(n)) => Num(f64::from(!(*n as i32))),23 (BitNot, Num(n)) => Num(!(*n as i64) as f64),
23 (op, o) => throw!(UnaryOperatorDoesNotOperateOnType(op, o.value_type())),24 (op, o) => throw!(UnaryOperatorDoesNotOperateOnType(op, o.value_type())),
24 })25 })
25}26}
29 Ok(match (a, b) {30 Ok(match (a, b) {
30 (Str(v1), Str(v2)) => Str(StrValue::concat(v1.clone(), v2.clone())),31 (Str(v1), Str(v2)) => Str(StrValue::concat(v1.clone(), v2.clone())),
3132
32 // Can't use generic json serialization way, because it depends on number to string concatenation (std.jsonnet:890)
33 (Num(a), Str(b)) => Str(StrValue::Flat(format!("{a}{b}").into())),33 (Num(a), Str(b)) => Str(StrValue::Flat(format!("{a}{b}").into())),
34 (Str(a), Num(b)) => Str(StrValue::Flat(format!("{a}{b}").into())),34 (Str(a), Num(b)) => Str(StrValue::Flat(format!("{a}{b}").into())),
3535
166166
167 (Num(v1), Sub, Num(v2)) => Val::new_checked_num(v1 - v2)?,167 (Num(v1), Sub, Num(v2)) => Val::new_checked_num(v1 - v2)?,
168168
169 (Num(v1), BitAnd, Num(v2)) => Num(f64::from((*v1 as i32) & (*v2 as i32))),169 (Num(v1), BitAnd, Num(v2)) => Num((*v1 as i64 & *v2 as i64) as f64),
170 (Num(v1), BitOr, Num(v2)) => Num(f64::from((*v1 as i32) | (*v2 as i32))),170 (Num(v1), BitOr, Num(v2)) => Num((*v1 as i64 | *v2 as i64) as f64),
171 (Num(v1), BitXor, Num(v2)) => Num(f64::from((*v1 as i32) ^ (*v2 as i32))),171 (Num(v1), BitXor, Num(v2)) => Num((*v1 as i64 ^ *v2 as i64) as f64),
172 (Num(v1), Lhs, Num(v2)) => {172 (Num(v1), Lhs, Num(v2)) => {
173 if *v2 < 0.0 {173 if *v2 < 0.0 {
174 throw!("shift by negative exponent")174 throw!("shift by negative exponent")
175 }175 }
176 let exp = ((*v2 as i64) & 63) as u32;
176 Num(f64::from((*v1 as i32) << (*v2 as i32)))177 Num((*v1 as i64).wrapping_shl(exp) as f64)
177 }178 }
178 (Num(v1), Rhs, Num(v2)) => {179 (Num(v1), Rhs, Num(v2)) => {
179 if *v2 < 0.0 {180 if *v2 < 0.0 {
180 throw!("shift by negative exponent")181 throw!("shift by negative exponent")
181 }182 }
183 let exp = ((*v2 as i64) & 63) as u32;
182 Num(f64::from((*v1 as i32) >> (*v2 as i32)))184 Num((*v1 as i64).wrapping_shr(exp) as f64)
183 }185 }
184186
185 // Bigint X Bigint187 // Bigint X Bigint
modifiedcrates/jrsonnet-parser/src/lib.rsdiffbeforeafterboth
332 a:(@) _ binop(<"/">) _ b:@ {expr_bin!(a Div b)}332 a:(@) _ binop(<"/">) _ b:@ {expr_bin!(a Div b)}
333 a:(@) _ binop(<"%">) _ b:@ {expr_bin!(a Mod b)}333 a:(@) _ binop(<"%">) _ b:@ {expr_bin!(a Mod b)}
334 --334 --
335 unaryop(<"+">) _ b:@ {expr_un!(Plus b)}
335 unaryop(<"-">) _ b:@ {expr_un!(Minus b)}336 unaryop(<"-">) _ b:@ {expr_un!(Minus b)}
336 unaryop(<"!">) _ b:@ {expr_un!(Not b)}337 unaryop(<"!">) _ b:@ {expr_un!(Not b)}
337 unaryop(<"~">) _ b:@ {expr_un!(BitNot b)}338 unaryop(<"~">) _ b:@ {expr_un!(BitNot b)}
addedtests/golden/issue126.jsonnetdiffbeforeafterboth

no changes

addedtests/golden/issue126.jsonnet.goldendiffbeforeafterboth

no changes