Mon Mar 8 17:58:26 CET 2010 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Mon, 8 Mar 2010 16:59:39 +0000 (16:59 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Mon, 8 Mar 2010 16:59:39 +0000 (16:59 -0000)
* mini.h, *.c: prepare for MonoMethodHeader to become a transient entity.

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

22 files changed:
mono/mini/ChangeLog
mono/mini/branch-opts.c
mono/mini/debug-mini.c
mono/mini/debugger-agent.c
mono/mini/dominators.c
mono/mini/dwarfwriter.c
mono/mini/method-to-ir.c
mono/mini/mini-alpha.c
mono/mini/mini-amd64.c
mono/mini/mini-arm.c
mono/mini/mini-hppa.c
mono/mini/mini-ia64.c
mono/mini/mini-llvm.c
mono/mini/mini-mips.c
mono/mini/mini-ppc.c
mono/mini/mini-s390.c
mono/mini/mini-s390x.c
mono/mini/mini-sparc.c
mono/mini/mini-x86.c
mono/mini/mini.c
mono/mini/mini.h
mono/mini/regalloc2.c

index 3e26393320e145b9a025caec51206cf60dabbc10..52ba8f4e82f418cdd13072ed4384f6ca78b519cc 100755 (executable)
@@ -1,4 +1,8 @@
 
+Mon Mar 8 17:58:26 CET 2010 Paolo Molaro <lupus@ximian.com>
+
+       * mini.h, *.c: prepare for MonoMethodHeader to become a transient entity.
+
 Mon Mar 8 17:35:26 CET 2010 Paolo Molaro <lupus@ximian.com>
 
        * driver.c: report also other misc build options.
index 97437739ee333b9164a868de26e0cd63566b2823..b6b22f285956ef92262ff2b66873863c8f1c7acc 100644 (file)
@@ -32,8 +32,7 @@ mono_bb_is_fall_through (MonoCompile *cfg, MonoBasicBlock *bb)
 MonoInst *
 mono_branch_optimize_exception_target (MonoCompile *cfg, MonoBasicBlock *bb, const char * exname)
 {
-       MonoMethod *method = cfg->method;
-       MonoMethodHeader *header = mono_method_get_header (method);
+       MonoMethodHeader *header = cfg->header;
        MonoExceptionClause *clause;
        MonoClass *exclass;
        int i;
index fa522e23e83623041e4e0c2ae75edab31a2bc9f2..29131f9c3c6f8741a0a31ba2ce37bcf32921864e 100644 (file)
@@ -136,7 +136,7 @@ mono_debug_open_method (MonoCompile *cfg)
 
        mono_class_init (cfg->method->klass);
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        g_assert (header);
        
        info->jit = jit = g_new0 (MonoDebugMethodJitInfo, 1);
@@ -259,6 +259,7 @@ mono_debug_add_vg_method (MonoMethod *method, MonoDebugMethodJitInfo *jit)
 
        g_free (addresses);
        g_free (lines);
+       mono_metadata_free_mh (header);
 #endif /* VALGRIND_ADD_LINE_INFO */
 }
 
@@ -281,7 +282,7 @@ mono_debug_close_method (MonoCompile *cfg)
        }
 
        method = cfg->method;
-       header = mono_method_get_header (method);
+       header = cfg->header;
        sig = mono_method_signature (method);
 
        jit = info->jit;
@@ -334,7 +335,7 @@ mono_debug_record_line_number (MonoCompile *cfg, MonoInst *ins, guint32 address)
        if (!info || !info->jit || !ins->cil_code)
                return;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        g_assert (header);
 
        if ((ins->cil_code < header->code) ||
@@ -361,7 +362,7 @@ mono_debug_open_block (MonoCompile *cfg, MonoBasicBlock *bb, guint32 address)
        if (!info || !info->jit || !bb->cil_code)
                return;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        g_assert (header);
 
        if ((bb->cil_code < header->code) ||
@@ -589,6 +590,7 @@ deserialize_debug_info (MonoMethod *method, guint8 *code_start, guint8 *buf, gui
                prev_native_offset = native_offset;
        }
 
+       mono_metadata_free_mh (header);
        return jit;
 }
 
index 9296a0a5c2b86d170377a911f9b0be917c128182..5fd09e4cd34a04e5f3009b7cc538d2542488cc4b 100644 (file)
@@ -5631,6 +5631,7 @@ method_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                        buffer_add_int (buf, header->code_size);
                        buffer_add_string (buf, "");
                        buffer_add_int (buf, 0);
+                       mono_metadata_free_mh (header);
                        break;
                }
 
@@ -5647,6 +5648,7 @@ method_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                g_free (source_file);
                g_free (il_offsets);
                g_free (line_numbers);
+               mono_metadata_free_mh (header);
                break;
        }
        case CMD_METHOD_GET_PARAM_INFO: {
@@ -5709,6 +5711,7 @@ method_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                        buffer_add_int (buf, 0);
                        buffer_add_int (buf, header->code_size);
                }
+               mono_metadata_free_mh (header);
 
                break;
        }
@@ -5728,6 +5731,7 @@ method_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                        for (i = 0; i < header->code_size; ++i)
                                buffer_add_byte (buf, header->code [i]);
                }
+               mono_metadata_free_mh (header);
                break;
        }
        case CMD_METHOD_RESOLVE_TOKEN: {
@@ -5958,6 +5962,7 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
                                add_var (buf, header->locals [pos], &jit->locals [pos], &frame->ctx, frame->domain, FALSE);
                        }
                }
+               mono_metadata_free_mh (header);
                break;
        }
        case CMD_STACK_FRAME_GET_THIS: {
@@ -6013,6 +6018,7 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
 
                        set_var (t, var, &frame->ctx, frame->domain, val_buf);
                }
+               mono_metadata_free_mh (header);
                break;
        }
        default:
index 6dc67906bfdbfb148e7a009a4aef84cecbf511c1..5024e066f19386af89c0d5fe9faab85412209027 100644 (file)
@@ -143,7 +143,7 @@ compute_dominators (MonoCompile *cfg)
 
 #ifdef DEBUG_DOMINATORS
        printf ("DTREE %s %d\n", mono_method_full_name (cfg->method, TRUE), 
-               mono_method_get_header (cfg->method)->num_clauses);
+               cfg->header->num_clauses);
        for (i = 0; i < cfg->num_bblocks; ++i) {
                MonoBasicBlock *bb = cfg->bblocks [i];
                printf ("BB%d(dfn=%d) (IDOM=BB%d): ", bb->block_num, bb->dfn, bb->idom ? bb->idom->block_num : -1);
index 581f979ca8a8adb93bef81030e71cbd66da1f71d..b7fd550089d4ebe2299cfe4db614fe875b3d1c30 100644 (file)
@@ -1258,6 +1258,7 @@ disasm_ins (MonoMethod *method, const guchar *ip, const guint8 **endip)
        token_handler_ip = NULL;
 
        *endip = ip;
+       mono_metadata_free_mh (header);
        return dis;
 }
 
@@ -1339,8 +1340,10 @@ emit_line_number_info (MonoDwarfWriter *w, MonoMethod *method,
        GArray *ln_array;
        int *native_to_il_offset = NULL;
 
-       if (!w->emit_line)
+       if (!w->emit_line) {
+               mono_metadata_free_mh (header);
                return;
+       }
 
        minfo = mono_debug_lookup_method (method);
 
@@ -1349,6 +1352,7 @@ emit_line_number_info (MonoDwarfWriter *w, MonoMethod *method,
        g_assert (code_size);
 
 #ifdef _EGLIB_MAJOR
+       mono_metadata_free_mh (header);
        /* g_array is not implemented in eglib */
        return;
 #else
@@ -1555,6 +1559,7 @@ emit_line_number_info (MonoDwarfWriter *w, MonoMethod *method,
                fflush (w->il_file);
                g_free (il_to_line);
        }
+       mono_metadata_free_mh (header);
 }
 
 static MonoMethodVar*
@@ -1761,6 +1766,7 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
                emit_line_number_info (w, method, start_symbol, end_symbol, code, code_size, debug_info);
 
        emit_line (w);
+       mono_metadata_free_mh (header);
 }
 
 void
index d762032e224810b68e2fb1ad3fe72a471606efbc..9d98659a8576b4f381563c352ab2768bd94593a8 100644 (file)
@@ -464,8 +464,7 @@ mono_link_bblock (MonoCompile *cfg, MonoBasicBlock *from, MonoBasicBlock* to)
 static int
 mono_find_block_region (MonoCompile *cfg, int offset)
 {
-       MonoMethod *method = cfg->method;
-       MonoMethodHeader *header = mono_method_get_header (method);
+       MonoMethodHeader *header = cfg->header;
        MonoExceptionClause *clause;
        int i;
 
@@ -494,8 +493,7 @@ mono_find_block_region (MonoCompile *cfg, int offset)
 static GList*
 mono_find_final_block (MonoCompile *cfg, unsigned char *ip, unsigned char *target, int type)
 {
-       MonoMethod *method = cfg->method;
-       MonoMethodHeader *header = mono_method_get_header (method);
+       MonoMethodHeader *header = cfg->header;
        MonoExceptionClause *clause;
        MonoBasicBlock *handler;
        int i;
@@ -1192,7 +1190,7 @@ mono_compile_get_interface_var (MonoCompile *cfg, int slot, MonoInst *ins)
        int pos, vnum;
 
        /* inlining can result in deeper stacks */ 
-       if (slot >= mono_method_get_header (cfg->method)->max_stack)
+       if (slot >= cfg->header->max_stack)
                return mono_compile_create_var (cfg, type_from_stack_type (ins), OP_LOCAL);
 
        pos = ins->type - 1 + slot * STACK_MAX;
@@ -4493,6 +4491,8 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
        cheader = mono_method_get_header (cmethod);
 
        if (cheader == NULL || mono_loader_get_last_error ()) {
+               if (cheader)
+                       mono_metadata_free_mh (cheader);
                mono_loader_clear_error ();
                return 0;
        }
@@ -4623,6 +4623,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig,
                        EMIT_NEW_TEMPLOAD (cfg, ins, rvar->inst_c0);
                        *sp++ = ins;
                }
+               mono_metadata_free_mh (cheader);
                return costs + 1;
        } else {
                if (cfg->verbose_level > 2)
@@ -4633,6 +4634,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);
        return 0;
 }
 
@@ -5011,8 +5013,9 @@ set_exception_type_from_invalid_il (MonoCompile *cfg, MonoMethod *method, unsign
 {
        char *method_fname = mono_method_full_name (method, TRUE);
        char *method_code;
+       MonoMethodHeader *header = mono_method_get_header (method);
 
-       if (mono_method_get_header (method)->code_size == 0)
+       if (header->code_size == 0)
                method_code = g_strdup ("method body is empty.");
        else
                method_code = mono_disasm_code_one (NULL, method, ip, NULL);
@@ -5020,6 +5023,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);
 }
 
 static void
@@ -9853,39 +9857,36 @@ 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);
                return -1;
        }
 
        if ((cfg->verbose_level > 2) && (cfg->method == method)) 
                mono_print_code (cfg, "AFTER METHOD-TO-IR");
 
+       mono_metadata_free_mh (header);
        return inline_costs;
  
  exception_exit:
        g_assert (cfg->exception_type != MONO_EXCEPTION_NONE);
-       g_slist_free (class_inits);
-       mono_basic_block_free (bb);
-       dont_inline = g_list_remove (dont_inline, method);
-       return -1;
+       goto cleanup;
 
  inline_failure:
-       g_slist_free (class_inits);
-       mono_basic_block_free (bb);
-       dont_inline = g_list_remove (dont_inline, method);
-       return -1;
+       goto cleanup;
 
  load_error:
-       g_slist_free (class_inits);
-       mono_basic_block_free (bb);
-       dont_inline = g_list_remove (dont_inline, method);
        cfg->exception_type = MONO_EXCEPTION_TYPE_LOAD;
-       return -1;
+       goto cleanup;
 
  unverified:
+       set_exception_type_from_invalid_il (cfg, method, ip);
+       goto cleanup;
+
+ cleanup:
        g_slist_free (class_inits);
        mono_basic_block_free (bb);
        dont_inline = g_list_remove (dont_inline, method);
-       set_exception_type_from_invalid_il (cfg, method, ip);
+       mono_metadata_free_mh (header);
        return -1;
 }
 
index 7983cc2a4ee8b77922f7d54bd979f5c35c023772..404227abb5c60ba28ecb5a93dc23fe4e39493e84 100644 (file)
@@ -5053,7 +5053,7 @@ mono_arch_get_allocatable_int_vars (MonoCompile *cfg)
 
    CFG_DEBUG(2) ALPHA_DEBUG("mono_arch_get_allocatable_int_vars");
 
-   header = mono_method_get_header (cfg->method);
+   header = cfg->header;
 
    sig = mono_method_signature (cfg->method);
 
@@ -5453,7 +5453,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
    
    CFG_DEBUG(2) ALPHA_DEBUG("mono_arch_allocate_vars");
    
-   header = mono_method_get_header (cfg->method);
+   header = cfg->header;
    
    sig = mono_method_signature (cfg->method);
    
index 470f3ecc71fe9b92ac83bd1a70c89850709ff527..61fdb31e7819e06c732210e03df591871152ee62 100644 (file)
@@ -1061,7 +1061,7 @@ mono_arch_compute_omit_fp (MonoCompile *cfg)
        if (cfg->arch.omit_fp_computed)
                return;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
@@ -1257,7 +1257,7 @@ mono_arch_fill_argument_info (MonoCompile *cfg)
        int i;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
@@ -1337,7 +1337,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        gint32 *offsets;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
index fc68d6244c21d97e9e81214e28dd2b6576d4eb38..d6d11211af2e7cb0680d7897387777f2e0b3eaf3 100644 (file)
@@ -1088,7 +1088,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        if (mono_jit_trace_calls != NULL && mono_trace_eval (cfg->method))
                cfg->param_area = MAX (cfg->param_area, sizeof (gpointer)*8);
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        /* 
         * We use the frame register also for any method that has
index 9bc6dbc66c1d31763dd42bfd2e0f8b1f37efd6e9..095ec0ad91863aae3d8d271f35dca93b1e8ee858 100644 (file)
@@ -521,7 +521,7 @@ mono_arch_allocate_vars (MonoCompile *m)
        DEBUG_FUNC_ENTER();
        m->flags |= MONO_CFG_HAS_SPILLUP;
 
-       header = mono_method_get_header (m->method);
+       header = m->header;
 
        sig = mono_method_signature (m->method);
        DEBUG (printf ("Allocating locals - incoming params:\n"));
index a61142d7eb526190312e2d3c9d6e9cc0f1b8e22b..5d5cc6e900728e1c9e3429cc5be9193b2e310cdc 100644 (file)
@@ -612,7 +612,7 @@ mono_arch_get_allocatable_int_vars (MonoCompile *cfg)
        MonoMethodHeader *header;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
@@ -670,7 +670,7 @@ mono_ia64_alloc_stacked_registers (MonoCompile *cfg)
 
        cinfo = get_call_info (cfg, cfg->mempool, mono_method_signature (cfg->method), FALSE);
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        
        /* Some registers are reserved for use by the prolog/epilog */
        reserved_regs = header->num_clauses ? 4 : 3;
@@ -756,7 +756,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        gint32 *offsets;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
index 46adb30750caa150b1a328b0278f3f36449f1a7e..13b228e0966c5fc0eee9923e08e1d2a4b4b07bb0 100644 (file)
@@ -976,7 +976,7 @@ emit_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, LL
 
        // FIXME: Nested clauses
        if (bb->region != -1 && MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY)) {
-               MonoMethodHeader *header = mono_method_get_header (cfg->method);
+               MonoMethodHeader *header = cfg->header;
                // FIXME: Add a macro for this
                int clause_index = (bb->region >> 8) - 1;
                MonoExceptionClause *ec = &header->clauses [clause_index];
@@ -1454,7 +1454,7 @@ mono_llvm_emit_method (MonoCompile *cfg)
        if (sig->pinvoke)
                LLVM_FAILURE (ctx, "pinvoke signature");
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        for (i = 0; i < header->num_clauses; ++i) {
                clause = &header->clauses [i];
                if (clause->flags != MONO_EXCEPTION_CLAUSE_FINALLY && clause->flags != MONO_EXCEPTION_CLAUSE_NONE)
@@ -3659,7 +3659,7 @@ exception_cb (void *data)
        /* Fill the rest of the information from the type info */
        for (i = 0; i < ei_len; ++i) {
                gint32 clause_index = *(gint32*)type_info [i];
-               MonoExceptionClause *clause = &mono_method_get_header (cfg->method)->clauses [clause_index];
+               MonoExceptionClause *clause = &cfg->header->clauses [clause_index];
 
                cfg->llvm_ex_info [i].flags = clause->flags;
                cfg->llvm_ex_info [i].data.catch_class = clause->data.catch_class;
index e2487779fde15282ddbd1add8a6357b340475a41..8d6f8f1509d372dec71e2f71f4ce74b3a02b66c0 100644 (file)
@@ -1190,7 +1190,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        /* a0-a3 always present */
        cfg->param_area = MAX (cfg->param_area, MIPS_STACK_PARAM_OFFSET);
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
        
index 8c07e682161451566f416532420161b76c106483..a23e078f45f3315857a06f1645f633c17575d3d7 100755 (executable)
@@ -1338,7 +1338,7 @@ mono_arch_allocate_vars (MonoCompile *m)
        if (m->method->wrapper_type == MONO_WRAPPER_MANAGED_TO_NATIVE)
                m->param_area = MAX (m->param_area, sizeof (gpointer)*8);
 
-       header = mono_method_get_header (m->method);
+       header = m->header;
 
        /* 
         * We use the frame register also for any method that has
index 2ea6b8c24ed4d3114e2c7ca6c1ec8f63986092f1..a35c4f527b131fe3935b996fabda0d9161c7b594 100644 (file)
@@ -1192,7 +1192,7 @@ mono_arch_get_global_int_regs (MonoCompile *cfg)
        MonoMethodHeader *header;
        int i, top = 13;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        if ((cfg->flags & MONO_CFG_HAS_ALLOCA) || header->num_clauses)
                cfg->frame_reg = s390_r11;
 
@@ -1728,7 +1728,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        int frame_reg = STK_BASE;
        int sArg, eArg;
 
-       header  = mono_method_get_header (cfg->method);
+       header  = cfg->header;
 
        cfg->flags |= MONO_CFG_HAS_SPILLUP;
 
index 1c0cb74f25b694e9a79d171f4d0f455d36dd9aa6..bfdfdefdc388994430ae58bdf5d917d31605f31a 100644 (file)
@@ -1268,7 +1268,7 @@ mono_arch_get_global_int_regs (MonoCompile *cfg)
        MonoMethodHeader *header;
        int i, top = 13;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        if ((cfg->flags & MONO_CFG_HAS_ALLOCA) || header->num_clauses)
                cfg->frame_reg = s390_r11;
 
@@ -1759,7 +1759,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        int frame_reg = STK_BASE;
        int sArg, eArg;
 
-       header  = mono_method_get_header (cfg->method);
+       header  = cfg->header;
 
        cfg->flags |= MONO_CFG_HAS_SPILLUP;
 
index cf197fd36527199fab472656722d8392d312fec6..985ce563c6dc39405e32099a1e72d053b25ef39d 100644 (file)
@@ -798,7 +798,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        int i, offset, size, align, curinst;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
@@ -1755,7 +1755,7 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb)
                         * Only do this if the method is small since BPr only has a 16bit
                         * displacement.
                         */
-                       if (v64 && (mono_method_get_header (cfg->method)->code_size < 10000) && last_ins && 
+                       if (v64 && (cfg->header->code_size < 10000) && last_ins && 
                                (last_ins->opcode == OP_COMPARE_IMM) &&
                                (last_ins->inst_imm == 0)) {
                                switch (ins->opcode) {
index b5377dce8fa5223b688784bc4873039d592ea6a5..31e84791f5305a9bd9e865729f127e9f4ed9c5d8 100644 (file)
@@ -917,7 +917,7 @@ needs_stack_frame (MonoCompile *cfg)
        if (cfg->arch.need_stack_frame_inited)
                return cfg->arch.need_stack_frame;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        sig = mono_method_signature (cfg->method);
 
        if (cfg->disable_omit_fp)
@@ -962,7 +962,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        gint32 *offsets;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        sig = mono_method_signature (cfg->method);
 
        cinfo = get_call_info (cfg->generic_sharing_context, cfg->mempool, sig, FALSE);
@@ -4480,7 +4480,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
        guint8 *code;
        gboolean need_stack_frame;
 
-       cfg->code_size = MAX (mono_method_get_header (method)->code_size * 4, 10240);
+       cfg->code_size = MAX (cfg->header->code_size * 4, 10240);
 
        if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
                cfg->code_size += 512;
index fc9c2740d9044d421f11d8043d2b35099619c1d7..797fe2417142a0a861f314276da8286e124a9d5d 100644 (file)
@@ -470,8 +470,7 @@ mono_bblocks_linked (MonoBasicBlock *bb1, MonoBasicBlock *bb2)
 static int
 mono_find_block_region_notry (MonoCompile *cfg, int offset)
 {
-       MonoMethod *method = cfg->method;
-       MonoMethodHeader *header = mono_method_get_header (method);
+       MonoMethodHeader *header = cfg->header;
        MonoExceptionClause *clause;
        int i;
 
@@ -504,7 +503,7 @@ int
 mono_get_block_region_notry (MonoCompile *cfg, int region)
 {
        if ((region & (0xf << 4)) == MONO_REGION_TRY) {
-               MonoMethodHeader *header = mono_method_get_header (cfg->method);
+               MonoMethodHeader *header = cfg->header;
                
                /*
                 * This can happen if a try clause is nested inside a finally clause.
@@ -2169,6 +2168,8 @@ mono_verify_cfg (MonoCompile *cfg)
 void
 mono_destroy_compile (MonoCompile *cfg)
 {
+       if (cfg->header)
+               mono_metadata_free_mh (cfg->header);
        //mono_mempool_stats (cfg->mempool);
        mono_free_loop_info (cfg);
        if (cfg->rs)
@@ -2930,7 +2931,7 @@ mono_compile_create_vars (MonoCompile *cfg)
        MonoMethodHeader *header;
        int i;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
        
@@ -3367,7 +3368,8 @@ create_jit_info (MonoCompile *cfg, MonoMethod *method_to_compile)
        int num_clauses;
        int generic_info_size;
 
-       header = mono_method_get_header (method_to_compile);
+       g_assert (method_to_compile == cfg->method);
+       header = cfg->header;
 
        if (cfg->generic_sharing_context)
                generic_info_size = sizeof (MonoGenericJitInfo);
@@ -3581,6 +3583,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
 
        cfg = g_new0 (MonoCompile, 1);
        cfg->method = method_to_compile;
+       cfg->header = mono_method_get_header (cfg->method);
        cfg->mempool = mono_mempool_new ();
        cfg->opt = opts;
        cfg->prof_options = mono_profiler_get_events ();
@@ -3634,7 +3637,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
                }
        }
 
-       header = mono_method_get_header (method_to_compile);
+       header = cfg->header;
        if (!header) {
                MonoLoaderError *error;
 
@@ -4300,7 +4303,7 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
                g_free (mono_jit_stats.biggest_method);
                mono_jit_stats.biggest_method = g_strdup_printf ("%s::%s)", method->klass->name, method->name);
        }
-       code_size_ratio = (code_size_ratio * 100) / mono_method_get_header (method)->code_size;
+       code_size_ratio = (code_size_ratio * 100) / header->code_size;
        if (code_size_ratio > mono_jit_stats.max_code_size_ratio && mono_jit_stats.enabled) {
                mono_jit_stats.max_code_size_ratio = code_size_ratio;
                g_free (mono_jit_stats.max_ratio_method);
index 17432be180228505652ed36107141cafe3106596..6fc3632a8335d61329e1ca3fe88ce231ae4bdce2 100644 (file)
@@ -943,6 +943,7 @@ enum {
  */
 typedef struct {
        MonoMethod      *method;
+       MonoMethodHeader *header;
        MonoMemPool     *mempool;
        MonoInst       **varinfo;
        MonoMethodVar   *vars;
index c0308e8c30303b8bf3285230d6c3bd6c9e7cbbab..9c5d4033f1636bad1ec087e073ec5f1ed74d3439 100644 (file)
@@ -1197,7 +1197,7 @@ linear_scan (MonoCompile *cfg, MonoRegallocContext *ctx)
 
        LSCAN_DEBUG (printf ("\nLINEAR SCAN 2 for %s:\n", mono_method_full_name (cfg->method, TRUE)));
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);