--- a/crates/jsonnet-evaluator/src/evaluate.rs +++ b/crates/jsonnet-evaluator/src/evaluate.rs @@ -1,6 +1,6 @@ use crate::{ - binding, context_creator, create_error, future_wrapper, lazy_val, push, with_state, Context, - ContextCreator, FuncDesc, LazyBinding, ObjMember, ObjValue, Result, Val, + context_creator, create_error, future_wrapper, lazy_val, push, with_state, Context, + ContextCreator, FuncDesc, LazyBinding, LazyVal, ObjMember, ObjValue, Result, Val, }; use closure::closure; use jsonnet_parser::{ @@ -252,17 +252,17 @@ ObjMember { add: plus, visibility: visibility.clone(), - invoke: binding!( + invoke: LazyBinding::Bindable(Rc::new( closure!(clone name, clone value, clone context_creator, |this, super_obj| { - push(value.clone(), "object ".to_owned()+&name+" field", ||{ + Ok(LazyVal::new_resolved(push(value.clone(), "object ".to_owned()+&name+" field", ||{ let context = context_creator.0(this, super_obj)?; evaluate( context, &value, )?.unwrap_if_lazy() - }) - }) - ), + })?)) + }), + )), }, ); } @@ -282,16 +282,16 @@ ObjMember { add: false, visibility: Visibility::Hidden, - invoke: binding!( + invoke: LazyBinding::Bindable(Rc::new( closure!(clone value, clone context_creator, |this, super_obj| { // TODO: Assert - Ok(evaluate_method( + Ok(LazyVal::new_resolved(evaluate_method( context_creator.0(this, super_obj)?, params.clone(), value.clone(), - )) - }) - ), + ))) + }), + )), }, ); } --- a/crates/jsonnet-evaluator/src/lib.rs +++ b/crates/jsonnet-evaluator/src/lib.rs @@ -22,12 +22,6 @@ use std::{cell::RefCell, collections::HashMap, fmt::Debug, path::PathBuf, rc::Rc}; pub use val::*; -rc_fn_helper!( - Binding, - binding, - dyn Fn(Option, Option) -> Result -); - type BindableFn = dyn Fn(Option, Option) -> Result; #[derive(Clone)] pub enum LazyBinding { --- a/crates/jsonnet-evaluator/src/map.rs +++ b/crates/jsonnet-evaluator/src/map.rs @@ -18,6 +18,7 @@ })) } + #[inline(always)] pub fn get(&self, key: &Q) -> Option<&V> where K: Borrow, --- a/crates/jsonnet-evaluator/src/obj.rs +++ b/crates/jsonnet-evaluator/src/obj.rs @@ -1,4 +1,4 @@ -use crate::{evaluate_add_op, Binding, Result, Val}; +use crate::{evaluate_add_op, LazyBinding, Result, Val}; use indexmap::IndexMap; use jsonnet_parser::Visibility; use std::{ @@ -12,7 +12,7 @@ pub struct ObjMember { pub add: bool, pub visibility: Visibility, - pub invoke: Binding, + pub invoke: LazyBinding, } #[derive(Debug)] @@ -102,12 +102,16 @@ } pub(crate) fn get_raw(&self, key: &str, real_this: &ObjValue) -> Result> { match (self.0.this_entries.get(key), &self.0.super_obj) { - (Some(k), None) => Ok(Some(k.invoke.0( - Some(real_this.clone()), - self.0.super_obj.clone(), - )?)), + (Some(k), None) => Ok(Some( + k.invoke + .evaluate(Some(real_this.clone()), self.0.super_obj.clone())? + .evaluate()?, + )), (Some(k), Some(s)) => { - let our = k.invoke.0(Some(real_this.clone()), self.0.super_obj.clone())?; + let our = k + .invoke + .evaluate(Some(real_this.clone()), self.0.super_obj.clone())? + .evaluate()?; if k.add { s.get_raw(key, real_this)? .map_or(Ok(Some(our.clone())), |v| {