difftreelog
perf static object shapes
in: master
29 files changed
crates/jrsonnet-evaluator/src/analyze.rsdiffbeforeafterboth21use jrsonnet_interner::IStr;21use jrsonnet_interner::IStr;22use jrsonnet_ir::{22use jrsonnet_ir::{23 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,23 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,24 ExprParams, FieldName, ForSpecData, IfElse, IfSpecData, ImportKind, LiteralType, NumValue,24 ExprParams, FieldName, ForSpecData, IdentityKind, IfElse, IfSpecData, ImportKind, ObjBody,25 ObjBody, ObjComp, ObjMembers, Slice, SliceDesc, Span, Spanned, UnaryOpType, Visibility,25 ObjComp, ObjMembers, Slice, SliceDesc, Span, Spanned, TrivialVal, UnaryOpType, Visibility,26 function::FunctionSignature,26 function::FunctionSignature,27};27};28use rustc_hash::FxHashMap;28use rustc_hash::{FxHashMap, FxHashSet};29use smallvec::SmallVec;29use smallvec::SmallVec;303031use crate::{31use crate::{32 arr::arridx,32 arr::arridx,33 error::{format_found, suggest_names},33 error::{format_found, suggest_names},34 gc::WithCapacityExt as _,35 obj::{ObjFieldFlags, ObjShape, ShapeField, ordering::FieldIndex},34};36};353736#[derive(Debug, Clone, Copy)]38#[derive(Debug, Clone, Copy)]329#[derive(Debug, Acyclic)]331#[derive(Debug, Acyclic)]330pub enum LObjBody {332pub enum LObjBody {331 MemberList(LObjMembers),333 MemberList(LObjMembers),334 StaticMembers(Box<LObjStaticMembers>),332 ObjComp(Box<LObjComp>),335 ObjComp(Box<LObjComp>),333}336}334337348 pub fields: Vec<LFieldMember>,351 pub fields: Vec<LFieldMember>,349}352}353354#[derive(Debug, Acyclic)]355pub struct LObjStaticMembers {356 pub frame_shape: ClosureShape,357 pub this: Option<LocalSlot>,358 pub set_dollar: bool,359 pub uses_super: bool,360361 pub locals: Rc<Vec<LBind>>,362 pub asserts: Option<Rc<LObjAsserts>>,363364 pub shape: Rc<ObjShape>,365 pub bindings: Vec<Rc<(ClosureShape, LExpr)>>,366}350367351#[derive(Debug, Acyclic)]368#[derive(Debug, Acyclic)]352pub struct LObjComp {369pub struct LObjComp {1336 taint: &mut AnalysisResult,1353 taint: &mut AnalysisResult,1337) -> LExpr {1354) -> LExpr {1338 if let Expr::Function(span, params, body) = expr {1355 if let Expr::Function(span, params, body) = expr {1339 return analyze_function(Some(name), &span, ¶ms, body, stack, taint);1356 return analyze_function(Some(name), span, params, body, stack, taint);1340 }1357 }1341 analyze(expr, stack, taint)1358 analyze(expr, stack, taint)1342}1359}1552 BindSpec::Field {1569 BindSpec::Field {1553 value: Expr::Function(span, params, value),1570 value: Expr::Function(span, params, value),1554 into: Destruct::Full(name),1571 into: Destruct::Full(name),1555 } => analyze_function(Some(name.value.clone()), &span, params, value, stack, taint),1572 } => analyze_function(Some(name.value.clone()), span, params, value, stack, taint),1556 BindSpec::Field { value, .. } => analyze(value, stack, taint),1573 BindSpec::Field { value, .. } => analyze(value, stack, taint),1557 BindSpec::Function {1574 BindSpec::Function {1558 params,1575 params,1694) -> LObjBody {1711) -> LObjBody {1695 match obj {1712 match obj {1696 ObjBody::MemberList(members) => {1713 ObjBody::MemberList(members) => {1697 LObjBody::MemberList(analyze_obj_members(members, stack, taint))1714 let lowered = analyze_obj_members(members, stack, taint);1715 match try_lower_static(lowered) {1716 Ok(static_members) => LObjBody::StaticMembers(Box::new(static_members)),1717 Err(member_list) => LObjBody::MemberList(member_list),1718 }1698 }1719 }1699 ObjBody::ObjComp(comp) => LObjBody::ObjComp(Box::new(analyze_obj_comp(comp, stack, taint))),1720 ObjBody::ObjComp(comp) => LObjBody::ObjComp(Box::new(analyze_obj_comp(comp, stack, taint))),1700 }1721 }1701}1722}17231724fn try_lower_static(members: LObjMembers) -> Result<LObjStaticMembers, LObjMembers> {1725 let mut seen: FxHashSet<IStr> = FxHashSet::with_capacity(members.fields.len());1726 for f in &members.fields {1727 match &f.name {1728 LFieldName::Fixed(name) => {1729 if !seen.insert(name.clone()) {1730 return Err(members);1731 }1732 }1733 LFieldName::Dyn(_) => return Err(members),1734 }1735 }17361737 let LObjMembers {1738 frame_shape,1739 this,1740 set_dollar,1741 uses_super,1742 locals,1743 asserts,1744 fields,1745 } = members;17461747 let mut shape_fields = Vec::with_capacity(fields.len());1748 let mut bindings = Vec::with_capacity(fields.len());1749 let mut next_index = FieldIndex::default();1750 for f in fields {1751 let LFieldName::Fixed(name) = f.name else {1752 unreachable!("checked above");1753 };1754 let index = next_index;1755 next_index = next_index.next();1756 shape_fields.push(ShapeField {1757 name,1758 flags: ObjFieldFlags::new(f.plus, f.visibility),1759 location: None,1760 index,1761 });1762 bindings.push(f.value);1763 }17641765 Ok(LObjStaticMembers {1766 frame_shape,1767 this,1768 set_dollar,1769 uses_super,1770 locals,1771 asserts,1772 shape: Rc::new(ObjShape::new(shape_fields)),1773 bindings,1774 })1775}170217761703fn analyze_obj_members(1777fn analyze_obj_members(1704 members: &ObjMembers,1778 members: &ObjMembers,crates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth11 operator::evaluate_binary_op_special,11 operator::evaluate_binary_op_special,12};12};13use crate::{13use crate::{14 Context, Error, ObjValue, ObjValueBuilder, ObjectAssertion, Result, ResultExt as _, SupThis,14 CcObjectAssertion, CcUnbound, Context, Error, MaybeUnbound, ObjValue, ObjValueBuilder,15 Unbound, Val,15 ObjectAssertion, Result, ResultExt as _, StaticShapeOopObject, SupThis, Unbound, Val,16 analyze::{16 analyze::{17 ClosureShape, LArgsDesc, LAssertStmt, LExpr, LFieldMember, LFieldName, LFunction,17 ClosureShape, LArgsDesc, LAssertStmt, LExpr, LFieldMember, LFieldName, LFunction,18 LIndexPart, LObjAsserts, LObjBody, LObjMembers, LSlot,18 LIndexPart, LObjAsserts, LObjBody, LObjMembers, LObjStaticMembers, LSlot,19 },19 },20 arr::ArrValue,20 arr::ArrValue,21 bail,21 bail,469fn evaluate_obj_body(super_obj: Option<ObjValue>, ctx: Context, body: &LObjBody) -> Result<Val> {469fn evaluate_obj_body(super_obj: Option<ObjValue>, ctx: Context, body: &LObjBody) -> Result<Val> {470 match body {470 match body {471 LObjBody::MemberList(members) => evaluate_obj_members(super_obj, ctx, members),471 LObjBody::MemberList(members) => evaluate_obj_members(super_obj, ctx, members),472 LObjBody::StaticMembers(members) => {473 Ok(evaluate_static_obj_members(super_obj, ctx, members))474 }472 LObjBody::ObjComp(comp) => evaluate_obj_comp(super_obj, ctx, comp),475 LObjBody::ObjComp(comp) => evaluate_obj_comp(super_obj, ctx, comp),473 }476 }474}477}540 Ok(())543 Ok(())541}544}545546fn evaluate_static_obj_members(547 super_obj: Option<ObjValue>,548 ctx: Context,549 members: &LObjStaticMembers,550) -> Val {551 #[derive(Trace)]552 struct UnboundField<B: Trace> {553 uctx: B,554 value: Rc<(ClosureShape, LExpr)>,555 name: IStr,556 }557 impl<B: Unbound<Bound = Context>> Unbound for UnboundField<B> {558 type Bound = Val;559 fn bind(&self, sup_this: SupThis) -> Result<Val> {560 let a_ctx = self.uctx.bind(sup_this)?;561 let b_ctx = Context::enter_using(&a_ctx, &self.value.0);562 evaluate(b_ctx, &self.value.1)563 }564 }565566 let needs_unbound = members.this.is_some() || members.uses_super;567568 let mut bindings: Vec<MaybeUnbound> = Vec::with_capacity(members.bindings.len());569570 let assertion = if needs_unbound {571 let uctx = CachedUnbound::new(evaluate_locals_unbound(572 &ctx,573 &members.frame_shape,574 members.this,575 members.locals.clone(),576 ));577 for (binding, field) in members.bindings.iter().zip(members.shape.fields()) {578 if let Some(v) = evaluate_trivial(&binding.1) {579 bindings.push(MaybeUnbound::Const(v));580 continue;581 }582 bindings.push(MaybeUnbound::Unbound(CcUnbound::new(UnboundField {583 uctx: uctx.clone(),584 value: binding.clone(),585 name: field.name.clone(),586 })));587 }588 members589 .asserts590 .as_ref()591 .map(|a| CcObjectAssertion::new(evaluate_object_assertions_unbound(uctx, a.clone())))592 } else {593 let a_ctx = ctx594 .pack_captures_sup_this(&members.frame_shape)595 .enter(|fill, ctx| {596 fill_letrec_binds(fill, ctx, &members.locals);597 });598 for binding in &members.bindings {599 if let Some(v) = evaluate_trivial(&binding.1) {600 bindings.push(MaybeUnbound::Const(v));601 continue;602 }603 let env = Context::enter_using(&a_ctx, &binding.0);604 let value = binding.clone();605 bindings.push(MaybeUnbound::Bound(Thunk!(move || evaluate(env, &value.1))));606 }607 members.asserts.as_ref().map(|a| {608 CcObjectAssertion::new(evaluate_object_assertions_static(a_ctx.clone(), a.clone()))609 })610 };611612 let mut builder = ObjValueBuilder::with_capacity(0);613 if let Some(sup) = super_obj {614 builder.with_super(sup);615 }616 builder.extend_with_core(StaticShapeOopObject::new(617 members.shape.clone(),618 bindings,619 assertion,620 ));621 Val::Obj(builder.build())622}542623543fn evaluate_obj_members(624fn evaluate_obj_members(544 super_obj: Option<ObjValue>,625 super_obj: Option<ObjValue>,crates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth144 Unbound(CcUnbound<Val>),144 Unbound(CcUnbound<Val>),145 /// Value is object-independent145 /// Value is object-independent146 Bound(Thunk<Val>),146 Bound(Thunk<Val>),147 Const(Val),147}148}148149149impl Debug for MaybeUnbound {150impl Debug for MaybeUnbound {157 match self {158 match self {158 Self::Unbound(v) => v.0.bind(sup_this),159 Self::Unbound(v) => v.0.bind(sup_this),159 Self::Bound(v) => Ok(v.evaluate()?),160 Self::Bound(v) => Ok(v.evaluate()?),161 Self::Const(v) => Ok(v.clone()),160 }162 }161 }163 }162}164}crates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth17use rustc_hash::{FxHashMap, FxHashSet};17use rustc_hash::{FxHashMap, FxHashSet};181819mod oop;19mod oop;20mod static_shape;202121pub use jrsonnet_ir::Visibility;22pub use jrsonnet_ir::Visibility;22pub use oop::ObjValueBuilder;23pub use oop::ObjValueBuilder;24pub use static_shape::{ObjShape, ObjShapeBuilder, ShapeField, StaticShapeOopObject};232524use crate::{26use crate::{25 CcUnbound, MaybeUnbound, Result, Thunk, Unbound, Val,27 CcUnbound, MaybeUnbound, Result, Thunk, Unbound, Val,99#[derive(Clone, Copy, Acyclic)]101#[derive(Clone, Copy, Acyclic)]100pub struct ObjFieldFlags(u8);102pub struct ObjFieldFlags(u8);101impl ObjFieldFlags {103impl ObjFieldFlags {102 fn new(add: bool, visibility: Visibility) -> Self {104 pub fn new(add: bool, visibility: Visibility) -> Self {103 let mut v = 0;105 let mut v = 0;104 if add {106 if add {105 v |= 1;107 v |= 1;140 pub location: Option<Span>,142 pub location: Option<Span>,141}143}142144143cc_dyn!(CcObjectAssertion, ObjectAssertion);145cc_dyn!(CcObjectAssertion, ObjectAssertion, pub fn new() {...});144pub trait ObjectAssertion: Trace {146pub trait ObjectAssertion: Trace {145 fn run(&self, sup_this: SupThis) -> Result<()>;147 fn run(&self, sup_this: SupThis) -> Result<()>;146}148}204206205 fn run_assertions_core(&self, sup_this: SupThis) -> Result<()>;207 fn run_assertions_core(&self, sup_this: SupThis) -> Result<()>;208209 fn has_assertion(&self) -> bool {210 false211 }206}212}207213208#[derive(Clone, Trace)]214#[derive(Clone, Trace)]1117pub struct ExtendBuilder<'v>(&'v mut ObjValue);1123pub struct ExtendBuilder<'v>(&'v mut ObjValue);1118impl ObjMemberBuilder<ExtendBuilder<'_>> {1124impl ObjMemberBuilder<ExtendBuilder<'_>> {1119 pub fn value(self, value: impl Into<Val>) {1125 pub fn value(self, value: impl Into<Val>) {1120 self.binding(MaybeUnbound::Bound(Thunk::evaluated(value.into())));1126 self.binding(MaybeUnbound::Const(value.into()));1121 }1127 }1122 pub fn bindable(self, bindable: impl Unbound<Bound = Val>) {1128 pub fn bindable(self, bindable: impl Unbound<Bound = Val>) {1123 self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)));1129 self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)));crates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth114 Ok(())114 Ok(())115 }115 }116117 fn has_assertion(&self) -> bool {118 self.assertion.is_some()119 }116}120}117121118#[allow(clippy::module_name_repetitions)]122#[allow(clippy::module_name_repetitions)]177181178 pub fn extend_with_core(&mut self, core: impl ObjectCore) {182 pub fn extend_with_core(&mut self, core: impl ObjectCore) {179 self.commit();183 self.commit();184 self.has_assertions |= core.has_assertion();180 self.sup.push(CcObjectCore::new(core));185 self.sup.push(CcObjectCore::new(core));181 }186 }182187219impl ObjMemberBuilder<ValueBuilder<'_>> {224impl ObjMemberBuilder<ValueBuilder<'_>> {220 /// Inserts value, replacing if it is already defined225 /// Inserts value, replacing if it is already defined221 pub fn value(self, value: impl Into<Val>) {226 pub fn value(self, value: impl Into<Val>) {222 let (receiver, name, idx, member) =227 let (receiver, name, idx, member) = self.build_member(MaybeUnbound::Const(value.into()));223 self.build_member(MaybeUnbound::Bound(Thunk::evaluated(value.into())));224 let entry = receiver.0.new.this_entries.entry(name);228 let entry = receiver.0.new.this_entries.entry(name);225 entry.insert_entry((member, idx));229 entry.insert_entry((member, idx));226 }230 }233237234 /// Tries to insert value, returns an error if it was already defined238 /// Tries to insert value, returns an error if it was already defined235 pub fn try_value(self, value: impl Into<Val>) -> Result<()> {239 pub fn try_value(self, value: impl Into<Val>) -> Result<()> {236 self.try_thunk(Thunk::evaluated(value.into()))240 self.binding(MaybeUnbound::Const(value.into()))237 }241 }238 pub fn try_thunk(self, value: impl Into<Thunk<Val>>) -> Result<()> {242 pub fn try_thunk(self, value: impl Into<Thunk<Val>>) -> Result<()> {239 self.binding(MaybeUnbound::Bound(value.into()))243 self.binding(MaybeUnbound::Bound(value.into()))crates/jrsonnet-evaluator/src/obj/static_shape.rsdiffbeforeafterbothno changes
crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@array_comp.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/array_comp.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/array_comp.jsonnet5---6---26 ),27 ),27 ),28 ),28 op: Mul,29 op: Mul,29 rhs: Num(30 rhs: Trivial(31 Num(30 2.0,32 2.0,33 ),31 ),34 ),32 },35 },33 compspecs: [36 compspecs: [41 0,44 0,42 ),45 ),43 ),46 ),44 over: Arr {47 over: ArrConst(45 shape: ClosureShape {48 [46 captures: [],47 n_locals: 0,48 },49 items: [50 Num(49 Num(51 1.0,50 1.0,52 ),51 ),57 3.0,56 3.0,58 ),57 ),59 ],58 ],60 },59 ),61 loop_invariant: true,60 loop_invariant: true,62 },61 },63 If(62 If(70 ),69 ),71 ),70 ),72 op: Gt,71 op: Gt,73 rhs: Num(72 rhs: Trivial(73 Num(74 1.0,74 1.0,75 ),75 ),76 ),76 },77 },77 ),78 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@dollar_deeply_nested.jsonnet.snapdiffbeforeafterboth20--- diagnostics ---20--- diagnostics ---21--- lir ---21--- lir ---22Obj(22Obj(23 MemberList(23 StaticMembers(24 LObjMembers {24 LObjStaticMembers {25 frame_shape: ClosureShape {25 frame_shape: ClosureShape {26 captures: [],26 captures: [],27 n_locals: 1,27 n_locals: 1,35 uses_super: false,35 uses_super: false,36 locals: [],36 locals: [],37 asserts: None,37 asserts: None,38 fields: [38 shape: ObjShape {39 LFieldMember {40 name: Fixed(39 fields: [41 "top",40 ShapeField {42 ),41 name: "top",43 plus: false,44 visibility: Normal,42 flags: ObjFieldFlags {45 value: (46 ClosureShape {47 captures: [],43 add: false,48 n_locals: 0,44 visibility: Normal,49 },45 },46 location: None,47 index: FieldIndex(48 (),49 ),50 },51 ShapeField {52 name: "a",53 flags: ObjFieldFlags {54 add: false,55 visibility: Normal,56 },57 location: None,58 index: FieldIndex(59 (),60 ),61 },62 ],63 },64 bindings: [65 (66 ClosureShape {67 captures: [],68 n_locals: 0,69 },70 Trivial(50 Str(71 Str(51 "outer",72 "outer",52 ),73 ),53 ),74 ),54 },75 ),55 LFieldMember {56 name: Fixed(57 "a",58 ),59 plus: false,76 (60 visibility: Normal,61 value: (62 ClosureShape {77 ClosureShape {63 captures: [],78 captures: [],64 n_locals: 0,79 n_locals: 0,65 },80 },66 Obj(81 Obj(67 MemberList(82 StaticMembers(68 LObjMembers {83 LObjStaticMembers {69 frame_shape: ClosureShape {84 frame_shape: ClosureShape {70 captures: [85 captures: [71 Local(86 Local(72 LocalSlot(87 LocalSlot(73 0,88 0,74 ),75 ),89 ),76 ],90 ),77 n_locals: 1,91 ],92 n_locals: 1,78 },93 },79 this: None,94 this: None,80 set_dollar: false,95 set_dollar: false,81 uses_super: false,96 uses_super: false,82 locals: [],97 locals: [],83 asserts: None,98 asserts: None,99 shape: ObjShape {84 fields: [100 fields: [85 LFieldMember {101 ShapeField {86 name: Fixed(102 name: "b",103 flags: ObjFieldFlags {104 add: false,105 visibility: Normal,106 },107 location: None,108 index: FieldIndex(87 "b",109 (),88 ),110 ),89 plus: false,111 },90 visibility: Normal,112 ],91 value: (113 },92 ClosureShape {114 bindings: [93 captures: [115 (94 Capture(116 ClosureShape {95 CaptureSlot(117 captures: [96 0,118 Capture(119 CaptureSlot(120 0,121 ),122 ),123 ],124 n_locals: 0,125 },126 Obj(127 StaticMembers(128 LObjStaticMembers {129 frame_shape: ClosureShape {130 captures: [131 Capture(132 CaptureSlot(133 0,134 ),97 ),135 ),136 ],137 n_locals: 1,138 },139 this: Some(140 LocalSlot(141 0,98 ),142 ),99 ],143 ),100 n_locals: 0,144 set_dollar: false,101 },145 uses_super: false,102 Obj(146 locals: [],103 MemberList(147 asserts: None,104 LObjMembers {148 shape: ObjShape {105 frame_shape: ClosureShape {149 fields: [150 ShapeField {151 name: "c",152 flags: ObjFieldFlags {153 add: false,154 visibility: Normal,155 },156 location: None,157 index: FieldIndex(158 (),159 ),160 },161 ShapeField {162 name: "d",163 flags: ObjFieldFlags {164 add: false,165 visibility: Normal,166 },167 location: None,168 index: FieldIndex(169 (),170 ),171 },172 ],173 },174 bindings: [175 (176 ClosureShape {106 captures: [177 captures: [107 Capture(178 Capture(108 CaptureSlot(179 CaptureSlot(109 0,180 0,110 ),181 ),111 ),182 ),112 ],183 ],113 n_locals: 1,184 n_locals: 0,114 },185 },115 this: Some(186 Index {187 indexable: Slot(116 LocalSlot(188 Capture(117 0,189 CaptureSlot(190 0,191 ),192 ),118 ),193 ),119 ),194 parts: [120 set_dollar: false,195 LIndexPart {121 uses_super: false,196 span: virtual:<test>:45-48,122 locals: [],197 value: Trivial(123 asserts: None,198 Str(124 fields: [199 "top",125 LFieldMember {126 name: Fixed(127 "c",128 ),129 plus: false,130 visibility: Normal,131 value: (132 ClosureShape {133 captures: [134 Capture(135 CaptureSlot(136 0,137 ),138 ),139 ],140 n_locals: 0,141 },142 Index {143 indexable: Slot(144 Capture(145 CaptureSlot(146 0,147 ),148 ),149 ),200 ),150 parts: [151 LIndexPart {152 span: virtual:<test>:45-48,153 value: Str(154 "top",155 ),156 },157 ],158 },159 ),160 },161 LFieldMember {162 name: Fixed(163 "d",164 ),165 plus: false,166 visibility: Normal,167 value: (168 ClosureShape {169 captures: [],170 n_locals: 0,171 },172 Slot(173 Local(174 LocalSlot(175 0,176 ),177 ),178 ),201 ),202 },203 ],204 },205 ),206 (207 ClosureShape {208 captures: [],209 n_locals: 0,210 },211 Slot(212 Local(213 LocalSlot(214 0,179 ),215 ),180 },216 ),181 ],217 ),182 },218 ),183 ),219 ],184 ),220 },185 ),221 ),186 },222 ),187 ],223 ),188 },224 ],189 ),225 },190 ),226 ),191 ),227 ),192 },228 ),193 ],229 ],194 },230 },195 ),231 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@dollar_outside_object.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/dollar_outside_object.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/dollar_outside_object.jsonnet5---6---21 parts: [22 parts: [22 LIndexPart {23 LIndexPart {23 span: virtual:<test>:2-3,24 span: virtual:<test>:2-3,24 value: Str(25 value: Trivial(26 Str(25 "a",27 "a",28 ),26 ),29 ),27 },30 },28 ],31 ],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@function_def.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/function_def.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/function_def.jsonnet5---6---108 ),109 ),109 args: LArgsDesc {110 args: LArgsDesc {110 unnamed: [111 unnamed: [111 Num(112 Trivial(113 Num(112 1.0,114 1.0,115 ),113 ),116 ),114 Num(117 Trivial(118 Num(115 2.0,119 2.0,120 ),116 ),121 ),117 ],122 ],118 names: [],123 names: [],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@hoistable_local.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/hoistable_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/hoistable_local.jsonnet5---6---31 captures: [],32 captures: [],32 n_locals: 0,33 n_locals: 0,33 },34 },34 value: Num(35 value: Trivial(36 Num(35 1.0,37 1.0,38 ),36 ),39 ),37 },40 },38 ],41 ],60 n_locals: 0,63 n_locals: 0,61 },64 },62 value: BinaryOp {65 value: BinaryOp {63 lhs: Num(66 lhs: Trivial(67 Num(64 10.0,68 10.0,69 ),65 ),70 ),66 op: Add,71 op: Add,67 rhs: Num(72 rhs: Trivial(73 Num(68 20.0,74 20.0,75 ),69 ),76 ),70 },77 },71 },78 },crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@ifelse.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analyze_tests/ifelse.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/ifelse.jsonnet5---6---6--- source ---7--- source ---7if true then 1 else 28if true then 1 else 212--- diagnostics ---13--- diagnostics ---13--- lir ---14--- lir ---14IfElse {15IfElse {15 cond: Bool(16 cond: Trivial(17 Bool(16 true,18 true,19 ),17 ),20 ),18 cond_then: Num(21 cond_then: Trivial(22 Num(19 1.0,23 1.0,24 ),20 ),25 ),21 cond_else: Some(26 cond_else: Some(22 Num(27 Trivial(28 Num(23 2.0,29 2.0,30 ),24 ),31 ),25 ),32 ),26}33}crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@literal.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analyze_tests/literal.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/literal.jsonnet5---6---6--- source ---7--- source ---74284211errored: false12errored: false12--- diagnostics ---13--- diagnostics ---13--- lir ---14--- lir ---15Trivial(14Num(16 Num(15 42.0,17 42.0,18 ),16)19)1720crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@loop_invariant.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/loop_invariant.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/loop_invariant.jsonnet5---6---64 parts: [65 parts: [65 LIndexPart {66 LIndexPart {66 span: virtual:<test>:21-26,67 span: virtual:<test>:21-26,67 value: Str(68 value: Trivial(69 Str(68 "range",70 "range",71 ),69 ),72 ),70 },73 },71 ],74 ],72 },75 },73 args: LArgsDesc {76 args: LArgsDesc {74 unnamed: [77 unnamed: [75 Num(78 Trivial(79 Num(76 1.0,80 1.0,81 ),77 ),82 ),78 Num(83 Trivial(84 Num(79 1000.0,85 1000.0,86 ),80 ),87 ),81 ],88 ],82 names: [],89 names: [],110 parts: [117 parts: [111 LIndexPart {118 LIndexPart {112 span: virtual:<test>:49-54,119 span: virtual:<test>:49-54,113 value: Str(120 value: Trivial(121 Str(114 "range",122 "range",123 ),115 ),124 ),116 },125 },117 ],126 ],118 },127 },119 args: LArgsDesc {128 args: LArgsDesc {120 unnamed: [129 unnamed: [121 Num(130 Trivial(131 Num(122 1.0,132 1.0,133 ),123 ),134 ),124 Num(135 Trivial(136 Num(125 1000.0,137 1000.0,138 ),126 ),139 ),127 ],140 ],128 names: [],141 names: [],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@mutual_recursion.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/mutual_recursion.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/mutual_recursion.jsonnet5---6---46 captures: [],47 captures: [],47 n_locals: 0,48 n_locals: 0,48 },49 },49 value: Num(50 value: Trivial(51 Num(50 1.0,52 1.0,53 ),51 ),54 ),52 },55 },53 ],56 ],60 ),63 ),61 ),64 ),62 op: Add,65 op: Add,63 rhs: Num(66 rhs: Trivial(67 Num(64 2.0,68 2.0,69 ),65 ),70 ),66 },71 },67 },72 },crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@nested_object_independent.jsonnet.snapdiffbeforeafterboth17--- diagnostics ---17--- diagnostics ---18--- lir ---18--- lir ---19Obj(19Obj(20 MemberList(20 StaticMembers(21 LObjMembers {21 LObjStaticMembers {22 frame_shape: ClosureShape {22 frame_shape: ClosureShape {23 captures: [],23 captures: [],24 n_locals: 1,24 n_locals: 1,28 uses_super: false,28 uses_super: false,29 locals: [],29 locals: [],30 asserts: None,30 asserts: None,31 fields: [31 shape: ObjShape {32 LFieldMember {33 name: Fixed(32 fields: [34 "a",33 ShapeField {35 ),34 name: "a",36 plus: false,37 visibility: Normal,35 flags: ObjFieldFlags {38 value: (39 ClosureShape {40 captures: [],36 add: false,41 n_locals: 0,37 visibility: Normal,42 },38 },39 location: None,40 index: FieldIndex(41 (),42 ),43 },44 ShapeField {45 name: "b",46 flags: ObjFieldFlags {47 add: false,48 visibility: Normal,49 },50 location: None,51 index: FieldIndex(52 (),53 ),54 },55 ],56 },57 bindings: [58 (59 ClosureShape {60 captures: [],61 n_locals: 0,62 },63 Trivial(43 Num(64 Num(44 1.0,65 1.0,45 ),66 ),46 ),67 ),47 },68 ),48 LFieldMember {49 name: Fixed(50 "b",51 ),52 plus: false,69 (53 visibility: Normal,54 value: (55 ClosureShape {70 ClosureShape {56 captures: [],71 captures: [],57 n_locals: 0,72 n_locals: 0,58 },73 },59 Obj(74 Obj(60 MemberList(75 StaticMembers(61 LObjMembers {76 LObjStaticMembers {62 frame_shape: ClosureShape {77 frame_shape: ClosureShape {63 captures: [],78 captures: [],64 n_locals: 1,79 n_locals: 1,65 },80 },66 this: Some(81 this: Some(67 LocalSlot(82 LocalSlot(68 0,83 0,69 ),70 ),84 ),71 set_dollar: false,85 ),86 set_dollar: false,72 uses_super: false,87 uses_super: false,73 locals: [],88 locals: [],74 asserts: None,89 asserts: None,90 shape: ObjShape {75 fields: [91 fields: [76 LFieldMember {92 ShapeField {77 name: Fixed(93 name: "c",94 flags: ObjFieldFlags {95 add: false,96 visibility: Normal,97 },98 location: None,99 index: FieldIndex(78 "c",100 (),79 ),101 ),80 plus: false,102 },81 visibility: Normal,103 ShapeField {82 value: (104 name: "d",83 ClosureShape {105 flags: ObjFieldFlags {84 captures: [],106 add: false,85 n_locals: 0,107 visibility: Normal,86 },108 },87 Num(109 location: None,88 2.0,110 index: FieldIndex(89 ),111 (),90 ),112 ),91 },113 },92 LFieldMember {114 ],115 },116 bindings: [117 (118 ClosureShape {93 name: Fixed(119 captures: [],120 n_locals: 0,121 },122 Trivial(123 Num(94 "d",124 2.0,95 ),125 ),96 plus: false,126 ),97 visibility: Normal,127 ),98 value: (128 (99 ClosureShape {129 ClosureShape {100 captures: [],130 captures: [],101 n_locals: 0,131 n_locals: 0,102 },132 },103 Index {133 Index {104 indexable: Slot(134 indexable: Slot(105 Local(135 Local(106 LocalSlot(136 LocalSlot(107 0,137 0,108 ),138 ),139 ),140 ),141 parts: [142 LIndexPart {143 span: virtual:<test>:35-36,144 value: Trivial(145 Str(146 "c",109 ),147 ),110 ),148 ),111 parts: [112 LIndexPart {113 span: virtual:<test>:35-36,114 value: Str(115 "c",116 ),117 },118 ],119 },149 },120 ),150 ],121 },151 },122 ],152 ),123 },153 ],124 ),154 },125 ),155 ),126 ),156 ),127 },157 ),128 ],158 ],129 },159 },130 ),160 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_comp.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/object_comp.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/object_comp.jsonnet5---6---71 0,72 0,72 ),73 ),73 ),74 ),74 over: Arr {75 over: ArrConst(75 shape: ClosureShape {76 [76 captures: [],77 n_locals: 0,78 },79 items: [80 Str(77 Str(81 "a",78 "a",82 ),79 ),83 Str(80 Str(84 "b",81 "b",85 ),82 ),86 ],83 ],87 },84 ),88 loop_invariant: true,85 loop_invariant: true,89 },86 },90 ],87 ],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_dollar.jsonnet.snapdiffbeforeafterboth12--- diagnostics ---12--- diagnostics ---13--- lir ---13--- lir ---14Obj(14Obj(15 MemberList(15 StaticMembers(16 LObjMembers {16 LObjStaticMembers {17 frame_shape: ClosureShape {17 frame_shape: ClosureShape {18 captures: [],18 captures: [],19 n_locals: 1,19 n_locals: 1,27 uses_super: false,27 uses_super: false,28 locals: [],28 locals: [],29 asserts: None,29 asserts: None,30 fields: [30 shape: ObjShape {31 LFieldMember {32 name: Fixed(31 fields: [33 "a",32 ShapeField {34 ),33 name: "a",35 plus: false,36 visibility: Normal,34 flags: ObjFieldFlags {37 value: (38 ClosureShape {39 captures: [],35 add: false,40 n_locals: 0,36 visibility: Normal,41 },37 },38 location: None,39 index: FieldIndex(40 (),41 ),42 },43 ShapeField {44 name: "b",45 flags: ObjFieldFlags {46 add: false,47 visibility: Normal,48 },49 location: None,50 index: FieldIndex(51 (),52 ),53 },54 ],55 },56 bindings: [57 (58 ClosureShape {59 captures: [],60 n_locals: 0,61 },62 Trivial(42 Num(63 Num(43 1.0,64 1.0,44 ),65 ),45 ),66 ),46 },67 ),47 LFieldMember {48 name: Fixed(49 "b",50 ),51 plus: false,68 (52 visibility: Normal,53 value: (54 ClosureShape {69 ClosureShape {55 captures: [],70 captures: [],56 n_locals: 0,71 n_locals: 0,57 },72 },58 Obj(73 Obj(59 MemberList(74 StaticMembers(60 LObjMembers {75 LObjStaticMembers {61 frame_shape: ClosureShape {76 frame_shape: ClosureShape {62 captures: [77 captures: [63 Local(78 Local(64 LocalSlot(79 LocalSlot(65 0,80 0,66 ),67 ),81 ),68 ],82 ),69 n_locals: 1,83 ],84 n_locals: 1,70 },85 },71 this: None,86 this: None,72 set_dollar: false,87 set_dollar: false,73 uses_super: false,88 uses_super: false,74 locals: [],89 locals: [],75 asserts: None,90 asserts: None,91 shape: ObjShape {76 fields: [92 fields: [77 LFieldMember {93 ShapeField {78 name: Fixed(94 name: "c",95 flags: ObjFieldFlags {96 add: false,97 visibility: Normal,98 },99 location: None,100 index: FieldIndex(79 "c",101 (),80 ),102 ),81 plus: false,103 },82 visibility: Normal,104 ],83 value: (105 },84 ClosureShape {106 bindings: [85 captures: [107 (86 Capture(108 ClosureShape {87 CaptureSlot(109 captures: [88 0,110 Capture(89 ),111 CaptureSlot(112 0,113 ),114 ),115 ],116 n_locals: 0,117 },118 Index {119 indexable: Slot(120 Capture(121 CaptureSlot(122 0,123 ),124 ),125 ),126 parts: [127 LIndexPart {128 span: virtual:<test>:18-19,129 value: Trivial(130 Str(131 "a",90 ),132 ),91 ],92 n_locals: 0,93 },94 Index {95 indexable: Slot(96 Capture(97 CaptureSlot(98 0,99 ),100 ),101 ),133 ),102 parts: [103 LIndexPart {104 span: virtual:<test>:18-19,105 value: Str(106 "a",107 ),108 },109 ],110 },134 },111 ),135 ],112 },136 },113 ],137 ),114 },138 ],115 ),139 },116 ),140 ),117 ),141 ),118 },142 ),119 ],143 ],120 },144 },121 ),145 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_self.jsonnet.snapdiffbeforeafterboth12--- diagnostics ---12--- diagnostics ---13--- lir ---13--- lir ---14Obj(14Obj(15 MemberList(15 StaticMembers(16 LObjMembers {16 LObjStaticMembers {17 frame_shape: ClosureShape {17 frame_shape: ClosureShape {18 captures: [],18 captures: [],19 n_locals: 1,19 n_locals: 1,27 uses_super: false,27 uses_super: false,28 locals: [],28 locals: [],29 asserts: None,29 asserts: None,30 fields: [30 shape: ObjShape {31 LFieldMember {32 name: Fixed(31 fields: [33 "a",32 ShapeField {34 ),33 name: "a",35 plus: false,36 visibility: Normal,34 flags: ObjFieldFlags {37 value: (38 ClosureShape {39 captures: [],35 add: false,40 n_locals: 0,36 visibility: Normal,41 },37 },38 location: None,39 index: FieldIndex(40 (),41 ),42 },43 ShapeField {44 name: "b",45 flags: ObjFieldFlags {46 add: false,47 visibility: Normal,48 },49 location: None,50 index: FieldIndex(51 (),52 ),53 },54 ],55 },56 bindings: [57 (58 ClosureShape {59 captures: [],60 n_locals: 0,61 },62 Trivial(42 Num(63 Num(43 1.0,64 1.0,44 ),65 ),45 ),66 ),46 },67 ),47 LFieldMember {48 name: Fixed(49 "b",50 ),51 plus: false,68 (52 visibility: Normal,53 value: (54 ClosureShape {69 ClosureShape {55 captures: [],70 captures: [],56 n_locals: 0,71 n_locals: 0,57 },72 },58 Index {73 Index {59 indexable: Slot(74 indexable: Slot(60 Local(75 Local(61 LocalSlot(76 LocalSlot(62 0,77 0,63 ),64 ),78 ),65 ),79 ),66 parts: [80 ),67 LIndexPart {81 parts: [68 span: virtual:<test>:16-17,82 LIndexPart {83 span: virtual:<test>:16-17,69 value: Str(84 value: Trivial(85 Str(70 "a",86 "a",71 ),87 ),72 },88 ),73 ],89 },74 },90 ],75 ),91 },76 },92 ),77 ],93 ],78 },94 },79 ),95 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_with_locals.jsonnet.snapdiffbeforeafterboth16--- diagnostics ---16--- diagnostics ---17--- lir ---17--- lir ---18Obj(18Obj(19 MemberList(19 StaticMembers(20 LObjMembers {20 LObjStaticMembers {21 frame_shape: ClosureShape {21 frame_shape: ClosureShape {22 captures: [],22 captures: [],23 n_locals: 2,23 n_locals: 2,36 captures: [],36 captures: [],37 n_locals: 0,37 n_locals: 0,38 },38 },39 value: Num(39 value: Trivial(40 Num(40 10.0,41 10.0,42 ),41 ),43 ),42 },44 },43 ],45 ],44 asserts: None,46 asserts: None,45 fields: [47 shape: ObjShape {46 LFieldMember {48 fields: [47 name: Fixed(49 ShapeField {48 "a",50 name: "a",51 flags: ObjFieldFlags {52 add: false,53 visibility: Normal,54 },55 location: None,56 index: FieldIndex(57 (),58 ),59 },60 ShapeField {61 name: "b",62 flags: ObjFieldFlags {63 add: false,64 visibility: Normal,65 },66 location: None,67 index: FieldIndex(68 (),69 ),70 },71 ],72 },73 bindings: [74 (75 ClosureShape {76 captures: [],77 n_locals: 0,78 },79 Slot(80 Local(81 LocalSlot(82 1,83 ),84 ),49 ),85 ),50 plus: false,86 ),51 visibility: Normal,87 (52 value: (88 ClosureShape {53 ClosureShape {89 captures: [],54 captures: [],90 n_locals: 0,55 n_locals: 0,91 },56 },92 BinaryOp {57 Slot(93 lhs: Slot(58 Local(94 Local(59 LocalSlot(95 LocalSlot(60 1,96 1,61 ),97 ),62 ),98 ),63 ),99 ),64 ),100 op: Mul,65 },66 LFieldMember {67 name: Fixed(68 "b",69 ),101 rhs: Trivial(70 plus: false,71 visibility: Normal,72 value: (73 ClosureShape {102 Num(74 captures: [],75 n_locals: 0,76 },77 BinaryOp {78 lhs: Slot(79 Local(80 LocalSlot(81 1,82 ),83 ),84 ),85 op: Mul,86 rhs: Num(87 2.0,103 2.0,88 ),104 ),89 },105 ),90 ),106 },91 },107 ),92 ],108 ],93 },109 },94 ),110 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@redeclared_local.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/redeclared_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/redeclared_local.jsonnet5---6---31 captures: [],32 captures: [],32 n_locals: 0,33 n_locals: 0,33 },34 },34 value: Num(35 value: Trivial(36 Num(35 1.0,37 1.0,38 ),36 ),39 ),37 },40 },38 ],41 ],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@shadowing.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/shadowing.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/shadowing.jsonnet5---6---32 captures: [],33 captures: [],33 n_locals: 0,34 n_locals: 0,34 },35 },35 value: Num(36 value: Trivial(37 Num(36 1.0,38 1.0,39 ),37 ),40 ),38 },41 },39 ],42 ],54 captures: [],57 captures: [],55 n_locals: 0,58 n_locals: 0,56 },59 },57 value: Num(60 value: Trivial(61 Num(58 2.0,62 2.0,63 ),59 ),64 ),60 },65 },61 ],66 ],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@simple_local.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/simple_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/simple_local.jsonnet5---6---28 captures: [],29 captures: [],29 n_locals: 0,30 n_locals: 0,30 },31 },31 value: Num(32 value: Trivial(33 Num(32 1.0,34 1.0,35 ),33 ),36 ),34 },37 },35 ],38 ],42 ),45 ),43 ),46 ),44 op: Add,47 op: Add,45 rhs: Num(48 rhs: Trivial(49 Num(46 2.0,50 2.0,51 ),47 ),52 ),48 },53 },49 },54 },crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@slice.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 20173assertion_line: 21754expression: rendered4expression: rendered5input_file: crates/jrsonnet-evaluator/src/analysis_tests/slice.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/slice.jsonnet6---6---14--- lir ---14--- lir ---15Slice(15Slice(16 LSliceExpr {16 LSliceExpr {17 value: Arr {17 value: ArrConst(18 shape: ClosureShape {18 [19 captures: [],20 n_locals: 0,21 },22 items: [23 Num(19 Num(24 1.0,20 1.0,25 ),21 ),36 5.0,32 5.0,37 ),33 ),38 ],34 ],39 },35 ),40 start: Some(36 start: Some(41 Num(37 Trivial(38 Num(42 1.0,39 1.0,40 ),43 ),41 ),44 ),42 ),45 end: Some(43 end: Some(46 Num(44 Trivial(45 Num(47 3.0,46 3.0,47 ),48 ),48 ),49 ),49 ),50 step: None,50 step: None,crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@super_outside_object.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/super_outside_object.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/super_outside_object.jsonnet5---6---21 parts: [22 parts: [22 LIndexPart {23 LIndexPart {23 span: virtual:<test>:6-7,24 span: virtual:<test>:6-7,24 value: Str(25 value: Trivial(26 Str(25 "a",27 "a",28 ),26 ),29 ),27 },30 },28 ],31 ],crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@super_usage.jsonnet.snapdiffbeforeafterboth13--- lir ---13--- lir ---14BinaryOp {14BinaryOp {15 lhs: Obj(15 lhs: Obj(16 MemberList(16 StaticMembers(17 LObjMembers {17 LObjStaticMembers {18 frame_shape: ClosureShape {18 frame_shape: ClosureShape {19 captures: [],19 captures: [],20 n_locals: 1,20 n_locals: 1,24 uses_super: false,24 uses_super: false,25 locals: [],25 locals: [],26 asserts: None,26 asserts: None,27 fields: [27 shape: ObjShape {28 LFieldMember {29 name: Fixed(28 fields: [30 "a",29 ShapeField {31 ),30 name: "a",32 plus: false,33 visibility: Normal,31 flags: ObjFieldFlags {34 value: (35 ClosureShape {36 captures: [],32 add: false,37 n_locals: 0,33 visibility: Normal,38 },34 },35 location: None,36 index: FieldIndex(37 (),38 ),39 },40 ShapeField {41 name: "b",42 flags: ObjFieldFlags {43 add: false,44 visibility: Normal,45 },46 location: None,47 index: FieldIndex(48 (),49 ),50 },51 ],52 },53 bindings: [54 (55 ClosureShape {56 captures: [],57 n_locals: 0,58 },59 Trivial(39 Num(60 Num(40 1.0,61 1.0,41 ),62 ),42 ),63 ),43 },64 ),44 LFieldMember {65 (45 name: Fixed(46 "b",66 ClosureShape {47 ),67 captures: [],48 plus: false,49 visibility: Normal,68 n_locals: 0,50 value: (51 ClosureShape {52 captures: [],53 n_locals: 0,69 },54 },70 Trivial(55 Num(71 Num(56 2.0,72 2.0,57 ),73 ),58 ),74 ),59 },75 ),60 ],76 ],61 },77 },62 ),78 ),63 ),79 ),64 op: Add,80 op: Add,65 rhs: Obj(81 rhs: Obj(66 MemberList(82 StaticMembers(67 LObjMembers {83 LObjStaticMembers {68 frame_shape: ClosureShape {84 frame_shape: ClosureShape {69 captures: [],85 captures: [],70 n_locals: 1,86 n_locals: 1,78 uses_super: true,94 uses_super: true,79 locals: [],95 locals: [],80 asserts: None,96 asserts: None,81 fields: [97 shape: ObjShape {82 LFieldMember {83 name: Fixed(98 fields: [84 "a",99 ShapeField {85 ),100 name: "a",86 plus: false,87 visibility: Normal,101 flags: ObjFieldFlags {88 value: (89 ClosureShape {90 captures: [],102 add: false,91 n_locals: 0,103 visibility: Normal,92 },104 },93 BinaryOp {105 location: None,94 lhs: Index {106 index: FieldIndex(95 indexable: Super,107 (),96 parts: [108 ),97 LIndexPart {109 },98 span: virtual:<test>:28-29,110 ShapeField {99 value: Str(111 name: "c",112 flags: ObjFieldFlags {113 add: false,114 visibility: Normal,115 },116 location: None,117 index: FieldIndex(118 (),119 ),120 },121 ],122 },123 bindings: [124 (125 ClosureShape {126 captures: [],127 n_locals: 0,128 },129 BinaryOp {130 lhs: Index {131 indexable: Super,132 parts: [133 LIndexPart {134 span: virtual:<test>:28-29,135 value: Trivial(136 Str(100 "a",137 "a",101 ),138 ),102 },139 ),103 ],140 },104 },141 ],105 op: Add,142 },143 op: Add,106 rhs: Num(144 rhs: Trivial(145 Num(107 10.0,146 10.0,108 ),147 ),109 },148 ),110 ),149 },111 },112 LFieldMember {150 ),113 name: Fixed(114 "c",115 ),116 plus: false,151 (117 visibility: Normal,118 value: (119 ClosureShape {152 ClosureShape {120 captures: [],153 captures: [],121 n_locals: 0,154 n_locals: 0,122 },155 },123 Index {156 Index {124 indexable: Slot(157 indexable: Slot(125 Local(158 Local(126 LocalSlot(159 LocalSlot(127 0,160 0,128 ),129 ),161 ),130 ),162 ),131 parts: [163 ),132 LIndexPart {164 parts: [133 span: virtual:<test>:44-45,165 LIndexPart {166 span: virtual:<test>:44-45,134 value: Str(167 value: Trivial(168 Str(135 "b",169 "b",136 ),170 ),137 },171 ),138 ],172 },139 },173 ],140 ),174 },141 },175 ),142 ],176 ],143 },177 },144 ),178 ),crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@undefined_var.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/undefined_var.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/undefined_var.jsonnet5---6---19 "ref",20 "ref",20 ),21 ),21 op: Add,22 op: Add,22 rhs: Num(23 rhs: Trivial(24 Num(23 1.0,25 1.0,26 ),24 ),27 ),25}28}2629crates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@unused_local.jsonnet.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs3assertion_line: 21753expression: rendered4expression: rendered4input_file: crates/jrsonnet-evaluator/src/analysis_tests/unused_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/unused_local.jsonnet5---6---31 captures: [],32 captures: [],32 n_locals: 0,33 n_locals: 0,33 },34 },34 value: Num(35 value: Trivial(36 Num(35 1.0,37 1.0,38 ),36 ),39 ),37 },40 },38 ],41 ],39 body: Num(42 body: Trivial(43 Num(40 2.0,44 2.0,45 ),41 ),46 ),42 },47 },43)48)crates/jrsonnet-evaluator/src/tla.rsdiffbeforeafterboth5use jrsonnet_ir::{SourceFifo, SourcePath};5use jrsonnet_ir::{SourceFifo, SourcePath};667use crate::{7use crate::{8 Result, Thunk, Val,8 Result, Thunk, Val, ensure_sufficient_stack,9 function::{CallLocation, PreparedFuncVal},9 function::{CallLocation, PreparedFuncVal},10 in_description_frame, with_state,10 in_description_frame, with_state,11};11};21}21}22impl TlaArg {22impl TlaArg {23 pub fn evaluate_tailstrict(&self) -> Result<Val> {23 pub fn evaluate_tailstrict(&self) -> Result<Val> {24 match self {24 ensure_sufficient_stack(|| match self {25 Self::String(s) => Ok(Val::string(s.clone())),25 Self::String(s) => Ok(Val::string(s.clone())),26 Self::Val(val) => Ok(val.clone()),26 Self::Val(val) => Ok(val.clone()),27 Self::Lazy(lazy) => Ok(lazy.evaluate()?),27 Self::Lazy(lazy) => Ok(lazy.evaluate()?),38 SourcePath::new(SourceFifo("<inline code>".to_owned(), p.as_bytes().into()));38 SourcePath::new(SourceFifo("<inline code>".to_owned(), p.as_bytes().into()));39 s.import_resolved(resolved)39 s.import_resolved(resolved)40 }),40 }),41 }41 })42 }42 }43 pub fn evaluate(&self) -> Result<Thunk<Val>> {43 pub fn evaluate(&self) -> Result<Thunk<Val>> {44 match self {44 match self {