X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmono-basic-block.c;h=9d28614b16e822487c9f258b88c4875bf3ce9a75;hb=HEAD;hp=d7115994b84f49a9063db8720ace9c9423c44f15;hpb=4ef4438ad9e8cb0f79b9e472b38dbd0cd848d812;p=mono.git diff --git a/mono/metadata/mono-basic-block.c b/mono/metadata/mono-basic-block.c index d7115994b84..9d28614b16e 100644 --- a/mono/metadata/mono-basic-block.c +++ b/mono/metadata/mono-basic-block.c @@ -1,10 +1,12 @@ -/* - * mono-basic-block.c: Routines for parsing basic blocks from the IL stream +/** + * \file + * Routines for parsing basic blocks from the IL stream * * Authors: * Rodrigo Kumpera (rkumpera@novell.com) * * Copyright 2010 Novell, Inc (http://www.novell.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #include @@ -239,6 +241,8 @@ bb_split (MonoSimpleBasicBlock *first, MonoSimpleBasicBlock *hint, MonoSimpleBas { MonoSimpleBasicBlock *res, *bb = first; + error_init (error); + if (bb_idx_is_contained (hint, target)) { first = hint; } else if (hint->next && bb_idx_is_contained (hint->next, target)) { @@ -335,6 +339,8 @@ bb_formation_il_pass (const unsigned char *start, const unsigned char *end, Mono MonoSimpleBasicBlock *branch, *next, *current; const MonoOpcode *opcode; + error_init (error); + current = bb; while (ip < end) { @@ -463,6 +469,9 @@ bb_formation_eh_pass (MonoMethodHeader *header, MonoSimpleBasicBlock *bb, MonoSi { int i; int end = header->code_size; + + error_init (error); + /*We must split at all points to verify for targets in the middle of an instruction*/ for (i = 0; i < header->num_clauses; ++i) { MonoExceptionClause *clause = header->clauses + i; @@ -514,20 +523,12 @@ mono_basic_block_free (MonoSimpleBasicBlock *bb) * Return the list of basic blocks of method. Return NULL on failure and set @error. */ MonoSimpleBasicBlock* -mono_basic_block_split (MonoMethod *method, MonoError *error) +mono_basic_block_split (MonoMethod *method, MonoError *error, MonoMethodHeader *header) { - MonoError inner_error; MonoSimpleBasicBlock *bb, *root; const unsigned char *start, *end; - MonoMethodHeader *header = mono_method_get_header_checked (method, &inner_error); - - mono_error_init (error); - if (!header) { - mono_error_set_not_verifiable (error, method, "Could not decode header due to %s", mono_error_get_message (&inner_error)); - mono_error_cleanup (&inner_error); - return NULL; - } + error_init (error); start = header->code; end = start + header->code_size; @@ -553,11 +554,9 @@ mono_basic_block_split (MonoMethod *method, MonoError *error) dump_bb_list (bb, &root, g_strdup_printf("AFTER LIVENESS %s", mono_method_full_name (method, TRUE))); #endif - mono_metadata_free_mh (header); return bb; fail: - mono_metadata_free_mh (header); mono_basic_block_free (bb); return NULL; }