about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-03-21 15:59:57 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-03-21 15:59:57 -0700
commitb0f6dad5e3a3fcb2a19077e5beb3833473bec5e7 (patch)
tree0125f618604ca16f9838179c0509df7cf7e161cd
parentc8ab0c1b3b2b6af4e9efa96773926bfa2f58f016 (diff)
downloadrust-b0f6dad5e3a3fcb2a19077e5beb3833473bec5e7.tar.gz
rust-b0f6dad5e3a3fcb2a19077e5beb3833473bec5e7.zip
rustc: Add a function to record region bindings
-rw-r--r--src/rustc/middle/ty.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs
index 74323100459..8a7df2c5693 100644
--- a/src/rustc/middle/ty.rs
+++ b/src/rustc/middle/ty.rs
@@ -1690,6 +1690,34 @@ mod unify {
         ret nxt(mk_var(cx.tcx, key));
     }
 
+    fn record_region_binding<T:copy>(
+        cx: @uctxt, key: uint,
+        r: region, base_mt: mt, variance: variance,
+        nxt: fn(t) -> ures<T>) -> ures<T> {
+
+        let rb = alt cx.st {
+            in_region_bindings(_, rb) { rb }
+            in_bindings(_) | precise { fail; }
+        };
+
+        ufind::grow(rb.sets, key + 1u);
+        let root = ufind::find(rb.sets, key);
+        let mut result_region = r;
+        alt smallintmap::find(rb.regions, root) {
+          some(old_region) {
+            alt unify_regions(cx, old_region, r, variance, {|v| ok(v)}) {
+              ok(unified_region) { result_region = unified_region; }
+              err(e) { ret err(e); }
+            }
+          }
+          none {/* fall through */ }
+        }
+        smallintmap::insert(rb.regions, root, result_region);
+
+        // FIXME: This should be re_var instead.
+        ret nxt(mk_rptr(cx.tcx, re_param(key), base_mt));
+    }
+
     // Simple structural type comparison.
     fn struct_cmp<T:copy>(
         cx: @uctxt, expected: t, actual: t,