diff --git a/src/libextra/flate.rs b/src/libextra/flate.rs index 5227cb18e6e..1153c3a6ef3 100644 --- a/src/libextra/flate.rs +++ b/src/libextra/flate.rs @@ -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] { diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index b5f0a5713bd..2e9687bb9c1 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -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, diff --git a/src/librustc/back/manifest.rs b/src/librustc/back/manifest.rs index 1b39935800b..8e85603b31c 100644 --- a/src/librustc/back/manifest.rs +++ b/src/librustc/back/manifest.rs @@ -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())); } diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index abb3e22edb7..de56453631e 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -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); } diff --git a/src/librustc/middle/trans/builder.rs b/src/librustc/middle/trans/builder.rs index 863c567a216..02e2232bfc8 100644 --- a/src/librustc/middle/trans/builder.rs +++ b/src/librustc/middle/trans/builder.rs @@ -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 diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 55617067db4..627a23542d2 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -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)); diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index 2a0840a0ef8..5560efacfa5 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -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 { diff --git a/src/librustuv/process.rs b/src/librustuv/process.rs index 0410d58bd8b..9e359e26f03 100644 --- a/src/librustuv/process.rs +++ b/src/librustuv/process.rs @@ -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(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(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 { diff --git a/src/libstd/c_str.rs b/src/libstd/c_str.rs index 1ba6b7b50ca..2f11e93d839 100644 --- a/src/libstd/c_str.rs +++ b/src/libstd/c_str.rs @@ -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(&self, f: |*libc::c_char| -> T) -> T { diff --git a/src/libstd/io/native/file.rs b/src/libstd/io/native/file.rs index bd618dd6f0f..74d18f11a1d 100644 --- a/src/libstd/io/native/file.rs +++ b/src/libstd/io/native/file.rs @@ -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; diff --git a/src/libstd/io/native/process.rs b/src/libstd/io/native/process.rs index a1f50b15f23..ef972dc4d0a 100644 --- a/src/libstd/io/native/process.rs +++ b/src/libstd/io/native/process.rs @@ -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(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(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(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()) } diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 7abeb34a010..c7ff4510d0d 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -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()) } } diff --git a/src/libstd/ptr.rs b/src/libstd/ptr.rs index 162e46c53ae..070884c078c 100644 --- a/src/libstd/ptr.rs +++ b/src/libstd/ptr.rs @@ -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); } } diff --git a/src/libstd/str.rs b/src/libstd/str.rs index f1310765130..e785ed74159 100644 --- a/src/libstd/str.rs +++ b/src/libstd/str.rs @@ -2502,7 +2502,7 @@ impl<'a> StrSlice<'a> for &'a str { #[inline] fn as_imm_buf(&self, f: |*u8, uint| -> T) -> T { let v: &[u8] = unsafe { cast::transmute(*self) }; - v.as_imm_buf(f) + f(v.as_ptr(), v.len()) } } diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index 65be214c14e..08ab6732aec 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -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 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(&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(&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(&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 = 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() { diff --git a/src/test/run-fail/bug-2470-bounds-check-overflow.rs b/src/test/run-fail/bug-2470-bounds-check-overflow.rs index a476a9727b3..932b9a0d451 100644 --- a/src/test/run-fail/bug-2470-bounds-check-overflow.rs +++ b/src/test/run-fail/bug-2470-bounds-check-overflow.rs @@ -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::(); - error!("ov1 base = 0x{:x}", base); - error!("ov1 idx = 0x{:x}", idx); - error!("ov1 sizeof::() = 0x{:x}", mem::size_of::()); - error!("ov1 idx * sizeof::() = 0x{:x}", - idx * mem::size_of::()); - // This should fail. - error!("ov1 0x{:x}", x[idx]); - }) + let base = x.as_ptr() as uint; + let idx = base / mem::size_of::(); + error!("ov1 base = 0x{:x}", base); + error!("ov1 idx = 0x{:x}", idx); + error!("ov1 sizeof::() = 0x{:x}", mem::size_of::()); + error!("ov1 idx * sizeof::() = 0x{:x}", + idx * mem::size_of::()); + + // This should fail. + error!("ov1 0x{:x}", x[idx]); }