make poison-on-free work, disable copying if borrowck is enabled

This commit is contained in:
Niko Matsakis 2012-05-14 08:22:51 -07:00
parent 17d6b09d14
commit be48cd87dc
5 changed files with 24 additions and 6 deletions

View File

@ -1,8 +1,7 @@
#include "boxed_region.h"
#include "rust_globals.h"
#include "rust_task.h"
#include "rust_env.h"
// #define DUMP_BOXED_REGION
@ -52,8 +51,15 @@ void boxed_region::free(rust_opaque_box *box) {
if (box->prev) box->prev->next = box->next;
if (box->next) box->next->prev = box->prev;
if (live_allocs == box) live_allocs = box->next;
if (env->poison_on_free) {
memset(box_body(box), 0xab, box->td->size);
return;
}
box->prev = NULL;
box->next = NULL;
box->td = NULL;
backing_region->free(box);
}

View File

@ -6,6 +6,7 @@
struct type_desc;
class memory_region;
struct rust_opaque_box;
struct rust_env;
/* Tracks the data allocated by a particular task in the '@' region.
* Currently still relies on the standard malloc as a backing allocator, but
@ -13,6 +14,7 @@ struct rust_opaque_box;
* a type descr which describes the payload (what follows the header). */
class boxed_region {
private:
rust_env *env;
memory_region *backing_region;
rust_opaque_box *live_allocs;
@ -24,8 +26,9 @@ private:
}
public:
boxed_region(memory_region *br)
: backing_region(br)
boxed_region(rust_env *e, memory_region *br)
: env(e)
, backing_region(br)
, live_allocs(NULL)
{}

View File

@ -27,7 +27,7 @@ rust_task::rust_task(rust_sched_loop *sched_loop, rust_task_state state,
list_index(-1),
rendezvous_ptr(0),
local_region(&sched_loop->local_region),
boxed(&local_region),
boxed(sched_loop->kernel->env, &local_region),
unwinding(false),
propagate_failure(true),
cc_counter(0),

View File

@ -48,7 +48,10 @@ type options =
no_trans: bool,
no_asm_comments: bool,
debug_rustc: bool,
borrowck: uint}; // 0=off,1=warn,2=err
// temporary hack: 0=off,1=warn,2=err --> if 2, alias is disabled
borrowck: uint,
};
type crate_metadata = {name: str, data: [u8]};

View File

@ -159,6 +159,12 @@ fn visit_block(cx: @ctx, b: ast::blk, sc: scope, v: vt<scope>) {
}
fn cant_copy(cx: ctx, b: binding) -> bool {
if cx.tcx.sess.opts.borrowck == 2u {
// borrowck is enabled. disable alias analysis.
ret false;
}
alt b.copied {
not_allowed { ret true; }
copied { ret false; }