Skip to content

Commit 4b2fc7e

Browse files
committed
YJIT: Replace std::mem::transmute with pointer casting
As the documentation puts it, transmute is "incredibly unsafe". We can express what we need to with pointer casts in these closure FFI situations, so let's use pointer casts.
1 parent 678b2c1 commit 4b2fc7e

1 file changed

Lines changed: 10 additions & 8 deletions

File tree

yjit/src/core.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,22 +1843,24 @@ pub fn get_or_create_iseq_payload(iseq: IseqPtr) -> &'static mut IseqPayload {
18431843
pub fn for_each_iseq<F: FnMut(IseqPtr)>(mut callback: F) {
18441844
unsafe extern "C" fn callback_wrapper(iseq: IseqPtr, data: *mut c_void) {
18451845
// SAFETY: points to the local below
1846-
let callback: &mut &mut dyn FnMut(IseqPtr) -> bool = unsafe { std::mem::transmute(&mut *data) };
1847-
callback(iseq);
1846+
let callback: *mut *mut dyn FnMut(IseqPtr) -> bool = data.cast();
1847+
unsafe { (**callback)(iseq) };
18481848
}
1849-
let mut data: &mut dyn FnMut(IseqPtr) = &mut callback;
1850-
unsafe { rb_jit_for_each_iseq(Some(callback_wrapper), (&mut data) as *mut _ as *mut c_void) };
1849+
let mut data: *mut dyn FnMut(IseqPtr) = &mut callback;
1850+
let data: *mut *mut dyn FnMut(IseqPtr) = &mut data;
1851+
unsafe { rb_jit_for_each_iseq(Some(callback_wrapper), data.cast()) };
18511852
}
18521853

18531854
/// Iterate over all on-stack ISEQs
18541855
pub fn for_each_on_stack_iseq<F: FnMut(IseqPtr)>(mut callback: F) {
18551856
unsafe extern "C" fn callback_wrapper(iseq: IseqPtr, data: *mut c_void) {
18561857
// SAFETY: points to the local below
1857-
let callback: &mut &mut dyn FnMut(IseqPtr) -> bool = unsafe { std::mem::transmute(&mut *data) };
1858-
callback(iseq);
1858+
let callback: *mut *mut dyn FnMut(IseqPtr) -> bool = data.cast();
1859+
unsafe { (**callback)(iseq) };
18591860
}
1860-
let mut data: &mut dyn FnMut(IseqPtr) = &mut callback;
1861-
unsafe { rb_jit_cont_each_iseq(Some(callback_wrapper), (&mut data) as *mut _ as *mut c_void) };
1861+
let mut data: *mut dyn FnMut(IseqPtr) = &mut callback;
1862+
let data: *mut *mut dyn FnMut(IseqPtr) = &mut data;
1863+
unsafe { rb_jit_cont_each_iseq(Some(callback_wrapper), data.cast()) };
18621864
}
18631865

18641866
/// Iterate over all on-stack ISEQ payloads

0 commit comments

Comments
 (0)