@@ -8,7 +8,7 @@ import trans::{call_memmove, trans_shared_malloc, llsize_of, type_of_or_i8,
8
8
llderivedtydescs_block_ctxt, lazily_emit_tydesc_glue,
9
9
get_tydesc, load_inbounds, move_val_if_temp, trans_lval,
10
10
node_id_type, new_sub_block_ctxt, tps_normal, do_spill_noroot,
11
- GEPi , alloc_ty} ;
11
+ GEPi , alloc_ty, dest } ;
12
12
import trans_build:: * ;
13
13
import trans_common:: * ;
14
14
@@ -49,7 +49,8 @@ type alloc_result =
49
49
llunitsz : ValueRef ,
50
50
llunitty : TypeRef } ;
51
51
52
- fn alloc ( bcx : @block_ctxt , vec_ty : ty:: t , elts : uint ) -> alloc_result {
52
+ fn alloc ( bcx : @block_ctxt , vec_ty : ty:: t , elts : uint , dest : dest )
53
+ -> alloc_result {
53
54
let unit_ty = ty:: sequence_element_type ( bcx_tcx ( bcx) , vec_ty) ;
54
55
let llunitty = type_of_or_i8 ( bcx, unit_ty) ;
55
56
let llvecty = T_vec ( llunitty) ;
@@ -60,12 +61,9 @@ fn alloc(bcx: @block_ctxt, vec_ty: ty::t, elts: uint) -> alloc_result {
60
61
let { bcx: bcx , val : vptr } = alloc_raw ( bcx, fill, alloc) ;
61
62
let vptr = PointerCast ( bcx, vptr, T_ptr ( llvecty) ) ;
62
63
63
- let r = alloc_ty ( bcx, vec_ty) ;
64
- let vptrptr = r. val ;
65
- bcx = r. bcx ;
66
-
64
+ let vptrptr = alt dest { trans : : save_in ( a) { a } } ;
67
65
Store ( bcx, vptr, vptrptr) ;
68
- add_clean_temp ( bcx, vptrptr, vec_ty) ;
66
+ // add_clean_temp(bcx, vptrptr, vec_ty);
69
67
ret { bcx : bcx,
70
68
val : vptrptr,
71
69
unit_ty : unit_ty,
@@ -102,18 +100,19 @@ fn make_drop_glue(bcx: @block_ctxt, vptrptr: ValueRef, vec_ty: ty::t) ->
102
100
ret next_cx;
103
101
}
104
102
105
- fn trans_vec ( bcx : @block_ctxt , args : [ @ast:: expr ] , id : ast:: node_id ) ->
106
- result {
103
+ // FIXME handle dest == ignore
104
+ fn trans_vec ( bcx : @block_ctxt , args : [ @ast:: expr ] , id : ast:: node_id ,
105
+ dest : dest ) -> @block_ctxt {
107
106
let vec_ty = node_id_type ( bcx_ccx ( bcx) , id) ;
108
107
let { bcx: bcx ,
109
- val : vptr ,
108
+ val : vptrptr ,
110
109
llunitsz : llunitsz ,
111
110
unit_ty : unit_ty ,
112
111
llunitty : llunitty } =
113
- alloc ( bcx, vec_ty, vec:: len ( args) ) ;
112
+ alloc ( bcx, vec_ty, vec:: len ( args) , dest ) ;
114
113
115
114
// Store the individual elements.
116
- let dataptr = get_dataptr ( bcx, vptr , llunitty) ;
115
+ let dataptr = get_dataptr ( bcx, vptrptr , llunitty) ;
117
116
let i = 0 u;
118
117
for e in args {
119
118
let lv = trans_lval ( bcx, e) ;
@@ -125,19 +124,18 @@ fn trans_vec(bcx: @block_ctxt, args: [@ast::expr], id: ast::node_id) ->
125
124
bcx = move_val_if_temp ( bcx, INIT , lleltptr, lv, unit_ty) ;
126
125
i += 1 u;
127
126
}
128
- ret rslt ( bcx, vptr ) ;
127
+ ret bcx;
129
128
}
130
- fn trans_str ( bcx : @block_ctxt , s : str ) -> result {
129
+ fn trans_str ( bcx : @block_ctxt , s : str , dest : dest ) -> @ block_ctxt {
131
130
let veclen = std:: str:: byte_len ( s) + 1 u; // +1 for \0
132
- let { bcx: bcx , val : sptr , _} =
133
- alloc ( bcx, ty:: mk_str ( bcx_tcx ( bcx) ) , veclen) ;
131
+ let { bcx: bcx , val : sptrptr , _} =
132
+ alloc ( bcx, ty:: mk_str ( bcx_tcx ( bcx) ) , veclen, dest ) ;
134
133
135
134
let llcstr = C_cstr ( bcx_ccx ( bcx) , s) ;
136
135
let bcx =
137
- call_memmove ( bcx, get_dataptr ( bcx, sptr , T_i8 ( ) ) , llcstr,
136
+ call_memmove ( bcx, get_dataptr ( bcx, sptrptr , T_i8 ( ) ) , llcstr,
138
137
C_uint ( veclen) ) . bcx ;
139
-
140
- ret rslt( bcx, sptr) ;
138
+ ret bcx;
141
139
}
142
140
143
141
fn trans_append ( cx : @block_ctxt , vec_ty : ty:: t , lhsptr : ValueRef ,
0 commit comments