@@ -1869,14 +1869,14 @@ mod unify {
1869
1869
hashmap[ int, uint] var_ids ,
1870
1870
mutable vec[ mutable vec[ t] ] types ) ;
1871
1871
1872
- fn mk_var_bindings ( ) -> var_bindings {
1872
+ fn mk_var_bindings ( ) -> @ var_bindings {
1873
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) ;
1874
+ ret @ rec( sets=ufind:: make ( ) ,
1875
+ var_ids=common:: new_int_hash[ uint] ( ) ,
1876
+ mutable types=types) ;
1877
1877
}
1878
1878
1879
- type ctxt = rec ( var_bindings var_bindings,
1879
+ type ctxt = rec ( @ var_bindings var_bindings ,
1880
1880
unify_handler handler,
1881
1881
ty_ctxt tcx) ;
1882
1882
@@ -2519,17 +2519,19 @@ mod unify {
2519
2519
}
2520
2520
2521
2521
// Performs type binding substitution.
2522
- fn substitute ( & @ctxt cx , & vec[ t] set_types , & t typ ) -> t {
2523
- if ( !type_contains_vars ( cx. tcx , typ) ) {
2522
+ fn substitute ( & ty_ctxt tcx, & @var_bindings var_bindings ,
2523
+ & vec[ t] set_types , & t typ ) -> t {
2524
+ if ( !type_contains_vars ( tcx, typ) ) {
2524
2525
ret typ;
2525
2526
}
2526
2527
2527
- fn substituter ( @ctxt cx , vec[ t] types , t typ ) -> t {
2528
- alt ( struct ( cx. tcx , typ) ) {
2528
+ fn substituter ( ty_ctxt tcx, @var_bindings var_bindings , vec[ t] types ,
2529
+ t typ ) -> t {
2530
+ alt ( struct ( tcx, typ) ) {
2529
2531
case ( ty_var ( ?id) ) {
2530
- alt ( cx . var_bindings . var_ids . find ( id) ) {
2532
+ alt ( var_bindings. var_ids . find ( id) ) {
2531
2533
case ( some[ uint] ( ?n) ) {
2532
- auto root = ufind:: find ( cx . var_bindings . sets , n) ;
2534
+ auto root = ufind:: find ( var_bindings. sets , n) ;
2533
2535
ret types. ( root) ;
2534
2536
}
2535
2537
case ( none[ uint] ) { ret typ; }
@@ -2539,24 +2541,24 @@ mod unify {
2539
2541
}
2540
2542
}
2541
2543
2542
- auto f = bind substituter ( cx , set_types, _) ;
2543
- ret fold_ty( cx . tcx , f, typ) ;
2544
+ auto f = bind substituter ( tcx , var_bindings , set_types, _) ;
2545
+ ret fold_ty( tcx, f, typ) ;
2544
2546
}
2545
2547
2546
- fn unify_sets ( & @ctxt cx ) -> vec[ t ] {
2548
+ fn unify_sets ( & @var_bindings var_bindings ) -> vec[ t ] {
2547
2549
let vec[ t] throwaway = [ ] ;
2548
2550
let vec[ mutable vec[ t] ] set_types = [ mutable throwaway] ;
2549
2551
vec:: pop[ vec[ t] ] ( set_types) ; // FIXME: botch
2550
2552
2551
- for ( ufind:: node node in cx . var_bindings. sets. nodes) {
2553
+ for ( ufind:: node node in var_bindings. sets. nodes) {
2552
2554
let vec[ t] v = [ ] ;
2553
2555
set_types += [ mutable v] ;
2554
2556
}
2555
2557
2556
2558
auto i = 0 u;
2557
2559
while ( i < vec:: len[ vec[ t] ] ( set_types) ) {
2558
- auto root = ufind:: find ( cx . var_bindings . sets , i) ;
2559
- set_types. ( root) += cx . var_bindings . types . ( i) ;
2560
+ auto root = ufind:: find ( var_bindings. sets , i) ;
2561
+ set_types. ( root) += var_bindings. types . ( i) ;
2560
2562
i += 1 u;
2561
2563
}
2562
2564
@@ -2576,27 +2578,15 @@ mod unify {
2576
2578
fn unify ( & t expected ,
2577
2579
& t actual ,
2578
2580
& unify_handler handler,
2581
+ & @var_bindings var_bindings ,
2579
2582
& ty_ctxt tcx) -> result {
2580
- auto cx = @rec ( var_bindings=mk_var_bindings ( ) ,
2581
- handler=handler,
2582
- tcx=tcx) ;
2583
-
2584
- auto ures = unify_step ( cx, expected, actual) ;
2585
- alt ( ures) {
2586
- case ( ures_ok ( ?typ) ) {
2587
- // Fast path: if there are no local variables, don't perform
2588
- // substitutions.
2589
- if ( vec:: len ( cx. var_bindings . sets . nodes ) == 0 u) {
2590
- ret ures_ok ( typ) ;
2591
- }
2583
+ auto cx = @rec ( var_bindings=var_bindings, handler=handler, tcx=tcx) ;
2584
+ ret unify_step( cx, expected, actual) ;
2585
+ }
2592
2586
2593
- auto set_types = unify_sets ( cx) ;
2594
- auto t2 = substitute ( cx, set_types, typ) ;
2595
- ret ures_ok( t2) ;
2596
- }
2597
- case ( _) { ret ures; }
2598
- }
2599
- fail; // not reached
2587
+ fn fixup ( & ty_ctxt tcx, & @var_bindings var_bindings , t typ ) -> t {
2588
+ auto set_types = unify_sets ( var_bindings) ;
2589
+ ret substitute ( tcx, var_bindings, set_types, typ) ;
2600
2590
}
2601
2591
}
2602
2592
0 commit comments