Skip to content

Commit 716a0b1

Browse files
authored
Only avoid pointer casts when using miri (#545)
1 parent b4b2c18 commit 716a0b1

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

src/bytes.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,14 +1104,31 @@ unsafe fn release_shared(ptr: *mut Shared) {
11041104
Box::from_raw(ptr);
11051105
}
11061106

1107+
// Ideally we would always use this version of `ptr_map` since it is strict
1108+
// provenance compatible, but it results in worse codegen. We will however still
1109+
// use it on miri because it gives better diagnostics for people who test bytes
1110+
// code with miri.
1111+
//
1112+
// See https://github.com/tokio-rs/bytes/pull/545 for more info.
1113+
#[cfg(miri)]
11071114
fn ptr_map<F>(ptr: *mut u8, f: F) -> *mut u8
11081115
where
11091116
F: FnOnce(usize) -> usize,
11101117
{
11111118
let old_addr = ptr as usize;
11121119
let new_addr = f(old_addr);
1113-
// this optimizes better than `ptr.wrapping_add(new_addr.wrapping_sub(old_addr))`
1114-
ptr.wrapping_sub(old_addr).wrapping_add(new_addr)
1120+
let diff = new_addr.wrapping_sub(old_addr);
1121+
ptr.wrapping_add(diff)
1122+
}
1123+
1124+
#[cfg(not(miri))]
1125+
fn ptr_map<F>(ptr: *mut u8, f: F) -> *mut u8
1126+
where
1127+
F: FnOnce(usize) -> usize,
1128+
{
1129+
let old_addr = ptr as usize;
1130+
let new_addr = f(old_addr);
1131+
new_addr as *mut u8
11151132
}
11161133

11171134
// compile-fails

0 commit comments

Comments
 (0)