Fri Jun 18 18:24:28 CEST 2004 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Fri, 18 Jun 2004 15:34:57 +0000 (15:34 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Fri, 18 Jun 2004 15:34:57 +0000 (15:34 -0000)
* mini.c, mini.h, mini-ppc.c: handle varargs methods with a special
case until bug #59509 is fixed (shows up in #60332).

svn path=/trunk/mono/; revision=29884

mono/mini/ChangeLog
mono/mini/mini-ppc.c
mono/mini/mini.c
mono/mini/mini.h

index 325a17e279998f9978392d2b6d8b5e5358aa1646..98534fc80f2c47bf6736753899b6e5f67c2dde3e 100644 (file)
@@ -1,4 +1,9 @@
 
+Fri Jun 18 18:24:28 CEST 2004 Paolo Molaro <lupus@ximian.com>
+
+       * mini.c, mini.h, mini-ppc.c: handle varargs methods with a special
+       case until bug #59509 is fixed (shows up in #60332).
+
 Tue Jun 15 16:36:51 CEST 2004 Paolo Molaro <lupus@ximian.com>
 
        * mini.c: make sure the needed wrappers are compiled, too, with
index 1ee8153b405b71c673527e5d6f3aed2c7b6987ec..b9b09430eee253419cf6d50f11fb2a7b725b794c 100644 (file)
@@ -575,6 +575,11 @@ mono_arch_allocate_vars (MonoCompile *m)
        /* allow room for the vararg method args: void* and long/double */
        if (mono_jit_trace_calls != NULL && mono_trace_eval (m->method))
                m->param_area = MAX (m->param_area, sizeof (gpointer)*8);
+       /* this is bug #60332: remove when #59509 is fixed, so no weird vararg 
+        * call convs needs to be handled this way.
+        */
+       if (m->flags & MONO_CFG_HAS_VARARGS)
+               m->param_area = MAX (m->param_area, sizeof (gpointer)*8);
 
        header = ((MonoMethodNormal *)m->method)->header;
 
index 2d1927a1863baf07d064a9dc25947229f0afaced..5c717b8e11dfceb5167b86992e68d1833d64fc8d 100644 (file)
@@ -2310,6 +2310,7 @@ mini_get_ldelema_ins (MonoCompile *cfg, MonoBasicBlock *bblock, MonoMethod *cmet
        }
 
        temp = mono_emit_native_call (cfg, bblock, mono_icall_get_wrapper (info), info->sig, sp, ip, FALSE);
+       cfg->flags |= MONO_CFG_HAS_VARARGS;
 
        NEW_TEMPLOAD (cfg, addr, temp);
        return addr;
@@ -3913,6 +3914,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                        if (cmethod->klass->parent == mono_defaults.array_class) {
                                NEW_METHODCONST (cfg, *sp, cmethod);
                                temp = mono_emit_native_call (cfg, bblock, mono_array_new_va, fsig, sp, ip, FALSE);
+                               cfg->flags |= MONO_CFG_HAS_VARARGS;
 
                        } else if (cmethod->string_ctor) {
                                /* we simply pass a null pointer */
index 3d44acaf3173da1bb30264508271c6227c182a22..117b1f7e97a0e78bc694641efd3c1817e64d77ad 100644 (file)
@@ -538,7 +538,8 @@ typedef struct {
 typedef enum {
        MONO_CFG_HAS_ALLOCA = 1 << 0,
        MONO_CFG_HAS_CALLS  = 1 << 1,
-       MONO_CFG_HAS_LDELEMA  = 1 << 2
+       MONO_CFG_HAS_LDELEMA  = 1 << 2,
+       MONO_CFG_HAS_VARARGS  = 1 << 3
 } MonoCompileFlags;
 
 typedef struct {