@@ -3244,7 +3244,9 @@ fn memmove_ty(&@block_ctxt cx, ValueRef dst, ValueRef src, &ty::t t) ->
3244
3244
if ( ty:: type_has_dynamic_size( cx. fcx. lcx. ccx. tcx, t) ) {
3245
3245
auto llsz = size_of( cx, t) ;
3246
3246
ret call_memmove( llsz. bcx, dst, src, llsz. val) ;
3247
- } else { ret rslt( cx, cx. build. Store ( cx. build. Load ( src) , dst) ) ; }
3247
+ } else {
3248
+ ret rslt( cx, cx. build. Store ( cx. build. Load ( src) , dst) ) ;
3249
+ }
3248
3250
}
3249
3251
3250
3252
// Duplicates any heap-owned memory owned by a value of the given type.
@@ -3365,7 +3367,65 @@ fn move_val_if_temp(@block_ctxt cx, copy_action action, ValueRef dst,
3365
3367
}
3366
3368
}
3367
3369
3368
- fn trans_lit( & @crate_ctxt cx, & ast:: lit lit) -> ValueRef {
3370
+ fn trans_lit_istr( & @block_ctxt cx, str s) -> result {
3371
+ auto llstackpart = alloca( cx, T_ivec ( T_i8 ( ) ) ) ;
3372
+ auto len = str :: byte_len( s) ;
3373
+
3374
+ auto bcx;
3375
+ if ( len < 3 u) { // 3 because of the \0
3376
+ cx. build. Store ( C_uint ( len + 1 u) ,
3377
+ cx. build. InBoundsGEP ( llstackpart,
3378
+ ~[ C_int ( 0 ) , C_int ( 0 ) ] ) ) ;
3379
+ cx. build. Store ( C_int ( 4 ) ,
3380
+ cx. build. InBoundsGEP ( llstackpart,
3381
+ ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ) ;
3382
+ auto i = 0 u;
3383
+ while ( i < len) {
3384
+ cx. build. Store ( C_u8 ( s. ( i) as uint) ,
3385
+ cx. build. InBoundsGEP ( llstackpart,
3386
+ ~[ C_int ( 0 ) , C_int ( 2 ) ,
3387
+ C_uint ( i) ] ) ) ;
3388
+ i += 1 u;
3389
+ }
3390
+ cx. build. Store ( C_u8 ( 0 u) ,
3391
+ cx. build. InBoundsGEP ( llstackpart,
3392
+ ~[ C_int ( 0 ) , C_int ( 2 ) ,
3393
+ C_uint ( len) ] ) ) ;
3394
+
3395
+ bcx = cx;
3396
+ } else {
3397
+ auto r =
3398
+ trans_shared_malloc( cx, T_ptr ( T_ivec_heap_part ( T_i8 ( ) ) ) ,
3399
+ llsize_of( T_struct ( ~[ T_int ( ) ,
3400
+ T_array ( T_i8 ( ) ,
3401
+ len + 1 u) ] ) ) ) ;
3402
+ bcx = r. bcx;
3403
+ auto llheappart = r. val;
3404
+
3405
+ bcx. build. Store ( C_uint ( len + 1 u) ,
3406
+ bcx. build. InBoundsGEP ( llheappart,
3407
+ ~[ C_int ( 0 ) , C_int ( 0 ) ] ) ) ;
3408
+ bcx. build. Store ( llvm:: LLVMConstString ( str :: buf( s) , len, False ) ,
3409
+ bcx. build. InBoundsGEP ( llheappart,
3410
+ ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ) ;
3411
+
3412
+ auto llspilledstackpart = bcx. build. PointerCast ( llstackpart,
3413
+ T_ptr ( T_ivec_heap ( T_i8 ( ) ) ) ) ;
3414
+ bcx. build. Store ( C_int ( 0 ) ,
3415
+ bcx. build. InBoundsGEP ( llspilledstackpart,
3416
+ ~[ C_int ( 0 ) , C_int ( 0 ) ] ) ) ;
3417
+ bcx. build. Store ( C_uint ( len + 1 u) ,
3418
+ bcx. build. InBoundsGEP ( llspilledstackpart,
3419
+ ~[ C_int ( 0 ) , C_int ( 1 ) ] ) ) ;
3420
+ bcx. build. Store ( llheappart,
3421
+ bcx. build. InBoundsGEP ( llspilledstackpart,
3422
+ ~[ C_int ( 0 ) , C_int ( 2 ) ] ) ) ;
3423
+ }
3424
+
3425
+ ret rslt( bcx, llstackpart) ;
3426
+ }
3427
+
3428
+ fn trans_crate_lit( & @crate_ctxt cx, & ast:: lit lit) -> ValueRef {
3369
3429
alt ( lit. node) {
3370
3430
case ( ast:: lit_int( ?i) ) { ret C_int ( i) ; }
3371
3431
case ( ast:: lit_uint( ?u) ) { ret C_int ( u as int) ; }
@@ -3402,7 +3462,17 @@ fn trans_lit(&@crate_ctxt cx, &ast::lit lit) -> ValueRef {
3402
3462
}
3403
3463
case ( ast:: lit_bool( ?b) ) { ret C_bool ( b) ; }
3404
3464
case ( ast:: lit_nil) { ret C_nil ( ) ; }
3405
- case ( ast:: lit_str( ?s, _) ) { ret C_str ( cx, s) ; }
3465
+ case ( ast:: lit_str( ?s, ast:: sk_rc) ) { ret C_str ( cx, s) ; }
3466
+ case ( ast:: lit_str( ?s, ast:: sk_unique) ) {
3467
+ cx. sess. span_unimpl( lit. span, "unique string in this context") ;
3468
+ }
3469
+ }
3470
+ }
3471
+
3472
+ fn trans_lit( & @block_ctxt cx, & ast:: lit lit) -> result {
3473
+ alt ( lit. node) {
3474
+ ast:: lit_str( ?s, ast:: sk_unique) { ret trans_lit_istr( cx, s) ; }
3475
+ _ { ret rslt( cx, trans_crate_lit( cx. fcx. lcx. ccx, lit) ) ; }
3406
3476
}
3407
3477
}
3408
3478
@@ -6018,9 +6088,7 @@ fn trans_expr_out(&@block_ctxt cx, &@ast::expr e, out_method output) ->
6018
6088
result {
6019
6089
// FIXME Fill in cx.sp
6020
6090
alt ( e. node) {
6021
- case ( ast:: expr_lit( ?lit) ) {
6022
- ret rslt( cx, trans_lit( cx. fcx. lcx. ccx, * lit) ) ;
6023
- }
6091
+ case ( ast:: expr_lit( ?lit) ) { ret trans_lit( cx, * lit) ; }
6024
6092
case ( ast:: expr_unary( ?op, ?x) ) {
6025
6093
if ( op != ast:: deref) { ret trans_unary( cx, op, x, e. id) ; }
6026
6094
}
@@ -8484,7 +8552,7 @@ fn trans_tag_variant(@local_ctxt cx, ast::node_id tag_id,
8484
8552
// that does so later on?
8485
8553
fn trans_const_expr( & @crate_ctxt cx, @ast:: expr e) -> ValueRef {
8486
8554
alt ( e. node) {
8487
- case ( ast:: expr_lit( ?lit) ) { ret trans_lit ( cx, * lit) ; }
8555
+ case ( ast:: expr_lit( ?lit) ) { ret trans_crate_lit ( cx, * lit) ; }
8488
8556
case ( _) {
8489
8557
cx. sess. span_unimpl( e. span, "consts that' s not a plain literal") ;
8490
8558
}
0 commit comments