Fix gpui2 bugs

* Compile error for tests that take StdRng
* Dynamic type dowcasting error when emitting events
* Slot error when dropping handles

Co-authored-by: Conrad <conrad@zed.dev>
This commit is contained in:
Max Brunsfeld 2023-10-26 15:54:06 +02:00
parent 58e8012d8c
commit 8bc2071414
4 changed files with 11 additions and 7 deletions

View file

@ -403,7 +403,7 @@ impl AppContext {
fn apply_emit_effect(&mut self, emitter: EntityId, event: Box<dyn Any>) {
self.event_listeners
.clone()
.retain(&emitter, |handler| handler(&event, self));
.retain(&emitter, |handler| handler(event.as_ref(), self));
}
fn apply_focus_changed_effect(&mut self, window_id: WindowId, focused: Option<FocusId>) {

View file

@ -100,10 +100,15 @@ impl EntityMap {
}
pub fn take_dropped(&mut self) -> Vec<(EntityId, AnyBox)> {
let dropped_entity_ids = mem::take(&mut self.ref_counts.write().dropped_entity_ids);
let mut ref_counts = self.ref_counts.write();
let dropped_entity_ids = mem::take(&mut ref_counts.dropped_entity_ids);
dropped_entity_ids
.into_iter()
.map(|entity_id| (entity_id, self.entities.remove(entity_id).unwrap()))
.map(|entity_id| {
ref_counts.counts.remove(entity_id);
(entity_id, self.entities.remove(entity_id).unwrap())
})
.collect()
}
}
@ -212,7 +217,6 @@ impl Drop for AnyHandle {
if prev_count == 1 {
// We were the last reference to this entity, so we can remove it.
let mut entity_map = RwLockUpgradableReadGuard::upgrade(entity_map);
entity_map.counts.remove(self.entity_id);
entity_map.dropped_entity_ids.push(self.entity_id);
}
}

View file

@ -79,7 +79,7 @@ impl<'a, T: 'static> ModelContext<'a, T> {
self.app.event_listeners.insert(
handle.entity_id,
Box::new(move |event, cx| {
let event = event.downcast_ref().expect("invalid event type");
let event: &E::Event = event.downcast_ref().expect("invalid event type");
if let Some((this, handle)) = this.upgrade().zip(handle.upgrade()) {
this.update(cx, |this, cx| on_event(this, handle, event, cx));
true

View file

@ -8,7 +8,7 @@ use std::{
pub fn run_test(
mut num_iterations: u64,
max_retries: usize,
test_fn: &mut (dyn RefUnwindSafe + Fn(TestDispatcher)),
test_fn: &mut (dyn RefUnwindSafe + Fn(TestDispatcher, u64)),
on_fail_fn: Option<fn()>,
_fn_name: String, // todo!("re-enable fn_name")
) {
@ -28,7 +28,7 @@ pub fn run_test(
}
let result = panic::catch_unwind(|| {
let dispatcher = TestDispatcher::new(StdRng::seed_from_u64(seed));
test_fn(dispatcher);
test_fn(dispatcher, seed);
});
match result {