@@ -5867,7 +5867,9 @@ fn trans_spawn(&@block_ctxt cx,
5867
5867
5868
5868
// Translate the arguments, remembering their types and where the values
5869
5869
// ended up.
5870
- let vec[ ty:: t] arg_tys = [ ] ;
5870
+
5871
+ // There are 3 integers, for magic.
5872
+ let vec[ ty:: t] arg_tys = [ ty:: idx_int, ty:: idx_int, ty:: idx_int] ;
5871
5873
let vec[ ValueRef ] arg_vals = [ ] ;
5872
5874
for ( @ast:: expr e in args) {
5873
5875
auto arg = trans_expr( bcx, e) ;
@@ -5881,14 +5883,15 @@ fn trans_spawn(&@block_ctxt cx,
5881
5883
}
5882
5884
5883
5885
// Make the tuple. We have to reverse the types first though.
5884
- vec:: reverse[ ty:: t] ( arg_tys) ;
5885
- vec:: reverse[ ValueRef ] ( arg_vals) ;
5886
+ // vec::reverse[ty::t](arg_tys);
5887
+ // vec::reverse[ValueRef](arg_vals);
5886
5888
auto args_ty = ty:: mk_imm_tup( cx. fcx. lcx. ccx. tcx, arg_tys) ;
5887
5889
5888
5890
// Allocate and fill the tuple.
5889
5891
auto llargs = alloc_ty( bcx, args_ty) ;
5890
5892
5891
- auto i = vec:: len[ ValueRef ] ( arg_vals) - 1 u;
5893
+ // 3 to skip all the magic
5894
+ auto i = 3 u;
5892
5895
for ( ValueRef v in arg_vals) {
5893
5896
// log_err #fmt("ty(llargs) = %s",
5894
5897
// val_str(bcx.fcx.lcx.ccx.tn, llargs.val));
@@ -5900,7 +5903,7 @@ fn trans_spawn(&@block_ctxt cx,
5900
5903
5901
5904
bcx. build. Store ( v, target) ;
5902
5905
5903
- i - = 1 u;
5906
+ i + = 1 u;
5904
5907
}
5905
5908
5906
5909
// Now we're ready to do the upcall.
@@ -5927,8 +5930,6 @@ fn trans_spawn(&@block_ctxt cx,
5927
5930
auto fnptr = trans_lval( bcx, func) . res;
5928
5931
bcx = fnptr. bcx;
5929
5932
5930
- auto num_args = vec:: len[ @ast:: expr] ( args) ;
5931
-
5932
5933
auto llfnptr = bcx. build. GEP ( fnptr. val,
5933
5934
[ C_int ( 0 ) , C_int ( 0 ) ] ) ;
5934
5935
log_err "Casting llfnptr" ;
@@ -5942,6 +5943,8 @@ fn trans_spawn(&@block_ctxt cx,
5942
5943
auto llargs_i = bcx. build. PointerCast ( llargs. val,
5943
5944
T_int ( ) ) ;
5944
5945
5946
+ auto args_size = size_of( bcx, args_ty) . val;
5947
+
5945
5948
log_err "Building call to start_task" ;
5946
5949
log_err #fmt( "ty(start_task) = %s" ,
5947
5950
val_str( bcx. fcx. lcx. ccx. tn,
@@ -5958,12 +5961,12 @@ fn trans_spawn(&@block_ctxt cx,
5958
5961
log_err #fmt( "ty(llargs) = %s" ,
5959
5962
val_str( bcx. fcx. lcx. ccx. tn,
5960
5963
llargs_i) ) ;
5961
- log_err #fmt( "ty(num_args ) = %s" ,
5964
+ log_err #fmt( "ty(args_size ) = %s" ,
5962
5965
val_str( bcx. fcx. lcx. ccx. tn,
5963
- C_int ( num_args as int ) ) ) ;
5966
+ args_size ) ) ;
5964
5967
bcx. build. Call ( bcx. fcx. lcx. ccx. upcalls. start_task,
5965
5968
[ bcx. fcx. lltaskptr, new_task,
5966
- llfnptr_i, llargs_i, C_int ( num_args as int ) ] ) ;
5969
+ llfnptr_i, llargs_i, args_size ] ) ;
5967
5970
log_err "Done" ;
5968
5971
5969
5972
/*
0 commit comments