2010-05-26 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 26 May 2010 14:14:10 +0000 (14:14 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 26 May 2010 14:14:10 +0000 (14:14 -0000)
* method-to-ir.c: Instead of freeing method headers immediately, save them in a list in
MonoCompile, and free them in mono_destroy_compile (), since the MonoType's in them could
be referenced even after the header is freed.

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

mono/mini/ChangeLog
mono/mini/method-to-ir.c
mono/mini/mini.c
mono/mini/mini.h

index acba0aadec10de4094e207838dffb0de13b77ac9..02cb7161dc3258e25da4afb43e2015347378c052 100755 (executable)
@@ -1,5 +1,9 @@
 2010-05-26  Zoltan Varga  <vargaz@gmail.com>
 
+       * method-to-ir.c: Instead of freeing method headers immediately, save them in a list in
+       MonoCompile, and free them in mono_destroy_compile (), since the MonoType's in them could
+       be referenced even after the header is freed.
+
        * aot-runtime.c: Remove the half finished support for decoding the .arm_exidx
        section.
 
index 464d0c417f37ea0f7c4e309bbefde79045daf2c2..73f1ea3403c7fcdb45e1405025c5afacc10569ae 100644 (file)
@@ -4613,7 +4613,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
                        EMIT_NEW_TEMPLOAD (cfg, ins, rvar->inst_c0);
                        *sp++ = ins;
                }
-               mono_metadata_free_mh (cheader);
+               cfg->headers_to_free = g_slist_prepend_mempool (cfg->mempool, cfg->headers_to_free, cheader);
                return costs + 1;
        } else {
                if (cfg->verbose_level > 2)
@@ -4624,7 +4624,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
                /* This gets rid of the newly added bblocks */
                cfg->cbb = prev_cbb;
        }
-       mono_metadata_free_mh (cheader);
+       cfg->headers_to_free = g_slist_prepend_mempool (cfg->mempool, cfg->headers_to_free, cheader);
        return 0;
 }
 
@@ -4997,7 +4997,7 @@ set_exception_type_from_invalid_il (MonoCompile *cfg, MonoMethod *method, unsign
        cfg->exception_message = g_strdup_printf ("Invalid IL code in %s: %s\n", method_fname, method_code);
        g_free (method_fname);
        g_free (method_code);
-       mono_metadata_free_mh (header);
+       cfg->headers_to_free = g_slist_prepend_mempool (cfg->mempool, cfg->headers_to_free, header);
 }
 
 static void
@@ -9827,7 +9827,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
                cfg->exception_type = MONO_EXCEPTION_INVALID_PROGRAM;
                cfg->exception_message = g_strdup_printf ("Method %s is too complex.", mname);
                g_free (mname);
-               mono_metadata_free_mh (header);
+               cfg->headers_to_free = g_slist_prepend_mempool (cfg->mempool, cfg->headers_to_free, header);
                mono_basic_block_free (original_bb);
                return -1;
        }
@@ -9835,7 +9835,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
        if ((cfg->verbose_level > 2) && (cfg->method == method)) 
                mono_print_code (cfg, "AFTER METHOD-TO-IR");
 
-       mono_metadata_free_mh (header);
+       cfg->headers_to_free = g_slist_prepend_mempool (cfg->mempool, cfg->headers_to_free, header);
        mono_basic_block_free (original_bb);
        return inline_costs;
  
@@ -9858,7 +9858,7 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
        g_slist_free (class_inits);
        mono_basic_block_free (original_bb);
        dont_inline = g_list_remove (dont_inline, method);
-       mono_metadata_free_mh (header);
+       cfg->headers_to_free = g_slist_prepend_mempool (cfg->mempool, cfg->headers_to_free, header);
        return -1;
 }
 
index 2f033920a7862ade098e506e582bbdcd828f47a5..5a6bcdba90b743d14e47bf21e221a92f39019c60 100644 (file)
@@ -2201,6 +2201,8 @@ mono_verify_cfg (MonoCompile *cfg)
 void
 mono_destroy_compile (MonoCompile *cfg)
 {
+       GSList *l;
+
        if (cfg->header)
                mono_metadata_free_mh (cfg->header);
        //mono_mempool_stats (cfg->mempool);
@@ -2211,11 +2213,13 @@ mono_destroy_compile (MonoCompile *cfg)
                g_hash_table_destroy (cfg->spvars);
        if (cfg->exvars)
                g_hash_table_destroy (cfg->exvars);
-       mono_mempool_destroy (cfg->mempool);
+       for (l = cfg->headers_to_free; l; l = l->next)
+               mono_metadata_free_mh (l->data);
        g_list_free (cfg->ldstr_list);
        g_hash_table_destroy (cfg->token_info_hash);
        if (cfg->abs_patches)
                g_hash_table_destroy (cfg->abs_patches);
+       mono_mempool_destroy (cfg->mempool);
 
        g_free (cfg->varinfo);
        g_free (cfg->vars);
index 9626fa644b5cb76998e1c0bbef92ad263aafa43a..8d9b431717bc5ce8e9505eb0f2b91a987f406906 100644 (file)
@@ -1149,6 +1149,9 @@ typedef struct {
        /* The encoded sequence point info */
        MonoSeqPointInfo *seq_point_info;
 
+       /* Method headers which need to be freed after compilation */
+       GSList *headers_to_free;
+
        /* Used by AOT */
        guint32 got_offset, ex_info_offset, method_info_offset;
        /* Symbol used to refer to this method in generated assembly */