difftreelog
fix bitwise ops, unary plus
in: master
4 files changed
crates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth17 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())),313232 // 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())),3535166166167 (Num(v1), Sub, Num(v2)) => Val::new_checked_num(v1 - v2)?,167 (Num(v1), Sub, Num(v2)) => Val::new_checked_num(v1 - v2)?,168168169 (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 }184186185 // Bigint X Bigint187 // Bigint X Bigintcrates/jrsonnet-parser/src/lib.rsdiffbeforeafterboth332 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)}tests/golden/issue126.jsonnetdiffbeforeafterbothno changes
tests/golden/issue126.jsonnet.goldendiffbeforeafterbothno changes