Skip to content

Commit 33dd4ec

Browse files
committed
Added Trace for Rc
1 parent c5408d2 commit 33dd4ec

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

gc/src/trace.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::num::{
55
NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize,
66
};
77
use std::path::{Path, PathBuf};
8+
use std::rc::Rc;
89
use std::sync::atomic::{
910
AtomicBool, AtomicI16, AtomicI32, AtomicI64, AtomicI8, AtomicIsize, AtomicU16, AtomicU32,
1011
AtomicU64, AtomicU8, AtomicUsize,
@@ -141,6 +142,7 @@ simple_empty_finalize_trace![
141142
char,
142143
String,
143144
Box<str>,
145+
Rc<str>,
144146
Path,
145147
PathBuf,
146148
NonZeroIsize,
@@ -256,6 +258,13 @@ type_arg_tuple_based_finalized_trace_impls![
256258
(A, B, C, D, E, F, G, H, I, J, K, L);
257259
];
258260

261+
impl<T: Trace + ?Sized> Finalize for Rc<T> {}
262+
unsafe impl<T: Trace + ?Sized> Trace for Rc<T> {
263+
custom_trace!(this, {
264+
mark(&**this);
265+
});
266+
}
267+
259268
impl<T: Trace + ?Sized> Finalize for Box<T> {}
260269
unsafe impl<T: Trace + ?Sized> Trace for Box<T> {
261270
custom_trace!(this, {

gc/tests/trace_impl.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use gc_derive::{Finalize, Trace};
44
use std::cell::RefCell;
5+
use std::rc::Rc;
56

67
thread_local!(static X: RefCell<u8> = RefCell::new(0));
78

@@ -37,6 +38,21 @@ struct InnerBoxStr {
3738
inner: Box<str>,
3839
}
3940

41+
#[derive(Trace, Clone, Finalize)]
42+
struct InnerRcSlice {
43+
inner: Box<[u32]>,
44+
}
45+
46+
#[derive(Trace, Clone, Finalize)]
47+
struct InnerRcStr {
48+
inner: Rc<str>,
49+
}
50+
51+
#[derive(Trace, Clone, Finalize)]
52+
struct InnerRcStruct {
53+
inner: Rc<Bar>,
54+
}
55+
4056
#[derive(Trace, Finalize)]
4157
struct Baz {
4258
a: Bar,

0 commit comments

Comments
 (0)