Index: vm/vmcore/src/class_support/Class_File_Loader.cpp =================================================================== --- vm/vmcore/src/class_support/Class_File_Loader.cpp (revision 525694) +++ vm/vmcore/src/class_support/Class_File_Loader.cpp (working copy) @@ -1745,28 +1745,33 @@ // JVM spec hints that LocalVariableTypeTable is meant to be a supplement to LocalVariableTable // so we have no reason to cross-check these tables // See specification 4.8.12 second paragraph. + bool mismatched = false; if (generic_vars && lv_table) { unsigned j = i = 0; - for (i = 0; i < generic_vars->length && j != lv_table->length; i++) { + for (i = 0; i < generic_vars->length; i++) { for (j = 0; j < lv_table->length; j++) { if (generic_vars->table[i].name == lv_table->table[j].name - && generic_vars->table[i].start_pc == lv_table->table[j].start_pc - && generic_vars->table[i].length == lv_table->table[j].length + // RI appears to tolerate mismatched code region + //&& generic_vars->table[i].start_pc == lv_table->table[j].start_pc + //&& generic_vars->table[i].length == lv_table->table[j].length && generic_vars->table[i].index == lv_table->table[j].index) { lv_table->table[j].generic_type = generic_vars->table[i].type; break; } } + if(j == lv_table->length) { + String* gvi_name = generic_vars->table[i].name; + REPORT_FAILED_METHOD("Element "<< gvi_name->bytes << + " of LocalVariableTypeTable mismatches LocalVariableTable data"); + mismatched = true; + break; + } + } - String* gvi_name = generic_vars->table[i].name; if( num_lvtt_entries >= LV_ALLOCATION_THRESHOLD ){ STD_FREE(generic_vars); - } - if(j == lv_table->length) { - REPORT_FAILED_METHOD("Element: "<< gvi_name->bytes << - " in LocalVariableTypeTable has no counterpart or differs from element in LocalVariableTable"); - } + } } if(TI_enabled) { @@ -1776,6 +1781,9 @@ STD_FREE(lv_table); } } + if (mismatched) { + return false; + } }