Skip to content

Commit 5c82b64

Browse files
authoredMar 14, 2017
Merge pull request rust-lang#148 from dwrensha/write-bytes-intrinsic
implement the write_bytes() intrinsic
2 parents feeb13c + 41c2aa6 commit 5c82b64

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed
 

‎src/terminator/intrinsic.rs

+12
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,18 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
402402
}
403403
}
404404

405+
"write_bytes" => {
406+
let u8 = self.tcx.types.u8;
407+
let ty = substs.type_at(0);
408+
let ty_align = self.type_align(ty)?;
409+
let val_byte = self.value_to_primval(arg_vals[1], u8)?.to_u128()? as u8;
410+
let size = self.type_size(ty)?.expect("write_bytes() type must be sized");
411+
let ptr = arg_vals[0].read_ptr(&self.memory)?;
412+
let count = self.value_to_primval(arg_vals[2], usize)?.to_u64()?;
413+
self.memory.check_align(ptr, size * count, ty_align)?;
414+
self.memory.write_repeat(ptr, val_byte, size * count)?;
415+
}
416+
405417
name => return Err(EvalError::Unimplemented(format!("unimplemented intrinsic: {}", name))),
406418
}
407419

‎tests/run-pass/write-bytes.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#[repr(C)]
2+
#[derive(Copy, Clone)]
3+
struct Foo {
4+
a: u64,
5+
b: u64,
6+
c: u64,
7+
}
8+
9+
fn main() {
10+
const LENGTH: usize = 10;
11+
let mut v: [u64; LENGTH] = [0; LENGTH];
12+
13+
for idx in 0..LENGTH {
14+
assert_eq!(v[idx], 0);
15+
}
16+
17+
unsafe {
18+
let p = v.as_mut_ptr();
19+
::std::ptr::write_bytes(p, 0xab, LENGTH);
20+
}
21+
22+
for idx in 0..LENGTH {
23+
assert_eq!(v[idx], 0xabababababababab);
24+
}
25+
26+
// -----
27+
28+
let mut w: [Foo; LENGTH] = [Foo { a: 0, b: 0, c: 0 }; LENGTH];
29+
for idx in 0..LENGTH {
30+
assert_eq!(w[idx].a, 0);
31+
assert_eq!(w[idx].b, 0);
32+
assert_eq!(w[idx].c, 0);
33+
}
34+
35+
unsafe {
36+
let p = w.as_mut_ptr();
37+
::std::ptr::write_bytes(p, 0xcd, LENGTH);
38+
}
39+
40+
for idx in 0..LENGTH {
41+
assert_eq!(w[idx].a, 0xcdcdcdcdcdcdcdcd);
42+
assert_eq!(w[idx].b, 0xcdcdcdcdcdcdcdcd);
43+
assert_eq!(w[idx].c, 0xcdcdcdcdcdcdcdcd);
44+
}
45+
}

0 commit comments

Comments
 (0)
Please sign in to comment.