From 8f2d71ac009e1f93c14266ecebb1c105a0a907e3 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 4 May 2013 21:53:43 -0400 Subject: [PATCH] small fix to the tutorial-ffi destructor example The previous example was erroneously attempting to destroy uninitialized memory, which was often zeroed (masking the bug). --- doc/tutorial-ffi.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/doc/tutorial-ffi.md b/doc/tutorial-ffi.md index 127f8158923..b806df5dd20 100644 --- a/doc/tutorial-ffi.md +++ b/doc/tutorial-ffi.md @@ -150,11 +150,7 @@ wrapping `malloc` and `free`: ~~~~ use core::libc::{c_void, size_t, malloc, free}; - -#[abi = "rust-intrinsic"] -extern "rust-intrinsic" mod rusti { - fn init() -> T; -} +use core::unstable::intrinsics; // a wrapper around the handle returned by the foreign code pub struct Unique { @@ -166,7 +162,8 @@ pub impl<'self, T: Owned> Unique { unsafe { let ptr = malloc(core::sys::size_of::() as size_t) as *mut T; assert!(!ptr::is_null(ptr)); - *ptr = value; + // `*ptr` is uninitialized, and `*ptr = value` would attempt to destroy it + intrinsics::move_val_init(&mut *ptr, value); Unique{ptr: ptr} } } @@ -186,7 +183,7 @@ pub impl<'self, T: Owned> Unique { impl Drop for Unique { fn finalize(&self) { unsafe { - let mut x = rusti::init(); // dummy value to swap in + let mut x = intrinsics::init(); // dummy value to swap in x <-> *self.ptr; // moving the object out is needed to call the destructor free(self.ptr as *c_void) }