difftreelog
perf lazy/eager comp
in: master
1 file changed
crates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth149 }149 }150 #[cfg(feature = "exp-object-iteration")]150 #[cfg(feature = "exp-object-iteration")]151 Val::Obj(obj) => {151 Val::Obj(obj) => {152 for field in obj.fields(152 let fields = obj.fields(153 // TODO: Should there be ability to preserve iteration order?153 // TODO: Should there be ability to preserve iteration order?154 #[cfg(feature = "exp-preserve-order")]154 #[cfg(feature = "exp-preserve-order")]155 false,155 false,156 ) {156 );157 guaranteed_reserve = guaranteed_reserve.max(1) * fields.len();158 for field in fields {157 let fctx = Pending::new();159 let fctx = Pending::new();158 let mut new_bindings = FxHashMap::with_capacity(into.binds_len());160 let mut new_bindings = FxHashMap::with_capacity(into.binds_len());159 let obj = obj.clone();161 let obj = obj.clone();176 Ok(())178 Ok(())177}179}180181fn evaluate_arr_comp(ctx: Context, expr: &Rc<Expr>, comp_specs: &[CompSpec]) -> Result<ArrValue> {182 'eager: {183 let mut out = Vec::new();184185 if evaluate_comp(ctx.clone(), comp_specs, 0, &mut |ctx, reserve| {186 if reserve != 0 {187 out.reserve(reserve);188 }189 out.push(evaluate(ctx, expr)?);190 Ok(())191 })192 .is_err()193 {194 break 'eager;195 }196197 return Ok(ArrValue::new(out));198 };199 let mut out = Vec::new();200 evaluate_comp(ctx, comp_specs, 0, &mut |ctx, reserve| {201 if reserve != 0 {202 out.reserve(reserve);203 }204 let expr = expr.clone();205 out.push(Thunk!(move || evaluate(ctx, &expr)));206 Ok(())207 })?;208 Ok(ArrValue::new(out))209}178210179trait CloneableUnbound<T>: Unbound<Bound = T> + Clone {}211trait CloneableUnbound<T>: Unbound<Bound = T> + Clone {}180impl<V, T> CloneableUnbound<T> for V where V: Unbound<Bound = T> + Clone {}212impl<V, T> CloneableUnbound<T> for V where V: Unbound<Bound = T> + Clone {}646 Val::Arr(ArrValue::expr(ctx, items.clone()))678 Val::Arr(ArrValue::expr(ctx, items.clone()))647 }679 }648 }680 }649 ArrComp(expr, comp_specs) => {681 ArrComp(expr, comp_specs) => Val::Arr(evaluate_arr_comp(ctx, expr, comp_specs)?),650 let mut out = Vec::new();651 evaluate_comp(ctx, comp_specs, 0, &mut |ctx, reserve| {652 if reserve != 0 {653 out.reserve(reserve);654 }655 let expr = expr.clone();656 out.push(Thunk!(move || evaluate(ctx, &expr)));657 Ok(())658 })?;659 Val::arr(out)660 }661 Obj(body) => Val::Obj(evaluate_object(None, ctx, body)?),682 Obj(body) => Val::Obj(evaluate_object(None, ctx, body)?),662 ObjExtend(a, b) => {683 ObjExtend(a, b) => {663 let base = evaluate(ctx.clone(), a)?;684 let base = evaluate(ctx.clone(), a)?;