about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-04-22 10:37:51 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-04-22 10:37:51 -0700
commit9edaa7dba3181ae68c60204e1e47a2d20e86236e (patch)
treea56f52dbda71faa2833e6b198a128f2ac79c57e6
parent9ab9bd9cc2dc97c2acc26849dd24b8989b76ea32 (diff)
downloadrust-9edaa7dba3181ae68c60204e1e47a2d20e86236e.tar.gz
rust-9edaa7dba3181ae68c60204e1e47a2d20e86236e.zip
rustc: Add a fast path if there are no type substitutions to be made
-rw-r--r--src/comp/middle/ty.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs
index 59de7768612..96479c4096d 100644
--- a/src/comp/middle/ty.rs
+++ b/src/comp/middle/ty.rs
@@ -2362,9 +2362,15 @@ mod Unify {
 
         auto ures = unify_step(cx, expected, actual);
         alt (ures) {
-        case (ures_ok(?t)) {
+        case (ures_ok(?typ)) {
+            // Fast path: if there are no local variables, don't perform
+            // substitutions.
+            if (_vec.len[mutable UFind.node](cx.sets.nodes) == 0u) {
+                ret ures_ok(typ);
+            }
+
             auto set_types = unify_sets(cx);
-            auto t2 = substitute(cx, set_types, t);
+            auto t2 = substitute(cx, set_types, typ);
             ret ures_ok(t2);
         }
         case (_) { ret ures; }