about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Woerister <michaelwoerister@posteo.net>2016-10-04 16:15:37 -0400
committerMichael Woerister <michaelwoerister@posteo.net>2016-10-04 16:15:37 -0400
commit2d34ad04ef6a2a5b69da24ed6b7b2c9f38e4678f (patch)
tree129d2dd2144a76acce38d575595d97441c330d4f
parent457019967bd2be3ce20b71e6d0beb3897b0a10eb (diff)
trans: Make sure that each FnOnce shim is only translated once.
-rw-r--r--src/librustc_trans/closure.rs6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/librustc_trans/closure.rs b/src/librustc_trans/closure.rs
index d506b47407d..c87497384ad 100644
--- a/src/librustc_trans/closure.rs
+++ b/src/librustc_trans/closure.rs
@@ -217,6 +217,10 @@ fn trans_fn_once_adapter_shim<'a, 'tcx>(
     llreffn: ValueRef)
     -> ValueRef
 {
+    if let Some(&llfn) = ccx.instances().borrow().get(&method_instance) {
+        return llfn;
+    }
+
     debug!("trans_fn_once_adapter_shim(closure_def_id={:?}, substs={:?}, llreffn={:?})",
            closure_def_id, substs, Value(llreffn));
 
@@ -312,5 +316,7 @@ fn trans_fn_once_adapter_shim<'a, 'tcx>(
 
     fcx.finish(bcx, DebugLoc::None);
 
+    ccx.instances().borrow_mut().insert(method_instance, lloncefn);
+
     lloncefn
 }