Don't crash when inlining static methods called using callvirt. Fixes #668170.
authorZoltan Varga <vargaz@gmail.com>
Sun, 30 Jan 2011 05:59:42 +0000 (06:59 +0100)
committerZoltan Varga <vargaz@gmail.com>
Sun, 30 Jan 2011 05:59:42 +0000 (06:59 +0100)
mono/mini/method-to-ir.c

index a1f305a518c0b70c370b8b457739d062a8300f84..d2a081c14d65afcccb1e14b21ff26909b9485d87 100644 (file)
@@ -4831,7 +4831,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
        guint32 prev_cil_offset_to_bb_len;
        MonoMethod *prev_current_method;
        MonoGenericContext *prev_generic_context;
-       gboolean ret_var_set, prev_ret_var_set;
+       gboolean ret_var_set, prev_ret_var_set, virtual = FALSE;
 
        g_assert (cfg->exception_type == MONO_EXCEPTION_NONE);
 
@@ -4878,7 +4878,6 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
                rvar = mono_compile_create_var (cfg, fsig->ret, OP_LOCAL);
        }
 
-
        prev_locals = cfg->locals;
        cfg->locals = mono_mempool_alloc0 (cfg->mempool, cheader->num_locals * sizeof (MonoInst*));     
        for (i = 0; i < cheader->num_locals; ++i)
@@ -4909,7 +4908,10 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
        prev_generic_context = cfg->generic_context;
        prev_ret_var_set = cfg->ret_var_set;
 
-       costs = mono_method_to_ir (cfg, cmethod, sbblock, ebblock, rvar, dont_inline, sp, real_offset, *ip == CEE_CALLVIRT);
+       if (*ip == CEE_CALLVIRT && !(cmethod->flags & METHOD_ATTRIBUTE_STATIC))
+               virtual = TRUE;
+
+       costs = mono_method_to_ir (cfg, cmethod, sbblock, ebblock, rvar, dont_inline, sp, real_offset, virtual);
 
        ret_var_set = cfg->ret_var_set;