Skip to content

Commit 7631428

Browse files
committed
repair the build---also, make try/commit work over both ty/region vars
1 parent 8462c6c commit 7631428

File tree

1 file changed

+34
-17
lines changed

1 file changed

+34
-17
lines changed

src/rustc/middle/infer.rs

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ fn new_infer_ctxt(tcx: ty::ctxt) -> infer_ctxt {
4747

4848
fn mk_subty(cx: infer_ctxt, a: ty::t, b: ty::t) -> ures {
4949
#debug[">> mk_subty(%s <: %s)", cx.ty_to_str(a), cx.ty_to_str(b)];
50-
cx.commit(cx.vb) {||
50+
cx.commit {||
5151
cx.tys(a, b)
5252
}
5353
}
5454

5555
fn mk_eqty(cx: infer_ctxt, a: ty::t, b: ty::t) -> ures {
5656
#debug["> mk_eqty(%s <: %s)", cx.ty_to_str(a), cx.ty_to_str(b)];
57-
cx.commit(cx.vb) {||
57+
cx.commit {||
5858
mk_subty(cx, a, b).then {||
5959
mk_subty(cx, b, a)
6060
}
@@ -64,7 +64,7 @@ fn mk_eqty(cx: infer_ctxt, a: ty::t, b: ty::t) -> ures {
6464
fn compare_tys(tcx: ty::ctxt, a: ty::t, b: ty::t) -> ures {
6565
let infcx = new_infer_ctxt(tcx);
6666
#debug["> compare_tys(%s == %s)", infcx.ty_to_str(a), infcx.ty_to_str(b)];
67-
infcx.commit(infcx.vb) {||
67+
infcx.commit {||
6868
mk_subty(infcx, a, b).then {||
6969
mk_subty(infcx, b, a)
7070
}
@@ -158,30 +158,47 @@ impl unify_methods for infer_ctxt {
158158
}
159159
}
160160

161-
fn commit<T:copy,E:copy,U:copy>(vb: vals_and_bindings<U>,
162-
f: fn() -> result<T,E>) -> result<T,E> {
161+
fn commit<T:copy,E:copy>(f: fn() -> result<T,E>) -> result<T,E> {
162+
163+
assert self.vb.bindings.len() == 0u;
164+
assert self.rb.bindings.len() == 0u;
165+
166+
let r = self.try(f);
167+
168+
// TODO---could use a vec::clear() that ran destructors but kept
169+
// the vec at its currently allocated length
170+
self.vb.bindings = [];
171+
self.rb.bindings = [];
163172

164-
assert vb.bindings.len() == 0u;
165-
let r = self.try(vb, f);
166-
vec::clear(vb.bindings);
167173
ret r;
168174
}
169175

170-
fn try<T:copy,E:copy,U:copy>(vb: vals_and_bindings<U>,
171-
f: fn() -> result<T,E>) -> result<T,E> {
176+
fn try<T:copy,E:copy>(f: fn() -> result<T,E>) -> result<T,E> {
172177

173-
let l = vb.bindings.len();
174-
#debug["try(l=%u)", l];
178+
fn rollback_to<T:copy>(vb: vals_and_bindings<T>, len: uint) {
179+
while vb.bindings.len() != len {
180+
let (vid, old_v) = vec::pop(vb.bindings);
181+
vb.vals.insert(vid, old_v);
182+
}
183+
}
184+
185+
let vbl = self.vb.bindings.len();
186+
let rbl = self.rb.bindings.len();
187+
#debug["try(vbl=%u, rbl=%u)", vbl, rbl];
175188
let r = f();
176189
alt r {
177190
result::ok(_) { #debug["try--ok"]; }
178-
result::err(_) { #debug["try--rollback"]; }
191+
result::err(_) {
192+
#debug["try--rollback"];
193+
rollback_to(self.vb, vbl);
194+
rollback_to(self.rb, rbl);
195+
}
179196
}
180197
ret r;
181198
}
182199

183200
fn get<T:copy>(vb: vals_and_bindings<T>, vid: uint)
184-
-> {root: uint, bounds:bounds<T>} {
201+
-> {root: uint, bounds:bounds<T>} {
185202

186203
alt vb.vals.find(vid) {
187204
none {
@@ -228,7 +245,7 @@ impl unify_methods for infer_ctxt {
228245
ok({lb: b, ub: b})
229246
}
230247
(some(t_a), some(t_b)) {
231-
let r1 = self.try(self.vb) {||
248+
let r1 = self.try {||
232249
self.tys(t_a, t_b).then {||
233250
ok({lb: a, ub: b})
234251
}
@@ -294,8 +311,8 @@ impl unify_methods for infer_ctxt {
294311
let {root: b_id, bounds: b_bounds} = self.get(self.vb, b_id);
295312

296313
#debug["vars(<T%u>=%s <: <T%u>=%s)",
297-
a_id, self.bounds_to_str(a_bounds),
298-
b_id, self.bounds_to_str(b_bounds)];
314+
a_id, self.ty_bounds_to_str(a_bounds),
315+
b_id, self.ty_bounds_to_str(b_bounds)];
299316

300317
if a_id == b_id { ret self.uok(); }
301318

0 commit comments

Comments
 (0)