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
136#[derive(Debug, Trace)]136#[derive(Debug, Trace)]
137pub struct ObjMember {137pub struct ObjMember {
138 flags: ObjFieldFlags,138 flags: ObjFieldFlags,
139 original_index: FieldIndex,
140 pub invoke: MaybeUnbound,139 pub invoke: MaybeUnbound,
141 pub location: Option<Span>,140 pub location: Option<Span>,
142}141}
1048 self.location = Some(location);1047 self.location = Some(location);
1049 self1048 self
1050 }1049 }
1051 fn build_member(self, binding: MaybeUnbound) -> (Kind, IStr, ObjMember) {1050 fn build_member(self, binding: MaybeUnbound) -> (Kind, IStr, FieldIndex, ObjMember) {
1052 (1051 (
1053 self.kind,1052 self.kind,
1054 self.name,1053 self.name,
1054 self.original_index,
1055 ObjMember {1055 ObjMember {
1056 flags: ObjFieldFlags::new(self.add, self.visibility),1056 flags: ObjFieldFlags::new(self.add, self.visibility),
1057 original_index: self.original_index,
1058 invoke: binding,1057 invoke: binding,
1059 location: self.location,1058 location: self.location,
1060 },1059 },
1071 self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)));1070 self.binding(MaybeUnbound::Unbound(CcUnbound::new(bindable)));
1072 }1071 }
1073 pub fn binding(self, binding: MaybeUnbound) {1072 pub fn binding(self, binding: MaybeUnbound) {
1074 let (receiver, name, member) = self.build_member(binding);1073 let (receiver, name, _, member) = self.build_member(binding);
1075 let new = receiver.0.clone();1074 let new = receiver.0.clone();
1076 *receiver.0 = new.extend_with_raw_member(name, member);1075 *receiver.0 = new.extend_with_raw_member(name, member);
1077 }1076 }
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()),