git.delta.rocks / jrsonnet / refs/commits / 9fe9fbbbee8c

difftreelog

perf lazy/eager comp

yxsmulznYaroslav Bolyukin2026-04-04parent: #a52e508.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
149 }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}
180
181fn evaluate_arr_comp(ctx: Context, expr: &Rc<Expr>, comp_specs: &[CompSpec]) -> Result<ArrValue> {
182 'eager: {
183 let mut out = Vec::new();
184
185 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 }
196
197 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}
178210
179trait 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)?;