difftreelog
fix align object iteration with context refactor
in: master
2 files changed
crates/jrsonnet-evaluator/src/evaluate/destructure.rsdiffbeforeafterboth1use jrsonnet_ir::{BindSpec, Destruct};1use jrsonnet_ir::{BindSpec, Destruct};223#[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;2526 use crate::bail;272728 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;104104105 use crate::ObjValueBuilder;105 use crate::{ObjValueBuilder, bail};106106107 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<_> = fieldscrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth145 )?;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);168167169 evaluate_comp(ctx, &specs[1..], callback)?;168 evaluate_comp(169 ctx,170 &specs[1..],171 if i == 0 || !specs.is_empty() {172 guaranteed_reserve173 } else {174 0175 },176 callback,177 )?;170 }178 }171 }179 }