difftreelog
feat optional tailstrict in FuncVal::evaluate_simple
in: master
7 files changed
crates/jrsonnet-evaluator/src/arr/mod.rsdiffbeforeafterboth--- 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,
crates/jrsonnet-evaluator/src/arr/spec.rsdiffbeforeafterboth--- 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,
crates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth--- 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<Val> {
use Expr::*;
+
if let Some(trivial) = evaluate_trivial(expr) {
return Ok(trivial);
}
crates/jrsonnet-evaluator/src/function/mod.rsdiffbeforeafterboth--- 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<A: ArgsLike + OptionalContext>(&self, args: &A) -> Result<Val> {
+ pub fn evaluate_simple<A: ArgsLike + OptionalContext>(
+ &self,
+ args: &A,
+ tailstrict: bool,
+ ) -> Result<Val> {
self.evaluate(
ContextBuilder::dangerous_empty_state().build(),
CallLocation::native(),
args,
- true,
+ tailstrict,
)
}
/// Convert jsonnet function to plain `Fn` value.
crates/jrsonnet-evaluator/src/function/native.rsdiffbeforeafterboth--- 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)
})
crates/jrsonnet-interner/src/lib.rsdiffbeforeafterboth174 }174 }175 // First reference - current object, second - POOL175 // First reference - current object, second - POOL176 if Inner::strong_count(&self.0) <= 2 {176 if Inner::strong_count(&self.0) <= 2 {177 eprintln!("unpool");178 unpool(&self.0);177 unpool(&self.0);179 }178 }180 }179 }crates/jrsonnet-stdlib/src/arrays.rsdiffbeforeafterboth--- 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<ArrValue> {
- 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<Val> {
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<Val> {
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)
}