@@ -1151,18 +1151,70 @@ fn mk_type_handle() -> type_handle {
1151
1151
ret rec( llth=th, dtor=type_handle_dtor ( th) ) ;
1152
1152
}
1153
1153
1154
- fn type_to_str ( TypeRef ty) -> str {
1154
+
1155
+ state obj type_names ( std. map . hashmap [ TypeRef , str] type_names,
1156
+ std. map . hashmap [ str, TypeRef ] named_types) {
1157
+
1158
+ fn associate ( str s, TypeRef t) {
1159
+ check ( !named_types. contains_key ( s) ) ;
1160
+ check ( !type_names. contains_key ( t) ) ;
1161
+ type_names. insert ( t, s) ;
1162
+ named_types. insert ( s, t) ;
1163
+ }
1164
+
1165
+ fn type_has_name ( TypeRef t) -> bool {
1166
+ ret type_names. contains_key ( t) ;
1167
+ }
1168
+
1169
+ fn get_name ( TypeRef t) -> str {
1170
+ ret type_names. get ( t) ;
1171
+ }
1172
+
1173
+ fn name_has_type ( str s) -> bool {
1174
+ ret named_types. contains_key ( s) ;
1175
+ }
1176
+
1177
+ fn get_type ( str s) -> TypeRef {
1178
+ ret named_types. get ( s) ;
1179
+ }
1180
+ }
1181
+
1182
+ fn mk_type_names ( ) -> type_names {
1183
+ auto nt = util. common . new_str_hash [ TypeRef ] ( ) ;
1184
+
1185
+ fn hash ( & TypeRef t) -> uint {
1186
+ ret t as uint ;
1187
+ }
1188
+
1189
+ fn eq ( & TypeRef a, & TypeRef b) -> bool {
1190
+ ret ( a as uint ) == ( b as uint ) ;
1191
+ }
1192
+
1193
+ let std. map. hashfn[ TypeRef ] hasher = hash;
1194
+ let std. map. eqfn[ TypeRef ] eqer = eq;
1195
+ auto tn = std. map . mk_hashmap [ TypeRef , str ] ( hasher, eqer) ;
1196
+
1197
+ ret type_names( tn, nt) ;
1198
+ }
1199
+
1200
+ fn type_to_str ( type_names names, TypeRef ty) -> str {
1155
1201
let vec[ TypeRef ] v = vec ( ) ;
1156
- ret type_to_str_inner ( v, ty) ;
1202
+ ret type_to_str_inner ( names , v, ty) ;
1157
1203
}
1158
1204
1159
- fn type_to_str_inner ( vec[ TypeRef ] outer0 , TypeRef ty) -> str {
1205
+ fn type_to_str_inner ( type_names names,
1206
+ vec[ TypeRef ] outer0 , TypeRef ty) -> str {
1207
+
1208
+ if ( names. type_has_name ( ty) ) {
1209
+ ret names. get_name ( ty) ;
1210
+ }
1160
1211
1161
1212
auto outer = outer0 + vec ( ty) ;
1162
1213
1163
1214
let int kind = llvm. LLVMGetTypeKind ( ty) ;
1164
1215
1165
- fn tys_str ( vec[ TypeRef ] outer , vec[ TypeRef ] tys ) -> str {
1216
+ fn tys_str ( type_names names,
1217
+ vec[ TypeRef ] outer , vec[ TypeRef ] tys ) -> str {
1166
1218
let str s = "" ;
1167
1219
let bool first = true ;
1168
1220
for ( TypeRef t in tys) {
@@ -1171,7 +1223,7 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
1171
1223
} else {
1172
1224
s += ", " ;
1173
1225
}
1174
- s += type_to_str_inner ( outer, t) ;
1226
+ s += type_to_str_inner ( names , outer, t) ;
1175
1227
}
1176
1228
ret s;
1177
1229
}
@@ -1200,9 +1252,9 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
1200
1252
let vec[ TypeRef ] args =
1201
1253
_vec. init_elt [ TypeRef ] ( 0 as TypeRef , n_args) ;
1202
1254
llvm. LLVMGetParamTypes ( ty, _vec. buf [ TypeRef ] ( args) ) ;
1203
- s += tys_str ( outer, args) ;
1255
+ s += tys_str ( names , outer, args) ;
1204
1256
s += ") -> " ;
1205
- s += type_to_str_inner ( outer, out_ty) ;
1257
+ s += type_to_str_inner ( names , outer, out_ty) ;
1206
1258
ret s;
1207
1259
}
1208
1260
@@ -1212,7 +1264,7 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
1212
1264
let vec[ TypeRef ] elts =
1213
1265
_vec. init_elt [ TypeRef ] ( 0 as TypeRef , n_elts) ;
1214
1266
llvm. LLVMGetStructElementTypes ( ty, _vec. buf [ TypeRef ] ( elts) ) ;
1215
- s += tys_str ( outer, elts) ;
1267
+ s += tys_str ( names , outer, elts) ;
1216
1268
s += "}" ;
1217
1269
ret s;
1218
1270
}
@@ -1228,7 +1280,8 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
1228
1280
ret "*\\ " + util. common . istr ( n as int ) ;
1229
1281
}
1230
1282
}
1231
- ret "* " + type_to_str_inner(outer, llvm.LLVMGetElementType(ty));
1283
+ ret "* " + type_to_str_inner(names, outer,
1284
+ llvm.LLVMGetElementType(ty));
1232
1285
}
1233
1286
1234
1287
case (12) { ret " Opaque "; }
0 commit comments