--- a/crates/jrsonnet-evaluator/src/evaluate/operator.rs +++ b/crates/jrsonnet-evaluator/src/evaluate/operator.rs @@ -218,9 +218,15 @@ (a, Div, b) => evaluate_div_op(a, b)?, (a, Mod, b) => evaluate_mod_op(a, b)?, - (Num(v1), BitAnd, Num(v2)) => Val::try_num((v1.get() as i64 & v2.get() as i64) as f64)?, - (Num(v1), BitOr, Num(v2)) => Val::try_num((v1.get() as i64 | v2.get() as i64) as f64)?, - (Num(v1), BitXor, Num(v2)) => Val::try_num((v1.get() as i64 ^ v2.get() as i64) as f64)?, + (Num(v1), BitAnd, Num(v2)) => { + Val::try_num((v1.truncate_for_bitwise()? & v2.truncate_for_bitwise()?) as f64)? + } + (Num(v1), BitOr, Num(v2)) => { + Val::try_num((v1.truncate_for_bitwise()? | v2.truncate_for_bitwise()?) as f64)? + } + (Num(v1), BitXor, Num(v2)) => { + Val::try_num((v1.truncate_for_bitwise()? ^ v2.truncate_for_bitwise()?) as f64)? + } (Num(v1), Lhs, Num(v2)) => { if v2.get() < 0.0 { bail!("shift by negative exponent") --- a/crates/jrsonnet-stdlib/src/arrays.rs +++ b/crates/jrsonnet-stdlib/src/arrays.rs @@ -138,19 +138,37 @@ } #[builtin] -pub fn builtin_foldl(func: FuncVal, arr: ArrValue, init: Val) -> Result { +pub fn builtin_foldl(func: FuncVal, arr: Either![ArrValue, IStr], init: Val) -> Result { let mut acc = init; - for i in arr.iter() { - acc = func.evaluate_simple(&(acc, i?), false)?; + match arr { + Either2::A(arr) => { + for i in arr.iter() { + acc = func.evaluate_simple(&(acc, i?), false)?; + } + } + Either2::B(arr) => { + for i in arr.chars() { + acc = func.evaluate_simple(&(acc, Val::string(i)), false)?; + } + } } Ok(acc) } #[builtin] -pub fn builtin_foldr(func: FuncVal, arr: ArrValue, init: Val) -> Result { +pub fn builtin_foldr(func: FuncVal, arr: Either![ArrValue, IStr], init: Val) -> Result { let mut acc = init; - for i in arr.iter().rev() { - acc = func.evaluate_simple(&(i?, acc), false)?; + match arr { + Either2::A(arr) => { + for i in arr.iter().rev() { + acc = func.evaluate_simple(&(i?, acc), false)?; + } + } + Either2::B(arr) => { + for i in arr.chars().rev() { + acc = func.evaluate_simple(&(Val::string(i), acc), false)?; + } + } } Ok(acc) }