@@ -2121,121 +2121,81 @@ pub fn ConstFCmp(Pred: RealPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef {
2121
2121
/* Memory-managed object interface to type handles. */
2122
2122
2123
2123
pub struct TypeNames {
2124
- type_names : @ mut HashMap < TypeRef , @str > ,
2125
- named_types : @ mut HashMap < @str , TypeRef >
2124
+ type_names : HashMap < TypeRef , @str > ,
2125
+ named_types : HashMap < @str , TypeRef >
2126
2126
}
2127
2127
2128
- pub fn associate_type ( tn : @TypeNames , s : @str , t : TypeRef ) {
2129
- assert ! ( tn. type_names. insert( t, s) ) ;
2130
- assert ! ( tn. named_types. insert( s, t) ) ;
2131
- }
2132
-
2133
- pub fn type_has_name ( tn : @TypeNames , t : TypeRef ) -> Option < @str > {
2134
- return tn. type_names . find ( & t) . map_consume ( |x| * x) ;
2135
- }
2136
-
2137
- pub fn name_has_type ( tn : @TypeNames , s : @str ) -> Option < TypeRef > {
2138
- return tn. named_types . find ( & s) . map_consume ( |x| * x) ;
2139
- }
2140
-
2141
- pub fn mk_type_names ( ) -> @TypeNames {
2142
- @TypeNames {
2143
- type_names : @mut HashMap :: new ( ) ,
2144
- named_types : @mut HashMap :: new ( )
2128
+ impl TypeNames {
2129
+ pub fn new ( ) -> TypeNames {
2130
+ TypeNames {
2131
+ type_names : HashMap :: new ( ) ,
2132
+ named_types : HashMap :: new ( )
2133
+ }
2145
2134
}
2146
- }
2147
-
2148
- pub fn type_to_str ( names : @TypeNames , ty : TypeRef ) -> @str {
2149
- return type_to_str_inner ( names, [ ] , ty) ;
2150
- }
2151
2135
2152
- pub fn type_to_str_inner ( names : @TypeNames , outer0 : & [ TypeRef ] , ty : TypeRef )
2153
- -> @str {
2154
- unsafe {
2155
- match type_has_name ( names, ty) {
2156
- option:: Some ( n) => return n,
2157
- _ => { }
2158
- }
2136
+ pub fn associate_type ( & mut self , s : @str , t : TypeRef ) {
2137
+ assert ! ( self . type_names. insert( t, s) ) ;
2138
+ assert ! ( self . named_types. insert( s, t) ) ;
2139
+ }
2159
2140
2160
- let outer = vec:: append_one ( outer0. to_owned ( ) , ty) ;
2141
+ pub fn find_name ( & self , ty : & TypeRef ) -> Option < @str > {
2142
+ self . type_names . find_copy ( ty)
2143
+ }
2161
2144
2162
- let kind = llvm:: LLVMGetTypeKind ( ty) ;
2145
+ pub fn find_type ( & self , s : & str ) -> Option < TypeRef > {
2146
+ self . named_types . find_equiv ( s) . map_consume ( |x| * x)
2147
+ }
2163
2148
2164
- fn tys_str ( names : @TypeNames , outer : & [ TypeRef ] ,
2165
- tys : ~[ TypeRef ] ) -> @str {
2166
- let mut s = ~"";
2167
- let mut first: bool = true ;
2168
- for tys. each |t| {
2169
- if first { first = false ; } else { s += ", " ; }
2170
- s += type_to_str_inner ( names, outer, * t) ;
2171
- }
2172
- // [Note at-str] FIXME #2543: Could rewrite this without the copy,
2173
- // but need better @str support.
2174
- return s. to_managed ( ) ;
2149
+ pub fn type_to_str ( & self , ty : TypeRef ) -> ~str {
2150
+ match self . find_name ( & ty) {
2151
+ option:: Some ( name) => return name. to_owned ( ) ,
2152
+ None => ( )
2175
2153
}
2176
2154
2177
- match kind {
2178
- Void => return @"Void ",
2179
- Half => return @"Half ",
2180
- Float => return @"Float ",
2181
- Double => return @"Double ",
2182
- X86_FP80 => return @"X86_FP80 ",
2183
- FP128 => return @"FP128 ",
2184
- PPC_FP128 => return @"PPC_FP128 ",
2185
- Label => return @"Label ",
2186
- Integer => {
2187
- // See [Note at-str]
2188
- return fmt ! ( "i%d" , llvm:: LLVMGetIntTypeWidth ( ty)
2189
- as int) . to_managed ( ) ;
2190
- }
2191
- Function => {
2192
- let out_ty: TypeRef = llvm:: LLVMGetReturnType ( ty) ;
2193
- let n_args = llvm:: LLVMCountParamTypes ( ty) as uint ;
2194
- let args = vec:: from_elem ( n_args, 0 as TypeRef ) ;
2195
- llvm:: LLVMGetParamTypes ( ty, vec:: raw:: to_ptr ( args) ) ;
2196
- // See [Note at-str]
2197
- return fmt ! ( "fn(%s) -> %s" ,
2198
- tys_str( names, outer, args) ,
2199
- type_to_str_inner( names, outer, out_ty) ) . to_managed ( ) ;
2200
- }
2201
- Struct => {
2202
- let elts = struct_tys ( ty) ;
2203
- // See [Note at-str]
2204
- return fmt ! ( "{%s}" , tys_str( names, outer, elts) ) . to_managed ( ) ;
2205
- }
2206
- Array => {
2207
- let el_ty = llvm:: LLVMGetElementType ( ty) ;
2208
- // See [Note at-str]
2209
- return fmt ! ( "[%s@ x %u" , type_to_str_inner( names, outer, el_ty) ,
2210
- llvm:: LLVMGetArrayLength ( ty) as uint) . to_managed ( ) ;
2211
- }
2212
- Pointer => {
2213
- let mut i = 0 ;
2214
- for outer0. each |tout| {
2215
- i += 1 ;
2216
- if * tout as int == ty as int {
2217
- let n = outer0. len ( ) - i;
2218
- // See [Note at-str]
2219
- return fmt ! ( "*\\ %d" , n as int) . to_managed ( ) ;
2155
+ unsafe {
2156
+ let kind = llvm:: LLVMGetTypeKind ( ty) ;
2157
+
2158
+ match kind {
2159
+ Void => ~"Void ",
2160
+ Half => ~"Half ",
2161
+ Double => ~"Double ",
2162
+ X86_FP80 => ~"X86_FP80 ",
2163
+ FP128 => ~"FP128 ",
2164
+ PPC_FP128 => ~"PPC_FP128 ",
2165
+ Label => ~"Label ",
2166
+ Vector => ~"Vector ",
2167
+ Metadata => ~"Metadata ",
2168
+ X86_MMX => ~"X86_MMAX ",
2169
+ Integer => {
2170
+ fmt ! ( "i%d" , llvm:: LLVMGetIntTypeWidth ( ty) as int)
2220
2171
}
2221
- }
2222
- let addrstr = {
2223
- let addrspace = llvm:: LLVMGetPointerAddressSpace ( ty) as uint ;
2224
- if addrspace == 0 {
2225
- ~""
2226
- } else {
2227
- fmt ! ( "addrspace(%u)" , addrspace)
2172
+ Function => {
2173
+ let out_ty = llvm:: LLVMGetReturnType ( ty) ;
2174
+ let n_args = llvm:: LLVMCountParamTypes ( ty) as uint ;
2175
+ let args = vec:: from_elem ( n_args, 0 as TypeRef ) ;
2176
+ llvm:: LLVMGetParamTypes ( ty, vec:: raw:: to_ptr ( args) ) ;
2177
+
2178
+ let args = args. map ( |& ty| self . type_to_str ( ty) ) . connect ( ", " ) ;
2179
+ let out_ty = self . type_to_str ( out_ty) ;
2180
+ fmt ! ( "fn(%s) -> %s" , args, out_ty)
2228
2181
}
2229
- } ;
2230
- // See [Note at-str]
2231
- return fmt ! ( "%s*%s" , addrstr, type_to_str_inner( names,
2232
- outer,
2233
- llvm:: LLVMGetElementType ( ty) ) ) . to_managed ( ) ;
2234
- }
2235
- Vector => return @"Vector ",
2236
- Metadata => return @"Metadata ",
2237
- X86_MMX => return @"X86_MMAX ",
2238
- _ => fail ! ( )
2182
+ Struct => {
2183
+ let tys = struct_tys ( ty) ;
2184
+ let tys = tys. map ( |ty| self . type_to_str ( ty) ) . connect ( ", " ) ;
2185
+ fmt ! ( "{%s}" , tys)
2186
+ }
2187
+ Array => {
2188
+ let el_ty = llvm:: LLVMGetElementType ( ty) ;
2189
+ let el_ty = self . type_to_str ( el_ty) ;
2190
+ let len = llvm:: LLVMGetArrayLength ( ty) as uint ;
2191
+ fmt ! ( "[%s x %u]" , el_ty, len)
2192
+ }
2193
+ Pointer => {
2194
+ let el_ty = llvm:: LLVMGetElementType ( ty) ;
2195
+ let el_ty = self . type_to_str ( el_ty) ;
2196
+ fmt ! ( "*%s" , el_ty)
2197
+ }
2198
+ }
2239
2199
}
2240
2200
}
2241
2201
}
0 commit comments