1
1
use super :: gc:: * ;
2
2
use crate :: { auto_traits:: HasGc , trace:: GcTypeInfo } ;
3
+ use smallvec:: SmallVec ;
3
4
use std:: ops:: Range ;
4
5
5
6
/// This will be sound once GAT or const Eq &str lands.
@@ -12,13 +13,19 @@ pub unsafe trait Mark<'o, 'n, 'r: 'n, O: 'o, N: 'r> {
12
13
13
14
// Blanket Arena<T> impl is in src/arena.rs
14
15
16
+ pub ( crate ) struct Handlers < ' e , E : FnMut ( * const u8 ) > {
17
+ // TODO benchmark sizes
18
+ translation : & ' e SmallVec < [ u8 ; 16 ] > ,
19
+ effects : & ' e mut SmallVec < [ E ; 4 ] > ,
20
+ }
21
+
15
22
pub unsafe trait Condemned {
16
23
fn feilds ( s : & Self , grey_feilds : u8 , region : Range < usize > ) -> u8 ;
17
- fn evacuate (
24
+ fn evacuate < ' e , E : FnMut ( * const u8 ) , const offset : u8 > (
18
25
s : & Self ,
19
26
grey_feilds : u8 ,
20
27
region : Range < usize > ,
21
- on_condemed : * const fn ( * const u8 , GcTypeInfo ) ,
28
+ handlers : Handlers < ' e , E > ,
22
29
) ;
23
30
24
31
const PRE_CONDTION : bool ;
@@ -35,7 +42,13 @@ unsafe impl<T> Condemned for T {
35
42
}
36
43
}
37
44
38
- default fn evacuate ( _: & Self , _: u8 , _: Range < usize > , _: * const fn ( * const u8 , GcTypeInfo ) ) { }
45
+ default fn evacuate < ' e , E : FnMut ( * const u8 ) , const offset: u8 > (
46
+ s : & Self ,
47
+ _: u8 ,
48
+ _: Range < usize > ,
49
+ _: Handlers < ' e , E > ,
50
+ ) {
51
+ }
39
52
40
53
default const PRE_CONDTION : bool = if T :: HAS_GC {
41
54
// TODO When fmt is allowed in const s/your type/type_name::<T>()
@@ -53,7 +66,17 @@ unsafe impl<T> Condemned for Option<T> {
53
66
}
54
67
}
55
68
56
- default fn evacuate ( _: & Self , _: u8 , _: Range < usize > , _: * const fn ( * const u8 , GcTypeInfo ) ) { }
69
+ fn evacuate < ' e , E : FnMut ( * const u8 ) , const offset: u8 > (
70
+ s : & Self ,
71
+ grey_feilds : u8 ,
72
+ region : Range < usize > ,
73
+ handlers : Handlers < ' e , E > ,
74
+ ) {
75
+ match s {
76
+ Some ( t) => Condemned :: evacuate ( t, grey_feilds, region, handlers) ,
77
+ None => ( ) ,
78
+ }
79
+ }
57
80
58
81
default const PRE_CONDTION : bool = if T :: PRE_CONDTION {
59
82
true
0 commit comments