difftreelog
refactor remove asserting object list from thread-local
in: master
2 files changed
crates/jrsonnet-evaluator/src/obj/mod.rsdiffbeforeafterboth244#[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}251252252thread_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 asserting271fn 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}275283276thread_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 }crates/jrsonnet-evaluator/src/obj/oop.rsdiffbeforeafterboth209 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 }))