git.delta.rocks / jrsonnet / refs/commits / 8f97cd5c0f83

difftreelog

chore move entry ids to oop object

xukuusknYaroslav Bolyukin2026-05-05parent: #ff546d6.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/obj/mod.rs
+++ b/crates/jrsonnet-evaluator/src/obj/mod.rs
@@ -136,7 +136,6 @@
 #[derive(Debug, Trace)]
 pub struct ObjMember {
 	flags: ObjFieldFlags,
-	original_index: FieldIndex,
 	pub invoke: MaybeUnbound,
 	pub location: Option<Span>,
 }
@@ -1048,13 +1047,13 @@
 		self.location = Some(location);
 		self
 	}
-	fn build_member(self, binding: MaybeUnbound) -> (Kind, IStr, ObjMember) {
+	fn build_member(self, binding: MaybeUnbound) -> (Kind, IStr, FieldIndex, ObjMember) {
 		(
 			self.kind,
 			self.name,
+			self.original_index,
 			ObjMember {
 				flags: ObjFieldFlags::new(self.add, self.visibility),
-				original_index: self.original_index,
 				invoke: binding,
 				location: self.location,
 			},
@@ -1071,7 +1070,7 @@
 		self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)));
 	}
 	pub fn binding(self, binding: MaybeUnbound) {
-		let (receiver, name, member) = self.build_member(binding);
+		let (receiver, name, _, member) = self.build_member(binding);
 		let new = receiver.0.clone();
 		*receiver.0 = new.extend_with_raw_member(name, member);
 	}
modifiedcrates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth
27#[trace(tracking(force))]27#[trace(tracking(force))]
28pub struct OopObject {28pub struct OopObject {
29 assertion: Option<CcObjectAssertion>,29 assertion: Option<CcObjectAssertion>,
30 this_entries: FxHashMap<IStr, ObjMember>,30 this_entries: FxHashMap<IStr, (ObjMember, FieldIndex)>,
31}31}
32impl fmt::Debug for OopObject {32impl fmt::Debug for OopObject {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43}43}
44impl OopObject {44impl OopObject {
45 pub fn new(45 pub fn new(
46 this_entries: FxHashMap<IStr, ObjMember>,46 this_entries: FxHashMap<IStr, (ObjMember, FieldIndex)>,
47 assertion: Option<CcObjectAssertion>,47 assertion: Option<CcObjectAssertion>,
48 ) -> Self {48 ) -> Self {
49 Self {49 Self {
59 super_depth: &mut SuperDepth,59 super_depth: &mut SuperDepth,
60 handler: &mut EnumFieldsHandler<'_>,60 handler: &mut EnumFieldsHandler<'_>,
61 ) -> bool {61 ) -> bool {
62 for (name, member) in &self.this_entries {62 for (name, (member, idx)) in &self.this_entries {
63 if matches!(63 if matches!(
64 handler(64 handler(
65 *super_depth,65 *super_depth,
66 member.original_index,66 *idx,
67 name.clone(),67 name.clone(),
68 EnumFields::Normal(member.flags.visibility()),68 EnumFields::Normal(member.flags.visibility()),
69 ),69 ),
88 return Ok(GetFor::NotFound);88 return Ok(GetFor::NotFound);
89 }89 }
90 match self.this_entries.get(&key) {90 match self.this_entries.get(&key) {
91 Some(k) => {91 Some((k, _)) => {
92 let v = k.invoke.evaluate(sup_this)?;92 let v = k.invoke.evaluate(sup_this)?;
93 Ok(if k.flags.add() {93 Ok(if k.flags.add() {
94 GetFor::SuperPlus(v)94 GetFor::SuperPlus(v)
102 fn field_visibility_core(&self, name: IStr) -> FieldVisibility {102 fn field_visibility_core(&self, name: IStr) -> FieldVisibility {
103 self.this_entries103 self.this_entries
104 .get(&name)104 .get(&name)
105 .map_or(FieldVisibility::NotFound, |f| {105 .map_or(FieldVisibility::NotFound, |(f, _)| {
106 FieldVisibility::Found(f.flags.visibility())106 FieldVisibility::Found(f.flags.visibility())
107 })107 })
108 }108 }
219impl ObjMemberBuilder<ValueBuilder<'_>> {219impl ObjMemberBuilder<ValueBuilder<'_>> {
220 /// Inserts value, replacing if it is already defined220 /// Inserts value, replacing if it is already defined
221 pub fn value(self, value: impl Into<Val>) {221 pub fn value(self, value: impl Into<Val>) {
222 let (receiver, name, member) =222 let (receiver, name, idx, member) =
223 self.build_member(MaybeUnbound::Bound(Thunk::evaluated(value.into())));223 self.build_member(MaybeUnbound::Bound(Thunk::evaluated(value.into())));
224 let entry = receiver.0.new.this_entries.entry(name);224 let entry = receiver.0.new.this_entries.entry(name);
225 entry.insert_entry(member);225 entry.insert_entry((member, idx));
226 }226 }
227 /// Inserts thunk, replacing if it is already defined227 /// Inserts thunk, replacing if it is already defined
228 pub fn thunk(self, value: impl Into<Thunk<Val>>) {228 pub fn thunk(self, value: impl Into<Thunk<Val>>) {
229 let (receiver, name, member) = self.build_member(MaybeUnbound::Bound(value.into()));229 let (receiver, name, idx, member) = self.build_member(MaybeUnbound::Bound(value.into()));
230 let entry = receiver.0.new.this_entries.entry(name);230 let entry = receiver.0.new.this_entries.entry(name);
231 entry.insert_entry(member);231 entry.insert_entry((member, idx));
232 }232 }
233233
234 /// Tries to insert value, returns an error if it was already defined234 /// Tries to insert value, returns an error if it was already defined
242 self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)))242 self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)))
243 }243 }
244 pub fn binding(self, binding: MaybeUnbound) -> Result<()> {244 pub fn binding(self, binding: MaybeUnbound) -> Result<()> {
245 let (receiver, name, member) = self.build_member(binding);245 let (receiver, name, idx, member) = self.build_member(binding);
246 let location = member.location.clone();246 let location = member.location.clone();
247 let old = receiver.0.new.this_entries.insert(name.clone(), member);247 let old = receiver
248 .0
249 .new
250 .this_entries
251 .insert(name.clone(), (member, idx));
248 if old.is_some() {252 if old.is_some() {
249 in_frame(253 in_frame(
250 CallLocation(location.as_ref()),254 CallLocation(location.as_ref()),