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.
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)
/* 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;
}
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
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;
}
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;
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;
}
void
mono_destroy_compile (MonoCompile *cfg)
{
+ GSList *l;
+
if (cfg->header)
mono_metadata_free_mh (cfg->header);
//mono_mempool_stats (cfg->mempool);
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);
/* 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 */