7
7
/// # use zerogc::{Trace, DynTrace, trait_object_trace};
8
8
/// # use zerogc_derive::Trace;
9
9
/// # use zerogc::dummy_impl::{self, DummyCollectorId, Gc};
10
- /// trait Foo<'gc>: DynTrace + 'gc {
10
+ /// # type OurSpecificId = DummyCollectorId;
11
+ /// trait Foo<'gc>: DynTrace<'gc, OurSpecificId> {
11
12
/// fn method(&self) -> i32;
12
13
/// }
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
+ /// );
14
20
/// fn foo<'gc, T: ?Sized + Trace + Foo<'gc>>(t: &T) -> i32 {
15
21
/// assert_eq!(t.method(), 12);
16
22
/// t.method() * 2
19
25
/// foo(gc.value())
20
26
/// }
21
27
/// #[derive(Trace)]
22
- /// # #[zerogc(collector_id (DummyCollectorId))]
28
+ /// # #[zerogc(collector_ids (DummyCollectorId))]
23
29
/// struct Bar<'gc> {
24
30
/// val: Gc<'gc, i32>
25
31
/// }
39
45
macro_rules! trait_object_trace {
40
46
( impl $( <$( $lt: lifetime, ) * $( $param: ident) ,* >) ? Trace for dyn $target: path $( where $( $where_clause: tt) * ) ?;
41
47
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) * ) ? {
45
53
/*
46
54
* Insufficient compile-time information to know whether we need to be traced.
47
55
*
@@ -57,11 +65,11 @@ macro_rules! trait_object_trace {
57
65
58
66
#[ inline]
59
67
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 > {
61
69
visitor. visit_trait_object( gc)
62
70
}
63
71
}
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) * ) ? {
65
73
type Branded = $branded;
66
74
}
67
75
}
0 commit comments