Skip to content

Instantly share code, notes, and snippets.

@ben0x539
Created May 25, 2013 11:59
Show Gist options
  • Save ben0x539/5648858 to your computer and use it in GitHub Desktop.
Save ben0x539/5648858 to your computer and use it in GitHub Desktop.
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();
}
$ 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