]> git.lizzy.rs Git - rust.git/commitdiff
std: Add init and uninit to mem. Replace direct intrinsic usage
authorBrian Anderson <banderson@mozilla.com>
Sat, 8 Feb 2014 10:46:55 +0000 (02:46 -0800)
committerBrian Anderson <banderson@mozilla.com>
Sun, 9 Feb 2014 08:17:40 +0000 (00:17 -0800)
19 files changed:
src/doc/guide-ffi.md
src/libnative/io/file.rs
src/libnative/io/net.rs
src/libnative/io/timer_other.rs
src/libnative/io/timer_timerfd.rs
src/librustdoc/html/markdown.rs
src/librustuv/net.rs
src/libstd/c_str.rs
src/libstd/cast.rs
src/libstd/mem.rs
src/libstd/ptr.rs
src/libstd/rt/thread.rs
src/libstd/trie.rs
src/libstd/unstable/intrinsics.rs
src/libstd/unstable/mutex.rs
src/libstd/util.rs
src/test/bench/shootout-k-nucleotide.rs
src/test/run-pass/issue-10714.rs
src/test/run-pass/uninit-empty-types.rs

index e19e9978e1707c0b907c9248a1d904350194163b..eaec482fc9b8d8e14af3ce39e8bc6be73635cea1 100644 (file)
@@ -176,6 +176,7 @@ and `free`:
 ~~~~
 use std::cast;
 use std::libc::{c_void, size_t, malloc, free};
+use std::mem;
 use std::ptr;
 use std::unstable::intrinsics;
 
@@ -226,7 +227,7 @@ impl<T: Send> Unique<T> {
 impl<T: Send> Drop for Unique<T> {
     fn drop(&mut self) {
         unsafe {
-            let x = intrinsics::uninit(); // dummy value to swap in
+            let x = mem::uninit(); // dummy value to swap in
             // We need to move the object out of the box, so that
             // the destructor is called (at the end of this scope.)
             ptr::replace_ptr(self.ptr, x);
index 25fb2809e764a63658d16743dfa06b9b6a58edb3..c8754c839b28625e4d3b8741721a628b392ccc8f 100644 (file)
@@ -16,9 +16,9 @@
 use std::io;
 use std::libc::{c_int, c_void};
 use std::libc;
+use std::mem;
 use std::os;
 use std::rt::rtio;
-use std::unstable::intrinsics;
 use std::vec;
 
 use io::{IoResult, retry};
@@ -147,7 +147,7 @@ fn pread(&mut self, buf: &mut [u8], offset: u64) -> Result<int, IoError> {
         #[cfg(windows)]
         fn os_pread(fd: c_int, buf: *u8, amt: uint, offset: u64) -> IoResult<int> {
             unsafe {
-                let mut overlap: libc::OVERLAPPED = intrinsics::init();
+                let mut overlap: libc::OVERLAPPED = mem::init();
                 let handle = libc::get_osfhandle(fd) as libc::HANDLE;
                 let mut bytes_read = 0;
                 overlap.Offset = offset as libc::DWORD;
@@ -179,7 +179,7 @@ fn pwrite(&mut self, buf: &[u8], offset: u64) -> Result<(), IoError> {
         #[cfg(windows)]
         fn os_pwrite(fd: c_int, buf: *u8, amt: uint, offset: u64) -> IoResult<()> {
             unsafe {
-                let mut overlap: libc::OVERLAPPED = intrinsics::init();
+                let mut overlap: libc::OVERLAPPED = mem::init();
                 let handle = libc::get_osfhandle(fd) as libc::HANDLE;
                 overlap.Offset = offset as libc::DWORD;
                 overlap.OffsetHigh = (offset >> 32) as libc::DWORD;
@@ -867,7 +867,7 @@ pub fn stat(p: &CString) -> IoResult<io::FileStat> {
 
     #[cfg(windows)]
     fn os_stat(p: &CString) -> IoResult<io::FileStat> {
-        let mut stat: libc::stat = unsafe { intrinsics::uninit() };
+        let mut stat: libc::stat = unsafe { mem::uninit() };
         as_utf16_p(p.as_str().unwrap(), |up| {
             match retry(|| unsafe { libc::wstat(up, &mut stat) }) {
                 0 => Ok(mkstat(&stat, p)),
@@ -878,7 +878,7 @@ fn os_stat(p: &CString) -> IoResult<io::FileStat> {
 
     #[cfg(unix)]
     fn os_stat(p: &CString) -> IoResult<io::FileStat> {
-        let mut stat: libc::stat = unsafe { intrinsics::uninit() };
+        let mut stat: libc::stat = unsafe { mem::uninit() };
         match retry(|| unsafe { libc::stat(p.with_ref(|p| p), &mut stat) }) {
             0 => Ok(mkstat(&stat, p)),
             _ => Err(super::last_error()),
@@ -897,7 +897,7 @@ fn os_lstat(_p: &CString) -> IoResult<io::FileStat> {
 
     #[cfg(unix)]
     fn os_lstat(p: &CString) -> IoResult<io::FileStat> {
-        let mut stat: libc::stat = unsafe { intrinsics::uninit() };
+        let mut stat: libc::stat = unsafe { mem::uninit() };
         match retry(|| unsafe { libc::lstat(p.with_ref(|p| p), &mut stat) }) {
             0 => Ok(mkstat(&stat, p)),
             _ => Err(super::last_error()),
index 32cd6337f993d312dcded17d2e34d289f9cfbdbc..9042353c50a73236b0ee203a94940eb35fd65b90 100644 (file)
@@ -68,7 +68,7 @@ fn ip_to_inaddr(ip: ip::IpAddr) -> InAddr {
 
 fn addr_to_sockaddr(addr: ip::SocketAddr) -> (libc::sockaddr_storage, uint) {
     unsafe {
-        let storage: libc::sockaddr_storage = intrinsics::init();
+        let storage: libc::sockaddr_storage = mem::init();
         let len = match ip_to_inaddr(addr.ip) {
             InAddr(inaddr) => {
                 let storage: *mut libc::sockaddr_in = cast::transmute(&storage);
@@ -138,7 +138,7 @@ fn sockname(fd: sock_t,
                                          *mut libc::socklen_t) -> libc::c_int)
     -> IoResult<ip::SocketAddr>
 {
-    let mut storage: libc::sockaddr_storage = unsafe { intrinsics::init() };
+    let mut storage: libc::sockaddr_storage = unsafe { mem::init() };
     let mut len = mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t;
     unsafe {
         let storage = &mut storage as *mut libc::sockaddr_storage;
@@ -225,7 +225,7 @@ fn WSAStartup(wVersionRequested: libc::WORD,
 
         LOCK.lock();
         if !INITIALIZED {
-            let mut data: WSADATA = intrinsics::init();
+            let mut data: WSADATA = mem::init();
             let ret = WSAStartup(0x202,      // version 2.2
                                  &mut data);
             assert_eq!(ret, 0);
@@ -438,7 +438,7 @@ pub fn fd(&self) -> sock_t { self.listener.fd() }
 
     pub fn native_accept(&mut self) -> IoResult<TcpStream> {
         unsafe {
-            let mut storage: libc::sockaddr_storage = intrinsics::init();
+            let mut storage: libc::sockaddr_storage = mem::init();
             let storagep = &mut storage as *mut libc::sockaddr_storage;
             let size = mem::size_of::<libc::sockaddr_storage>();
             let mut size = size as libc::socklen_t;
@@ -543,7 +543,7 @@ fn socket_name(&mut self) -> IoResult<ip::SocketAddr> {
 impl rtio::RtioUdpSocket for UdpSocket {
     fn recvfrom(&mut self, buf: &mut [u8]) -> IoResult<(uint, ip::SocketAddr)> {
         unsafe {
-            let mut storage: libc::sockaddr_storage = intrinsics::init();
+            let mut storage: libc::sockaddr_storage = mem::init();
             let storagep = &mut storage as *mut libc::sockaddr_storage;
             let mut addrlen: libc::socklen_t =
                     mem::size_of::<libc::sockaddr_storage>() as libc::socklen_t;
index cda239329dcc07ca571da85b1fa1bfe25a7771a7..a06cab33a52f76868fc24fb1a1211894876d6f2d 100644 (file)
 use std::comm::Data;
 use std::hashmap::HashMap;
 use std::libc;
+use std::mem;
 use std::os;
 use std::ptr;
 use std::rt::rtio;
 use std::sync::atomics;
-use std::unstable::intrinsics;
 
 use io::file::FileDesc;
 use io::IoResult;
@@ -87,17 +87,17 @@ pub enum Req {
 // returns the current time (in milliseconds)
 fn now() -> u64 {
     unsafe {
-        let mut now: libc::timeval = intrinsics::init();
+        let mut now: libc::timeval = mem::init();
         assert_eq!(imp::gettimeofday(&mut now, ptr::null()), 0);
         return (now.tv_sec as u64) * 1000 + (now.tv_usec as u64) / 1000;
     }
 }
 
 fn helper(input: libc::c_int, messages: Port<Req>) {
-    let mut set: imp::fd_set = unsafe { intrinsics::init() };
+    let mut set: imp::fd_set = unsafe { mem::init() };
 
     let mut fd = FileDesc::new(input, true);
-    let mut timeout: libc::timeval = unsafe { intrinsics::init() };
+    let mut timeout: libc::timeval = unsafe { mem::init() };
 
     // active timers are those which are able to be selected upon (and it's a
     // sorted list, and dead timers are those which have expired, but ownership
index 7c22e90bbffe23518551129b36e8e7b676e2dca6..434794e32cb3c222e7f5527c2509e9c31f73a147 100644 (file)
@@ -34,7 +34,7 @@
 use std::os;
 use std::rt::rtio;
 use std::hashmap::HashMap;
-use std::unstable::intrinsics;
+use std::mem;
 
 use io::file::FileDesc;
 use io::IoResult;
@@ -75,7 +75,7 @@ fn del(efd: libc::c_int, fd: libc::c_int) {
     }
 
     add(efd, input);
-    let events: [imp::epoll_event, ..16] = unsafe { intrinsics::init() };
+    let events: [imp::epoll_event, ..16] = unsafe { mem::init() };
     let mut map: HashMap<libc::c_int, (Chan<()>, bool)> = HashMap::new();
     'outer: loop {
         let n = match unsafe {
index 63748203a1ab102ff1cece5376f4846a1ae4cada..7c9448bb73241a6c34166c128bf0db81fce2d842 100644 (file)
@@ -28,6 +28,7 @@
 use std::fmt;
 use std::io;
 use std::libc;
+use std::mem;
 use std::str;
 use std::unstable::intrinsics;
 use std::vec;
@@ -144,7 +145,7 @@ pub fn render(w: &mut io::Writer, s: &str) -> fmt::Result {
             flags: 0,
             link_attributes: None,
         };
-        let mut callbacks: sd_callbacks = intrinsics::init();
+        let mut callbacks: sd_callbacks = mem::init();
 
         sdhtml_renderer(&callbacks, &options, 0);
         let opaque = my_opaque {
@@ -197,7 +198,7 @@ pub fn find_testable_code(doc: &str, tests: &mut ::test::Collector) {
                          MKDEXT_STRIKETHROUGH;
         let callbacks = sd_callbacks {
             blockcode: block,
-            other: intrinsics::init()
+            other: mem::init()
         };
 
         let tests = tests as *mut ::test::Collector as *libc::c_void;
index 7660d2c4f2b3ef5143c9cbaeaac7ca1252cedd9a..9ccef383efaf918ac309b1a4a6186515492d199f 100644 (file)
@@ -80,7 +80,7 @@ pub fn sockaddr_to_addr(storage: &libc::sockaddr_storage,
 
 fn addr_to_sockaddr(addr: ip::SocketAddr) -> (libc::sockaddr_storage, uint) {
     unsafe {
-        let mut storage: libc::sockaddr_storage = intrinsics::init();
+        let mut storage: libc::sockaddr_storage = mem::init();
         let len = match addr.ip {
             ip::Ipv4Addr(a, b, c, d) => {
                 let storage: &mut libc::sockaddr_in =
@@ -134,7 +134,7 @@ fn socket_name(sk: SocketNameKind,
     };
 
     // Allocate a sockaddr_storage since we don't know if it's ipv4 or ipv6
-    let mut sockaddr: libc::sockaddr_storage = unsafe { intrinsics::init() };
+    let mut sockaddr: libc::sockaddr_storage = unsafe { mem::init() };
     let mut namelen = mem::size_of::<libc::sockaddr_storage>() as c_int;
 
     let sockaddr_p = &mut sockaddr as *mut libc::sockaddr_storage;
index fdef7e36bd5bd97f38c6e416558fa389ca281986..cc6cd7666d642bbbce53ac37b5c6f924fafe8bf6 100644 (file)
@@ -70,6 +70,7 @@
 use ops::Drop;
 use cmp::Eq;
 use clone::Clone;
+use mem;
 use option::{Option, Some, None};
 use ptr::RawPtr;
 use ptr;
@@ -77,7 +78,6 @@
 use str;
 use vec::{ImmutableVector, MutableVector};
 use vec;
-use unstable::intrinsics;
 use rt::global_heap::malloc_raw;
 
 /// The representation of a C String.
@@ -327,7 +327,7 @@ unsafe fn with_c_str_unchecked<T>(&self, f: |*libc::c_char| -> T) -> T {
 // Unsafe function that handles possibly copying the &[u8] into a stack array.
 unsafe fn with_c_str<T>(v: &[u8], checked: bool, f: |*libc::c_char| -> T) -> T {
     if v.len() < BUF_LEN {
-        let mut buf: [u8, .. BUF_LEN] = intrinsics::uninit();
+        let mut buf: [u8, .. BUF_LEN] = mem::uninit();
         vec::bytes::copy_memory(buf, v);
         buf[v.len()] = 0;
 
index eec7d28e134bb0274690bf3aaf23819301a1e940..258c0e23094041b2ead4f73a952b7698cf7fdfe5 100644 (file)
@@ -18,7 +18,7 @@
 /// Casts the value at `src` to U. The two types must have the same length.
 #[inline]
 pub unsafe fn transmute_copy<T, U>(src: &T) -> U {
-    let mut dest: U = intrinsics::uninit();
+    let mut dest: U = mem::uninit();
     let dest_ptr: *mut u8 = transmute(&mut dest);
     let src_ptr: *u8 = transmute(src);
     copy_nonoverlapping_memory(dest_ptr, src_ptr, mem::size_of::<U>());
index c4a546f71c315e88bb9df62bdcd46224607c7e57..05bc8ed982610bff8a0f714b1384dfad4780dfc3 100644 (file)
@@ -68,6 +68,21 @@ pub fn pref_align_of_val<T>(_val: &T) -> uint {
     pref_align_of::<T>()
 }
 
+/// Create a value initialized to zero.
+///
+/// `init` is unsafe because it returns a zeroed-out datum,
+/// which is unsafe unless T is Pod.
+#[inline]
+pub unsafe fn init<T>() -> T {
+    intrinsics::init()
+}
+
+/// Create an uninitialized value.
+#[inline]
+pub unsafe fn uninit<T>() -> T {
+    intrinsics::uninit()
+}
+
 #[cfg(test)]
 mod tests {
     use mem::*;
index dcb6d2719d9077792b6fdc3dc66739eeea6ea6ee..d22e91fb83e275c4b194f64d5a0aa1ae524eaf27 100644 (file)
@@ -15,6 +15,7 @@
 #[cfg(not(test))]
 use cmp::Equiv;
 use iter::{range, Iterator};
+use mem;
 use option::{Option, Some, None};
 use unstable::intrinsics;
 use util::swap;
@@ -132,7 +133,7 @@ pub unsafe fn zero_memory<T>(dst: *mut T, count: uint) {
 #[inline]
 pub unsafe fn swap_ptr<T>(x: *mut T, y: *mut T) {
     // Give ourselves some scratch space to work with
-    let mut tmp: T = intrinsics::uninit();
+    let mut tmp: T = mem::uninit();
     let t: *mut T = &mut tmp;
 
     // Perform the swap
@@ -160,7 +161,7 @@ pub unsafe fn replace_ptr<T>(dest: *mut T, mut src: T) -> T {
  */
 #[inline(always)]
 pub unsafe fn read_ptr<T>(src: *T) -> T {
-    let mut tmp: T = intrinsics::uninit();
+    let mut tmp: T = mem::uninit();
     copy_nonoverlapping_memory(&mut tmp, src, 1);
     tmp
 }
index b762c1173f56b32d4bfe034097a2b768e6bfc7d6..b443182c157a343a8bb11ba39bba31ad7da2d28d 100644 (file)
@@ -205,17 +205,17 @@ mod imp {
     use cmp;
     use libc::consts::os::posix01::{PTHREAD_CREATE_JOINABLE, PTHREAD_STACK_MIN};
     use libc;
+    use mem;
     use os;
     use ptr;
-    use unstable::intrinsics;
     use unstable::stack::RED_ZONE;
 
     pub type rust_thread = libc::pthread_t;
     pub type rust_thread_return = *u8;
 
     pub unsafe fn create(stack: uint, p: ~proc()) -> rust_thread {
-        let mut native: libc::pthread_t = intrinsics::uninit();
-        let mut attr: libc::pthread_attr_t = intrinsics::uninit();
+        let mut native: libc::pthread_t = mem::uninit();
+        let mut attr: libc::pthread_attr_t = mem::uninit();
         assert_eq!(pthread_attr_init(&mut attr), 0);
         assert_eq!(pthread_attr_setdetachstate(&mut attr,
                                                PTHREAD_CREATE_JOINABLE), 0);
index f1c3d7a7a911d7048130192fb61686614f54c8c2..624a5aa72de7b8fac65b0f359ad13103032706f1 100644 (file)
@@ -16,7 +16,7 @@
 use mem;
 use uint;
 use util::replace;
-use unstable::intrinsics::init;
+use mem::init;
 use vec;
 use ptr::RawPtr;
 use vec::{ImmutableVector, Items, MutableVector, MutItems, OwnedVector};
index 7ca28711504c9a56df31fc53961fbbefd797563b..8f313ed661d36e4efe0ac691f36ba7f0a36318f9 100644 (file)
@@ -288,8 +288,7 @@ fn visit_leave_fn(&mut self, purity: uint, proto: uint,
     /// Create a value initialized to zero.
     ///
     /// `init` is unsafe because it returns a zeroed-out datum,
-    /// which is unsafe unless T is POD. We don't have a POD
-    /// kind yet. (See #4074).
+    /// which is unsafe unless T is Pod.
     pub fn init<T>() -> T;
 
     /// Create an uninitialized value.
index e9df17ef514fa26fb7e78200fb14814c5b51a9cf..3122e925e82d9f5d6fdfdcfc6967d451cee6be05 100644 (file)
@@ -92,7 +92,7 @@ mod imp {
     use libc;
     use self::os::{PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER,
                    pthread_mutex_t, pthread_cond_t};
-    use unstable::intrinsics;
+    use mem;
 
     type pthread_mutexattr_t = libc::c_void;
     type pthread_condattr_t = libc::c_void;
@@ -208,8 +208,8 @@ pub struct Mutex {
     impl Mutex {
         pub unsafe fn new() -> Mutex {
             let mut m = Mutex {
-                lock: intrinsics::init(),
-                cond: intrinsics::init(),
+                lock: mem::init(),
+                cond: mem::init(),
             };
 
             pthread_mutex_init(&mut m.lock, 0 as *libc::c_void);
index 715a10b9112f975b3fe1f632cb8a63fb81cb22bc..05c5d7e1588169f9317df831b66f98c89003270e 100644 (file)
@@ -11,8 +11,8 @@
 //! Miscellaneous helpers for common patterns
 
 use cast;
+use mem;
 use ptr;
-use unstable::intrinsics;
 
 /// The identity function.
 #[inline]
@@ -26,7 +26,7 @@ pub fn id<T>(x: T) -> T { x }
 pub fn swap<T>(x: &mut T, y: &mut T) {
     unsafe {
         // Give ourselves some scratch space to work with
-        let mut tmp: T = intrinsics::uninit();
+        let mut tmp: T = mem::uninit();
         let t: *mut T = &mut tmp;
 
         // Perform the swap, `&mut` pointers never alias
index be8daf34df70678aa9122938e50336be662a3e65..5140a2984f224846c129b02a633d3d8d9440ea6a 100644 (file)
@@ -16,8 +16,8 @@
 use std::i32::range;
 use std::libc::{STDIN_FILENO, c_int, fdopen, fgets, fileno, fopen, fstat};
 use std::libc::{stat, strlen};
+use std::mem::init;
 use std::ptr::null;
-use std::unstable::intrinsics::init;
 use std::vec::{reverse};
 
 static LINE_LEN: uint = 80;
index d369546317eac41d5edd7bfcf89a95a4c6d7e142..3c389f49aa14af6c5456d3ff1aad18262de92415 100644 (file)
@@ -10,5 +10,5 @@
 
 enum v {}
 pub fn main() {
-    let y: v = unsafe { ::std::unstable::intrinsics::uninit() };
+    let y: v = unsafe { ::std::mem::uninit() };
 }
index 4a5c859d4a722fc8ed7d51ec3eb7b1883aeb4250..df24a399f4a737df79794785856d6504c5dbb9fa 100644 (file)
 // Test the uninit() construct returning various empty types.
 
 use std::vec;
-use std::unstable::intrinsics;
+use std::mem;
 
 #[deriving(Clone)]
 struct Foo;
 
 pub fn main() {
     unsafe {
-        let _x: Foo = intrinsics::uninit();
-        let _x: [Foo, ..2] = intrinsics::uninit();
+        let _x: Foo = mem::uninit();
+        let _x: [Foo, ..2] = mem::uninit();
     }
 }