extraClasses

some bug fixes regarding inner/outerClasses


git-svn-id: https://svn.code.sf.net/p/jode/code/trunk@804 379699f6-c40d-0410-875b-85095c16579e
stable
jochen 26 years ago
parent 41e1a257e7
commit 62ba1fec3a
  1. 73
      jode/jode/bytecode/ClassInfo.java

@ -60,6 +60,7 @@ public class ClassInfo extends BinaryInfo {
private MethodInfo[] methods; private MethodInfo[] methods;
private InnerClassInfo[] outerClasses; private InnerClassInfo[] outerClasses;
private InnerClassInfo[] innerClasses; private InnerClassInfo[] innerClasses;
private InnerClassInfo[] extraClasses;
private String sourceFile; private String sourceFile;
public final static ClassInfo javaLangObject = forName("java.lang.Object"); public final static ClassInfo javaLangObject = forName("java.lang.Object");
@ -162,7 +163,7 @@ public class ClassInfo extends BinaryInfo {
} else if ((howMuch & (OUTERCLASSES | INNERCLASSES)) != 0 } else if ((howMuch & (OUTERCLASSES | INNERCLASSES)) != 0
&& name.equals("InnerClasses")) { && name.equals("InnerClasses")) {
int count = input.readUnsignedShort(); int count = input.readUnsignedShort();
int innerCount = 0, outerCount = 0; int innerCount = 0, outerCount = 0, extraCount = 0;
InnerClassInfo[] innerClassInfo = new InnerClassInfo[count]; InnerClassInfo[] innerClassInfo = new InnerClassInfo[count];
for (int i=0; i< count; i++) { for (int i=0; i< count; i++) {
int innerIndex = input.readUnsignedShort(); int innerIndex = input.readUnsignedShort();
@ -180,7 +181,21 @@ public class ClassInfo extends BinaryInfo {
if (outer != null && outer.equals(getName())) if (outer != null && outer.equals(getName()))
innerClassInfo[innerCount++] = ici; innerClassInfo[innerCount++] = ici;
else else
innerClassInfo[count - (++outerCount)] = ici; innerClassInfo[count - (++extraCount)] = ici;
}
{
String lastOuterName = getName();
for (int i = count - extraCount; i < count; i++) {
InnerClassInfo ici = innerClassInfo[i];
if (ici.inner.equals(lastOuterName)) {
for (int j = i; j > count - extraCount; j--)
innerClassInfo[j] = innerClassInfo[j-1];
innerClassInfo[count-extraCount] = ici;
extraCount--;
outerCount++;
lastOuterName = ici.outer;
}
}
} }
if (innerCount > 0) { if (innerCount > 0) {
innerClasses = new InnerClassInfo[innerCount]; innerClasses = new InnerClassInfo[innerCount];
@ -193,18 +208,16 @@ public class ClassInfo extends BinaryInfo {
outerClasses = new InnerClassInfo[outerCount]; outerClasses = new InnerClassInfo[outerCount];
System.arraycopy(innerClassInfo, innerCount, System.arraycopy(innerClassInfo, innerCount,
outerClasses, 0, outerCount); outerClasses, 0, outerCount);
if (!outerClasses[0].inner.equals(getName()))
throw new ClassFormatException
("InnerClasses attribute has wrong format");
for (int i=1; i < outerCount; i++) {
if (outerClasses[i-1].outer != null &&
!outerClasses[i].inner.equals(outerClasses[i-1].outer))
throw new ClassFormatException
("InnerClasses attribute has wrong format");
}
} else } else
outerClasses = null; outerClasses = null;
if (extraCount > 0) {
extraClasses = new InnerClassInfo[extraCount];
System.arraycopy(innerClassInfo, innerCount + outerCount,
extraClasses, 0, extraCount);
} else
extraClasses = null;
if (length != 2 + 8 * count) if (length != 2 + 8 * count)
throw new ClassFormatException throw new ClassFormatException
("InnerClasses attribute has wrong length"); ("InnerClasses attribute has wrong length");
@ -304,7 +317,8 @@ public class ClassInfo extends BinaryInfo {
gcp.putUTF8("SourceFile"); gcp.putUTF8("SourceFile");
gcp.putUTF8(sourceFile); gcp.putUTF8(sourceFile);
} }
if (outerClasses != null || innerClasses != null) { if (outerClasses != null || innerClasses != null
|| extraClasses != null) {
gcp.putUTF8("InnerClasses"); gcp.putUTF8("InnerClasses");
int outerCount = outerClasses != null ? outerClasses.length : 0; int outerCount = outerClasses != null ? outerClasses.length : 0;
for (int i=outerCount; i-- > 0;) { for (int i=outerCount; i-- > 0;) {
@ -322,6 +336,14 @@ public class ClassInfo extends BinaryInfo {
if (innerClasses[i].name != null) if (innerClasses[i].name != null)
gcp.putUTF8(innerClasses[i].name); gcp.putUTF8(innerClasses[i].name);
} }
int extraCount = extraClasses != null ? extraClasses.length : 0;
for (int i=0; i< extraCount; i++) {
gcp.putClassName(extraClasses[i].inner);
if (extraClasses[i].outer != null)
gcp.putClassName(extraClasses[i].outer);
if (extraClasses[i].name != null)
gcp.putUTF8(extraClasses[i].name);
}
} }
prepareAttributes(gcp); prepareAttributes(gcp);
} }
@ -330,7 +352,8 @@ public class ClassInfo extends BinaryInfo {
int count = 0; int count = 0;
if (sourceFile != null) if (sourceFile != null)
count++; count++;
if (innerClasses != null) if (innerClasses != null || outerClasses != null
|| extraClasses != null)
count++; count++;
return count; return count;
} }
@ -343,11 +366,13 @@ public class ClassInfo extends BinaryInfo {
output.writeInt(2); output.writeInt(2);
output.writeShort(gcp.putUTF8(sourceFile)); output.writeShort(gcp.putUTF8(sourceFile));
} }
if (outerClasses != null || innerClasses != null) { if (outerClasses != null || innerClasses != null
|| extraClasses != null) {
output.writeShort(gcp.putUTF8("InnerClasses")); output.writeShort(gcp.putUTF8("InnerClasses"));
int outerCount = (outerClasses != null) ? outerClasses.length : 0; int outerCount = (outerClasses != null) ? outerClasses.length : 0;
int innerCount = (innerClasses != null) ? innerClasses.length : 0; int innerCount = (innerClasses != null) ? innerClasses.length : 0;
int count = outerCount + innerCount; int extraCount = (extraClasses != null) ? extraClasses.length : 0;
int count = outerCount + innerCount + extraCount;
output.writeInt(2 + count * 8); output.writeInt(2 + count * 8);
output.writeShort(count); output.writeShort(count);
for (int i=outerCount; i-- > 0; ) { for (int i=outerCount; i-- > 0; ) {
@ -366,6 +391,14 @@ public class ClassInfo extends BinaryInfo {
gcp.putUTF8(innerClasses[i].name) : 0); gcp.putUTF8(innerClasses[i].name) : 0);
output.writeShort(innerClasses[i].modifiers); output.writeShort(innerClasses[i].modifiers);
} }
for (int i=0; i< extraCount; i++) {
output.writeShort(gcp.putClassName(extraClasses[i].inner));
output.writeShort(extraClasses[i].outer != null ?
gcp.putClassName(extraClasses[i].outer) : 0);
output.writeShort(extraClasses[i].name != null ?
gcp.putUTF8(extraClasses[i].name) : 0);
output.writeShort(extraClasses[i].modifiers);
}
} }
} }
@ -637,6 +670,12 @@ public class ClassInfo extends BinaryInfo {
return innerClasses; return innerClasses;
} }
public InnerClassInfo[] getExtraClasses() {
if ((status & INNERCLASSES) == 0)
loadInfo(INNERCLASSES);
return extraClasses;
}
public void setName(String newName) { public void setName(String newName) {
name = newName; name = newName;
} }
@ -669,6 +708,10 @@ public class ClassInfo extends BinaryInfo {
innerClasses = ic; innerClasses = ic;
} }
public void setExtraClasses(InnerClassInfo[] ec) {
extraClasses = ec;
}
public boolean superClassOf(ClassInfo son) { public boolean superClassOf(ClassInfo son) {
while (son != this && son != null) { while (son != this && son != null) {
son = son.getSuperclass(); son = son.getSuperclass();

Loading…
Cancel
Save