You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/04/09 14:15:21 UTC
svn commit: r526725 -
/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp
Author: varlax
Date: Mon Apr 9 05:15:21 2007
New Revision: 526725
URL: http://svn.apache.org/viewvc?view=rev&rev=526725
Log:
Workaround for HARMONY-3575 [drlvm][eclipse] One class in Pydev fails classloading
+ a few leaks and error message fixes.
Modified:
harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp?view=diff&rev=526725&r1=526724&r2=526725
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/class_support/Class_File_Loader.cpp Mon Apr 9 05:15:21 2007
@@ -1444,7 +1444,7 @@
&&table->table[j].length == table->table[i].length
&&table->table[j].index == table->table[i].index)
{
- REPORT_FAILED_METHOD("Duplicate local variable "<< table->table[j].name
+ REPORT_FAILED_METHOD("Duplicate local variable "<< table->table[j].name->bytes
<< " in attribute " << attr_name);
return false;
}
@@ -1735,38 +1735,45 @@
}
lv_table->length = num_lvt_entries;
+ bool failed = false;
if (!_parse_local_vars(lv_table, offset_lvt_array, cp, cfs,
"LocalVariableTable", ATTR_LocalVariableTable)
|| (generic_vars && !_parse_local_vars(generic_vars, offset_lvtt_array, cp, cfs,
"LocalVariableTypeTable", ATTR_LocalVariableTypeTable)))
{
- return false;
+ failed = true;
}
// 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.
- if (generic_vars && lv_table) {
+ // See specification 4.8.13 second paragraph.
+ if (!failed && generic_vars) {
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
+ /* FIXME This is temporary solution. One broken class file
+ was found in eclipse plugin. RI loads this class successfully, DRLVM doesn't.
+ Tests show that this depends on classloader, so further evaluation is needed
+ to fix it permanently. */
+ //&& 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 does not match any of LocalVariableTable entries");
+ failed = 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 +1783,9 @@
STD_FREE(lv_table);
}
}
+ if (failed) {
+ return false;
+ }
}
@@ -3149,6 +3159,7 @@
//See specification 4.8.5 about InnerClasses Attribute
if (m_declaring_class_index || m_innerclasses) {
REPORT_FAILED_CLASS_FORMAT(this, "more than one InnerClasses attribute");
+ return true;
}
bool isinner = false;
// found_myself == 2: myself is not inner class or has passed myself when iterating inner class attribute arrays