git.delta.rocks / jrsonnet / refs/commits / 3132268afd8f

difftreelog

refactor remove asserting object list from thread-local

krppmxylYaroslav Bolyukin2026-07-31parent: #f280493.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth
244#[educe(Debug)]244#[educe(Debug)]
245struct ObjValueInner {245struct ObjValueInner {
246 cores: Vec<CcObjectCore>,246 cores: Vec<CcObjectCore>,
247 asserting: Cell<bool>,
247 assertions_ran: Cell<bool>,248 assertions_ran: Cell<bool>,
248 has_assertions: bool,249 has_assertions: bool,
249 value_cache: RefCell<FxHashMap<(IStr, CoreIdx), CacheValue>>,250 value_cache: RefCell<FxHashMap<(IStr, CoreIdx), CacheValue>>,
250}251}
251252
252thread_local! {253thread_local! {
253 static RUNNING_ASSERTIONS: RefCell<FxHashSet<ObjValue>> = RefCell::default();254 static IN_ASSERTION: Cell<bool> = Cell::default();
254}255}
255fn is_asserting() -> bool {256fn is_asserting() -> bool {
256 RUNNING_ASSERTIONS.with_borrow(|v| !v.is_empty())257 IN_ASSERTION.get()
257}258}
258struct AssertionGuard(ObjValue);259struct AssertionGuard {
260 obj: ObjValue,
261 toplevel: bool,
262}
259impl Drop for AssertionGuard {263impl Drop for AssertionGuard {
260 fn drop(&mut self) {264 fn drop(&mut self) {
265 let was_asserting = self.obj.0.asserting.replace(false);
266 debug_assert!(was_asserting);
261 RUNNING_ASSERTIONS.with_borrow_mut(|v| {267 if self.toplevel {
262 let r = v.remove(&self.0);268 let was_toplevel_assertion = IN_ASSERTION.replace(false);
263 debug_assert!(269 debug_assert!(was_toplevel_assertion);
264 r,
265 "finish_asserting was called before start_asserting or twice"
266 );
267 });270 }
268 }271 }
269}272}
270/// Returns `None` if already asserting273/// Returns `None` if already asserting
271fn asserting(obj: &ObjValue) -> Option<AssertionGuard> {274fn asserting(obj: &ObjValue) -> Option<AssertionGuard> {
272 RUNNING_ASSERTIONS275 if obj.0.asserting.replace(true) {
276 return None;
277 }
273 .with_borrow_mut(|v| v.insert(obj.clone()).then(|| AssertionGuard(obj.clone())))278 Some(AssertionGuard {
279 obj: obj.clone(),
280 toplevel: !IN_ASSERTION.replace(true),
281 })
274}282}
275283
276thread_local! {284thread_local! {
277 static EMPTY_OBJ: ObjValue = ObjValue(Cc::new(ObjValueInner {285 static EMPTY_OBJ: ObjValue = ObjValue(Cc::new(ObjValueInner {
278 cores: vec![],286 cores: vec![],
279 assertions_ran: Cell::new(true),287 assertions_ran: Cell::new(true),
288 asserting: Cell::new(false),
280 has_assertions: false,289 has_assertions: false,
281 value_cache: RefCell::default(),290 value_cache: RefCell::default(),
282 }))291 }))
511 cores,520 cores,
512 value_cache: RefCell::default(),521 value_cache: RefCell::default(),
513 assertions_ran: Cell::new(!has_assertions),522 assertions_ran: Cell::new(!has_assertions),
523 asserting: Cell::new(false),
514 has_assertions,524 has_assertions,
515 }))525 }))
516 }526 }
modifiedcrates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth
209 ObjValue(Cc::new(ObjValueInner {209 ObjValue(Cc::new(ObjValueInner {
210 cores: self.sup,210 cores: self.sup,
211 assertions_ran: Cell::new(!has_assertions),211 assertions_ran: Cell::new(!has_assertions),
212 asserting: Cell::new(false),
212 has_assertions,213 has_assertions,
213 value_cache: RefCell::default(),214 value_cache: RefCell::default(),
214 }))215 }))