diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-03-21 15:59:57 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-03-21 15:59:57 -0700 |
| commit | b0f6dad5e3a3fcb2a19077e5beb3833473bec5e7 (patch) | |
| tree | 0125f618604ca16f9838179c0509df7cf7e161cd | |
| parent | c8ab0c1b3b2b6af4e9efa96773926bfa2f58f016 (diff) | |
| download | rust-b0f6dad5e3a3fcb2a19077e5beb3833473bec5e7.tar.gz rust-b0f6dad5e3a3fcb2a19077e5beb3833473bec5e7.zip | |
rustc: Add a function to record region bindings
| -rw-r--r-- | src/rustc/middle/ty.rs | 28 |
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, |
