2006-08-18 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Fri, 18 Aug 2006 10:25:27 +0000 (10:25 -0000)
committerZoltan Varga <vargaz@gmail.com>
Fri, 18 Aug 2006 10:25:27 +0000 (10:25 -0000)
* mini.c (mono_allocate_stack_slots_full): Fix yet another place where byref
is not handled because it is stored as a flag and not as a type ctor. Fixes
#79016.

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

mono/mini/ChangeLog
mono/mini/mini.c

index 5c1c51d28fcd742217db35a7de6bb5be9f72d0af..77c1efc297fc636f3e169675261f5bab6b8b966a 100644 (file)
@@ -1,3 +1,9 @@
+2006-08-18  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini.c (mono_allocate_stack_slots_full): Fix yet another place where byref
+       is not handled because it is stored as a flag and not as a type ctor. Fixes
+       #79016.
+
 2006-08-17  Zoltan Varga  <vargaz@gmail.com>
 
        * aot-compiler.c: Fix computation of GOT slot statistics.
index cc2464de69244457b116d260822998d260e1029a..485b4477048459f573b0beca90dc5a7249074763 100644 (file)
@@ -7906,28 +7906,32 @@ mono_allocate_stack_slots_full (MonoCompile *m, gboolean backward, guint32 *stac
                }
 
                t = mono_type_get_underlying_type (inst->inst_vtype);
-               switch (t->type) {
-               case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (t)) {
-                               slot_info = &scalar_stack_slots [t->type];
-                               break;
-                       }
-                       /* Fall through */
-               case MONO_TYPE_VALUETYPE:
-                       for (i = 0; i < nvtypes; ++i)
-                               if (t->data.klass == vtype_stack_slots [i].vtype)
+               if (t->byref) {
+                       slot_info = &scalar_stack_slots [MONO_TYPE_I];
+               } else {
+                       switch (t->type) {
+                       case MONO_TYPE_GENERICINST:
+                               if (!mono_type_generic_inst_is_valuetype (t)) {
+                                       slot_info = &scalar_stack_slots [t->type];
                                        break;
-                       if (i < nvtypes)
-                               slot_info = &vtype_stack_slots [i];
-                       else {
-                               g_assert (nvtypes < 256);
-                               vtype_stack_slots [nvtypes].vtype = t->data.klass;
-                               slot_info = &vtype_stack_slots [nvtypes];
-                               nvtypes ++;
+                               }
+                               /* Fall through */
+                       case MONO_TYPE_VALUETYPE:
+                               for (i = 0; i < nvtypes; ++i)
+                                       if (t->data.klass == vtype_stack_slots [i].vtype)
+                                               break;
+                               if (i < nvtypes)
+                                       slot_info = &vtype_stack_slots [i];
+                               else {
+                                       g_assert (nvtypes < 256);
+                                       vtype_stack_slots [nvtypes].vtype = t->data.klass;
+                                       slot_info = &vtype_stack_slots [nvtypes];
+                                       nvtypes ++;
+                               }
+                               break;
+                       default:
+                               slot_info = &scalar_stack_slots [t->type];
                        }
-                       break;
-               default:
-                       slot_info = &scalar_stack_slots [t->type];
                }
 
                slot = 0xffffff;