Skip to content

Commit bc219d6

Browse files
committed
Offset based Allocation effect
1 parent 8f45c23 commit bc219d6

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

src/gc.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::trace::*;
22

3-
use crate::mark::Condemned;
3+
use crate::mark::{Condemned, Handlers};
44
use std::ops::Deref;
55

66
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
@@ -46,6 +46,13 @@ unsafe impl<'r, T> Condemned for Gc<'r, T> {
4646
fn feilds(_: &Self, _: u8, _: std::ops::Range<usize>) -> u8 {
4747
0b0000_0000
4848
}
49-
fn evacuate(_: &Self, _: u8, _: std::ops::Range<usize>, _: *const fn(*const u8, GcTypeInfo)) {}
5049
const PRE_CONDTION: bool = true;
50+
fn evacuate<'e, E: FnMut(*const u8), const offset: u8>(
51+
s: &Self,
52+
grey_feilds: u8,
53+
region: std::ops::Range<usize>,
54+
handlers: Handlers<'e, E>,
55+
) {
56+
todo!()
57+
}
5158
}

src/mark.rs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::gc::*;
22
use crate::{auto_traits::HasGc, trace::GcTypeInfo};
3+
use smallvec::SmallVec;
34
use std::ops::Range;
45

56
/// 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> {
1213

1314
// Blanket Arena<T> impl is in src/arena.rs
1415

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+
1522
pub unsafe trait Condemned {
1623
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>(
1825
s: &Self,
1926
grey_feilds: u8,
2027
region: Range<usize>,
21-
on_condemed: *const fn(*const u8, GcTypeInfo),
28+
handlers: Handlers<'e, E>,
2229
);
2330

2431
const PRE_CONDTION: bool;
@@ -35,7 +42,13 @@ unsafe impl<T> Condemned for T {
3542
}
3643
}
3744

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+
}
3952

4053
default const PRE_CONDTION: bool = if T::HAS_GC {
4154
// TODO When fmt is allowed in const s/your type/type_name::<T>()
@@ -53,7 +66,17 @@ unsafe impl<T> Condemned for Option<T> {
5366
}
5467
}
5568

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+
}
5780

5881
default const PRE_CONDTION: bool = if T::PRE_CONDTION {
5982
true

0 commit comments

Comments
 (0)