@@ -2829,18 +2829,21 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s
2829
2829
2830
2830
/* we first do all conversions */
2831
2831
tmp_locals = g_newa (int , sig -> param_count );
2832
+ int arg_shift = 0 ; // used to skip arguments when we have lowered structs
2832
2833
for (i = 0 ; i < sig -> param_count ; i ++ ) {
2833
2834
MonoType * t = sig -> params [i ];
2834
2835
MonoMarshalSpec * spec = mspecs [i + 1 ];
2835
2836
2836
2837
if (spec && spec -> native == MONO_NATIVE_CUSTOM ) {
2837
- tmp_locals [i ] = mono_emit_marshal (m , i , t , mspecs [i + 1 ], 0 , & sig -> params [i ], MARSHAL_ACTION_MANAGED_CONV_IN );
2838
+ tmp_locals [i ] = mono_emit_marshal (m , i , t , mspecs [i + 1 ], 0 , & csig -> params [i + arg_shift ], MARSHAL_ACTION_MANAGED_CONV_IN );
2838
2839
} else {
2839
2840
switch (t -> type ) {
2840
2841
case MONO_TYPE_VALUETYPE :
2841
2842
if (mono_method_signature_has_ext_callconv (csig , MONO_EXT_CALLCONV_SWIFTCALL ))
2842
2843
{
2843
2844
tmp_locals [i ] = 0 ;
2845
+ if (!swift_lowering [i ].by_reference )
2846
+ arg_shift += swift_lowering [i ].num_lowered_elements - 1 ;
2844
2847
break ;
2845
2848
}
2846
2849
case MONO_TYPE_OBJECT :
@@ -2849,7 +2852,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s
2849
2852
case MONO_TYPE_SZARRAY :
2850
2853
case MONO_TYPE_STRING :
2851
2854
case MONO_TYPE_BOOLEAN :
2852
- tmp_locals [i ] = mono_emit_marshal (m , i , t , mspecs [i + 1 ], 0 , & sig -> params [i ], MARSHAL_ACTION_MANAGED_CONV_IN );
2855
+ tmp_locals [i ] = mono_emit_marshal (m , i , t , mspecs [i + 1 ], 0 , & csig -> params [i + arg_shift ], MARSHAL_ACTION_MANAGED_CONV_IN );
2853
2856
break ;
2854
2857
default :
2855
2858
tmp_locals [i ] = 0 ;
@@ -2873,7 +2876,7 @@ emit_managed_wrapper_ilgen (MonoMethodBuilder *mb, MonoMethodSignature *invoke_s
2873
2876
mono_mb_emit_icall (mb , mono_gchandle_get_target_internal );
2874
2877
}
2875
2878
2876
- int arg_shift = 0 ;
2879
+ arg_shift = 0 ;
2877
2880
int lowered_struct_so_far = 0 ;
2878
2881
for (i = 0 ; i < csig -> param_count ; i ++ ) {
2879
2882
MonoType * t = csig -> params [i ];
0 commit comments