mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 17:24:06 +00:00
std::vec: remove .as_imm_buf, replaced by .as_ptr & .len.
There's no need for the restrictions of a closure with the above methods.
This commit is contained in:
parent
ac137f6dbe
commit
4c79b22ef2
@ -44,21 +44,18 @@ static TINFL_FLAG_PARSE_ZLIB_HEADER : c_int = 0x1; // parse zlib header and adle
|
||||
static TDEFL_WRITE_ZLIB_HEADER : c_int = 0x01000; // write zlib header and adler32 checksum
|
||||
|
||||
fn deflate_bytes_internal(bytes: &[u8], flags: c_int) -> ~[u8] {
|
||||
bytes.as_imm_buf(|b, len| {
|
||||
unsafe {
|
||||
let mut outsz : size_t = 0;
|
||||
let res =
|
||||
rustrt::tdefl_compress_mem_to_heap(b as *c_void,
|
||||
len as size_t,
|
||||
&mut outsz,
|
||||
flags);
|
||||
assert!(res as int != 0);
|
||||
unsafe {
|
||||
let mut outsz : size_t = 0;
|
||||
let res = rustrt::tdefl_compress_mem_to_heap(bytes.as_ptr() as *c_void,
|
||||
bytes.len() as size_t,
|
||||
&mut outsz,
|
||||
flags);
|
||||
assert!(res as int != 0);
|
||||
let out = vec::raw::from_buf_raw(res as *u8,
|
||||
outsz as uint);
|
||||
libc::free(res);
|
||||
out
|
||||
}
|
||||
})
|
||||
libc::free(res);
|
||||
out
|
||||
}
|
||||
}
|
||||
|
||||
pub fn deflate_bytes(bytes: &[u8]) -> ~[u8] {
|
||||
@ -70,21 +67,18 @@ pub fn deflate_bytes_zlib(bytes: &[u8]) -> ~[u8] {
|
||||
}
|
||||
|
||||
fn inflate_bytes_internal(bytes: &[u8], flags: c_int) -> ~[u8] {
|
||||
bytes.as_imm_buf(|b, len| {
|
||||
unsafe {
|
||||
let mut outsz : size_t = 0;
|
||||
let res =
|
||||
rustrt::tinfl_decompress_mem_to_heap(b as *c_void,
|
||||
len as size_t,
|
||||
&mut outsz,
|
||||
flags);
|
||||
assert!(res as int != 0);
|
||||
let out = vec::raw::from_buf_raw(res as *u8,
|
||||
outsz as uint);
|
||||
libc::free(res);
|
||||
out
|
||||
}
|
||||
})
|
||||
unsafe {
|
||||
let mut outsz : size_t = 0;
|
||||
let res = rustrt::tinfl_decompress_mem_to_heap(bytes.as_ptr() as *c_void,
|
||||
bytes.len() as size_t,
|
||||
&mut outsz,
|
||||
flags);
|
||||
assert!(res as int != 0);
|
||||
let out = vec::raw::from_buf_raw(res as *u8,
|
||||
outsz as uint);
|
||||
libc::free(res);
|
||||
out
|
||||
}
|
||||
}
|
||||
|
||||
pub fn inflate_bytes(bytes: &[u8]) -> ~[u8] {
|
||||
|
@ -354,9 +354,7 @@ pub mod write {
|
||||
add(*arg);
|
||||
}
|
||||
|
||||
llvm_args.as_imm_buf(|p, len| {
|
||||
llvm::LLVMRustSetLLVMOptions(len as c_int, p);
|
||||
})
|
||||
llvm::LLVMRustSetLLVMOptions(llvm_args.len() as c_int, llvm_args.as_ptr());
|
||||
}
|
||||
|
||||
unsafe fn populate_llvm_passes(fpm: lib::llvm::PassManagerRef,
|
||||
|
@ -55,7 +55,7 @@ mod windows {
|
||||
let mut t = s.to_utf16();
|
||||
// Null terminate before passing on.
|
||||
t.push(0u16);
|
||||
t.as_imm_buf(|buf, _len| f(buf))
|
||||
f(t.as_ptr())
|
||||
}
|
||||
|
||||
#[link_name = "kernel32"]
|
||||
@ -86,14 +86,12 @@ mod windows {
|
||||
return Err(format!("failure in BeginUpdateResourceW: {}", os::last_os_error()));
|
||||
}
|
||||
|
||||
let ok = manifest.as_imm_buf(|p, len| {
|
||||
UpdateResourceW(hUpdate,
|
||||
MAKEINTRESOURCEW(24), // RT_MANIFEST
|
||||
MAKEINTRESOURCEW(1), // CREATEPROCESS_MANIFEST_RESOURCE_ID
|
||||
0, // LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
p as LPCVOID,
|
||||
len as u32)
|
||||
});
|
||||
let ok = UpdateResourceW(hUpdate,
|
||||
MAKEINTRESOURCEW(24), // RT_MANIFEST
|
||||
MAKEINTRESOURCEW(1), // CREATEPROCESS_MANIFEST_RESOURCE_ID
|
||||
0, // LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||
manifest.as_ptr() as LPCVOID,
|
||||
manifest.len() as u32);
|
||||
if ok == FALSE {
|
||||
return Err(format!("failure in UpdateResourceW: {}", os::last_os_error()));
|
||||
}
|
||||
|
@ -2414,9 +2414,9 @@ pub fn create_entry_wrapper(ccx: @mut CrateContext,
|
||||
(rust_main, args)
|
||||
};
|
||||
|
||||
let result = args.as_imm_buf(|buf, len| {
|
||||
llvm::LLVMBuildCall(bld, start_fn, buf, len as c_uint, noname())
|
||||
});
|
||||
let result = llvm::LLVMBuildCall(bld, start_fn,
|
||||
args.as_ptr(), args.len() as c_uint,
|
||||
noname());
|
||||
|
||||
llvm::LLVMBuildRet(bld, result);
|
||||
}
|
||||
|
@ -464,11 +464,11 @@ impl Builder {
|
||||
let min = llvm::LLVMConstInt(t, lo, signed);
|
||||
let max = llvm::LLVMConstInt(t, hi, signed);
|
||||
|
||||
[min, max].as_imm_buf(|ptr, len| {
|
||||
llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,
|
||||
llvm::LLVMMDNodeInContext(self.ccx.llcx,
|
||||
ptr, len as c_uint));
|
||||
})
|
||||
let v = [min, max];
|
||||
|
||||
llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,
|
||||
llvm::LLVMMDNodeInContext(self.ccx.llcx,
|
||||
v.as_ptr(), v.len() as c_uint));
|
||||
}
|
||||
|
||||
value
|
||||
|
@ -952,17 +952,16 @@ pub fn C_zero_byte_arr(size: uint) -> ValueRef {
|
||||
|
||||
pub fn C_struct(elts: &[ValueRef], packed: bool) -> ValueRef {
|
||||
unsafe {
|
||||
elts.as_imm_buf(|ptr, len| {
|
||||
llvm::LLVMConstStructInContext(base::task_llcx(), ptr, len as c_uint, packed as Bool)
|
||||
})
|
||||
|
||||
llvm::LLVMConstStructInContext(base::task_llcx(),
|
||||
elts.as_ptr(), elts.len() as c_uint,
|
||||
packed as Bool)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn C_named_struct(T: Type, elts: &[ValueRef]) -> ValueRef {
|
||||
unsafe {
|
||||
elts.as_imm_buf(|ptr, len| {
|
||||
llvm::LLVMConstNamedStruct(T.to_ref(), ptr, len as c_uint)
|
||||
})
|
||||
llvm::LLVMConstNamedStruct(T.to_ref(), elts.as_ptr(), elts.len() as c_uint)
|
||||
}
|
||||
}
|
||||
|
||||
@ -988,9 +987,7 @@ pub fn get_param(fndecl: ValueRef, param: uint) -> ValueRef {
|
||||
pub fn const_get_elt(cx: &CrateContext, v: ValueRef, us: &[c_uint])
|
||||
-> ValueRef {
|
||||
unsafe {
|
||||
let r = us.as_imm_buf(|p, len| {
|
||||
llvm::LLVMConstExtractValue(v, p, len as c_uint)
|
||||
});
|
||||
let r = llvm::LLVMConstExtractValue(v, us.as_ptr(), us.len() as c_uint);
|
||||
|
||||
debug!("const_get_elt(v={}, us={:?}, r={})",
|
||||
cx.tn.val_to_str(v), us, cx.tn.val_to_str(r));
|
||||
|
@ -646,11 +646,9 @@ pub fn trans_rust_fn_with_foreign_abi(ccx: @mut CrateContext,
|
||||
}
|
||||
|
||||
// Perform the call itself
|
||||
let llrust_ret_val = llrust_args.as_imm_buf(|ptr, len| {
|
||||
debug!("calling llrustfn = {}", ccx.tn.val_to_str(llrustfn));
|
||||
llvm::LLVMBuildCall(builder, llrustfn, ptr,
|
||||
len as c_uint, noname())
|
||||
});
|
||||
debug!("calling llrustfn = {}", ccx.tn.val_to_str(llrustfn));
|
||||
let llrust_ret_val = llvm::LLVMBuildCall(builder, llrustfn, llrust_args.as_ptr(),
|
||||
llrust_args.len() as c_uint, noname());
|
||||
|
||||
// Get the return value where the foreign fn expects it.
|
||||
let llforeign_ret_ty = match tys.fn_ty.ret_ty.cast {
|
||||
|
@ -70,7 +70,7 @@ impl Process {
|
||||
},
|
||||
flags: 0,
|
||||
stdio_count: stdio.len() as libc::c_int,
|
||||
stdio: stdio.as_imm_buf(|p, _| p),
|
||||
stdio: stdio.as_ptr(),
|
||||
uid: 0,
|
||||
gid: 0,
|
||||
};
|
||||
@ -163,7 +163,7 @@ fn with_argv<T>(prog: &str, args: &[~str], f: |**libc::c_char| -> T) -> T {
|
||||
c_args.push(s.with_ref(|p| p));
|
||||
}
|
||||
c_args.push(ptr::null());
|
||||
c_args.as_imm_buf(|buf, _| f(buf))
|
||||
f(c_args.as_ptr())
|
||||
}
|
||||
|
||||
/// Converts the environment to the env array expected by libuv
|
||||
@ -182,7 +182,7 @@ fn with_env<T>(env: Option<&[(~str, ~str)]>, f: |**libc::c_char| -> T) -> T {
|
||||
c_envp.push(s.with_ref(|p| p));
|
||||
}
|
||||
c_envp.push(ptr::null());
|
||||
c_envp.as_imm_buf(|buf, _| f(buf))
|
||||
f(c_envp.as_ptr())
|
||||
}
|
||||
|
||||
impl HomingIO for Process {
|
||||
|
@ -267,17 +267,16 @@ impl<'a> ToCStr for &'a [u8] {
|
||||
}
|
||||
|
||||
unsafe fn to_c_str_unchecked(&self) -> CString {
|
||||
self.as_imm_buf(|self_buf, self_len| {
|
||||
let buf = libc::malloc(self_len as libc::size_t + 1) as *mut u8;
|
||||
if buf.is_null() {
|
||||
fail!("failed to allocate memory!");
|
||||
}
|
||||
let self_len = self.len();
|
||||
let buf = libc::malloc(self_len as libc::size_t + 1) as *mut u8;
|
||||
if buf.is_null() {
|
||||
fail!("failed to allocate memory!");
|
||||
}
|
||||
|
||||
ptr::copy_memory(buf, self_buf, self_len);
|
||||
*ptr::mut_offset(buf, self_len as int) = 0;
|
||||
ptr::copy_memory(buf, self.as_ptr(), self_len);
|
||||
*ptr::mut_offset(buf, self_len as int) = 0;
|
||||
|
||||
CString::new(buf as *libc::c_char, true)
|
||||
})
|
||||
CString::new(buf as *libc::c_char, true)
|
||||
}
|
||||
|
||||
fn with_c_str<T>(&self, f: |*libc::c_char| -> T) -> T {
|
||||
|
@ -37,8 +37,8 @@ fn keep_going(data: &[u8], f: |*u8, uint| -> i64) -> i64 {
|
||||
#[cfg(windows)] static eintr: int = 0; // doesn't matter
|
||||
#[cfg(not(windows))] static eintr: int = libc::EINTR as int;
|
||||
|
||||
let (data, origamt) = data.as_imm_buf(|data, amt| (data, amt));
|
||||
let mut data = data;
|
||||
let origamt = data.len();
|
||||
let mut data = data.as_ptr();
|
||||
let mut amt = origamt;
|
||||
while amt > 0 {
|
||||
let mut ret;
|
||||
|
@ -8,7 +8,6 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use cast;
|
||||
use io;
|
||||
use libc::{pid_t, c_void, c_int};
|
||||
use libc;
|
||||
@ -17,6 +16,8 @@ use prelude::*;
|
||||
use ptr;
|
||||
use rt::rtio;
|
||||
use super::file;
|
||||
#[cfg(windows)]
|
||||
use cast;
|
||||
|
||||
use p = io::process;
|
||||
|
||||
@ -453,7 +454,7 @@ fn with_argv<T>(prog: &str, args: &[~str], cb: |**libc::c_char| -> T) -> T {
|
||||
// Finally, make sure we add a null pointer.
|
||||
ptrs.push(ptr::null());
|
||||
|
||||
ptrs.as_imm_buf(|buf, _| cb(buf))
|
||||
cb(ptrs.as_ptr())
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
@ -476,7 +477,7 @@ fn with_envp<T>(env: Option<~[(~str, ~str)]>, cb: |*c_void| -> T) -> T {
|
||||
let mut ptrs = tmps.map(|tmp| tmp.with_ref(|buf| buf));
|
||||
ptrs.push(ptr::null());
|
||||
|
||||
ptrs.as_imm_buf(|buf, _| unsafe { cb(cast::transmute(buf)) })
|
||||
cb(ptrs.as_ptr() as *c_void)
|
||||
}
|
||||
_ => cb(ptr::null())
|
||||
}
|
||||
@ -499,7 +500,7 @@ fn with_envp<T>(env: Option<~[(~str, ~str)]>, cb: |*mut c_void| -> T) -> T {
|
||||
|
||||
blk.push(0);
|
||||
|
||||
blk.as_imm_buf(|p, _len| unsafe { cb(cast::transmute(p)) })
|
||||
cb(blk.as_mut_ptr() as *mut c_void)
|
||||
}
|
||||
_ => cb(ptr::mut_null())
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ pub mod win32 {
|
||||
let mut t = s.to_utf16();
|
||||
// Null terminate before passing on.
|
||||
t.push(0u16);
|
||||
t.as_imm_buf(|buf, _len| f(buf))
|
||||
f(t.as_ptr())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -511,10 +511,9 @@ pub mod ptr_tests {
|
||||
"there".with_c_str(|p1| {
|
||||
"thing".with_c_str(|p2| {
|
||||
let v = ~[p0, p1, p2, null()];
|
||||
v.as_imm_buf(|vp, len| {
|
||||
assert_eq!(unsafe { buf_len(vp) }, 3u);
|
||||
assert_eq!(len, 4u);
|
||||
})
|
||||
unsafe {
|
||||
assert_eq!(buf_len(v.as_ptr()), 3u);
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
@ -623,23 +622,21 @@ pub mod ptr_tests {
|
||||
one, two, three
|
||||
];
|
||||
|
||||
arr.as_imm_buf(|arr_ptr, arr_len| {
|
||||
let mut ctr = 0;
|
||||
let mut iteration_count = 0;
|
||||
array_each_with_len(arr_ptr, arr_len, |e| {
|
||||
let actual = str::raw::from_c_str(e);
|
||||
let expected = expected_arr[ctr].with_ref(|buf| {
|
||||
str::raw::from_c_str(buf)
|
||||
});
|
||||
debug!(
|
||||
"test_ptr_array_each_with_len e: {}, a: {}",
|
||||
expected, actual);
|
||||
assert_eq!(actual, expected);
|
||||
ctr += 1;
|
||||
iteration_count += 1;
|
||||
let mut ctr = 0;
|
||||
let mut iteration_count = 0;
|
||||
array_each_with_len(arr.as_ptr(), arr.len(), |e| {
|
||||
let actual = str::raw::from_c_str(e);
|
||||
let expected = expected_arr[ctr].with_ref(|buf| {
|
||||
str::raw::from_c_str(buf)
|
||||
});
|
||||
debug!(
|
||||
"test_ptr_array_each_with_len e: {}, a: {}",
|
||||
expected, actual);
|
||||
assert_eq!(actual, expected);
|
||||
ctr += 1;
|
||||
iteration_count += 1;
|
||||
});
|
||||
assert_eq!(iteration_count, 3u);
|
||||
})
|
||||
assert_eq!(iteration_count, 3u);
|
||||
}
|
||||
}
|
||||
|
||||
@ -660,23 +657,22 @@ pub mod ptr_tests {
|
||||
one, two, three
|
||||
];
|
||||
|
||||
arr.as_imm_buf(|arr_ptr, _| {
|
||||
let mut ctr = 0;
|
||||
let mut iteration_count = 0;
|
||||
array_each(arr_ptr, |e| {
|
||||
let actual = str::raw::from_c_str(e);
|
||||
let expected = expected_arr[ctr].with_ref(|buf| {
|
||||
str::raw::from_c_str(buf)
|
||||
});
|
||||
debug!(
|
||||
"test_ptr_array_each e: {}, a: {}",
|
||||
expected, actual);
|
||||
assert_eq!(actual, expected);
|
||||
ctr += 1;
|
||||
iteration_count += 1;
|
||||
let arr_ptr = arr.as_ptr();
|
||||
let mut ctr = 0;
|
||||
let mut iteration_count = 0;
|
||||
array_each(arr_ptr, |e| {
|
||||
let actual = str::raw::from_c_str(e);
|
||||
let expected = expected_arr[ctr].with_ref(|buf| {
|
||||
str::raw::from_c_str(buf)
|
||||
});
|
||||
debug!(
|
||||
"test_ptr_array_each e: {}, a: {}",
|
||||
expected, actual);
|
||||
assert_eq!(actual, expected);
|
||||
ctr += 1;
|
||||
iteration_count += 1;
|
||||
});
|
||||
assert_eq!(iteration_count, 3);
|
||||
})
|
||||
assert_eq!(iteration_count, 3);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2502,7 +2502,7 @@ impl<'a> StrSlice<'a> for &'a str {
|
||||
#[inline]
|
||||
fn as_imm_buf<T>(&self, f: |*u8, uint| -> T) -> T {
|
||||
let v: &[u8] = unsafe { cast::transmute(*self) };
|
||||
v.as_imm_buf(f)
|
||||
f(v.as_ptr(), v.len())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -775,7 +775,7 @@ impl<'a, T> Container for &'a [T] {
|
||||
/// Returns the length of a vector
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
self.as_imm_buf(|_p, len| len)
|
||||
self.repr().len
|
||||
}
|
||||
}
|
||||
|
||||
@ -783,7 +783,7 @@ impl<T> Container for ~[T] {
|
||||
/// Returns the length of a vector
|
||||
#[inline]
|
||||
fn len(&self) -> uint {
|
||||
self.as_imm_buf(|_p, len| len)
|
||||
self.repr().len
|
||||
}
|
||||
}
|
||||
|
||||
@ -984,14 +984,6 @@ pub trait ImmutableVector<'a, T> {
|
||||
/// of a vector and return the results.
|
||||
fn map<U>(&self, |t: &T| -> U) -> ~[U];
|
||||
|
||||
/**
|
||||
* Work with the buffer of a vector.
|
||||
*
|
||||
* Allows for unsafe manipulation of vector contents, which is useful for
|
||||
* foreign interop.
|
||||
*/
|
||||
fn as_imm_buf<U>(&self, f: |*T, uint| -> U) -> U;
|
||||
|
||||
/**
|
||||
* Returns a mutable reference to the first element in this slice
|
||||
* and adjusts the slice in place so that it no longer contains
|
||||
@ -1032,14 +1024,12 @@ impl<'a,T> ImmutableVector<'a, T> for &'a [T] {
|
||||
fn slice(&self, start: uint, end: uint) -> &'a [T] {
|
||||
assert!(start <= end);
|
||||
assert!(end <= self.len());
|
||||
self.as_imm_buf(|p, _len| {
|
||||
unsafe {
|
||||
cast::transmute(Slice {
|
||||
data: ptr::offset(p, start as int),
|
||||
unsafe {
|
||||
cast::transmute(Slice {
|
||||
data: self.as_ptr().offset(start as int),
|
||||
len: (end - start)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@ -1197,12 +1187,6 @@ impl<'a,T> ImmutableVector<'a, T> for &'a [T] {
|
||||
self.iter().map(f).collect()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn as_imm_buf<U>(&self, f: |*T, uint| -> U) -> U {
|
||||
let s = self.repr();
|
||||
f(s.data, s.len)
|
||||
}
|
||||
|
||||
fn shift_ref(&mut self) -> &'a T {
|
||||
unsafe {
|
||||
let s: &mut Slice<T> = cast::transmute(self);
|
||||
@ -2206,10 +2190,9 @@ impl<'a,T> MutableVector<'a, T> for &'a mut [T] {
|
||||
#[inline]
|
||||
unsafe fn copy_memory(self, src: &[T]) {
|
||||
self.as_mut_buf(|p_dst, len_dst| {
|
||||
src.as_imm_buf(|p_src, len_src| {
|
||||
assert!(len_dst >= len_src)
|
||||
ptr::copy_nonoverlapping_memory(p_dst, p_src, len_src)
|
||||
})
|
||||
let len_src = src.len();
|
||||
assert!(len_dst >= len_src);
|
||||
ptr::copy_nonoverlapping_memory(p_dst, src.as_ptr(), len_src)
|
||||
})
|
||||
}
|
||||
|
||||
@ -2369,9 +2352,7 @@ pub mod bytes {
|
||||
dst.reserve_additional(src.len());
|
||||
unsafe {
|
||||
dst.as_mut_buf(|p_dst, len_dst| {
|
||||
src.as_imm_buf(|p_src, len_src| {
|
||||
ptr::copy_memory(p_dst.offset(len_dst as int), p_src, len_src)
|
||||
})
|
||||
ptr::copy_memory(p_dst.offset(len_dst as int), src.as_ptr(), src.len())
|
||||
});
|
||||
dst.set_len(old_len + src.len());
|
||||
}
|
||||
@ -3553,15 +3534,6 @@ mod tests {
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_fail]
|
||||
fn test_as_imm_buf_fail() {
|
||||
let v = [(~0, @0), (~0, @0), (~0, @0), (~0, @0)];
|
||||
v.as_imm_buf(|_buf, _i| {
|
||||
fail!()
|
||||
})
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_fail]
|
||||
fn test_as_mut_buf_fail() {
|
||||
|
@ -21,16 +21,15 @@ fn main() {
|
||||
// huge).
|
||||
|
||||
let x = ~[1u,2u,3u];
|
||||
x.as_imm_buf(|p, _len| {
|
||||
let base = p as uint;
|
||||
let idx = base / mem::size_of::<uint>();
|
||||
error!("ov1 base = 0x{:x}", base);
|
||||
error!("ov1 idx = 0x{:x}", idx);
|
||||
error!("ov1 sizeof::<uint>() = 0x{:x}", mem::size_of::<uint>());
|
||||
error!("ov1 idx * sizeof::<uint>() = 0x{:x}",
|
||||
idx * mem::size_of::<uint>());
|
||||
|
||||
// This should fail.
|
||||
error!("ov1 0x{:x}", x[idx]);
|
||||
})
|
||||
let base = x.as_ptr() as uint;
|
||||
let idx = base / mem::size_of::<uint>();
|
||||
error!("ov1 base = 0x{:x}", base);
|
||||
error!("ov1 idx = 0x{:x}", idx);
|
||||
error!("ov1 sizeof::<uint>() = 0x{:x}", mem::size_of::<uint>());
|
||||
error!("ov1 idx * sizeof::<uint>() = 0x{:x}",
|
||||
idx * mem::size_of::<uint>());
|
||||
|
||||
// This should fail.
|
||||
error!("ov1 0x{:x}", x[idx]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user