Skip to content

Commit eba235c

Browse files
committed
Start to try and fix 'trait_object_trace!'
Needs to be fixed before the 0.2.0 release.....
1 parent 066309a commit eba235c

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/macros.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,16 @@
77
/// # use zerogc::{Trace, DynTrace, trait_object_trace};
88
/// # use zerogc_derive::Trace;
99
/// # use zerogc::dummy_impl::{self, DummyCollectorId, Gc};
10-
/// trait Foo<'gc>: DynTrace + 'gc {
10+
/// # type OurSpecificId = DummyCollectorId;
11+
/// trait Foo<'gc>: DynTrace<'gc, OurSpecificId> {
1112
/// fn method(&self) -> i32;
1213
/// }
13-
/// trait_object_trace!(impl<'gc,> Trace for dyn Foo<'gc>; Branded<'new_gc> => dyn Foo<'new_gc> + 'new_gc, Erased<'min> => dyn Foo<'min> + 'min);
14+
/// trait_object_trace!(
15+
/// impl<'gc,> Trace for dyn Foo<'gc>;
16+
/// Branded<'new_gc> => dyn Foo<'new_gc> + 'new_gc,
17+
/// collector_id => OurSpecificId,
18+
/// gc_lifetime => 'gc
19+
/// );
1420
/// fn foo<'gc, T: ?Sized + Trace + Foo<'gc>>(t: &T) -> i32 {
1521
/// assert_eq!(t.method(), 12);
1622
/// t.method() * 2
@@ -19,7 +25,7 @@
1925
/// foo(gc.value())
2026
/// }
2127
/// #[derive(Trace)]
22-
/// # #[zerogc(collector_id(DummyCollectorId))]
28+
/// # #[zerogc(collector_ids(DummyCollectorId))]
2329
/// struct Bar<'gc> {
2430
/// val: Gc<'gc, i32>
2531
/// }
@@ -39,9 +45,11 @@
3945
macro_rules! trait_object_trace {
4046
(impl $(<$($lt:lifetime,)* $($param:ident),*>)? Trace for dyn $target:path $(where $($where_clause:tt)*)?;
4147
Branded<$branded_lt:lifetime> => $branded:ty,
42-
Erased<$erased_lt:lifetime> => $erased:ty) => {
43-
unsafe impl$(<$($lt,)* $($param:ident),*>)? $crate::GcSafe for dyn $target where Self: $crate::DynTrace, $($($where_clause)*)? {}
44-
unsafe impl$(<$($lt,)* $($param:ident),*>)? $crate::Trace for dyn $target where Self: $crate::DynTrace, $($($where_clause)*)? {
48+
collector_id => $collector_id:path,
49+
gc_lifetime => $gc_lt:lifetime) => {
50+
unsafe impl$(<$($lt,)* $($param:ident),*>)? $crate::TrustedDrop for dyn $target where Self: $crate::DynTrace<$gc_lt, $collector_id>, $($($where_clause)*)? {}
51+
unsafe impl$(<$($lt,)* $($param:ident),*>)? $crate::GcSafe<$gc_lt, $collector_id> for dyn $target where Self: $crate::DynTrace<$gc_lt, $collector_id>, $($($where_clause)*)? {}
52+
unsafe impl$(<$($lt,)* $($param:ident),*>)? $crate::Trace for dyn $target where Self: $crate::DynTrace::<$gc_lt, $collector_id>, $($($where_clause)*)? {
4553
/*
4654
* Insufficient compile-time information to know whether we need to be traced.
4755
*
@@ -57,11 +65,11 @@ macro_rules! trait_object_trace {
5765

5866
#[inline]
5967
unsafe fn visit_inside_gc<'actual_gc, V, Id>(gc: &mut $crate::Gc<'actual_gc, Self, Id>, visitor: &mut V) -> Result<(), V::Err>
60-
where V: $crate::GcVisitor, Id: $crate::CollectorId, Self: $crate::GcSafe + 'actual_gc {
68+
where V: $crate::GcVisitor, Id: $crate::CollectorId, Self: $crate::GcSafe<'actual_gc, Id> {
6169
visitor.visit_trait_object(gc)
6270
}
6371
}
64-
unsafe impl<$branded_lt, $($($lt,)* $($param:ident,)*)? ActualId: $crate::CollectorId> $crate::GcRebrand<$branded_lt, ActualId> for dyn $target where Self: $crate::DynTrace, $($($where_clause)*)? {
72+
unsafe impl<$branded_lt, $($($lt,)* $($param:ident,)*)?> $crate::GcRebrand<$branded_lt, $collector_id> for dyn $target where Self: $crate::DynTrace<$gc_lt, $collector_id>, T::Branded: $crate::DynTrace<$branded_lt, $collectorId>, $($($where_clause)*)? {
6573
type Branded = $branded;
6674
}
6775
}

0 commit comments

Comments
 (0)