Avoid cloning the stack on every push_ctxt call in trans

Rewrite the use of TLS variable for `push_ctxt` so that it uses a ~[]
instead of a @~[]. Before it cloned the whole vector on each push and
pop, which is unnecessary.
This commit is contained in:
blake2-ppc 2013-10-05 01:10:27 +02:00
parent 9344e2a866
commit 87294c23ba

View File

@ -92,17 +92,19 @@ use syntax::visit::Visitor;
pub use middle::trans::context::task_llcx;
local_data_key!(task_local_insn_key: @~[&'static str])
local_data_key!(task_local_insn_key: ~[&'static str])
pub fn with_insn_ctxt(blk: &fn(&[&'static str])) {
let opt = local_data::get(task_local_insn_key, |k| k.map_move(|k| *k));
if opt.is_some() {
blk(*opt.unwrap());
do local_data::get(task_local_insn_key) |c| {
match c {
Some(ctx) => blk(*ctx),
None => ()
}
}
}
pub fn init_insn_ctxt() {
local_data::set(task_local_insn_key, @~[]);
local_data::set(task_local_insn_key, ~[]);
}
pub struct _InsnCtxt { _x: () }
@ -111,10 +113,9 @@ pub struct _InsnCtxt { _x: () }
impl Drop for _InsnCtxt {
fn drop(&mut self) {
do local_data::modify(task_local_insn_key) |c| {
do c.map_move |ctx| {
let mut ctx = (*ctx).clone();
do c.map_move |mut ctx| {
ctx.pop();
@ctx
ctx
}
}
}
@ -123,10 +124,9 @@ impl Drop for _InsnCtxt {
pub fn push_ctxt(s: &'static str) -> _InsnCtxt {
debug2!("new InsnCtxt: {}", s);
do local_data::modify(task_local_insn_key) |c| {
do c.map_move |ctx| {
let mut ctx = (*ctx).clone();
do c.map_move |mut ctx| {
ctx.push(s);
@ctx
ctx
}
}
_InsnCtxt { _x: () }