Created
May 25, 2013 11:59
-
-
Save ben0x539/5648858 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
trait Allocator { | |
unsafe fn store<T>(obj: T) -> *T; | |
unsafe fn store_mut<T>(obj: T) -> *mut T; | |
unsafe fn release<T>(ptr: *T); | |
} | |
struct Malloc; | |
struct OwnedPtr; | |
impl Allocator for Malloc { | |
unsafe fn store<T>(obj: T) -> *T { | |
Allocator::store_mut::<Malloc, T>(obj) as *T | |
} | |
unsafe fn store_mut<T>(obj: T) -> *mut T { | |
let ptr = libc::malloc(sys::size_of::<T>() as libc::size_t) as *mut T; | |
unstable::intrinsics::move_val_init(&mut *ptr, obj); | |
ptr | |
} | |
unsafe fn release<T>(ptr: *T) { | |
let ptr_ = ptr; | |
discard(*ptr); | |
libc::free(ptr_ as *libc::c_void); | |
} | |
} | |
impl Allocator for OwnedPtr { | |
unsafe fn store<T>(obj: T) -> *T { | |
Allocator::store_mut::<OwnedPtr, T>(obj) as *T | |
} | |
unsafe fn store_mut<T>(obj: T) -> *mut T { | |
let box = ~obj; | |
let ptr = ptr::to_unsafe_ptr(box); | |
cast::forget(box); | |
ptr as *mut T | |
} | |
unsafe fn release<T>(ptr: *T) { | |
let dummy = 0 as *std::managed::raw::BoxRepr; | |
let data_ptr = ptr::to_unsafe_ptr(&(*dummy).data); | |
let offset = (data_ptr as uint) - (dummy as uint); | |
let box = cast::transmute::<*T, ~T>(((ptr as uint) - offset) as *T); | |
discard(box); // no-op, really | |
} | |
} | |
#[inline(always)] | |
fn discard<T>(_: T) {} | |
struct Box<T, A> { | |
priv ptr: *mut T | |
} | |
impl<T, A: Allocator> Box<T, A> { | |
fn new(obj: T) -> Box<T, A> { | |
unsafe { | |
Box::claim(Allocator::store_mut::<A, T>(obj)) | |
} | |
} | |
unsafe fn claim(ptr: *mut T) -> Box<T, A> { | |
if ptr.is_null() { fail!("claim() received NULL"); } | |
Box { ptr: ptr } | |
} | |
unsafe fn disown(self) -> *mut T { | |
let p = self.ptr; | |
cast::forget(self); | |
p | |
} | |
fn borrow<'lt>(&'lt self) -> &'lt T { | |
unsafe { &*self.ptr } | |
} | |
} | |
impl<T: Clone, A: Allocator> Clone for Box<T, A> { | |
fn clone(&self) -> Box<T, A> { | |
let ptr = self.ptr; | |
unsafe { Box::new((*ptr).clone()) } | |
} | |
} | |
#[unsafe_destructor] | |
impl<T, A: Allocator> Drop for Box<T, A> { | |
fn finalize(&self) { | |
unsafe { | |
Allocator::release::<A, T>(self.ptr as *T); | |
} | |
} | |
} | |
// trait MyClone { | |
// fn my_clone(&self) -> Self; | |
// } | |
// | |
// impl<T: Clone> MyClone for [T, .. 3] { | |
// fn my_clone(&self) -> [T, .. 3] { | |
// [self[0].clone(), self[1].clone(), self[2].clone()] | |
// } | |
// } | |
#[deriving(Clone)] | |
struct S(int); | |
impl Drop for S { | |
fn finalize(&self) { | |
io::println(fmt!("~S(%?)", **self)); | |
} | |
} | |
fn main() { | |
let s = Box::new::<S, OwnedPtr>(S(42)); | |
let f = |n| Box::new::<S, OwnedPtr>(S(n)); | |
f(42); | |
//let a = Box::new::<[Box<S, OwnedPtr>,..3], OwnedPtr>([f(1), f(2), f(3)]); | |
//let b = vec::from_fn(a.borrow().len(), |i| a.borrow()[i].clone()); | |
//let b = a.borrow().my_clone(); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ RUST_LOG=rustc=1,::rt::backtrace rustc box.rs | |
box.rs:110:8: 110:9 warning: unused variable: `s` [-W unused-variable (default)] | |
box.rs:110 let s = Box::new::<S, OwnedPtr>(S(42)); | |
^ | |
rust: task failed at 'option::get none', /home/ben/code/repos/rust/src/libstd/option.rs:345 | |
/usr/local/bin/../lib/librustrt.so(_ZN9rust_task13begin_failureEPKcS1_m+0x4b)[0x7faf27ae80cb] | |
/usr/local/bin/../lib/librustrt.so(+0x2cd29)[0x7faf27af8d29] | |
/usr/local/bin/../lib/librustrt.so(upcall_fail+0x1a8)[0x7faf27aea138] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(_ZN3sys13begin_unwind_17_bdd0fd58907ecc496_07preE+0x1ad)[0x7faf2b3e8c5d] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(+0x138042)[0x7faf2b3e9042] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(+0x70e14)[0x7faf2b321e14] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6common11find_vtable17_87436e7e7f303b7a6_07preE+0x7e5)[0x7faf298f1b45] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6common25resolve_vtable_in_fn_ctxt16_7e58e7316483ffe6_07preE+0xf6)[0x7faf298f0dc6] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x282cb9)[0x7faf298f0cb9] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x2822a3)[0x7faf298f02a3] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6common26resolve_vtables_in_fn_ctxt17_7721781ff5b8d54a6_07preE+0x95)[0x7faf298f0135] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4meth26trans_static_method_callee17_c7eec0b7cc7a8f646_07preE+0xe9a)[0x7faf2984f16a] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6callee5trans15_1e4595c3a7ae856_07preE+0x64f)[0x7faf2984bfef] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x1e79c8)[0x7faf298559c8] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x20057f)[0x7faf2986e57f] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base10with_scope17_def75c5e536767206_07preE+0x59d)[0x7faf2981a63d] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6callee16trans_call_inner16_3fd0747da8aa4656_07preE+0x13e)[0x7faf298558ae] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6callee10trans_call17_627ff4edb2e6ed8e6_07preE+0x39a)[0x7faf2985547a] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x213092)[0x7faf29881092] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4expr10trans_into17_c24297bea2e0f0d46_07preE+0x9b3)[0x7faf298096b3] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base10trans_stmt17_9cdade22b2bb5b226_07preE+0x5eb)[0x7faf298084cb] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans11controlflow11trans_block16_138e7b5d176f5ae6_07preE+0x1a4)[0x7faf29805bd4] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x21e0ff)[0x7faf2988c0ff] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base10with_scope17_def75c5e536767206_07preE+0x59d)[0x7faf2981a63d] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x214432)[0x7faf29882432] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4expr10trans_into17_c24297bea2e0f0d46_07preE+0x9b3)[0x7faf298096b3] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans11controlflow11trans_block16_138e7b5d176f5ae6_07preE+0x340)[0x7faf29805d70] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base13trans_closure17_a0ceb68d9ba6a91c6_07preE+0xa41)[0x7faf29935191] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base8trans_fn17_651ac1d618c892946_07preE+0x627)[0x7faf297bd2f7] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4meth12trans_method17_13902815e83669526_07preE+0x45e)[0x7faf297fd38e] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans12monomorphize14monomorphic_fn16_7581ab245c8a05a6_07preE+0x5a35)[0x7faf297c3295] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base12get_res_dtor17_303897d786d3f1766_07preE+0x478)[0x7faf298310a8] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x1c23fd)[0x7faf298303fd] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base9with_cond17_1c9daaf717b9369b6_07preE+0x170)[0x7faf29819aa0] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue17trans_struct_drop17_c6343780c9ac30466_07preE+0x1c1)[0x7faf2982d5d1] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue14make_drop_glue17_c92714b79a309b556_07preE+0x39c)[0x7faf2982830c] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue23make_generic_glue_inner17_ab301065edc2f1376_07preE+0x2af)[0x7faf298375ff] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue17make_generic_glue16_fa4d9a15e741d8f6_07preE+0x266)[0x7faf29827406] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue23lazily_emit_tydesc_glue17_5e16ceb9a15cf45b6_07preE+0x607)[0x7faf298249e7] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue21call_tydesc_glue_full16_28eb40fa8cdc6226_07preE+0x14a)[0x7faf2982981a] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue16call_tydesc_glue17_d2d96dcf672987516_07preE+0x173)[0x7faf29821ee3] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue7drop_ty16_139473df770e1de6_07preE+0x117)[0x7faf29822197] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4glue12drop_ty_root17_c63e6d24d7fe257f6_07preE+0x12f)[0x7faf298223ff] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x27699e)[0x7faf298e499e] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base21trans_block_cleanups_17_3d809fc6a5a365256_07preE+0x1f1)[0x7faf2992c781] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base17cleanup_and_leave17_e86fa65c384ace3a6_07preE+0x95d)[0x7faf2981c97d] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base15get_landing_pad15_279594e975a8706_07preE+0x419)[0x7faf29926399] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base6invoke16_92e1734b8de51196_07preE+0x884)[0x7faf298705f4] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x200be3)[0x7faf2986ebe3] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base10with_scope17_def75c5e536767206_07preE+0x59d)[0x7faf2981a63d] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6callee16trans_call_inner16_3fd0747da8aa4656_07preE+0x13e)[0x7faf298558ae] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans6callee10trans_call17_627ff4edb2e6ed8e6_07preE+0x39a)[0x7faf2985547a] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0x213092)[0x7faf29881092] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4expr10trans_into17_c24297bea2e0f0d46_07preE+0x9b3)[0x7faf298096b3] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base10trans_stmt17_9cdade22b2bb5b226_07preE+0x5eb)[0x7faf298084cb] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans11controlflow11trans_block16_138e7b5d176f5ae6_07preE+0x1a4)[0x7faf29805bd4] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base13trans_closure17_a0ceb68d9ba6a91c6_07preE+0xa41)[0x7faf29935191] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base8trans_fn17_651ac1d618c892946_07preE+0x627)[0x7faf297bd2f7] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base10trans_item16_31c1537893f76e96_07preE+0xfaf)[0x7faf297b37ef] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base9trans_mod15_984673b8597f446_07preE+0xb6)[0x7faf2993b8e6] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6middle5trans4base11trans_crate16_4a63af10ff13e3e6_07preE+0x34fe)[0x7faf29959e7e] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6driver6driver12compile_rest16_f5f52a63f51c5236_07preE+0x3ba9)[0x7faf2a053e59] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6driver6driver12compile_upto16_9dc6b4c145ad2db6_07preE+0x192)[0x7faf2a057932] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN6driver6driver13compile_input17_6132a74bb455d3616_07preE+0x107)[0x7faf2a057db7] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN12run_compiler15_91c8aa32e11acf6_07preE+0x29ba)[0x7faf2a082d3a] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0xa328fe)[0x7faf2a0a08fe] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0xa2faef)[0x7faf2a09daef] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0xa2579b)[0x7faf2a09379b] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0xa32bd8)[0x7faf2a0a0bd8] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(+0xfffe9)[0x7faf2b3b0fe9] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(+0x194fac)[0x7faf2b445fac] | |
/usr/local/bin/../lib/librustrt.so(_Z18task_start_wrapperP10spawn_args+0x24)[0x7faf27ae8a74] | |
error: internal compiler error: unexpected failure | |
note: the compiler hit an unexpected failure path. this is a bug | |
note: try running with RUST_LOG=rustc=1,::rt::backtrace to get further details and report the results to github.com/mozilla/rust/issues | |
rust: task failed at 'explicit failure', /home/ben/code/repos/rust/src/librustc/rustc.rc:363 | |
/usr/local/bin/../lib/librustrt.so(_ZN9rust_task13begin_failureEPKcS1_m+0x4b)[0x7faf27ae80cb] | |
/usr/local/bin/../lib/librustrt.so(+0x2cd29)[0x7faf27af8d29] | |
/usr/local/bin/../lib/librustrt.so(upcall_fail+0x1a8)[0x7faf27aea138] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(_ZN3sys13begin_unwind_17_bdd0fd58907ecc496_07preE+0x1ad)[0x7faf2b3e8c5d] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(+0x138042)[0x7faf2b3e9042] | |
/usr/local/bin/../lib/libstd-c3ca5d77d81b46c1-0.7-pre.so(+0x70e14)[0x7faf2b321e14] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN7monitor17_c89b7b218697b2a46_07preE+0x5005)[0x7faf2a088f45] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(+0xa32bd8)[0x7faf2a0a0bd8] | |
/usr/local/bin/../lib/librustc-e786add3fc752ef5-0.7-pre.so(_ZN4main17_97e178e84d833ffa6_07preE+0x69)[0x7faf2a0a0839] | |
rustc(_rust_main+0x2e)[0x400cfe] | |
/usr/local/bin/../lib/librustrt.so(_Z18task_start_wrapperP10spawn_args+0x24)[0x7faf27ae8a74] | |
rust: domain main @0x1633410 root task failed |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment