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.rsdiffbeforeafterboth1use super::{2 arglike::{ArgLike, OptionalContext},3 FuncVal,4};5use crate::{error::Result, typed::Typed};67pub trait NativeDesc {8 type Value;9 fn into_native(val: FuncVal) -> Self::Value;10}11macro_rules! impl_native_desc {12 ($($gen:ident)*) => {13 impl<$($gen,)* O> NativeDesc for (($($gen,)*), O)14 where15 $($gen: ArgLike + OptionalContext,)*16 O: Typed,17 {18 type Value = Box<dyn Fn($($gen,)*) -> Result<O>>;1920 #[allow(non_snake_case)]21 fn into_native(val: FuncVal) -> Self::Value {22 Box::new(move |$($gen),*| {23 let val = val.evaluate_simple(24 &($($gen,)*),25 )?;26 O::from_untyped(val)27 })28 }29 }30 };31 ($($cur:ident)* @ $c:ident $($rest:ident)*) => {32 impl_native_desc!($($cur)*);33 impl_native_desc!($($cur)* $c @ $($rest)*);34 };35 ($($cur:ident)* @) => {36 impl_native_desc!($($cur)*);37 }38}3940impl_native_desc! {41 @ A B C D E F G H I J K L42}1use super::{2 arglike::{ArgLike, OptionalContext},3 FuncVal,4};5use crate::{error::Result, typed::Typed};67pub trait NativeDesc {8 type Value;9 fn into_native(val: FuncVal) -> Self::Value;10}11macro_rules! impl_native_desc {12 ($($gen:ident)*) => {13 impl<$($gen,)* O> NativeDesc for (($($gen,)*), O)14 where15 $($gen: ArgLike + OptionalContext,)*16 O: Typed,17 {18 type Value = Box<dyn Fn($($gen,)*) -> Result<O>>;1920 #[allow(non_snake_case)]21 fn into_native(val: FuncVal) -> Self::Value {22 Box::new(move |$($gen),*| {23 let val = val.evaluate_simple(24 &($($gen,)*),25 false,26 )?;27 O::from_untyped(val)28 })29 }30 }31 };32 ($($cur:ident)* @ $c:ident $($rest:ident)*) => {33 impl_native_desc!($($cur)*);34 impl_native_desc!($($cur)* $c @ $($rest)*);35 };36 ($($cur:ident)* @) => {37 impl_native_desc!($($cur)*);38 }39}4041impl_native_desc! {42 @ A B C D E F G H I J K L43}crates/jrsonnet-interner/src/lib.rsdiffbeforeafterboth--- 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);
}
}
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)
}