Skip to content

Commit 545c046

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 4b2fc7e commit 545c046

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
@@ -320,11 +320,12 @@ pub fn iseq_rest_param_idx(params: &IseqParameters) -> Option<i32> {
320320
pub fn for_each_iseq<F: FnMut(IseqPtr)>(mut callback: F) {
321321
unsafe extern "C" fn callback_wrapper(iseq: IseqPtr, data: *mut c_void) {
322322
// SAFETY: points to the local below
323-
let callback: &mut &mut dyn FnMut(IseqPtr) -> bool = unsafe { std::mem::transmute(&mut *data) };
324-
callback(iseq);
323+
let callback: *mut *mut dyn FnMut(IseqPtr) -> bool = data.cast();
324+
unsafe { (**callback)(iseq) };
325325
}
326-
let mut data: &mut dyn FnMut(IseqPtr) = &mut callback;
327-
unsafe { rb_jit_for_each_iseq(Some(callback_wrapper), (&mut data) as *mut _ as *mut c_void) };
326+
let mut data: *mut dyn FnMut(IseqPtr) = &raw mut callback;
327+
let data: *mut *mut dyn FnMut(IseqPtr) = &raw mut data;
328+
unsafe { rb_jit_for_each_iseq(Some(callback_wrapper), data.cast()) };
328329
}
329330

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

0 commit comments

Comments
 (0)