Skip to content

Commit 3d6c043

Browse files
committed
ZJIT: 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 3e6f9fc commit 3d6c043

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

zjit/src/cruby.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,12 @@ pub fn iseq_rest_param_idx(params: &IseqParameters) -> Option<i32> {
323323
pub fn for_each_iseq<F: FnMut(IseqPtr)>(mut callback: F) {
324324
unsafe extern "C" fn callback_wrapper(iseq: IseqPtr, data: *mut c_void) {
325325
// SAFETY: points to the local below
326-
let callback: &mut &mut dyn FnMut(IseqPtr) -> bool = unsafe { std::mem::transmute(&mut *data) };
327-
callback(iseq);
326+
let callback: *mut *mut dyn FnMut(IseqPtr) -> bool = data.cast();
327+
unsafe { (**callback)(iseq) };
328328
}
329-
let mut data: &mut dyn FnMut(IseqPtr) = &mut callback;
330-
unsafe { rb_jit_for_each_iseq(Some(callback_wrapper), (&mut data) as *mut _ as *mut c_void) };
329+
let mut data: *mut dyn FnMut(IseqPtr) = &raw mut callback;
330+
let data: *mut *mut dyn FnMut(IseqPtr) = &raw mut data;
331+
unsafe { rb_jit_for_each_iseq(Some(callback_wrapper), data.cast()) };
331332
}
332333

333334
/// Return a poison value to be set above the stack top to verify leafness.

0 commit comments

Comments
 (0)