[Mono-dev] crash on first runtime_invoke (using MSVC build)

Robert Jordan robertj at gmx.net
Sat Jan 15 14:25:56 EST 2011


Hi,

On 15.01.2011 01:20, Zoltan Varga wrote:
> Hi,
>
>    Do you have a testcase, or does this happen with all apps ?


See mono/tests/delegate1.cs

csig->pinvoke = 1 leads to STDCALL under Windows. This means
that the "runtime_invoke" declaration in
mini.c:mono_jit_runtime_invoke is incorrect:

	MonoObject *(*runtime_invoke) (MonoObject *this, void **params, 
MonoObject **exc, void* compiled_method);

should be

	MonoObject *(__stdcall *runtime_invoke) (MonoObject *this, void 
**params, MonoObject **exc, void* compiled_method);


A proposed patch (IMO, this is less uglier than injecting a conditional
__stdcall in mono_jit_runtime_invoke()):


diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c
index 4c52421..2f02a4d 100644
--- a/mono/metadata/marshal.c
+++ b/mono/metadata/marshal.c
@@ -4594,6 +4594,9 @@ mono_marshal_get_runtime_invoke (MonoMethod 
*method, gboolean virtual)
  	csig->params [2] = &mono_defaults.int_class->byval_arg;
  	csig->params [3] = &mono_defaults.int_class->byval_arg;
  	csig->pinvoke = 1;
+#if TARGET_WIN32
+	csig->call_convention = MONO_CALL_C;
+#endif

  	name = mono_signature_to_name (callsig, virtual ? 
"runtime_invoke_virtual" : "runtime_invoke");
  	mb = mono_mb_new (target_klass, name,  MONO_WRAPPER_RUNTIME_INVOKE);



Robert


>
>                     Zoltan
>
> On Fri, Jan 14, 2011 at 10:58 PM, Virgile Bello<virgile.bello at gmail.com>wrote:
>
>> Recently, I had some problem with the VS2010 build of mono.
>> Runtime check complains ESP is wrong after first time runtime_invoke is
>> called.
>>
>> I traced it back to this single-line commit.
>> (Reverting this single line avoids the problem on any version up to master)
>>
>> 08f0bcaad89540260323f24811cbf896cfe471ed
>>
>>     Mark runtime invoke wrappers as pinvoke, since they are called from
>> native code.
>>
>> diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c
>> index 476d129..c586555 100644
>> --- a/mono/metadata/marshal.c
>> +++ b/mono/metadata/marshal.c
>> @@ -4571,6 +4571,7 @@ mono_marshal_get_runtime_invoke (MonoMethod *method,
>> gboolean virtual)
>>          csig->params [1] =&mono_defaults.int_class->byval_arg;
>>          csig->params [2] =&mono_defaults.int_class->byval_arg;
>>          csig->params [3] =&mono_defaults.int_class->byval_arg;
>> +       csig->pinvoke = 1;
>>
>>          name = mono_signature_to_name (callsig, virtual ?
>> "runtime_invoke_virtual" : "runtime_invoke");
>>          mb = mono_mb_new (target_klass, name,
>>   MONO_WRAPPER_RUNTIME_INVOKE);
>>
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>>
>>
>
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list




More information about the Mono-devel-list mailing list