2009-12-30 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Wed, 30 Dec 2009 13:43:20 +0000 (13:43 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Wed, 30 Dec 2009 13:43:20 +0000 (13:43 -0000)
* marshal.c (mono_mb_emit_restore_result): Properly handle generic enums.

2009-12-30  Rodrigo Kumpera  <rkumpera@novell.com>

* mini.c:
* method-to.ir.c:
* mini-*.c: Properly handle generic enums.

Fixes #566294

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

14 files changed:
mono/metadata/ChangeLog
mono/metadata/marshal.c
mono/mini/ChangeLog
mono/mini/method-to-ir.c
mono/mini/mini-alpha.c
mono/mini/mini-amd64.c
mono/mini/mini-arm.c
mono/mini/mini-ia64.c
mono/mini/mini-mips.c
mono/mini/mini-ppc.c
mono/mini/mini-s390.c
mono/mini/mini-sparc.c
mono/mini/mini-x86.c
mono/mini/mini.c

index d0c8149ba5a9a9345dcc1bc3d192729598bb239f..d10196a2c272b7fd5e5ab7ee14a65f4a8708ecba 100644 (file)
@@ -1,3 +1,7 @@
+2009-12-30  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * marshal.c (mono_mb_emit_restore_result): Properly handle generic enums.
+
 2009-12-26  Zoltan Varga  <vargaz@gmail.com>
 
        * monitor.c (ves_icall_System_Threading_Monitor_Monitor_wait): Don't close the
index fae24a4aa07a063ed71b16845808925a647ab6f4..4ad425fad99bc310f73b432e16ae6c4f49ac2480 100644 (file)
@@ -2603,7 +2603,7 @@ mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type)
                mono_mb_emit_byte (mb, mono_type_to_ldind (return_type));
                break;
        case MONO_TYPE_GENERICINST:
-               if (!mono_type_generic_inst_is_valuetype (return_type))
+               if (!mono_type_generic_inst_is_valuetype (t))
                        break;
                /* fall through */
        case MONO_TYPE_VALUETYPE: {
@@ -4297,6 +4297,7 @@ mono_marshal_get_runtime_invoke (MonoMethod *method, gboolean virtual)
                        continue;
                }
 
+               /*FIXME 'this doesn't handle generic enums. Shouldn't we?*/
                type = sig->params [i]->type;
 handle_enum:
                switch (type) {
index 8bb960de6bee2917b767d46a18e5ea75867edb9e..efedf9edcb847f8e24c3ac2b2b43d8c095e2bfe1 100644 (file)
@@ -1,3 +1,11 @@
+2009-12-30  Rodrigo Kumpera  <rkumpera@novell.com>
+
+       * mini.c:
+       * method-to.ir.c:
+       * mini-*.c: Properly handle generic enums.
+
+       Fixes #566294
+
 2009-12-28  Zoltan Varga  <vargaz@gmail.com>
 
        * method-to-ir.c (mono_method_to_ir): Handle the failure of mono_class_vtable ()
index 988f0b291f05b59befc45c6f3a89c833fd7ce518..5a38eb3b210d21454586d8b8e7e6f8a6d400bd16 100644 (file)
@@ -1098,7 +1098,8 @@ type_from_stack_type (MonoInst *ins) {
 static G_GNUC_UNUSED int
 type_to_stack_type (MonoType *t)
 {
-       switch (mono_type_get_underlying_type (t)->type) {
+       t = mono_type_get_underlying_type (t);
+       switch (t->type) {
        case MONO_TYPE_I1:
        case MONO_TYPE_U1:
        case MONO_TYPE_BOOLEAN:
index 2c372c44cb6e6190a817150dfeabbe88cfe4f6f6..7983cc2a4ee8b77922f7d54bd979f5c35c023772 100644 (file)
@@ -4422,7 +4422,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gbool
        cinfo->ret.reg = alpha_f0;
        break;
      case MONO_TYPE_GENERICINST:
-       if (!mono_type_generic_inst_is_valuetype (sig->ret))
+       if (!mono_type_generic_inst_is_valuetype (ret_type))
         {
           cinfo->ret.storage = ArgInIReg;
           cinfo->ret.reg = alpha_r0;
@@ -4525,7 +4525,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gbool
         add_general (pgr, &stack_size, ainfo);
         break;
        case MONO_TYPE_GENERICINST:
-        if (!mono_type_generic_inst_is_valuetype (sig->params [i]))
+        if (!mono_type_generic_inst_is_valuetype (ptype))
           {
             add_general (pgr, &stack_size, ainfo);
             break;
index d8b6a66524688f3a974569bec3ff9f444af559ee..6b02c4fc29fbce543a627d21f3b726aa651cdafe 100644 (file)
@@ -675,7 +675,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
                        cinfo->ret.reg = AMD64_XMM0;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                                cinfo->ret.storage = ArgInIReg;
                                cinfo->ret.reg = AMD64_RAX;
                                break;
@@ -6553,9 +6553,9 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
        guchar *code = p;
        int save_mode = SAVE_NONE;
        MonoMethod *method = cfg->method;
-       int rtype = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret)->type;
+       MonoType *ret_type = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret);
        
-       switch (rtype) {
+       switch (ret_type->type) {
        case MONO_TYPE_VOID:
                /* special case string .ctor icall */
                if (strcmp (".ctor", method->name) && method->klass == mono_defaults.string_class)
@@ -6572,7 +6572,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
                save_mode = SAVE_XMM;
                break;
        case MONO_TYPE_GENERICINST:
-               if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) {
+               if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                        save_mode = SAVE_EAX;
                        break;
                }
index 55b27bf8ef7a76227ea54d39a73694e2969f1bd2..8f2a4afc4e4c6347cf4a2a301e31c102ef9121cc 100644 (file)
@@ -902,7 +902,7 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
                        n++;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (simpletype)) {
                                cinfo->args [n].size = sizeof (gpointer);
                                add_general (&gr, &stack_size, cinfo->args + n, TRUE);
                                n++;
@@ -1015,7 +1015,7 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
                        cinfo->ret.storage = RegTypeFP;*/
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (simpletype)) {
                                cinfo->ret.storage = RegTypeGeneral;
                                cinfo->ret.reg = ARMREG_R0;
                                break;
index 1d9b54ed0c45d24294c1a98896572287029ded73..a61142d7eb526190312e2d3c9d6e9cc0f1b8e22b 100644 (file)
@@ -401,7 +401,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
                        cinfo->ret.reg = 8;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                                cinfo->ret.storage = ArgInIReg;
                                cinfo->ret.reg = IA64_R8;
                                break;
@@ -494,7 +494,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
                        add_general (&gr, &stack_size, ainfo);
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (ptype)) {
                                add_general (&gr, &stack_size, ainfo);
                                break;
                        }
index 92bff32ea743db6b728e940e18e85f85ee547ffc..e2487779fde15282ddbd1add8a6357b340475a41 100644 (file)
@@ -897,7 +897,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
 {
        guint i;
        int n = sig->hasthis + sig->param_count;
-       guint32 simpletype;
+       MonoType* simpletype;
        CallInfo *cinfo = g_malloc0 (sizeof (CallInfo) + sizeof (ArgInfo) * n);
 
        cinfo->fr = MIPS_FIRST_FPARG_REG;
@@ -933,8 +933,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        n++;
                        continue;
                }
-               simpletype = mono_type_get_underlying_type (sig->params [i])->type;
-               switch (simpletype) {
+               simpletype = mono_type_get_underlying_type (sig->params [i]);
+               switch (simpletype->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_I1:
                case MONO_TYPE_U1:
@@ -972,7 +972,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        n++;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (simpletype)) {
                                cinfo->args [n].size = sizeof (gpointer);
                                add_int32_arg (cinfo, &cinfo->args[n]);
                                n++;
@@ -1096,8 +1096,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
        }
 
        {
-               simpletype = mono_type_get_underlying_type (sig->ret)->type;
-               switch (simpletype) {
+               simpletype = mono_type_get_underlying_type (sig->ret);
+               switch (simpletype->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_I1:
                case MONO_TYPE_U1:
@@ -1127,7 +1127,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        cinfo->ret.regtype = RegTypeFP;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (simpletype)) {
                                cinfo->ret.reg = mips_v0;
                                break;
                        }
index 0ffb0ef3acfcae93cc6e5111d0f182dd8b86ffe5..e845267f003fe9d084fbb5f98d3a1e126c425b86 100644 (file)
@@ -1000,7 +1000,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
 {
        guint i, fr, gr;
        int n = sig->hasthis + sig->param_count;
-       guint32 simpletype;
+       MonoType *simpletype;
        guint32 stack_size = 0;
        CallInfo *cinfo = g_malloc0 (sizeof (CallInfo) + sizeof (ArgInfo) * n);
 
@@ -1035,8 +1035,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        n++;
                        continue;
                }
-               simpletype = mini_type_get_underlying_type (NULL, sig->params [i])->type;
-               switch (simpletype) {
+               simpletype = mini_type_get_underlying_type (NULL, sig->params [i]);
+               switch (simpletype->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_I1:
                case MONO_TYPE_U1:
@@ -1071,7 +1071,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        n++;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (simpletype)) {
                                cinfo->args [n].size = sizeof (gpointer);
                                add_general (&gr, &stack_size, cinfo->args + n, TRUE);
                                n++;
@@ -1084,7 +1084,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        MonoClass *klass;
 
                        klass = mono_class_from_mono_type (sig->params [i]);
-                       if (simpletype == MONO_TYPE_TYPEDBYREF)
+                       if (simpletype->type == MONO_TYPE_TYPEDBYREF)
                                size = sizeof (MonoTypedRef);
                        else if (is_pinvoke)
                            size = mono_class_native_size (klass, NULL);
@@ -1215,8 +1215,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
        }
 
        {
-               simpletype = mini_type_get_underlying_type (NULL, sig->ret)->type;
-               switch (simpletype) {
+               simpletype = mini_type_get_underlying_type (NULL, sig->ret);
+               switch (simpletype->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_I1:
                case MONO_TYPE_U1:
@@ -1246,7 +1246,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
                        cinfo->ret.regtype = RegTypeFP;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (simpletype)) {
                                cinfo->ret.reg = ppc_r3;
                                break;
                        }
index 7f5d678c92c96ac85d9dafe5d96bd21384211461..2ea6b8c24ed4d3114e2c7ca6c1ec8f63986092f1 100644 (file)
@@ -1436,7 +1436,7 @@ enum_retvalue:
                        sz->code_size += 4;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                                cinfo->ret.reg = s390_r2;
                                sz->code_size += 4;
                                break;
@@ -1560,7 +1560,7 @@ enum_retvalue:
                        nParm++;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (ptype)) {
                                cinfo->args[nParm].size = sizeof(gpointer);
                                add_general (&gr, sz, cinfo->args+nParm, TRUE);
                                nParm++;
index b1825eb6c64f61d9a5866b1ac575c2c603da3f31..cf197fd36527199fab472656722d8392d312fec6 100644 (file)
@@ -571,7 +571,7 @@ get_call_info (MonoCompile *cfg, MonoMethodSignature *sig, gboolean is_pinvoke)
                        add_general (&gr, &stack_size, ainfo, FALSE);
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (ptype)) {
                                add_general (&gr, &stack_size, ainfo, FALSE);
                                break;
                        }
@@ -670,7 +670,7 @@ get_call_info (MonoCompile *cfg, MonoMethodSignature *sig, gboolean is_pinvoke)
                cinfo->ret.reg = sparc_f0;
                break;
        case MONO_TYPE_GENERICINST:
-               if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+               if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                        cinfo->ret.storage = ArgInIReg;
                        cinfo->ret.reg = sparc_i0;
                        if (gr < 1)
index 40ab916edccf072c3c298ac4d3526d66254448f4..c0d8e1322c0d2264567774593a42d44ee192696e 100644 (file)
@@ -342,7 +342,7 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
                        cinfo->ret.storage = ArgOnDoubleFpStack;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                                cinfo->ret.storage = ArgInIReg;
                                cinfo->ret.reg = X86_EAX;
                                break;
@@ -431,7 +431,7 @@ get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoM
                        add_general (&gr, &stack_size, ainfo);
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (ptype)) {
                                add_general (&gr, &stack_size, ainfo);
                                break;
                        }
@@ -1505,8 +1505,9 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
        guchar *code = p;
        int arg_size = 0, stack_usage = 0, save_mode = SAVE_NONE;
        MonoMethod *method = cfg->method;
-       
-       switch (mini_type_get_underlying_type (cfg->generic_sharing_context, mono_method_signature (method)->ret)->type) {
+       MonoType *ret_type = mini_type_get_underlying_type (cfg->generic_sharing_context, mono_method_signature (method)->ret);
+
+       switch (ret_type->type) {
        case MONO_TYPE_VOID:
                /* special case string .ctor icall */
                if (strcmp (".ctor", method->name) && method->klass == mono_defaults.string_class) {
@@ -1526,7 +1527,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
                stack_usage = enable_arguments ? 16 : 8;
                break;
        case MONO_TYPE_GENERICINST:
-               if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) {
+               if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                        save_mode = SAVE_EAX;
                        stack_usage = enable_arguments ? 8 : 4;
                        break;
index 6f856db23b093765e88c8dd7d4c22304e5e50169..42326f278588f9eca0037b3c2ae94f3b3ae90558 100644 (file)
@@ -649,7 +649,9 @@ mono_type_to_load_membase (MonoCompile *cfg, MonoType *type)
        if (type->byref)
                return OP_LOAD_MEMBASE;
 
-       switch (mono_type_get_underlying_type (type)->type) {
+       type = mono_type_get_underlying_type (type);
+
+       switch (type->type) {
        case MONO_TYPE_I1:
                return OP_LOADI1_MEMBASE;
        case MONO_TYPE_U1: