@@ -1865,9 +1865,18 @@ mod unify {
1865
1865
ures_err( type_err, t, t) ;
1866
1866
}
1867
1867
1868
- type ctxt = rec ( ufind:: ufind sets,
1869
- hashmap[ int, uint] var_ids ,
1870
- mutable vec[ mutable vec[ t] ] types ,
1868
+ type var_bindings = rec ( ufind:: ufind sets,
1869
+ hashmap[ int, uint] var_ids ,
1870
+ mutable vec[ mutable vec[ t] ] types ) ;
1871
+
1872
+ fn mk_var_bindings ( ) -> var_bindings {
1873
+ let vec[ mutable vec[ t] ] types = [ mutable] ;
1874
+ ret rec( sets=ufind:: make ( ) ,
1875
+ var_ids=common:: new_int_hash[ uint] ( ) ,
1876
+ mutable types=types) ;
1877
+ }
1878
+
1879
+ type ctxt = rec ( var_bindings var_bindings,
1871
1880
unify_handler handler,
1872
1881
ty_ctxt tcx) ;
1873
1882
@@ -2070,12 +2079,12 @@ mod unify {
2070
2079
2071
2080
fn get_or_create_set ( & @ctxt cx , int id) -> uint {
2072
2081
auto set_num;
2073
- alt ( cx. var_ids . find ( id) ) {
2074
- case ( none[ uint] ) {
2075
- set_num = ufind:: make_set ( cx. sets ) ;
2076
- cx . var_ids . insert ( id, set_num) ;
2077
- }
2078
- case ( some[ uint] ( ?n) ) { set_num = n; }
2082
+ alt ( cx. var_bindings . var_ids . find ( id) ) {
2083
+ case ( none[ uint] ) {
2084
+ set_num = ufind:: make_set ( cx. var_bindings . sets ) ;
2085
+ cx . var_bindings . var_ids . insert ( id, set_num) ;
2086
+ }
2087
+ case ( some[ uint] ( ?n) ) { set_num = n; }
2079
2088
}
2080
2089
ret set_num;
2081
2090
}
@@ -2098,17 +2107,18 @@ mod unify {
2098
2107
alt ( struct ( cx. tcx , expected) ) {
2099
2108
case ( ty:: ty_var ( ?expected_id) ) {
2100
2109
auto expected_n = get_or_create_set ( cx, expected_id) ;
2101
- ufind:: union ( cx. sets , expected_n, actual_n) ;
2110
+ ufind:: union ( cx. var_bindings . sets , expected_n,
2111
+ actual_n) ;
2102
2112
}
2103
2113
2104
2114
case ( _) {
2105
2115
// Just bind the type variable to the expected type.
2106
- auto vlen = vec:: len[ vec[ t] ] ( cx. types ) ;
2116
+ auto vlen = vec:: len[ vec[ t] ] ( cx. var_bindings . types ) ;
2107
2117
if ( actual_n < vlen) {
2108
- cx. types . ( actual_n) += [ expected] ;
2118
+ cx. var_bindings . types . ( actual_n) += [ expected] ;
2109
2119
} else {
2110
2120
assert ( actual_n == vlen) ;
2111
- cx. types += [ mutable [ expected] ] ;
2121
+ cx. var_bindings . types += [ mutable [ expected] ] ;
2112
2122
}
2113
2123
}
2114
2124
}
@@ -2472,12 +2482,12 @@ mod unify {
2472
2482
case ( ty:: ty_var ( ?expected_id) ) {
2473
2483
// Add a binding.
2474
2484
auto expected_n = get_or_create_set ( cx, expected_id) ;
2475
- auto vlen = vec:: len[ vec[ t] ] ( cx. types ) ;
2485
+ auto vlen = vec:: len[ vec[ t] ] ( cx. var_bindings . types ) ;
2476
2486
if ( expected_n < vlen) {
2477
- cx. types . ( expected_n) += [ actual] ;
2487
+ cx. var_bindings . types . ( expected_n) += [ actual] ;
2478
2488
} else {
2479
2489
assert ( expected_n == vlen) ;
2480
- cx. types += [ mutable [ actual] ] ;
2490
+ cx. var_bindings . types += [ mutable [ actual] ] ;
2481
2491
}
2482
2492
ret ures_ok( expected) ;
2483
2493
}
@@ -2517,9 +2527,9 @@ mod unify {
2517
2527
fn substituter ( @ctxt cx , vec[ t] types , t typ ) -> t {
2518
2528
alt ( struct ( cx. tcx , typ) ) {
2519
2529
case ( ty_var ( ?id) ) {
2520
- alt ( cx. var_ids . find ( id) ) {
2530
+ alt ( cx. var_bindings . var_ids . find ( id) ) {
2521
2531
case ( some[ uint] ( ?n) ) {
2522
- auto root = ufind:: find ( cx. sets , n) ;
2532
+ auto root = ufind:: find ( cx. var_bindings . sets , n) ;
2523
2533
ret types. ( root) ;
2524
2534
}
2525
2535
case ( none[ uint] ) { ret typ; }
@@ -2538,15 +2548,15 @@ mod unify {
2538
2548
let vec[ mutable vec[ t] ] set_types = [ mutable throwaway] ;
2539
2549
vec:: pop[ vec[ t] ] ( set_types) ; // FIXME: botch
2540
2550
2541
- for ( ufind:: node node in cx. sets. nodes) {
2551
+ for ( ufind:: node node in cx. var_bindings . sets. nodes) {
2542
2552
let vec[ t] v = [ ] ;
2543
2553
set_types += [ mutable v] ;
2544
2554
}
2545
2555
2546
2556
auto i = 0 u;
2547
2557
while ( i < vec:: len[ vec[ t] ] ( set_types) ) {
2548
- auto root = ufind:: find ( cx. sets , i) ;
2549
- set_types. ( root) += cx. types . ( i) ;
2558
+ auto root = ufind:: find ( cx. var_bindings . sets , i) ;
2559
+ set_types. ( root) += cx. var_bindings . types . ( i) ;
2550
2560
i += 1 u;
2551
2561
}
2552
2562
@@ -2567,13 +2577,7 @@ mod unify {
2567
2577
& t actual ,
2568
2578
& unify_handler handler,
2569
2579
& ty_ctxt tcx) -> result {
2570
- let vec[ t] throwaway = [ ] ;
2571
- let vec[ mutable vec[ t] ] types = [ mutable throwaway] ;
2572
- vec:: pop[ vec[ t] ] ( types) ; // FIXME: botch
2573
-
2574
- auto cx = @rec ( sets=ufind:: make ( ) ,
2575
- var_ids=common:: new_int_hash[ uint] ( ) ,
2576
- mutable types=types,
2580
+ auto cx = @rec ( var_bindings=mk_var_bindings ( ) ,
2577
2581
handler=handler,
2578
2582
tcx=tcx) ;
2579
2583
@@ -2582,7 +2586,7 @@ mod unify {
2582
2586
case ( ures_ok ( ?typ) ) {
2583
2587
// Fast path: if there are no local variables, don't perform
2584
2588
// substitutions.
2585
- if ( vec:: len ( cx. sets . nodes ) == 0 u) {
2589
+ if ( vec:: len ( cx. var_bindings . sets . nodes ) == 0 u) {
2586
2590
ret ures_ok ( typ) ;
2587
2591
}
2588
2592
0 commit comments