Skip to content

Commit ad012d4

Browse files
committed
Implement Condemned for (A, B)
OFFSET as a const parameter is blocked on rust-lang/rust#68436
1 parent def5708 commit ad012d4

File tree

1 file changed

+55
-7
lines changed

1 file changed

+55
-7
lines changed

src/mark.rs

+55-7
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ pub struct Handlers {
3131

3232
pub unsafe trait Condemned {
3333
fn feilds(s: &Self, grey_feilds: u8, region: Range<usize>) -> u8;
34-
fn evacuate<'e, const OFFSET: u8>(
34+
fn evacuate<'e>(
3535
s: &Self,
36+
offset: u8,
3637
grey_feilds: u8,
3738
region: Range<usize>,
3839
handlers: &mut Handlers,
3940
);
4041

42+
const GC_COUNT: u8;
4143
const PRE_CONDTION: bool;
4244
}
4345

@@ -52,8 +54,9 @@ unsafe impl<T> Condemned for T {
5254
}
5355
}
5456

55-
default fn evacuate<'e, const OFFSET: u8>(_: &Self, _: u8, _: Range<usize>, _: &mut Handlers) {}
57+
default fn evacuate<'e>(_: &Self, _: u8, _: u8, _: Range<usize>, _: &mut Handlers) {}
5658

59+
default const GC_COUNT: u8 = 0;
5760
default const PRE_CONDTION: bool = if T::HAS_GC {
5861
// TODO When fmt is allowed in const s/your type/type_name::<T>()
5962
panic!("You need to derive Condemned for your type. Required due to a direct Gc<T>");
@@ -66,17 +69,18 @@ unsafe impl<'r, T> Condemned for Gc<'r, T> {
6669
fn feilds(_: &Self, _: u8, _: std::ops::Range<usize>) -> u8 {
6770
0b0000_0000
6871
}
69-
const PRE_CONDTION: bool = true;
70-
fn evacuate<'e, const OFFSET: u8>(
72+
73+
fn evacuate<'e>(
7174
s: &Self,
75+
offset: u8,
7276
_: u8,
7377
region: std::ops::Range<usize>,
7478
handlers: &mut Handlers,
7579
) {
7680
let ptr = s.ptr as *const T;
7781
let addr = ptr as usize;
7882
if region.contains(&addr) {
79-
let i = handlers.translation[OFFSET as usize];
83+
let i = handlers.translation[offset as usize];
8084
if let Some(next) = handlers.nexts.get_mut(i as usize) {
8185
let next_addr = *next as usize;
8286
let header_addr = next_addr - next_addr % ARENA_SIZE;
@@ -105,6 +109,9 @@ unsafe impl<'r, T> Condemned for Gc<'r, T> {
105109
}
106110
}
107111
}
112+
113+
const GC_COUNT: u8 = 1;
114+
const PRE_CONDTION: bool = T::PRE_CONDTION;
108115
}
109116

110117
// std impls
@@ -117,14 +124,15 @@ unsafe impl<T> Condemned for Option<T> {
117124
}
118125
}
119126

120-
fn evacuate<'e, const OFFSET: u8>(
127+
fn evacuate<'e>(
121128
s: &Self,
129+
offset: u8,
122130
grey_feilds: u8,
123131
region: Range<usize>,
124132
handlers: &mut Handlers,
125133
) {
126134
match s {
127-
Some(t) => Condemned::evacuate::<OFFSET>(t, grey_feilds, region, handlers),
135+
Some(t) => Condemned::evacuate(t, offset, grey_feilds, region, handlers),
128136
None => (),
129137
}
130138
}
@@ -135,3 +143,43 @@ unsafe impl<T> Condemned for Option<T> {
135143
panic!("You need to derive Condemned for T. Required due to a direct Gc<A> in Option<T>");
136144
};
137145
}
146+
147+
unsafe impl<A, B> Condemned for (A, B) {
148+
fn feilds((a, b): &Self, grey_feilds: u8, region: Range<usize>) -> u8 {
149+
let mut r = 0b0000_0000;
150+
if (grey_feilds & 0b1000_0000) == 0b1000_0000 {
151+
r |= Condemned::feilds(a, grey_feilds, region.clone());
152+
};
153+
154+
if (grey_feilds & 0b0100_0000) == 0b0100_0000 {
155+
r |= Condemned::feilds(b, grey_feilds, region);
156+
};
157+
158+
r
159+
}
160+
161+
fn evacuate<'e>(
162+
(a, b): &Self,
163+
offset: u8,
164+
grey_feilds: u8,
165+
region: Range<usize>,
166+
handlers: &mut Handlers,
167+
) {
168+
Condemned::evacuate(a, offset, grey_feilds, region.clone(), handlers);
169+
170+
Condemned::evacuate(
171+
b,
172+
offset + A::GC_COUNT,
173+
grey_feilds,
174+
region.clone(),
175+
handlers,
176+
);
177+
}
178+
179+
const GC_COUNT: u8 = A::GC_COUNT + B::GC_COUNT;
180+
const PRE_CONDTION: bool = if A::PRE_CONDTION && B::PRE_CONDTION {
181+
true
182+
} else {
183+
panic!("You need to derive Condemned for A & B. Required due to a direct Gc<T> in (A, B)");
184+
};
185+
}

0 commit comments

Comments
 (0)