git.delta.rocks / jrsonnet / refs/commits / 7bd5bbd0756a

difftreelog

perf static object shapes

ptmvzrqoYaroslav Bolyukin2026-05-08parent: #d0b9ff2.patch.diff
in: master

29 files changed

modifiedcrates/jrsonnet-evaluator/src/analyze.rsdiffbeforeafterboth
21use 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;
3030
31use 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};
3537
36#[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}
334337
348 pub fields: Vec<LFieldMember>,351 pub fields: Vec<LFieldMember>,
349}352}
353
354#[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,
360
361 pub locals: Rc<Vec<LBind>>,
362 pub asserts: Option<Rc<LObjAsserts>>,
363
364 pub shape: Rc<ObjShape>,
365 pub bindings: Vec<Rc<(ClosureShape, LExpr)>>,
366}
350367
351#[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, &params, 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}
1723
1724fn 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 }
1736
1737 let LObjMembers {
1738 frame_shape,
1739 this,
1740 set_dollar,
1741 uses_super,
1742 locals,
1743 asserts,
1744 fields,
1745 } = members;
1746
1747 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 }
1764
1765 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}
17021776
1703fn analyze_obj_members(1777fn analyze_obj_members(
1704 members: &ObjMembers,1778 members: &ObjMembers,
modifiedcrates/jrsonnet-evaluator/src/evaluate/mod.rsdiffbeforeafterboth
11 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}
545
546fn 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 }
565
566 let needs_unbound = members.this.is_some() || members.uses_super;
567
568 let mut bindings: Vec<MaybeUnbound> = Vec::with_capacity(members.bindings.len());
569
570 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 members
589 .asserts
590 .as_ref()
591 .map(|a| CcObjectAssertion::new(evaluate_object_assertions_unbound(uctx, a.clone())))
592 } else {
593 let a_ctx = ctx
594 .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 };
611
612 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}
542623
543fn evaluate_obj_members(624fn evaluate_obj_members(
544 super_obj: Option<ObjValue>,625 super_obj: Option<ObjValue>,
modifiedcrates/jrsonnet-evaluator/src/lib.rsdiffbeforeafterboth
144 Unbound(CcUnbound<Val>),144 Unbound(CcUnbound<Val>),
145 /// Value is object-independent145 /// Value is object-independent
146 Bound(Thunk<Val>),146 Bound(Thunk<Val>),
147 Const(Val),
147}148}
148149
149impl 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}
modifiedcrates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth
17use rustc_hash::{FxHashMap, FxHashSet};17use rustc_hash::{FxHashMap, FxHashSet};
1818
19mod oop;19mod oop;
20mod static_shape;
2021
21pub 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};
2325
24use 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}
142144
143cc_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}
204206
205 fn run_assertions_core(&self, sup_this: SupThis) -> Result<()>;207 fn run_assertions_core(&self, sup_this: SupThis) -> Result<()>;
208
209 fn has_assertion(&self) -> bool {
210 false
211 }
206}212}
207213
208#[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)));
modifiedcrates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth
114 Ok(())114 Ok(())
115 }115 }
116
117 fn has_assertion(&self) -> bool {
118 self.assertion.is_some()
119 }
116}120}
117121
118#[allow(clippy::module_name_repetitions)]122#[allow(clippy::module_name_repetitions)]
177181
178 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 }
182187
219impl ObjMemberBuilder<ValueBuilder<'_>> {224impl ObjMemberBuilder<ValueBuilder<'_>> {
220 /// Inserts value, replacing if it is already defined225 /// Inserts value, replacing if it is already defined
221 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 }
233237
234 /// Tries to insert value, returns an error if it was already defined238 /// Tries to insert value, returns an error if it was already defined
235 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()))
addedcrates/jrsonnet-evaluator/src/obj/static_shape.rsdiffbeforeafterboth

no changes

modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@array_comp.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/array_comp.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/array_comp.jsonnet
5---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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@dollar_deeply_nested.jsonnet.snapdiffbeforeafterboth
20--- 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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@dollar_outside_object.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/dollar_outside_object.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/dollar_outside_object.jsonnet
5---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 ],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@function_def.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/function_def.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/function_def.jsonnet
5---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: [],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@hoistable_local.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/hoistable_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/hoistable_local.jsonnet
5---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 },
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@ifelse.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analyze_tests/ifelse.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/ifelse.jsonnet
5---6---
6--- source ---7--- source ---
7if true then 1 else 28if true then 1 else 2
12--- 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}
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@literal.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analyze_tests/literal.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/literal.jsonnet
5---6---
6--- source ---7--- source ---
742842
11errored: false12errored: false
12--- diagnostics ---13--- diagnostics ---
13--- lir ---14--- lir ---
15Trivial(
14Num(16 Num(
15 42.0,17 42.0,
18 ),
16)19)
1720
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@loop_invariant.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/loop_invariant.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/loop_invariant.jsonnet
5---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: [],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@mutual_recursion.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/mutual_recursion.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/mutual_recursion.jsonnet
5---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 },
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@nested_object_independent.jsonnet.snapdiffbeforeafterboth
17--- 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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_comp.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/object_comp.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/object_comp.jsonnet
5---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 ],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_dollar.jsonnet.snapdiffbeforeafterboth
12--- 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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_self.jsonnet.snapdiffbeforeafterboth
12--- 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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@object_with_locals.jsonnet.snapdiffbeforeafterboth
16--- 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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@redeclared_local.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/redeclared_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/redeclared_local.jsonnet
5---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 ],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@shadowing.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/shadowing.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/shadowing.jsonnet
5---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 ],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@simple_local.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/simple_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/simple_local.jsonnet
5---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 },
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@slice.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 20173assertion_line: 2175
4expression: rendered4expression: rendered
5input_file: crates/jrsonnet-evaluator/src/analysis_tests/slice.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/slice.jsonnet
6---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,
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@super_outside_object.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/super_outside_object.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/super_outside_object.jsonnet
5---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 ],
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@super_usage.jsonnet.snapdiffbeforeafterboth
13--- 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 ),
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@undefined_var.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/undefined_var.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/undefined_var.jsonnet
5---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}
2629
modifiedcrates/jrsonnet-evaluator/src/snapshots/jrsonnet_evaluator__analyze__tests__snapshots@unused_local.jsonnet.snapdiffbeforeafterboth
1---1---
2source: crates/jrsonnet-evaluator/src/analyze.rs2source: crates/jrsonnet-evaluator/src/analyze.rs
3assertion_line: 2175
3expression: rendered4expression: rendered
4input_file: crates/jrsonnet-evaluator/src/analysis_tests/unused_local.jsonnet5input_file: crates/jrsonnet-evaluator/src/analysis_tests/unused_local.jsonnet
5---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)
modifiedcrates/jrsonnet-evaluator/src/tla.rsdiffbeforeafterboth
5use jrsonnet_ir::{SourceFifo, SourcePath};5use jrsonnet_ir::{SourceFifo, SourcePath};
66
7use 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 {