git.delta.rocks / jrsonnet / refs/commits / d6e3ee65093c

difftreelog

fix align object iteration with context refactor

wnuqoyquYaroslav Bolyukin2026-04-25parent: #e9c741d.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/destructure.rsdiffbeforeafterboth
1use jrsonnet_ir::{BindSpec, Destruct};1use jrsonnet_ir::{BindSpec, Destruct};
22
3#[cfg(feature = "exp-preserve-order")]
4use crate::evaluate;
5use crate::{3use crate::{
6 Context, ContextBuilder, Pending, Thunk, Val, error::Result, evaluate_method,4 Context, ContextBuilder, Pending, Thunk, Val, error::Result, evaluate_method,
7 evaluate_named_param,5 evaluate_named_param,
25 Destruct::Array { start, rest, end } => {23 Destruct::Array { start, rest, end } => {
26 use jrsonnet_ir::DestructRest;24 use jrsonnet_ir::DestructRest;
25
26 use crate::bail;
2727
28 let min_len = start.len() + end.len();28 let min_len = start.len() + end.len();
29 let has_rest = rest.is_some();29 let has_rest = rest.is_some();
102 use jrsonnet_ir::DestructRest;102 use jrsonnet_ir::DestructRest;
103 use rustc_hash::FxHashSet;103 use rustc_hash::FxHashSet;
104104
105 use crate::ObjValueBuilder;105 use crate::{ObjValueBuilder, bail};
106106
107 let captured_fields: FxHashSet<_> = fields.iter().map(|f| f.0.clone()).collect();107 let captured_fields: FxHashSet<_> = fields.iter().map(|f| f.0.clone()).collect();
108 let field_names: Vec<_> = fields108 let field_names: Vec<_> = fields
modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
145 )?;145 )?;
146 }146 }
147 }147 }
148 #[cfg(feature = "exp-object-iteration")]
149 Val::Obj(obj) => {148 Val::Obj(obj) if cfg!(feature = "exp-object-iteration") => {
150 let fields = obj.fields(149 let fields = obj.fields(
151 // TODO: Should there be ability to preserve iteration order?150 // TODO: Should there be ability to preserve iteration order?
152 #[cfg(feature = "exp-preserve-order")]151 #[cfg(feature = "exp-preserve-order")]
153 false,152 false,
154 );153 );
155 guaranteed_reserve = guaranteed_reserve.max(1) * fields.len();154 guaranteed_reserve = guaranteed_reserve.max(1) * fields.len();
156 for field in fields {155 for (i, field) in fields.into_iter().enumerate() {
157 let fctx = Pending::new();156 let fctx = Pending::new();
158 let mut new_bindings = FxHashMap::with_capacity(into.binds_len());157 let mut ctx = ContextBuilder::extend_fast(ctx.clone());
159 let obj = obj.clone();158 let obj = obj.clone();
160 let value = Thunk::evaluated(Val::arr(vec![159 let value = Thunk::evaluated(Val::arr(vec![
161 Thunk::evaluated(Val::string(field.clone())),160 Thunk::evaluated(Val::string(field.clone())),
162 obj.get_lazy(field).transpose().expect(161 obj.get_lazy(field).expect(
163 "field exists, as field name was obtained from object.fields()",162 "field exists, as field name was obtained from object.fields()",
164 ),163 ),
165 ]));164 ]));
166 destruct(into, value, fctx.clone(), &mut new_bindings)?;165 destruct(into, value, fctx.clone(), &mut ctx)?;
167 let ctx = ctx.clone().extend_bindings(new_bindings).into_future(fctx);166 let ctx = ctx.build().into_future(fctx);
168167
169 evaluate_comp(ctx, &specs[1..], callback)?;168 evaluate_comp(
169 ctx,
170 &specs[1..],
171 if i == 0 || !specs.is_empty() {
172 guaranteed_reserve
173 } else {
174 0
175 },
176 callback,
177 )?;
170 }178 }
171 }179 }