difftreelog
perf(evaluator) remove unnecessary cloning
in: master
4 files changed
crates/jsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth211 let future_this = FutureObjValue::new();211 let future_this = FutureObjValue::new();212 let context_creator = context_creator!(212 let context_creator = context_creator!(213 closure!(clone context, clone new_bindings, |this: Option<ObjValue>, super_obj: Option<ObjValue>| {213 closure!(clone context, clone new_bindings, |this: Option<ObjValue>, super_obj: Option<ObjValue>| {214 Ok(context.clone().extend_unbound(214 Ok(context.extend_unbound(215 new_bindings.clone().unwrap(),215 new_bindings.clone().unwrap(),216 context.clone().dollar().clone().or_else(||this.clone()),216 context.dollar().clone().or_else(||this.clone()),217 Some(this.unwrap()),217 Some(this.unwrap()),218 super_obj218 super_obj219 )?)219 )?)318 let new_bindings = FutureNewBindings::new();318 let new_bindings = FutureNewBindings::new();319 let context_creator = context_creator!(319 let context_creator = context_creator!(320 closure!(clone context, clone new_bindings, |this: Option<ObjValue>, super_obj: Option<ObjValue>| {320 closure!(clone context, clone new_bindings, |this: Option<ObjValue>, super_obj: Option<ObjValue>| {321 Ok(context.clone().extend_unbound(321 Ok(context.extend_unbound(322 new_bindings.clone().unwrap(),322 new_bindings.clone().unwrap(),323 context.clone().dollar().clone().or_else(||this.clone()),323 context.dollar().clone().or_else(||this.clone()),324 None,324 None,325 super_obj325 super_obj326 )?)326 )?)664 ("std", "filter") => {664 ("std", "filter") => {665 assert_eq!(args.len(), 2);665 assert_eq!(args.len(), 2);666 if let (Val::Func(predicate), Val::Arr(arr)) = (666 if let (Val::Func(predicate), Val::Arr(arr)) = (667 evaluate(context, &args[0].1)?,667 evaluate(context.clone(), &args[0].1)?,668 evaluate(context, &args[1].1)?,668 evaluate(context.clone(), &args[1].1)?,669 ) {669 ) {670 Val::Arr(670 Val::Arr(671 arr.into_iter()671 arr.into_iter()672 .filter(|e| {672 .filter(|e| {673 predicate673 predicate674 .evaluate_values(&context, &[e.clone()])674 .evaluate_values(context.clone(), &[e.clone()])675 .unwrap()675 .unwrap()676 .try_cast_bool("filter predicate")676 .try_cast_bool("filter predicate")677 .unwrap()677 .unwrap()685 // faster685 // faster686 ("std", "join") => {686 ("std", "join") => {687 assert_eq!(args.len(), 2);687 assert_eq!(args.len(), 2);688 let joiner = evaluate(context, &args[0].1)?.unwrap_if_lazy()?;688 let joiner = evaluate(context.clone(), &args[0].1)?.unwrap_if_lazy()?;689 let items = evaluate(context, &args[1].1)?.unwrap_if_lazy()?;689 let items = evaluate(context, &args[1].1)?.unwrap_if_lazy()?;690 println!("Before");690 println!("Before");691 let result = match (joiner, items) {691 let result = match (joiner, items) {775 cond_then,775 cond_then,776 cond_else,776 cond_else,777 } => {777 } => {778 if evaluate(context, &cond.0)?.try_cast_bool("if condition should be boolean")? {778 if evaluate(context.clone(), &cond.0)?779 .try_cast_bool("if condition should be boolean")?780 {779 evaluate(context, cond_then)?781 evaluate(context, cond_then)?crates/jsonnet-evaluator/src/function.rsdiffbeforeafterboth69 unreachable!()69 unreachable!()70 };70 };71 let val = if tailstrict {71 let val = if tailstrict {72 resolved_lazy_val!(evaluate(ctx.clone(), expr)?)72 resolved_lazy_val!(evaluate(ctx, expr)?)73 } else {73 } else {74 lazy_val!(closure!(clone ctx, clone expr, ||evaluate(ctx.clone(), &expr)))74 lazy_val!(closure!(clone ctx, clone expr, ||evaluate(ctx.clone(), &expr)))75 };75 };crates/jsonnet-evaluator/src/lib.rsdiffbeforeafterboth154 }154 }155 value.1.clone()155 value.1.clone()156 };156 };157 let value = evaluate(&self.create_default_context()?, &expr)?;157 let value = evaluate(self.create_default_context()?, &expr)?;158 {158 {159 self.0159 self.0160 .files160 .files205 }205 }206206207 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {207 pub fn evaluate_raw(&self, code: LocExpr) -> Result<Val> {208 self.run_in_state(|| evaluate(&self.create_default_context()?, &code))208 self.run_in_state(|| evaluate(self.create_default_context()?, &code))209 }209 }210210211 pub fn add_global(&self, name: String, value: Val) {211 pub fn add_global(&self, name: String, value: Val) {crates/jsonnet-evaluator/src/val.rsdiffbeforeafterboth179 .create_default_context()?179 .create_default_context()?180 .with_var("__tmp__to_json__".to_owned(), self)?;180 .with_var("__tmp__to_json__".to_owned(), self)?;181 if let Val::Str(result) = evaluate(181 if let Val::Str(result) = evaluate(182 &ctx,182 ctx,183 &el!(Expr::Apply(183 &el!(Expr::Apply(184 el!(Expr::Index(184 el!(Expr::Index(185 el!(Expr::Var("std".to_owned())),185 el!(Expr::Var("std".to_owned())),