1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use core::ptr;
use boc_sys::descriptor as ffi;
use boc_sys::vsizeof;
extern "C" fn drop_glue_for<T>(obj: *mut ffi::Object) {
unsafe { ptr::drop_in_place::<T>(obj.cast()) }
}
extern "C" fn noop_trace(_o: *const ffi::Object, _os: *mut ffi::ObjectStack) {}
pub(crate) const fn get_descriptor<T>() -> &'static ffi::Descriptor {
// ______
// _____/ \\_____
// | _ ___ _ ||
// | | \ | | \ ||
// | | | | | | ||
// | |_/ | |_/ ||
// | | \ | | ||
// | | \ | | ||
// | | \. _|_. | . ||
// | ||
// | hack trait ||
// | ||
// * | * ** * ** |** **
// \))ejm97/.,(//,,..,,\||(,,.,\\,.((//
const {
// `static Descriptor* desc()` in `vobject.h`
&ffi::Descriptor {
size: vsizeof::<T>(),
trace: noop_trace,
finaliser: None,
notified: None,
destructor: Some(drop_glue_for::<T>),
}
}
}
#[test]
fn descriptor_ptr_eq() {
let i1 = get_descriptor::<i32>();
let i2 = get_descriptor::<i32>();
let v1 = get_descriptor::<Vec<i32>>();
let v2 = get_descriptor::<Vec<i32>>();
assert!(ptr::eq(i1, i2));
assert!(ptr::eq(v1, v2));
assert!(!ptr::eq(i1, v1));
}