@@ -1251,20 +1251,19 @@ fn SetLinkage(Global: ValueRef, Link: Linkage) {
1251
1251
1252
1252
/* Memory-managed object interface to type handles. */
1253
1253
1254
- type type_names = @{ type_names : HashMap < TypeRef , ~ str > ,
1255
- named_types : HashMap < ~ str , TypeRef > } ;
1254
+ type type_names = @{ type_names : HashMap < TypeRef , @ str > ,
1255
+ named_types : HashMap < @ str , TypeRef > } ;
1256
1256
1257
- fn associate_type ( tn : type_names , +s : ~str , t : TypeRef ) {
1258
- // XXX: Bad copy, use @str instead?
1259
- assert tn. type_names . insert ( t, copy s) ;
1257
+ fn associate_type ( tn : type_names , s : @str , t : TypeRef ) {
1258
+ assert tn. type_names . insert ( t, s) ;
1260
1259
assert tn. named_types . insert ( s, t) ;
1261
1260
}
1262
1261
1263
- fn type_has_name ( tn : type_names , t : TypeRef ) -> Option < ~ str > {
1262
+ fn type_has_name ( tn : type_names , t : TypeRef ) -> Option < @ str > {
1264
1263
return tn. type_names . find ( t) ;
1265
1264
}
1266
1265
1267
- fn name_has_type ( tn : type_names , + s : ~ str ) -> Option < TypeRef > {
1266
+ fn name_has_type ( tn : type_names , s : @ str ) -> Option < TypeRef > {
1268
1267
return tn. named_types . find ( s) ;
1269
1268
}
1270
1269
@@ -1273,101 +1272,104 @@ fn mk_type_names() -> type_names {
1273
1272
named_types: HashMap ( ) }
1274
1273
}
1275
1274
1276
- fn type_to_str ( names : type_names , ty : TypeRef ) -> ~ str {
1275
+ fn type_to_str ( names : type_names , ty : TypeRef ) -> @ str {
1277
1276
return type_to_str_inner ( names, ~[ ] , ty) ;
1278
1277
}
1279
1278
1280
1279
fn type_to_str_inner ( names : type_names , +outer0 : ~[ TypeRef ] , ty : TypeRef ) ->
1281
- ~ str {
1280
+ @ str {
1282
1281
unsafe {
1283
1282
match type_has_name ( names, ty) {
1284
- option:: Some ( ref n) => return ( /*bad*/ copy * n ) ,
1283
+ option:: Some ( n) => return n ,
1285
1284
_ => { }
1286
1285
}
1287
1286
1288
- // XXX : Bad copy.
1287
+ // FIXME #2543 : Bad copy.
1289
1288
let outer = vec:: append_one ( copy outer0, ty) ;
1290
1289
1291
1290
let kind = llvm:: LLVMGetTypeKind ( ty) ;
1292
1291
1293
1292
fn tys_str ( names : type_names , outer : ~[ TypeRef ] ,
1294
- tys : ~[ TypeRef ] ) -> ~ str {
1295
- let mut s: ~ str = ~"";
1293
+ tys : ~[ TypeRef ] ) -> @ str {
1294
+ let mut s = ~"";
1296
1295
let mut first: bool = true ;
1297
1296
for tys. each |t| {
1298
1297
if first { first = false ; } else { s += ~", "; }
1299
- s += type_to_str_inner(names, outer, *t);
1298
+ s += type_to_str_inner(names, outer, *t).to_owned() ;
1300
1299
}
1301
- return s;
1300
+ // [Note at-str] FIXME #2543: Could rewrite this without the copy,
1301
+ // but need better @str support.
1302
+ return s.to_managed();
1302
1303
}
1303
1304
1304
1305
match kind {
1305
- Void => return ~ " Void ",
1306
- Half => return ~ "Half ",
1307
- Float => return ~ "Float ",
1308
- Double => return ~ "Double ",
1309
- X86_FP80 => return ~ "X86_FP80 ",
1310
- FP128 => return ~ "FP128 ",
1311
- PPC_FP128 => return ~ "PPC_FP128 ",
1312
- Label => return ~ "Label ",
1306
+ Void => return @ " Void ",
1307
+ Half => return @ "Half ",
1308
+ Float => return @ "Float ",
1309
+ Double => return @ "Double ",
1310
+ X86_FP80 => return @ "X86_FP80 ",
1311
+ FP128 => return @ "FP128 ",
1312
+ PPC_FP128 => return @ "PPC_FP128 ",
1313
+ Label => return @ "Label ",
1313
1314
Integer => {
1314
- return ~"i" + int:: str ( llvm:: LLVMGetIntTypeWidth ( ty) as int ) ;
1315
+ // See [Note at-str]
1316
+ return fmt ! ( "i%d" , llvm:: LLVMGetIntTypeWidth ( ty)
1317
+ as int) . to_managed ( ) ;
1315
1318
}
1316
1319
Function => {
1317
- let mut s = ~"fn ( ";
1318
1320
let out_ty: TypeRef = llvm:: LLVMGetReturnType ( ty) ;
1319
1321
let n_args = llvm:: LLVMCountParamTypes ( ty) as uint ;
1320
1322
let args = vec:: from_elem ( n_args, 0 as TypeRef ) ;
1321
1323
unsafe {
1322
1324
llvm:: LLVMGetParamTypes ( ty, vec:: raw:: to_ptr ( args) ) ;
1323
1325
}
1324
- s += tys_str(names, outer, args);
1325
- s += ~" ) -> ";
1326
- s += type_to_str_inner (names, outer, out_ty);
1327
- return s ;
1326
+ // See [Note at-str]
1327
+ return fmt ! ( "fn(%s ) -> %s" ,
1328
+ tys_str ( names, outer, args ) ,
1329
+ type_to_str_inner ( names , outer , out_ty ) ) . to_managed ( ) ;
1328
1330
}
1329
1331
Struct => {
1330
- let mut s: ~str = ~" { ";
1331
1332
let n_elts = llvm:: LLVMCountStructElementTypes ( ty) as uint ;
1332
1333
let mut elts = vec:: from_elem ( n_elts, 0 as TypeRef ) ;
1333
- if elts.len() > 0 {
1334
+ if elts. is_not_empty ( ) {
1334
1335
llvm:: LLVMGetStructElementTypes (
1335
1336
ty, ptr:: to_mut_unsafe_ptr ( & mut elts[ 0 ] ) ) ;
1336
1337
}
1337
- s += tys_str(names, outer, elts);
1338
- s += ~" } ";
1339
- return s;
1338
+ // See [Note at-str]
1339
+ return fmt ! ( "{%s}" , tys_str( names, outer, elts) ) . to_managed ( ) ;
1340
1340
}
1341
1341
Array => {
1342
1342
let el_ty = llvm:: LLVMGetElementType ( ty) ;
1343
- return ~" [ " + type_to_str_inner(names, outer, el_ty) + ~" x " +
1344
- uint::str(llvm::LLVMGetArrayLength(ty) as uint) + ~" ] ";
1343
+ // See [Note at-str]
1344
+ return fmt ! ( "[%s@ x %u" , type_to_str_inner( names, outer, el_ty) ,
1345
+ llvm:: LLVMGetArrayLength ( ty) as uint) . to_managed ( ) ;
1345
1346
}
1346
1347
Pointer => {
1347
- let mut i: uint = 0 u ;
1348
+ let mut i = 0 ;
1348
1349
for outer0. each |tout| {
1349
- i += 1 u ;
1350
+ i += 1 ;
1350
1351
if * tout as int == ty as int {
1351
- let n: uint = vec:: len :: < TypeRef > ( outer0) - i;
1352
- return ~"* \\ " + int:: str ( n as int ) ;
1352
+ let n = outer0. len ( ) - i;
1353
+ // See [Note at-str]
1354
+ return fmt ! ( "*\\ %d" , n as int) . to_managed ( ) ;
1353
1355
}
1354
1356
}
1355
1357
let addrstr = {
1356
1358
let addrspace = llvm:: LLVMGetPointerAddressSpace ( ty) as uint ;
1357
- if addrspace == 0 u {
1359
+ if addrspace == 0 {
1358
1360
~""
1359
1361
} else {
1360
1362
fmt ! ( "addrspace(%u)" , addrspace)
1361
1363
}
1362
1364
} ;
1363
- return addrstr + ~" * " +
1364
- type_to_str_inner(names,
1365
- outer,
1366
- llvm::LLVMGetElementType(ty));
1365
+ // See [Note at-str]
1366
+ return fmt ! ( "%s*%s" , addrstr , type_to_str_inner( names,
1367
+ outer,
1368
+ llvm:: LLVMGetElementType ( ty) ) ) . to_managed ( ) ;
1367
1369
}
1368
- Vector => return ~ "Vector ",
1369
- Metadata => return ~ "Metadata ",
1370
- X86_MMX => return ~ "X86_MMAX "
1370
+ Vector => return @ "Vector ",
1371
+ Metadata => return @ "Metadata ",
1372
+ X86_MMX => return @ "X86_MMAX "
1371
1373
}
1372
1374
}
1373
1375
}
0 commit comments