@@ -1124,20 +1124,6 @@ fn trans_lval(@block_ctxt cx, @ast.expr e) -> tup(result, bool) {
1124
1124
fail;
1125
1125
}
1126
1126
1127
- impure fn trans_exprs ( @block_ctxt cx , & vec[ @ast. expr] es)
1128
- -> tup( @block_ctxt, vec[ ValueRef ] ) {
1129
- let vec[ ValueRef ] vs = vec( ) ;
1130
- let @block_ctxt bcx = cx;
1131
-
1132
- for ( @ast. expr e in es ) {
1133
- auto res = trans_expr ( bcx, e) ;
1134
- vs += res. val ;
1135
- bcx = res. bcx ;
1136
- }
1137
-
1138
- ret tup( bcx, vs) ;
1139
- }
1140
-
1141
1127
impure fn trans_cast ( @block_ctxt cx , @ast. expr e , & ast. ann ann ) -> result {
1142
1128
auto e_res = trans_expr ( cx, e) ;
1143
1129
auto llsrctype = val_ty ( e_res. val ) ;
@@ -1169,15 +1155,33 @@ impure fn trans_cast(@block_ctxt cx, @ast.expr e, &ast.ann ann) -> result {
1169
1155
ret e_res;
1170
1156
}
1171
1157
1158
+
1159
+ impure fn trans_args ( @block_ctxt cx , & vec[ @ast. expr] es)
1160
+ -> tup( @block_ctxt, vec[ ValueRef ] ) {
1161
+ let vec[ ValueRef ] vs = vec( cx. fcx. lltaskptr) ;
1162
+ let @block_ctxt bcx = cx;
1163
+
1164
+ for ( @ast. expr e in es ) {
1165
+ auto res = trans_expr ( bcx, e) ;
1166
+ // Until here we've been treating structures by pointer;
1167
+ // we are now passing it as an arg, so need to load it.
1168
+ if ( typeck. type_is_structural ( typeck. expr_ty ( e) ) ) {
1169
+ res. val = res. bcx . build . Load ( res. val ) ;
1170
+ }
1171
+ vs += res. val ;
1172
+ bcx = res. bcx ;
1173
+ }
1174
+
1175
+ ret tup( bcx, vs) ;
1176
+ }
1177
+
1172
1178
impure fn trans_call ( @block_ctxt cx, @ast. expr f,
1173
1179
vec[ @ast. expr ] args) -> result {
1174
1180
auto f_res = trans_lval ( cx, f) ;
1175
1181
check ( ! f_res. _1 ) ;
1176
- auto args_res = trans_exprs ( f_res. _0 . bcx , args) ;
1177
- auto llargs = vec ( cx. fcx . lltaskptr ) ;
1178
- llargs += args_res. _1 ;
1182
+ auto args_res = trans_args ( f_res. _0 . bcx , args) ;
1179
1183
ret res( args_res. _0 ,
1180
- args_res. _0 . build . FastCall ( f_res. _0 . val , llargs ) ) ;
1184
+ args_res. _0 . build . FastCall ( f_res. _0 . val , args_res . _1 ) ) ;
1181
1185
}
1182
1186
1183
1187
impure fn trans_tup ( @block_ctxt cx, vec[ tup ( bool, @ast. expr ) ] args,
0 commit comments