From 685a983a974912fbb2a5f2c430bff052196f999b Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Sat, 08 Apr 2023 19:42:08 +0000 Subject: [PATCH] feat: optional tailstrict in FuncVal::evaluate_simple --- --- a/crates/jrsonnet-evaluator/src/arr/mod.rs +++ b/crates/jrsonnet-evaluator/src/arr/mod.rs @@ -234,6 +234,7 @@ } } + /// Is this vec supports .get_cheap()? pub fn is_cheap(&self) -> bool { match self { ArrValue::Eager(_) | ArrValue::Range(..) | ArrValue::Bytes(_) => true, --- a/crates/jrsonnet-evaluator/src/arr/spec.rs +++ b/crates/jrsonnet-evaluator/src/arr/spec.rs @@ -748,7 +748,7 @@ .get(index) .transpose() .expect("index checked") - .and_then(|r| self.0.mapper.evaluate_simple(&(r,))); + .and_then(|r| self.0.mapper.evaluate_simple(&(r,), false)); let new_value = match val { Ok(v) => v, --- a/crates/jrsonnet-evaluator/src/evaluate/mod.rs +++ b/crates/jrsonnet-evaluator/src/evaluate/mod.rs @@ -414,6 +414,7 @@ #[allow(clippy::too_many_lines)] pub fn evaluate(ctx: Context, expr: &LocExpr) -> Result { use Expr::*; + if let Some(trivial) = evaluate_trivial(expr) { return Ok(trivial); } --- a/crates/jrsonnet-evaluator/src/function/mod.rs +++ b/crates/jrsonnet-evaluator/src/function/mod.rs @@ -164,12 +164,16 @@ Self::Builtin(b) => b.call(call_ctx, loc, args), } } - pub fn evaluate_simple(&self, args: &A) -> Result { + pub fn evaluate_simple( + &self, + args: &A, + tailstrict: bool, + ) -> Result { self.evaluate( ContextBuilder::dangerous_empty_state().build(), CallLocation::native(), args, - true, + tailstrict, ) } /// Convert jsonnet function to plain `Fn` value. --- a/crates/jrsonnet-evaluator/src/function/native.rs +++ b/crates/jrsonnet-evaluator/src/function/native.rs @@ -22,6 +22,7 @@ Box::new(move |$($gen),*| { let val = val.evaluate_simple( &($($gen,)*), + false, )?; O::from_untyped(val) }) --- a/crates/jrsonnet-interner/src/lib.rs +++ b/crates/jrsonnet-interner/src/lib.rs @@ -174,7 +174,6 @@ } // First reference - current object, second - POOL if Inner::strong_count(&self.0) <= 2 { - eprintln!("unpool"); unpool(&self.0); } } --- a/crates/jrsonnet-stdlib/src/arrays.rs +++ b/crates/jrsonnet-stdlib/src/arrays.rs @@ -88,14 +88,14 @@ #[builtin] pub fn builtin_filter(func: FuncVal, arr: ArrValue) -> Result { - arr.filter(|val| bool::from_untyped(func.evaluate_simple(&(val.clone(),))?)) + arr.filter(|val| bool::from_untyped(func.evaluate_simple(&(val.clone(),), false)?)) } #[builtin] pub fn builtin_foldl(func: FuncVal, arr: ArrValue, init: Val) -> Result { let mut acc = init; for i in arr.iter() { - acc = func.evaluate_simple(&(acc, i?))?; + acc = func.evaluate_simple(&(acc, i?), false)?; } Ok(acc) } @@ -104,7 +104,7 @@ pub fn builtin_foldr(func: FuncVal, arr: ArrValue, init: Val) -> Result { let mut acc = init; for i in arr.iter().rev() { - acc = func.evaluate_simple(&(i?, acc))?; + acc = func.evaluate_simple(&(i?, acc), false)?; } Ok(acc) } -- gitstuff