From 87294c23baacaee17a13d2f7316fffc76239cff5 Mon Sep 17 00:00:00 2001
From: blake2-ppc <blake2-ppc>
Date: Sat, 5 Oct 2013 01:10:27 +0200
Subject: [PATCH] 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.
---
 src/librustc/middle/trans/base.rs | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs
index dea86286279..2c0497283c1 100644
--- a/src/librustc/middle/trans/base.rs
+++ b/src/librustc/middle/trans/base.rs
@@ -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: () }