[mini] Cleanup alloca: call twice instead of once, and shrink allocation slightly...
authorJay Krell <jaykrell@microsoft.com>
Thu, 15 Aug 2019 22:14:37 +0000 (15:14 -0700)
committerAleksey Kliger (λgeek) <alklig@microsoft.com>
Thu, 15 Aug 2019 22:14:37 +0000 (18:14 -0400)
It is an actual function call at least on Windows.

Commit migrated from https://github.com/mono/mono/commit/6c05cfab5996387321164d84c267d3100b6bfb66

src/mono/mono/mini/mini-runtime.c

index 0418d67..a78a5c6 100644 (file)
@@ -2892,10 +2892,8 @@ mono_llvmonly_runtime_invoke (MonoMethod *method, RuntimeInvokeInfo *info, void
        MonoMethodSignature *sig = info->sig;
        MonoDomain *domain = mono_domain_get ();
        MonoObject *(*runtime_invoke) (MonoObject *this_obj, void **params, MonoObject **exc, void* compiled_method);
-       gpointer *args;
        gpointer retval_ptr;
        guint8 retval [256];
-       gpointer *param_refs;
        int i, pindex;
 
        error_init (error);
@@ -2910,8 +2908,10 @@ mono_llvmonly_runtime_invoke (MonoMethod *method, RuntimeInvokeInfo *info, void
         * This code also handles invocation of gsharedvt methods directly, no
         * out wrappers are used in that case.
         */
-       args = (void **)g_alloca ((sig->param_count + sig->hasthis + 2) * sizeof (gpointer));
-       param_refs = (gpointer*)g_alloca ((sig->param_count + sig->hasthis + 2) * sizeof (gpointer));
+       // allocate param_refs = param_count and args = param_count + hasthis + 2.
+       int const param_count = sig->param_count;
+       gpointer* const param_refs = g_newa (gpointer, param_count * 2 + sig->hasthis + 2);
+       gpointer* const args = param_refs + param_count;
        pindex = 0;
        /*
         * The runtime invoke wrappers expects pointers to primitive types, so have to
@@ -2920,7 +2920,7 @@ mono_llvmonly_runtime_invoke (MonoMethod *method, RuntimeInvokeInfo *info, void
        if (sig->hasthis)
                args [pindex ++] = &obj;
        if (sig->ret->type != MONO_TYPE_VOID) {
-               retval_ptr = (gpointer)&retval;
+               retval_ptr = &retval;
                args [pindex ++] = &retval_ptr;
        }
        for (i = 0; i < sig->param_count; ++i) {