@@ -53,59 +53,72 @@ const uint tag_index_table = 0x15u;
53
53
54
54
type ty_abbrev = rec ( uint pos, uint len, str s) ;
55
55
56
+ tag abbrev_ctxt {
57
+ ac_no_abbrevs;
58
+ ac_use_abbrevs ( hashmap[ ty. t , ty_abbrev] ) ;
59
+ }
60
+
56
61
mod Encode {
57
62
58
63
type ctxt = rec (
59
64
fn ( ast. def_id ) -> str ds, // Def -> str Callback.
60
65
ty. ctxt tcx , // The type context.
61
- bool use_abbrevs ,
62
- hashmap[ ty. t, ty_abbrev] abbrevs // Type abbrevs.
66
+ abbrev_ctxt abbrevs
63
67
) ;
64
68
69
+ fn cx_uses_abbrevs ( @ctxt cx ) -> bool {
70
+ alt ( cx. abbrevs ) {
71
+ case ( ac_no_abbrevs) { ret false ; }
72
+ case ( ac_use_abbrevs ( _) ) { ret true ; }
73
+ }
74
+ }
75
+
65
76
fn ty_str ( @ctxt cx , ty . t t) -> str {
66
- assert ( ! cx . use_abbrevs ) ;
77
+ assert ( !cx_uses_abbrevs ( cx ) ) ;
67
78
auto sw = io. string_writer ( ) ;
68
79
enc_ty ( sw. get_writer ( ) , cx, t) ;
69
80
ret sw. get_str ( ) ;
70
81
}
71
82
72
83
fn enc_ty ( io. writer w , @ctxt cx , ty . t t) {
73
- if ( cx. use_abbrevs ) {
74
- alt ( cx. abbrevs . find ( t) ) {
75
- case ( some[ ty_abbrev] ( ?a) ) {
76
- w. write_str ( a. s ) ;
77
- ret;
78
- }
79
- case ( none[ ty_abbrev] ) {
80
- auto pos = w. get_buf_writer ( ) . tell ( ) ;
81
- auto ss = enc_sty ( w, cx, ty. struct ( cx. tcx , t) ) ;
82
- auto end = w. get_buf_writer ( ) . tell ( ) ;
83
- auto len = end-pos;
84
- fn estimate_sz ( uint u) -> uint {
85
- auto n = u;
86
- auto len = 0 u;
87
- while ( n != 0 u) {
88
- len += 1 u;
89
- n = n >> 4 u;
90
- }
91
- ret len;
84
+ alt ( cx. abbrevs ) {
85
+ case ( ac_no_abbrevs) { enc_sty ( w, cx, ty. struct ( cx. tcx , t) ) ; }
86
+ case ( ac_use_abbrevs ( ?abbrevs) ) {
87
+ alt ( abbrevs. find ( t) ) {
88
+ case ( some[ ty_abbrev] ( ?a) ) {
89
+ w. write_str ( a. s ) ;
90
+ ret;
92
91
}
93
- auto abbrev_len =
94
- 3 u + estimate_sz ( pos) + estimate_sz ( len) ;
95
-
96
- if ( abbrev_len < len) {
97
- // I.e. it's actually an abbreviation.
98
- auto s = ( "#"
99
- + _uint. to_str ( pos, 16 u) + ":"
100
- + _uint. to_str ( len, 16 u) + "#" ) ;
101
- auto a = rec ( pos=pos, len=len, s=s) ;
102
- cx. abbrevs . insert ( t, a) ;
92
+ case ( none[ ty_abbrev] ) {
93
+ auto pos = w. get_buf_writer ( ) . tell ( ) ;
94
+ auto ss = enc_sty ( w, cx, ty. struct ( cx. tcx , t) ) ;
95
+ auto end = w. get_buf_writer ( ) . tell ( ) ;
96
+ auto len = end-pos;
97
+ fn estimate_sz ( uint u) -> uint {
98
+ auto n = u;
99
+ auto len = 0 u;
100
+ while ( n != 0 u) {
101
+ len += 1 u;
102
+ n = n >> 4 u;
103
+ }
104
+ ret len;
105
+ }
106
+ auto abbrev_len =
107
+ 3 u + estimate_sz ( pos) + estimate_sz ( len) ;
108
+
109
+ if ( abbrev_len < len) {
110
+ // I.e. it's actually an abbreviation.
111
+ auto s = ( "#"
112
+ + _uint. to_str ( pos, 16 u) + ":"
113
+ + _uint. to_str ( len, 16 u) + "#" ) ;
114
+ auto a = rec ( pos=pos, len=len, s=s) ;
115
+ abbrevs. insert ( t, a) ;
116
+ }
117
+ ret;
103
118
}
104
- ret;
105
119
}
106
120
}
107
121
}
108
- enc_sty ( w, cx, ty. struct ( cx. tcx , t) ) ;
109
122
}
110
123
111
124
fn enc_mt ( io. writer w , @ctxt cx , & ty. mt mt ) {
@@ -406,7 +419,7 @@ fn encode_type(@trans.crate_ctxt cx, &ebml.writer ebml_w, ty.t typ) {
406
419
407
420
auto f = def_to_str;
408
421
auto ty_str_ctxt = @rec ( ds=f, tcx=cx. tcx ,
409
- use_abbrevs= true , abbrevs=cx. type_abbrevs ) ;
422
+ abbrevs=ac_use_abbrevs ( cx. type_abbrevs ) ) ;
410
423
Encode . enc_ty ( io. new_writer_ ( ebml_w. writer ) , ty_str_ctxt, typ) ;
411
424
ebml. end_tag ( ebml_w) ;
412
425
}
0 commit comments