You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sj...@apache.org on 2008/03/18 16:55:20 UTC
svn commit: r638423 - in
/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200:
IcBands.java IcTuple.java Segment.java
Author: sjanuary
Date: Tue Mar 18 08:55:14 2008
New Revision: 638423
URL: http://svn.apache.org/viewvc?rev=638423&view=rev
Log:
Apply patch for HARMONY-5607 ([classlib][pack200] Inner class handling is wrong)
Modified:
harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java
harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcTuple.java
harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java?rev=638423&r1=638422&r2=638423&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java Tue Mar 18 08:55:14 2008
@@ -31,9 +31,9 @@
public class IcBands extends BandSet {
private IcTuple[] icAll;
- private String[] cpUTF8;
+ private final String[] cpUTF8;
- private String[] cpClass;
+ private final String[] cpClass;
/**
* @param header
@@ -107,7 +107,14 @@
int allTuplesSize = allTuples.length;
for(int index=0; index < allTuplesSize; index++) {
if(allTuples[index].outerClassString().equals(className)) {
- relevantTuples.add(allTuples[index]);
+ // Originally I added all classes (anonymous and not anonymous).
+ // That yielded bad results on some classes. Adding just
+ // the non-anonymous classes (which is not what the
+ // spec specifies) seems to fix up a number of cases
+ // where the classes are otherwise mismatched.
+ if(!allTuples[index].isAnonymous()) {
+ relevantTuples.add(allTuples[index]);
+ }
}
}
Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcTuple.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcTuple.java?rev=638423&r1=638422&r2=638423&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcTuple.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcTuple.java Tue Mar 18 08:55:14 2008
@@ -182,4 +182,35 @@
result.append(')');
return result.toString();
}
+
+ public boolean nullSafeEquals(String stringOne, String stringTwo) {
+ if(null==stringOne) {
+ return null==stringTwo;
+ }
+ return stringOne.equals(stringTwo);
+ }
+
+ public boolean equals(Object object) {
+ if(object.getClass() != this.getClass()) {
+ return false;
+ }
+ IcTuple compareTuple = (IcTuple)object;
+
+ if(!nullSafeEquals(this.C, compareTuple.C)) {
+ return false;
+ }
+
+ if(!nullSafeEquals(this.C2, compareTuple.C2)) {
+ return false;
+ }
+
+ if(!nullSafeEquals(this.N, compareTuple.N)) {
+ return false;
+ }
+ return true;
+ }
+
+ public int hashCode() {
+ return 17 + C.hashCode() + C2.hashCode() + N.hashCode();
+ }
}
Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java?rev=638423&r1=638422&r2=638423&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java Tue Mar 18 08:55:14 2008
@@ -127,29 +127,44 @@
int i = fullName.lastIndexOf("/") + 1; // if lastIndexOf==-1, then
// -1+1=0, so str.substring(0)
// == str
- AttributeLayout SOURCE_FILE = attrDefinitionBands.getAttributeDefinitionMap()
- .getAttributeLayout(AttributeLayout.ATTRIBUTE_SOURCE_FILE,
- AttributeLayout.CONTEXT_CLASS);
- if (SOURCE_FILE.matches(classBands.getClassFlags()[classNum])) {
- int firstDollar = SegmentUtils.indexOfFirstDollar(fullName);
- String fileName = null;
-
- if(firstDollar > -1 && (i <= firstDollar)) {
- fileName = fullName.substring(i, firstDollar) + ".java";
- } else {
- fileName = fullName.substring(i) + ".java";
- }
- classFile.attributes = new Attribute[] { (Attribute) cp
- .add(new SourceFileAttribute(cpBands.cpUTF8Value(fileName, ClassConstantPool.DOMAIN_ATTRIBUTEASCIIZ))) };
- } else {
- classFile.attributes = new Attribute[] {};
- }
-
+
+ // Get the source file attribute
+ ArrayList classAttributes = classBands.getClassAttributes()[classNum];
+ SourceFileAttribute sourceFileAttribute = null;
+ for(int index=0; index < classAttributes.size(); index++) {
+ if(((Attribute)classAttributes.get(index)).isSourceFileAttribute()) {
+ sourceFileAttribute = ((SourceFileAttribute)classAttributes.get(index));
+ }
+ }
+
+ if(sourceFileAttribute == null) {
+ // If we don't have a source file attribute yet, we need
+ // to infer it from the class.
+ AttributeLayout SOURCE_FILE = attrDefinitionBands.getAttributeDefinitionMap()
+ .getAttributeLayout(AttributeLayout.ATTRIBUTE_SOURCE_FILE,
+ AttributeLayout.CONTEXT_CLASS);
+ if (SOURCE_FILE.matches(classBands.getClassFlags()[classNum])) {
+ int firstDollar = SegmentUtils.indexOfFirstDollar(fullName);
+ String fileName = null;
+
+ if(firstDollar > -1 && (i <= firstDollar)) {
+ fileName = fullName.substring(i, firstDollar) + ".java";
+ } else {
+ fileName = fullName.substring(i) + ".java";
+ }
+ sourceFileAttribute = new SourceFileAttribute(cpBands.cpUTF8Value(fileName, ClassConstantPool.DOMAIN_ATTRIBUTEASCIIZ));
+ classFile.attributes = new Attribute[] { (Attribute) cp
+ .add(sourceFileAttribute) };
+ } else {
+ classFile.attributes = new Attribute[] {};
+ }
+ } else {
+ classFile.attributes = new Attribute[] { (Attribute) cp.add(sourceFileAttribute)};
+ }
+
// If we see any class attributes, add them to the class's attributes that will
// be written out. Keep SourceFileAttributes out since we just
- // did them above. (One of the computations for SourceFileAttribute
- // may be redundant.)
- ArrayList classAttributes = classBands.getClassAttributes()[classNum];
+ // did them above.
ArrayList classAttributesWithoutSourceFileAttribute = new ArrayList();
for(int index=0; index < classAttributes.size(); index++) {
Attribute attrib = (Attribute)classAttributes.get(index);
@@ -159,7 +174,7 @@
}
Attribute[] originalAttributes = classFile.attributes;
classFile.attributes = new Attribute[originalAttributes.length + classAttributesWithoutSourceFileAttribute.size()];
- System.arraycopy(originalAttributes, 0, classFile.attributes, 0, originalAttributes.length);
+ System.arraycopy(originalAttributes, 0, classFile.attributes, 0, originalAttributes.length);
for(int index=0; index < classAttributesWithoutSourceFileAttribute.size(); index++) {
Attribute attrib = ((Attribute)classAttributesWithoutSourceFileAttribute.get(index));
cp.add(attrib);
@@ -200,11 +215,23 @@
// add inner class attribute (if required)
boolean addInnerClassesAttr = false;
+ // TODO: remove the debug info below
+// String debugClass = getClassBands().getClassThis()[classNum];
+// SegmentUtils.debug("buildClassFile: class is " + debugClass);
+// if("com/ibm/collaboration/realtime/application/RTCMainPlugin".equals(foo)) {
+// SegmentUtils.debug("self halt");
+// }
IcTuple[] ic_local = getClassBands().getIcLocal()[classNum];
boolean ic_local_sent = false;
if(ic_local != null) {
ic_local_sent = true;
}
+ // TODO: remove the debug code below
+// if(ic_local_sent) {
+// for(int xx = 0; xx < ic_local.length; xx++) {
+// SegmentUtils.debug("ic_local[" + xx + "]=" + ic_local[xx]);
+// }
+// }
InnerClassesAttribute innerClassesAttribute = new InnerClassesAttribute("InnerClasses");
IcTuple[] ic_relevant = getIcBands().getRelevantIcTuples(fullName, cp);
IcTuple[] ic_stored = computeIcStored(ic_local, ic_relevant);