Index: main/java/org/apache/harmony/pack200/Segment.java =================================================================== --- main/java/org/apache/harmony/pack200/Segment.java (revision 636104) +++ main/java/org/apache/harmony/pack200/Segment.java (working copy) @@ -144,6 +144,28 @@ } else { classFile.attributes = new Attribute[] {}; } + + // 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]; + ArrayList classAttributesWithoutSourceFileAttribute = new ArrayList(); + for(int index=0; index < classAttributes.size(); index++) { + Attribute attrib = (Attribute)classAttributes.get(index); + if(!attrib.isSourceFileAttribute()) { + classAttributesWithoutSourceFileAttribute.add(attrib); + } + } + Attribute[] originalAttributes = classFile.attributes; + classFile.attributes = new Attribute[originalAttributes.length + classAttributesWithoutSourceFileAttribute.size()]; + 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); + classFile.attributes[originalAttributes.length + index] = attrib; + } + // this/superclass ClassFileEntry cfThis = cp.add(cpBands.cpClassValue(fullName)); ClassFileEntry cfSuper = cp.add(cpBands.cpClassValue(classBands.getClassSuper()[classNum])); Index: main/java/org/apache/harmony/pack200/ClassBands.java =================================================================== --- main/java/org/apache/harmony/pack200/ClassBands.java (revision 636104) +++ main/java/org/apache/harmony/pack200/ClassBands.java (working copy) @@ -1194,6 +1194,10 @@ return numBackwardsCalls; } + public ArrayList[] getClassAttributes() { + return classAttributes; + } + public int[] getClassFieldCount() { return classFieldCount; } Index: main/java/org/apache/harmony/pack200/bytecode/Attribute.java =================================================================== --- main/java/org/apache/harmony/pack200/bytecode/Attribute.java (revision 636104) +++ main/java/org/apache/harmony/pack200/bytecode/Attribute.java (working copy) @@ -83,6 +83,17 @@ return false; } + /** + * Answer true if the receiver is a source file attribute + * (which gets special handling when the class is built); + * otherwise answer false. + * + * @return boolean source file attribute + */ + public boolean isSourceFileAttribute() { + return false; + } + public int hashCode() { final int PRIME = 31; int result = 1; Index: main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java =================================================================== --- main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java (revision 636104) +++ main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java (working copy) @@ -48,6 +48,13 @@ return true; } + /* (non-Javadoc) + * @see org.apache.harmony.pack200.bytecode.Attribute#isSourceFileAttribute() + */ + public boolean isSourceFileAttribute() { + return true; + } + protected int getLength() { return 2; }