You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by to...@apache.org on 2008/01/31 11:04:22 UTC
svn commit: r617085 [12/14] - in /harmony/enhanced/classlib/branches/java6:
depends/build/ depends/build/platform/ depends/libs/ depends/oss/ make/
make/linux.x86_64.libstdc++6/ make/windows.x86/ make/windows.x86_64/
modules/archive/META-INF/ modules/a...
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java Thu Jan 31 02:04:05 2008
@@ -18,22 +18,20 @@
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.harmony.pack200.bytecode.CPClass;
+import org.apache.harmony.pack200.bytecode.ClassConstantPool;
/**
* Pack200 Inner Class Bands
*/
public class IcBands extends BandSet {
-
- public static class ICTuple {
-
- public String C; // this class
- public int F; // flags
- public String C2; // outer class
- public String N; // name
- }
- private ICTuple[] icAll;
+ private IcTuple[] icAll;
private String[] cpUTF8;
@@ -63,12 +61,12 @@
outerClasses, cpClass);
String[] icName = parseReferences("ic_name", in, Codec.DELTA5, outerClasses,
cpUTF8);
-
+
// Construct IC tuples
- icAll = new ICTuple[icThisClass.length];
+ icAll = new IcTuple[icThisClass.length];
int index = 0;
for (int i = 0; i < icThisClass.length; i++) {
- icAll[i] = new ICTuple();
+ icAll[i] = new IcTuple();
icAll[i].C = icThisClass[i];
icAll[i].F = icFlags[i];
if((icFlags[i] & 1<<16) != 0) {
@@ -79,9 +77,72 @@
}
}
- public ICTuple[] getIcTuples() {
+ public IcTuple[] getIcTuples() {
return icAll;
}
-
+ /**
+ * Answer the relevant IcTuples for the specified className
+ * and class constant pool.
+ * @param className String name of the class X for ic_relevant(X)
+ * @param cp ClassConstantPool used to generate ic_relevant(X)
+ * @return array of IcTuple
+ */
+ public IcTuple[] getRelevantIcTuples(String className, ClassConstantPool cp) {
+ List relevantTuples = new ArrayList();
+ IcTuple[] allTuples = getIcTuples();
+ int allTuplesSize = allTuples.length;
+ SegmentUtils.debug("-------\nRelevant() " + className);
+ for(int index=0; index < allTuplesSize; index++) {
+ if(allTuples[index].outerClassString().equals(className)) {
+ relevantTuples.add(allTuples[index]);
+ }
+ }
+
+ SegmentUtils.debug("self halt");
+ List classPoolClasses = cp.allClasses();
+ boolean changed = true;
+ // For every class in both ic_this_class and cp,
+ // add it to ic_relevant. Repeat until no more
+ // changes to ic_relevant.
+ while(changed) {
+ changed = false;
+ for(int allTupleIndex=0; allTupleIndex < allTuplesSize; allTupleIndex++) {
+ Iterator it = classPoolClasses.iterator();
+ SegmentUtils.debug("\n\n----\nLooking through class pool for: " + allTuples[allTupleIndex].thisClassString());
+ while(it.hasNext()) {
+ CPClass classInPool = (CPClass)it.next();
+ String poolClassName = classInPool.name;
+ SegmentUtils.debug(" " + poolClassName);
+ if(poolClassName.equals(allTuples[allTupleIndex].thisClassString())) {
+ // If the tuple isn't already in there, then add it
+ SegmentUtils.debug(" -> match");
+ if(relevantTuples.indexOf(allTuples[allTupleIndex]) == -1) {
+ SegmentUtils.debug(" -> added");
+ relevantTuples.add(allTuples[allTupleIndex]);
+ changed = true;
+ }
+ }
+ // TODO: is this right?
+ if(poolClassName.equals(allTuples[allTupleIndex].outerClassString())) {
+ // If the tuple isn't already in there, then add it
+ SegmentUtils.debug(" -> omatch");
+ if(relevantTuples.indexOf(allTuples[allTupleIndex]) == -1) {
+ SegmentUtils.debug(" -> oadded");
+ relevantTuples.add(allTuples[allTupleIndex]);
+ changed = true;
+ }
+ }
+ }
+ }
+ }
+
+ IcTuple[] result = new IcTuple[relevantTuples.size()];
+ for(int index=0; index < result.length; index++) {
+ result[index] = (IcTuple)relevantTuples.get(index);
+ SegmentUtils.debug("Returning relevantTuple: " + result[index].thisClassString());
+ }
+ return result;
+ }
+
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/MetadataBandGroup.java Thu Jan 31 02:04:05 2008
@@ -39,13 +39,13 @@
* Group of metadata bands, e.g. class_RVA_bands, method_AD_bands etc
*/
public class MetadataBandGroup {
-
+
private String type;
public MetadataBandGroup(String type) {
this.type = type;
}
-
+
private List attributes;
public int[] param_NB;
@@ -64,7 +64,7 @@
public CPUTF8[] cases_RU;
public int[] casearray_N;
public CPUTF8[] nesttype_RS;
- public int[] nestpair_N;
+ public int[] nestpair_N;
public CPUTF8[] nestname_RU;
private Iterator caseI_Iterator;
@@ -86,9 +86,9 @@
private Iterator casearray_Iterator;
private Iterator T_iterator;
-
+
private Iterator nesttype_RS_Iterator;
-
+
private Iterator nestpair_N_Iterator;
private Iterator nestname_RU_Iterator;
@@ -98,8 +98,8 @@
private Iterator type_RS_Iterator;
private Iterator pair_N_Iterator;
-
-
+
+
public List getAttributes() {
if(attributes == null) {
attributes = new ArrayList();
@@ -146,13 +146,13 @@
Annotation[] annotations = new Annotation[numAnnotations];
for (int i = 0; i < numAnnotations; i++) {
annotations[i] = getAnnotation(types[i], pairCounts[i], namesIterator);
- }
+ }
return new RuntimeVisibleorInvisibleAnnotationsAttribute(type
.equals("RVA") ? "RuntimeVisibleAnnotations"
: "RuntimeInvisibleAnnotations",
annotations);
}
-
+
private Attribute getParameterAttribute(int numParameters, Iterator namesIterator ) {
ParameterAnnotation[] parameter_annotations = new ParameterAnnotation[numParameters];
for (int i = 0; i < numParameters; i++) {
@@ -215,7 +215,7 @@
case '@':
CPUTF8 type = (CPUTF8) nesttype_RS_Iterator.next();
int numPairs = ((Integer)nestpair_N_Iterator.next()).intValue();
-
+
return getAnnotation(type, numPairs, nestname_RU_Iterator);
}
return null;
@@ -228,5 +228,5 @@
}
return boxed;
}
-
+
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/NewAttributeBands.java Thu Jan 31 02:04:05 2008
@@ -47,7 +47,7 @@
private List attributes;
private int backwardsCallCount;
-
+
private List attributeLayoutElements;
public NewAttributeBands(Segment segment, AttributeLayout attributeLayout) throws IOException {
@@ -59,7 +59,7 @@
/*
* (non-Javadoc)
- *
+ *
* @see org.apache.harmony.pack200.BandSet#unpack(java.io.InputStream)
*/
public void unpack(InputStream in) throws IOException, Pack200Exception {
@@ -78,7 +78,7 @@
/**
* Parse the bands relating to this AttributeLayout and return the correct
* class file attributes as a List of {@link Attribute}
- * @throws Pack200Exception
+ * @throws Pack200Exception
*/
public List parseAttributes(InputStream in, int occurrenceCount)
throws IOException, Pack200Exception {
@@ -129,7 +129,7 @@
/**
* Resolve calls in the attribute layout and returns the number of backwards calls
- *
+ *
* @param tokens -
* the attribute layout as a List of AttributeElements
*/
@@ -145,7 +145,7 @@
if (layoutElement instanceof Call) {
// Set the callable for each call
Call call = (Call) layoutElement;
- int index = call.callableIndex;
+ int index = call.callableIndex;
if (index == 0) { // Calls the parent callable
backwardsCalls++;
call.setCallable(callable);
@@ -319,17 +319,17 @@
/**
* Read the bands associated with this part of the layout
- *
+ *
* @param in
* @param count
- * @throws Pack200Exception
- * @throws IOException
+ * @throws Pack200Exception
+ * @throws IOException
*/
public void readBands(InputStream in, int count) throws IOException, Pack200Exception;
/**
* Add the band data for this element at the given index to the attribute
- *
+ *
* @param index
* @param attribute
*/
@@ -342,18 +342,18 @@
protected int getLength(char uint_type) {
int length = 0;;
switch(uint_type) {
- case 'B':
+ case 'B':
length = 1;
break;
- case 'H':
+ case 'H':
length = 2;
break;
- case 'I':
+ case 'I':
length = 4;
break;
- case 'V':
+ case 'V':
length = 0;
- break;
+ break;
}
return length;
}
@@ -369,7 +369,7 @@
}
public void readBands(InputStream in, int count) throws IOException, Pack200Exception {
- band = decodeBandLong(attributeLayout.getName() + "_" + tag, in, (BHSDCodec) getCodec(tag), count);
+ band = decodeBandLong(attributeLayout.getName() + "_" + tag, in, getCodec(tag), count);
}
public void addToAttribute(int n, NewAttribute attribute) {
@@ -395,7 +395,7 @@
} else if (tag.startsWith("P")) {
char uint_type = tag.substring(1).toCharArray()[0];
int length = getLength(uint_type);
- attribute.addBCIndex(length, (int) value);
+ attribute.addBCIndex(length, (int) value);
} else if (tag.startsWith("OS")) {
char uint_type = tag.substring(1).toCharArray()[0];
int length = getLength(uint_type);
@@ -406,11 +406,11 @@
} else if(length == 4) {
value = (int)value;
}
- attribute.addBCLength(length, (int) value);
+ attribute.addBCLength(length, (int) value);
} else if (tag.startsWith("O")) {
char uint_type = tag.substring(1).toCharArray()[0];
int length = getLength(uint_type);
- attribute.addBCLength(length, (int) value);
+ attribute.addBCLength(length, (int) value);
}
}
@@ -442,7 +442,7 @@
countElement.readBands(in, count);
int arrayCount = 0;
for (int i = 0; i < count; i++) {
- arrayCount += countElement.getValue(i);
+ arrayCount += countElement.getValue(i);
}
for (Iterator iter = layoutElements.iterator(); iter.hasNext();) {
LayoutElement element = (LayoutElement) iter.next();
@@ -453,14 +453,14 @@
public void addToAttribute(int index, NewAttribute attribute) {
// Add the count value
countElement.addToAttribute(index, attribute);
-
+
// Add the corresponding array values
int offset = 0;
for (int i = 0; i < index; i++) {
offset += countElement.getValue(i);
}
long numElements = countElement.getValue(index);
- for (int i = offset; i < offset + numElements; i++) {
+ for (int i = offset; i < offset + numElements; i++) {
for (Iterator iter = layoutElements.iterator(); iter.hasNext();) {
LayoutElement element = (LayoutElement) iter.next();
element.addToAttribute(i, attribute);
@@ -469,13 +469,13 @@
}
}
-
+
/**
* A Union is a type of layout element where the tag value acts as a
* selector for one of the union cases
*/
private class Union extends LayoutElement {
-
+
private Integral unionTag;
private List unionCases;
private List defaultCaseBody;
@@ -506,7 +506,7 @@
for (int i = 0; i < values.length; i++) {
boolean found = false;
for (Iterator iter = unionCases.iterator(); iter.hasNext();) {
- UnionCase unionCase = (UnionCase) iter.next();
+ UnionCase unionCase = (UnionCase) iter.next();
if(unionCase.hasTag(values[i])) {
found = true;
}
@@ -592,7 +592,7 @@
*/
if(callableIndex > 0) {
callable.addCount(count);
- }
+ }
}
public void addToAttribute(int n, NewAttribute attribute) {
@@ -606,7 +606,7 @@
private class Reference extends LayoutElement {
private String tag;
-
+
private Object band;
private int length;
@@ -677,13 +677,13 @@
private class Callable implements AttributeLayoutElement {
private List body;
-
+
private boolean isBackwardsCallable;
public Callable(List body) throws IOException {
this.body = body;
}
-
+
private int count;
private int index;
@@ -692,11 +692,11 @@
* so they don't have to keep track of the internal index
* of the callable
* @param attribute
- */
+ */
public void addNextToAttribute(NewAttribute attribute) {
for (Iterator iter = body.iterator(); iter.hasNext();) {
LayoutElement element = (LayoutElement) iter.next();
- element.addToAttribute(index, attribute);
+ element.addToAttribute(index, attribute);
}
index++;
}
@@ -721,7 +721,7 @@
// Ignore n because bands also contain element parts from calls
for (Iterator iter = body.iterator(); iter.hasNext();) {
LayoutElement element = (LayoutElement) iter.next();
- element.addToAttribute(index, attribute);
+ element.addToAttribute(index, attribute);
}
index++;
}
@@ -729,7 +729,7 @@
public boolean isBackwardsCallable() {
return isBackwardsCallable;
}
-
+
/**
* Tells this Callable that it is a backwards callable
*/
@@ -737,7 +737,7 @@
this.isBackwardsCallable = true;
}
}
-
+
/**
* A Union case
*/
@@ -899,7 +899,7 @@
* Once the attribute bands have been read the callables can be informed
* about the number of times each is subject to a backwards call. This
* method is used to set this information.
- *
+ *
* @param backwardsCalls
* one int for each backwards callable, which contains the number
* of times that callable is subject to a backwards call.
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Pack200Exception.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Pack200Exception.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Pack200Exception.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Pack200Exception.java Thu Jan 31 02:04:05 2008
@@ -25,7 +25,7 @@
/**
* Create a new Pack200 exception with the given message and cause
- *
+ *
* @param message
* the text message to display
*/
@@ -35,7 +35,7 @@
/**
* Create a new Pack200 exception with the given message and cause
- *
+ *
* @param message
* the text message to display
* @param cause
@@ -47,7 +47,7 @@
/**
* Create a new Pack200 exception with the given message and cause
- *
+ *
* @param cause
* the throwable that caused this problem
*/
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java Thu Jan 31 02:04:05 2008
@@ -25,7 +25,7 @@
private Codec unvafouredCodec;
private int l;
private long[] favoured;
-
+
public PopulationCodec(Codec favouredCodec, Codec tableCodec, Codec unvafouredCodec) {
this.favouredCodec = favouredCodec;
this.tokenCodec = tableCodec;
@@ -40,18 +40,18 @@
this.unvafouredCodec = unvafouredCodec;
}
-
+
public long decode(InputStream in) throws IOException, Pack200Exception {
throw new Pack200Exception("Population encoding does not work unless the number of elements are known");
}
-
+
public long decode(InputStream in, long last) throws IOException,
Pack200Exception {
throw new Pack200Exception("Population encoding does not work unless the number of elements are known");
}
-
+
public long[] decode(int n, InputStream in) throws IOException, Pack200Exception {
favoured = new long[n]; // there must be <= n values, but probably a lot less
long result[];
@@ -90,7 +90,7 @@
}
}
// read favorites
- result = tokenCodec.decode(n, in);
+ result = tokenCodec.decode(n, in);
// read unfavorites
last = 0;
for(int i = 0; i < n; i++) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java Thu Jan 31 02:04:05 2008
@@ -51,7 +51,7 @@
return value;
} else {
this.last = bCodec.decode(in,last);
- return this.last;
+ return this.last;
}
}
public String toString() {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java Thu Jan 31 02:04:05 2008
@@ -20,6 +20,7 @@
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.OutputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.zip.GZIPInputStream;
@@ -28,9 +29,11 @@
import org.apache.harmony.pack200.bytecode.CPClass;
import org.apache.harmony.pack200.bytecode.CPField;
import org.apache.harmony.pack200.bytecode.CPMethod;
+import org.apache.harmony.pack200.bytecode.CPUTF8;
import org.apache.harmony.pack200.bytecode.ClassConstantPool;
import org.apache.harmony.pack200.bytecode.ClassFile;
import org.apache.harmony.pack200.bytecode.ClassFileEntry;
+import org.apache.harmony.pack200.bytecode.InnerClassesAttribute;
import org.apache.harmony.pack200.bytecode.SourceFileAttribute;
/**
@@ -40,19 +43,19 @@
* combine (non-GZipped) archives into a single large archive by concatenation
* alone. Thus all the hard work in unpacking an archive falls to understanding
* a segment.
- *
+ *
* This class implements the Pack200 specification by an entry point ({@link #parse(InputStream)})
* which in turn delegates to a variety of other parse methods. Each parse
* method corresponds (roughly) to the name of the bands in the Pack200
* specification.
- *
+ *
* The first component of a segment is the header; this contains (amongst other
* things) the expected counts of constant pool entries, which in turn defines
* how many values need to be read from the stream. Because values are variable
* width (see {@link Codec}), it is not possible to calculate the start of the
* next segment, although one of the header values does hint at the size of the
* segment if non-zero, which can be used for buffering purposes.
- *
+ *
* Note that this does not perform any buffering of the input stream; each value
* will be read on a byte-by-byte basis. It does not perform GZip decompression
* automatically; both of these are expected to be done by the caller if the
@@ -65,15 +68,14 @@
/**
+ * TODO: Do we need this method now we have Archive as the main entry point?
+ *
* Decode a segment from the given input stream. This does not attempt to
* re-assemble or export any class files, but it contains enough information
* to be able to re-assemble class files by external callers.
- *
+ *
* @param in
- * the input stream to read from TODO At this point, this must be
- * a non-GZipped input stream, but this decoding could be done in
- * this method in the future (but perhaps more likely on an
- * archive as a whole)
+ * the input stream to read from
* @return a segment parsed from the input stream
* @throws IOException
* if a problem occurs during reading from the underlying stream
@@ -84,19 +86,6 @@
public static Segment parse(InputStream in) throws IOException,
Pack200Exception {
Segment segment = new Segment();
- // See if file is GZip compressed
- if (!in.markSupported()) {
- in = new BufferedInputStream(in);
- if (!in.markSupported())
- throw new IllegalStateException();
- }
- in.mark(2);
- if (((in.read() & 0xFF) | (in.read() & 0xFF) << 8) == GZIPInputStream.GZIP_MAGIC) {
- in.reset();
- in = new BufferedInputStream(new GZIPInputStream(in));
- } else {
- in.reset();
- }
segment.parseSegment(in);
return segment;
}
@@ -105,7 +94,7 @@
private SegmentHeader header;
private CpBands cpBands;
-
+
private AttrDefinitionBands attrDefinitionBands;
private IcBands icBands;
@@ -116,6 +105,10 @@
private FileBands fileBands;
+ private boolean overrideDeflateHint;
+
+ private boolean deflateHint;
+
private ClassFile buildClassFile(int classNum) throws Pack200Exception {
ClassFile classFile = new ClassFile();
classFile.major = header.getDefaultClassMajorVersion(); // TODO If
@@ -163,6 +156,51 @@
cfMethods[i] = cp.add(new CPMethod(classBands.getMethodDescr()[classNum][i],
classBands.getMethodFlags()[classNum][i], classBands.getMethodAttributes()[classNum][i]));
}
+ // TODO: maybe this is a better place to add ic_relevant?
+ // This seems like the right thing to do.
+ boolean addedClasses = false;
+ InnerClassesAttribute innerClassesAttribute = new InnerClassesAttribute("InnerClasses");
+ IcTuple[] ic_relevant = getIcBands().getRelevantIcTuples(fullName, cp);
+
+ for(int index = 0; index < ic_relevant.length; index++) {
+ String innerClassString = ic_relevant[index].thisClassString();
+ String outerClassString = ic_relevant[index].outerClassString();
+ String simpleClassName = ic_relevant[index].simpleClassName();
+
+ CPClass innerClass = null;
+ CPUTF8 innerName = null;
+ CPClass outerClass = null;
+
+ if(ic_relevant[index].isAnonymous()) {
+ innerClass = new CPClass(innerClassString);
+ } else {
+ innerClass = new CPClass(innerClassString);
+ innerName = new CPUTF8(simpleClassName, ClassConstantPool.DOMAIN_ATTRIBUTEASCIIZ);
+ }
+
+ // TODO: I think we need to worry about if the
+ // OUTER class is a member or not - not the
+ // ic_relevant itself.
+// if(ic_relevant[index].isMember()) {
+ outerClass = new CPClass(outerClassString);
+// }
+
+ int flags = ic_relevant[index].F;
+ innerClassesAttribute.addInnerClassesEntry(innerClass, outerClass, innerName, flags);
+ addedClasses = true;
+ }
+ if(addedClasses) {
+ // Need to add the InnerClasses attribute to the
+ // existing classFile attributes.
+ Attribute[] originalAttrs = classFile.attributes;
+ Attribute[] newAttrs = new Attribute[originalAttrs.length + 1];
+ for(int index=0; index < originalAttrs.length; index++) {
+ newAttrs[index] = originalAttrs[index];
+ }
+ newAttrs[newAttrs.length - 1] = innerClassesAttribute;
+ classFile.attributes = newAttrs;
+ cp.add(innerClassesAttribute);
+ }
// sort CP according to cp_All
cp.resolve(this);
// print out entries
@@ -189,7 +227,7 @@
/**
* This performs the actual work of parsing against a non-static instance of
* Segment.
- *
+ *
* @param in
* the input stream to read from
* @throws IOException
@@ -202,7 +240,7 @@
Pack200Exception {
debug("-------");
header = new SegmentHeader();
- header.unpack(in);
+ header.unpack(in);
cpBands = new CpBands(this);
cpBands.unpack(in);
attrDefinitionBands = new AttrDefinitionBands(this);
@@ -216,11 +254,11 @@
fileBands = new FileBands(this);
fileBands.unpack(in);
}
-
+
/**
* Unpacks a packed stream (either .pack. or .pack.gz) into a corresponding
* JarOuputStream.
- *
+ *
* @throws Pack200Exception
* if there is a problem unpacking
* @throws IOException
@@ -229,18 +267,17 @@
public void unpack(InputStream in, JarOutputStream out) throws IOException,
Pack200Exception {
if (!in.markSupported())
- in = new BufferedInputStream(in);
- // TODO Can handle multiple concatenated streams, so should deal with
- // that possibility
- parse(in).unpack(in, out);
+ in = new BufferedInputStream(in);
+ parseSegment(in);
+ writeJar(out);
}
-
+
/**
* This is a local debugging message to aid the developer in writing this
* class. It will be removed before going into production. If the property
* 'debug.pack200' is set, this will generate messages to stderr; otherwise,
* it will be silent.
- *
+ *
* @param message
* @deprecated this should be removed from production code
*/
@@ -258,7 +295,7 @@
* reading, since the file bits may not be loaded and thus just copied from
* one stream to another. Doesn't close the output stream when finished, in
* case there are more entries (e.g. further segments) to be written.
- *
+ *
* @param out
* the JarOutputStream to write data to
* @param in
@@ -277,7 +314,7 @@
long[] fileOptions = fileBands.getFileOptions();
long[] fileSize = fileBands.getFileSize();
byte[][] fileBits = fileBands.getFileBits();
-
+
// out.setLevel(JarEntry.DEFLATED)
// now write the files out
int classNum = 0;
@@ -289,6 +326,9 @@
long modtime = archiveModtime + fileModtime[i];
boolean deflate = (fileOptions[i] & 1) == 1
|| options.shouldDeflate();
+ if (overrideDeflateHint) { // Overridden by a command line argument
+ deflate = deflateHint;
+ }
boolean isClass = (fileOptions[i] & 2) == 2 || name == null
|| name.equals("");
if (isClass) {
@@ -356,6 +396,28 @@
protected IcBands getIcBands() {
return icBands;
+ }
+
+
+ public void setLogLevel(int logLevel) {
+
+ }
+
+ public void setLogStream(OutputStream stream) {
+
+ }
+
+ public void log(int logLevel, String message) {
+
+ }
+
+ /**
+ * Override the archive's deflate hint with the given boolean
+ * @param deflateHint - the deflate hint to use
+ */
+ public void overrideDeflateHint(boolean deflateHint) {
+ this.overrideDeflateHint = true;
+ this.deflateHint = deflateHint;
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java Thu Jan 31 02:04:05 2008
@@ -33,7 +33,7 @@
public class SegmentConstantPool {
/**
- *
+ *
*/
private CpBands bands;
@@ -89,13 +89,13 @@
throw new Error("Get value incomplete");
}
}
-
+
/**
* Subset the constant pool of the specified type
* to be just that which has the specified class
* name. Answer the ConstantPoolEntry at the
* desiredIndex of the subsetted pool.
- *
+ *
* @param cp type of constant pool array to search
* @param desiredIndex index of the constant pool
* @param desiredClassName class to use to generate a
@@ -117,9 +117,9 @@
throw new Error("Don't know how to handle " + cp);
}
realIndex = matchSpecificPoolEntryIndex(array, desiredClassName, index);
- return getConstantPoolEntry(cp, (long)realIndex);
+ return getConstantPoolEntry(cp, realIndex);
}
-
+
/**
* Given the name of a class, answer the CPClass associated
* with that class. Answer null if the class doesn't exist.
@@ -133,13 +133,13 @@
return null;
}
try {
- return getConstantPoolEntry(CP_CLASS, (long)index);
+ return getConstantPoolEntry(CP_CLASS, index);
}
catch (Pack200Exception ex) {
throw new Error("Error getting class pool entry");
}
}
-
+
/**
* Answer the init method for the specified class.
* @param cp constant pool to search (must be CP_METHOD)
@@ -156,7 +156,7 @@
} else {
throw new Error("Nothing but CP_METHOD can be an <init>");
}
- return getConstantPoolEntry(cp, (long)realIndex);
+ return getConstantPoolEntry(cp, realIndex);
}
/**
@@ -166,12 +166,12 @@
* fields defined in the superclass. Similarly, _this bytecodes
* use just those methods/fields defined in this class, and _init
* bytecodes use just those methods that start with <init>.
- *
+ *
* This method takes an array of names, a String to match for,
* an index and a boolean as parameters, and answers the array
* position in the array of the indexth element which matches
* (or equals) the String (depending on the state of the boolean)
- *
+ *
* In other words, if the class array consists of:
* Object [position 0, 0th instance of Object]
* String [position 1, 0th instance of String]
@@ -181,7 +181,7 @@
* then classSpecificPoolEntryIndex(..., "Object", 2, false) will
* answer 4. classSpecificPoolEntryIndex(..., "String", 0, false)
* will answer 1.
- *
+ *
* @param nameArray Array of Strings against which the compareString is tested
* @param compareString String for which to search
* @param desiredIndex nth element with that match (counting from 0)
@@ -199,7 +199,7 @@
* - the secondaryArray[index] .matches() the secondaryCompareString
* When the desiredIndex number of hits has been reached, the index
* into the original two arrays of the element hit is returned.
- *
+ *
* @param primaryArray The first array to search
* @param secondaryArray The second array (must be same .length as primaryArray)
* @param primaryCompareString The String to compare against primaryArray using .equals()
@@ -210,7 +210,7 @@
protected int matchSpecificPoolEntryIndex(String[] primaryArray, String[] secondaryArray, String primaryCompareString, String secondaryCompareRegex, int desiredIndex) {
int instanceCount = -1;
for(int index=0; index < primaryArray.length; index++) {
- if((primaryArray[index].equals(primaryCompareString)) &&
+ if((primaryArray[index].equals(primaryCompareString)) &&
secondaryArray[index].matches(secondaryCompareRegex)) {
instanceCount++;
if(instanceCount == desiredIndex) {
@@ -220,10 +220,13 @@
}
// We didn't return in the for loop, so the desiredMatch
// with desiredIndex must not exist in the array.
+ if(secondaryCompareRegex.equals("^<init>.*")) {
+ SegmentUtils.debug("self halt");
+ }
return -1;
}
-
-
+
+
public ConstantPoolEntry getConstantPoolEntry(int cp, long value) throws Pack200Exception {
int index = (int) value;
if (index == -1) {
@@ -261,7 +264,7 @@
throw new Error("Get value incomplete");
}
}
-
+
public ConstantPoolEntry[] getCpAll() throws Pack200Exception {
ArrayList cpAll = new ArrayList();
// TODO: this is 1.5-specific. Try to get rid
@@ -296,11 +299,11 @@
for(int index=0; index < bands.getCpIMethodClass().length; index++) {
cpAll.add(getConstantPoolEntry(CP_IMETHOD, index));
}
-
+
ConstantPoolEntry[] result = new ConstantPoolEntry[cpAll.size()];
cpAll.toArray(result);
return result;
}
-
+
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java Thu Jan 31 02:04:05 2008
@@ -22,11 +22,11 @@
import java.io.InputStream;
public class SegmentHeader {
-
+
private int archiveMajor;
- private int archiveMinor;
-
+ private int archiveMinor;
+
private long archiveModtime;
private long archiveSize;
@@ -74,14 +74,14 @@
private int segmentsRemaining;
private SegmentOptions options;
-
-
+
+
/**
* The magic header for a Pack200 Segment is 0xCAFED00D. I wonder where they
* get their inspiration from ...
*/
private static final int[] magic = { 0xCA, 0xFE, 0xD0, 0x0D };
-
+
public void unpack(InputStream in) throws IOException,
Pack200Exception, Error, Pack200Exception {
long word[] = decodeScalar("archive_magic_word", in, Codec.BYTE1,
@@ -99,17 +99,17 @@
parseArchiveSpecialCounts(in);
parseCpCounts(in);
parseClassCounts(in);
-
+
if (getBandHeadersSize() > 0) {
- byte[] bandHeaders = new byte[(int) getBandHeadersSize()];
+ byte[] bandHeaders = new byte[getBandHeadersSize()];
readFully(in, bandHeaders);
setBandHeadersData(bandHeaders);
}
}
-
+
/**
* Sets the minor version of this archive
- *
+ *
* @param version
* the minor version of the archive
* @throws Pack200Exception
@@ -120,10 +120,10 @@
throw new Pack200Exception("Invalid segment minor version");
archiveMinor = version;
}
-
+
/**
* Sets the major version of this archive.
- *
+ *
* @param version
* the minor version of the archive
* @throws Pack200Exception
@@ -134,7 +134,7 @@
throw new Pack200Exception("Invalid segment major version: " + version);
archiveMajor = version;
}
-
+
public long getArchiveModtime() {
return archiveModtime;
}
@@ -222,16 +222,16 @@
public long getArchiveSize() {
return archiveSize;
}
-
+
/**
* Obtain the band headers data as an input stream. If no band headers are
* present, this will return an empty input stream to prevent any further
* reads taking place.
- *
+ *
* Note that as a stream, data consumed from this input stream can't be
* re-used. Data is only read from this stream if the encoding is such that
* additional information needs to be decoded from the stream itself.
- *
+ *
* @return the band headers input stream
*/
public InputStream getBandHeadersInputStream() {
@@ -241,19 +241,19 @@
return bandHeadersInputStream;
}
-
+
public int getNumberOfFiles() {
return numberOfFiles;
}
-
+
public int getSegmentsRemaining() {
return segmentsRemaining;
}
-
+
public SegmentOptions getOptions() {
return options;
}
-
+
private void parseArchiveFileCounts(InputStream in) throws IOException,
Pack200Exception {
if (options.hasArchiveFileCounts()) {
@@ -276,7 +276,7 @@
in, Codec.UNSIGNED5));
}
}
-
+
private void parseClassCounts(InputStream in) throws IOException,
Pack200Exception {
innerClassCount = (int)decodeScalar("ic_count", in, Codec.UNSIGNED5);
@@ -286,7 +286,7 @@
Codec.UNSIGNED5);
classCount = (int)decodeScalar("class_count", in, Codec.UNSIGNED5);
}
-
+
private void parseCpCounts(InputStream in) throws IOException,
Pack200Exception {
cpUTF8Count = (int)decodeScalar("cp_Utf8_count", in, Codec.UNSIGNED5);
@@ -306,11 +306,11 @@
cpMethodCount = (int)decodeScalar("cp_Method_count", in, Codec.UNSIGNED5);
cpIMethodCount = (int)decodeScalar("cp_Imethod_count", in, Codec.UNSIGNED5);
}
-
+
/**
* Decode a number of scalars from the band file. A scalar is like a band,
* but does not perform any band code switching.
- *
+ *
* @param name
* the name of the scalar (primarily for logging/debugging
* purposes)
@@ -332,11 +332,11 @@
debug("Parsed #" + name + " (" + n + ")");
return codec.decode(n, in);
}
-
+
/**
* Decode a scalar from the band file. A scalar is like a band, but does not
* perform any band code switching.
- *
+ *
* @param name
* the name of the scalar (primarily for logging/debugging
* purposes)
@@ -358,7 +358,7 @@
debug("Parsed #" + name + " as " + ret);
return ret;
}
-
+
public void setArchiveModtime(long archiveModtime) {
this.archiveModtime = archiveModtime;
}
@@ -370,7 +370,7 @@
private void setAttributeDefinitionCount(long valuie) {
this.attributeDefinitionCount = (int) valuie;
}
-
+
private void setBandHeadersData(byte[] bandHeaders) {
this.bandHeadersInputStream = new ByteArrayInputStream(bandHeaders);
}
@@ -378,12 +378,12 @@
public void setSegmentsRemaining(long value) {
segmentsRemaining = (int) value;
}
-
+
/**
* Completely reads in a byte array, akin to the implementation in
* {@link java.lang.DataInputStream}. TODO Refactor out into a separate
* InputStream handling class
- *
+ *
* @param in
* the input stream to read from
* @param data
@@ -411,7 +411,7 @@
public int getBandHeadersSize() {
return bandHeadersSize;
}
-
+
protected void debug(String message) {
if (System.getProperty("debug.pack200") != null) {
System.err.println(message);
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentOptions.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentOptions.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentOptions.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentOptions.java Thu Jan 31 02:04:05 2008
@@ -61,7 +61,7 @@
/**
* Creates a new segment options with the given integer value.
- *
+ *
* @param options
* the integer value to use as the flags
* @throws Pack200Exception
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java Thu Jan 31 02:04:05 2008
@@ -18,36 +18,15 @@
// TODO Write doc
public final class SegmentUtils {
-
+
public static int countArgs(String descriptor) {
return countArgs(descriptor, 1);
-// int bra = descriptor.indexOf("(");
-// int ket = descriptor.indexOf(")");
-// if (bra == -1 || ket == -1 || ket < bra)
-// throw new IllegalArgumentException("No arguments");
-//
-// boolean inType = false;
-// int count = 0;
-// for (int i = bra + 1; i < ket; i++) {
-// char charAt = descriptor.charAt(i);
-// if (inType && charAt == ';') {
-// inType = false;
-// } else if (!inType && charAt == 'L') {
-// inType = true;
-// count++;
-// } else if (charAt == '[' || inType) {
-// // NOP
-// } else {
-// count++;
-// }
-// }
-// return count;
}
public static int countInvokeInterfaceArgs(String descriptor) {
return countArgs(descriptor, 2);
}
-
+
/**
* Count the number of arguments in the descriptor. Each
* long or double counts as widthOfLongsAndDoubles; all other
@@ -94,7 +73,7 @@
}
return count;
}
-
+
public static int countMatches(long[] flags, IMatcher matcher) {
int count = 0;
for (int i = 0; i < flags.length; i++) {
@@ -103,7 +82,7 @@
}
return count;
}
-
+
public static int countBit16(int[] flags) {
int count = 0;
for (int i = 0; i < flags.length; i++) {
@@ -112,7 +91,7 @@
}
return count;
}
-
+
public static int countBit16(long[] flags) {
int count = 0;
for (int i = 0; i < flags.length; i++) {
@@ -121,14 +100,14 @@
}
return count;
}
-
+
public static int countBit16(long[][] flags) {
int count = 0;
for (int i = 0; i < flags.length; i++) {
for (int j = 0; j < flags[i].length; j++) {
if ((flags[i][j] & (1 << 16)) != 0)
count++;
- }
+ }
}
return count;
}
@@ -141,15 +120,48 @@
return count;
}
+ /**
+ * Given a String classX (the name of a class) and the
+ * collection of inner class tuples ic_all, answer
+ * ic_relevant(classX)
+ * @param classX String class name
+ * @param ic_all ICTuple[] all the inner class tuples
+ * @return ICTuple[] all the relevant tuples sorted as in
+ */
+ public static IcTuple[] icRelevant(String classX, IcTuple[] ic_all) {
+ return null;
+ }
+
+ public static boolean isRelevant(String outerClass, IcTuple tuple) {
+ if(tuple.C.equals(outerClass)) {
+ // If the outer class name is explicitly
+ // specified and it's the correct one, the
+ // tuple is relevant.
+ return true;
+ }
+
+ if(tuple.C != null) {
+ // If the outer class name is explicitly specified
+ // (non-null) and it's not the correct one, the
+ // tuple is not relevant.
+ return false;
+ }
+
+ // Now we know that tuple.C is null, so it might be
+ // relevant. Find out.
+ return false;
+ }
+
+
private SegmentUtils() {
// Intended to be a helper class
}
-
+
/**
* This is a debugging message to aid the developer in writing this
* class. If the property 'debug.pack200' is set, this will
* generate messages to stderr; otherwise, it will be silent.
- *
+ *
* @param message
* @deprecated this may be removed from production code
*/
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationDefaultAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationDefaultAttribute.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationDefaultAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationDefaultAttribute.java Thu Jan 31 02:04:05 2008
@@ -38,7 +38,7 @@
protected void writeBody(DataOutputStream dos) throws IOException {
element_value.writeBody(dos);
}
-
+
protected void resolve(ClassConstantPool pool) {
super.resolve(pool);
element_value.resolve(pool);
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationsAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationsAttribute.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationsAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/AnnotationsAttribute.java Thu Jan 31 02:04:05 2008
@@ -24,29 +24,29 @@
*/
public abstract class AnnotationsAttribute extends Attribute {
-
+
/**
* Class to represent the annotation structure for class file attributes
*/
public static class Annotation {
-
+
private int num_pairs;
private CPUTF8[] element_names;
private ElementValue[] element_values;
private CPUTF8 type;
-
+
// Resolved values
private int type_index;
private int[] name_indexes;
-
-
+
+
public Annotation(int num_pairs, CPUTF8 type, CPUTF8[] element_names, ElementValue[] element_values) {
this.num_pairs = num_pairs;
this.type = type;
this.element_names = element_names;
this.element_values = element_values;
}
-
+
public int getLength() {
int length = 4;
for (int i = 0; i < num_pairs; i++) {
@@ -55,7 +55,7 @@
}
return length;
}
-
+
public void resolve(ClassConstantPool pool) {
type.resolve(pool);
type_index = pool.indexOf(type);
@@ -75,22 +75,22 @@
element_values[i].writeBody(dos);
}
}
-
+
}
public static class ElementValue {
-
+
private Object value;
private int tag;
-
+
// resolved value index if it's a constant
private int constant_value_index = -1;
-
+
public ElementValue(int tag, Object value) {
this.tag = tag;
this.value = value;
}
-
+
public void resolve(ClassConstantPool pool) {
if(value instanceof CPConstant) {
((CPConstant)value).resolve(pool);
@@ -100,7 +100,7 @@
constant_value_index = pool.indexOf((CPClass)value);
} else if (value instanceof CPNameAndType) {
((CPNameAndType)value).resolve(pool);
- } else if (value instanceof Annotation) {
+ } else if (value instanceof Annotation) {
((Annotation)value).resolve(pool);
} else if (value instanceof ElementValue[]) {
ElementValue[] nestedValues = (ElementValue[])value;
@@ -116,7 +116,7 @@
dos.writeShort(constant_value_index);
} else if (value instanceof CPNameAndType) {
((CPNameAndType)value).writeBody(dos);
- } else if (value instanceof Annotation) {
+ } else if (value instanceof Annotation) {
((Annotation)value).writeBody(dos);
} else if (value instanceof ElementValue[]) {
ElementValue[] nestedValues = (ElementValue[])value;
@@ -158,6 +158,6 @@
super(attributeName);
}
-
+
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/Attribute.java Thu Jan 31 02:04:05 2008
@@ -62,7 +62,7 @@
* when attributes are nested within other attributes - the outer attribute
* needs to take the inner attribute headers into account when calculating
* its length.
- *
+ *
* @return int adjusted length
*/
protected int getLengthIncludingHeader() {
@@ -76,7 +76,7 @@
/**
* Answer true if the receiver needs to have BCI renumbering applied to it;
* otherwise answer false.
- *
+ *
* @return boolean BCI renumbering required
*/
public boolean hasBCIRenumbering() {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java Thu Jan 31 02:04:05 2008
@@ -25,23 +25,23 @@
public abstract class BCIRenumberedAttribute extends Attribute {
protected boolean renumbered = false;
-
+
/* (non-Javadoc)
* @see org.apache.harmony.pack200.bytecode.Attribute#hasBCIRenumbering()
*/
public boolean hasBCIRenumbering() {
return true;
}
-
+
public BCIRenumberedAttribute(String attributeName) {
super(attributeName);
}
-
+
protected abstract int getLength();
protected abstract void writeBody(DataOutputStream dos) throws IOException;
public abstract String toString();
protected abstract int[] getStartPCs();
-
+
/**
* In Pack200, line number tables are BCI renumbered.
* This method takes the byteCodeOffsets (which is
@@ -49,7 +49,7 @@
* byte code array of each instruction) and updates the
* start_pcs so that it points to the instruction index
* itself, not the BCI renumbering of the instruction.
- *
+ *
* @param byteCodeOffsets List of Integer offsets of the bytecode array
*/
public void renumber(List byteCodeOffsets) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java Thu Jan 31 02:04:05 2008
@@ -124,22 +124,22 @@
for(int index = 0; index < nested.length; index++) {
int argLength = getNestedPosition(index)[1];
switch(argLength) {
-
+
case 1:
setOperandByte(pool.indexOf(nested[index]), getNestedPosition(index)[0]);
break;
-
- case 2:
+
+ case 2:
setOperand2Bytes(pool.indexOf(nested[index]), getNestedPosition(index)[0]);
break;
-
+
case 4:
// TODO: need to handle wides?
SegmentUtils.debug("Need to handle wides");
// figure out and if so, handle and put a break here.
// break;
-
- default:
+
+ default:
SegmentUtils.debug("Unhandled resolve " + this);
}
}
@@ -153,7 +153,7 @@
* operand to be the appropriate values. All values in
* operands[] will be masked with 0xFF so they fit into
* a byte.
- * @param operands int[] rewrite operand bytes
+ * @param operands int[] rewrite operand bytes
*/
public void setOperandBytes(int[] operands) {
int firstOperandIndex = getByteCodeForm().firstOperandIndex();
@@ -162,23 +162,23 @@
// No operand rewriting permitted for this bytecode
throw new Error("Trying to rewrite " + this + " that has no rewrite");
}
-
+
if(byteCodeFormLength != operands.length) {
throw new Error("Trying to rewrite " + this + " with " + operands.length + " but bytecode has length " + byteCodeForm.operandLength());
}
-
+
for(int index=0; index < byteCodeFormLength; index++) {
rewrite[index + firstOperandIndex] = operands[index] & 0xFF;
}
}
-
+
/**
* Given an int operand, set the rewrite bytes for
* that position and the one immediately following it
* to a high-byte, low-byte encoding of the operand.
- *
+ *
* @param operand int to set the rewrite bytes to
- * @param position int position in the operands of the
+ * @param position int position in the operands of the
* rewrite bytes. For a rewrite array of {100, -1, -1, -1}
* position 0 is the first -1, position 1 is the second -1,
* etc.
@@ -190,15 +190,15 @@
// No operand rewriting permitted for this bytecode
throw new Error("Trying to rewrite " + this + " that has no rewrite");
}
-
+
if(firstOperandIndex + position + 1 > byteCodeFormLength) {
throw new Error("Trying to rewrite " + this + " with an int at position " + position + " but this won't fit in the rewrite array");
}
-
+
rewrite[firstOperandIndex + position] = (operand & 0xFF00) >> 8;
rewrite[firstOperandIndex + position + 1] = operand & 0xFF;
}
-
+
/**
* This is just like setOperandInt, but takes special care when the
* operand is less than 0 to make sure it's written correctly.
@@ -218,9 +218,9 @@
* Given an int operand, treat it as a byte and set
* the rewrite byte for that position to that value.
* Mask of anything beyond 0xFF.
- *
+ *
* @param operand int to set the rewrite byte to (unsigned)
- * @param position int position in the operands of the
+ * @param position int position in the operands of the
* rewrite bytes. For a rewrite array of {100, -1, -1, -1}
* position 0 is the first -1, position 1 is the second -1,
* etc.
@@ -232,29 +232,29 @@
// No operand rewriting permitted for this bytecode
throw new Error("Trying to rewrite " + this + " that has no rewrite");
}
-
+
if(firstOperandIndex + position > byteCodeFormLength) {
throw new Error("Trying to rewrite " + this + " with an byte at position " + position + " but this won't fit in the rewrite array");
}
-
- rewrite[firstOperandIndex + position] = operand & 0xFF;
+
+ rewrite[firstOperandIndex + position] = operand & 0xFF;
}
-
-
+
+
public String toString() {
return getByteCodeForm().getName();
}
-
+
public void setNested(ClassFileEntry[] nested) {
this.nested = nested;
}
-
+
/**
* nestedPositions is an array of arrays of ints. Each
* subarray specifies a position of a nested
* element (from the nested[] array) and the length of
* that element.
- *
+ *
* For instance, one might have a nested of:
* {CPClass java/lang/Foo, CPFloat 3.14}
* The nestedPositions would then be:
@@ -265,17 +265,17 @@
* occurrences of -1). The CPFloat will be resolved to
* an int position and inserted at positions 2 and 3 of
* the rewrite arguments.
- *
+ *
* @param nestedPositions
*/
public void setNestedPositions(int[][] nestedPositions) {
this.nestedPositions = nestedPositions;
}
-
+
public int[][] getNestedPositions() {
return nestedPositions;
}
-
+
public int[] getNestedPosition(int index) {
return getNestedPositions()[index];
}
@@ -285,7 +285,7 @@
* a multi-bytecode instruction (such as
* aload0_putfield_super); otherwise, it will answer
* false.
- *
+ *
* @return boolean true if multibytecode, false otherwise
*/
public boolean hasMultipleByteCodes() {
@@ -298,10 +298,10 @@
* to know where they are in order to calculate their
* targets). This method lets the CodeAttribute specify
* where the byte code is.
- *
+ *
* Since there are no aload0+label instructions, this
* method doesn't worry about multioperation bytecodes.
- *
+ *
* @param byteCodeOffset int position in code array.
*/
public void setByteCodeIndex(int byteCodeOffset) {
@@ -312,7 +312,7 @@
public int getByteCodeIndex() {
return byteCodeOffset;
}
-
+
/**
* Some ByteCodes (in particular, those with labels)
* have to keep track of byteCodeTargets. These are
@@ -320,17 +320,17 @@
* relative to the byteCodeOffset, but later get fixed
* up to point to the absolute position in the CodeAttribute
* array. This method sets the targets.
- *
+ *
* @param byteCodeTarget int index in array
*/
public void setByteCodeTargets(int[] byteCodeTargets) {
this.byteCodeTargets = byteCodeTargets;
}
-
+
public int[] getByteCodeTargets() {
return byteCodeTargets;
}
-
+
/**
* Some ByteCodes (in particular, those with labels
* need to be fixed up after all the bytecodes in the
@@ -346,23 +346,23 @@
* Some bytecodes (the ones with variable lengths) can't
* have a static rewrite array - they need the ability to
* update the array. This method permits that.
- *
+ *
* Note that this should not be called from bytecodes
* which have a static rewrite; use the table in ByteCodeForm
* instead to specify those rewrites.
- *
+ *
* @param rewrite
*/
public void setRewrite(int[] rewrite) {
this.rewrite = rewrite;
}
-
+
/**
* Some bytecodes (the ones with variable lengths) can't
* have a static rewrite array - they need the ability to
* update the array. This method permits their associated
* bytecode formst to query their rewrite array.
- *
+ *
* Note that this should not be called from bytecodes
* which have a static rewrite; use the table in ByteCodeForm
* instead to specify those rewrites.
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java Thu Jan 31 02:04:05 2008
@@ -34,7 +34,7 @@
this.utf8 = new CPUTF8(name, ClassConstantPool.DOMAIN_NORMALASCIIZ);
}
-
+
public boolean equals(Object obj) {
if (this == obj)
return true;
@@ -60,7 +60,7 @@
return new ClassFileEntry[] { utf8, };
}
-
+
public int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -81,12 +81,14 @@
public String getName() {
return name;
}
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeShort(index);
}
-
+
public String comparisonString() {
+ // TODO: what to do about inner classes?
+ if(name==null) {return "null:name (probably an inner class?)";};
return getName();
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPConstant.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPConstant.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPConstant.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPConstant.java Thu Jan 31 02:04:05 2008
@@ -26,7 +26,7 @@
this.value = value;
}
-
+
public boolean equals(Object obj) {
if (this == obj)
return true;
@@ -43,7 +43,7 @@
return true;
}
-
+
public int hashCode() {
final int PRIME = 31;
int result = 1;
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPDouble.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPDouble.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPDouble.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPDouble.java Thu Jan 31 02:04:05 2008
@@ -25,12 +25,12 @@
this.domain = ClassConstantPool.DOMAIN_DOUBLE;
}
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeDouble(getNumber().doubleValue());
}
-
+
public String toString() {
return "Double: " + getValue();
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java Thu Jan 31 02:04:05 2008
@@ -36,13 +36,13 @@
}
-
+
protected ClassFileEntry[] getNestedClassFileEntries() {
return new ClassFileEntry[] {className, nameAndType};
}
-
+
protected void resolve(ClassConstantPool pool) {
super.resolve(pool);
nameAndTypeIndex = pool.indexOf(nameAndType);
@@ -54,13 +54,15 @@
dos.writeShort(nameAndTypeIndex);
}
-
+
public String toString() {
return "FieldRef: " + className + "#" + nameAndType;
}
+ public String comparisonString() {
+ return (className.getName() + Character.MAX_VALUE) + nameAndType.descriptor + Character.MAX_VALUE + nameAndType.name;
+ }
-
public int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -70,7 +72,7 @@
}
-
+
public boolean equals(Object obj) {
if (this == obj)
return true;
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFloat.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFloat.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFloat.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFloat.java Thu Jan 31 02:04:05 2008
@@ -25,12 +25,12 @@
this.domain = ClassConstantPool.DOMAIN_FLOAT;
}
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeFloat(getNumber().floatValue());
}
-
+
public String toString() {
return "Float: " + getValue();
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInteger.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInteger.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInteger.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInteger.java Thu Jan 31 02:04:05 2008
@@ -26,12 +26,12 @@
this.domain = ClassConstantPool.DOMAIN_INTEGER;
}
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeInt(getNumber().intValue());
}
-
+
public String toString() {
return "Integer: " + getValue();
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInterfaceMethodRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInterfaceMethodRef.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInterfaceMethodRef.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPInterfaceMethodRef.java Thu Jan 31 02:04:05 2008
@@ -28,7 +28,7 @@
* for an invokeinterface call. This is equal to 1 + the
* count of all the args, where longs and doubles count for
* 2 and all others count for 1.
- *
+ *
* @return integer count
*/
public int invokeInterfaceCount() {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPLong.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPLong.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPLong.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPLong.java Thu Jan 31 02:04:05 2008
@@ -26,12 +26,12 @@
this.domain = ClassConstantPool.DOMAIN_LONG;
}
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeLong(getNumber().longValue());
}
-
+
public String toString() {
return "Long: " + getValue();
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMember.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMember.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMember.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMember.java Thu Jan 31 02:04:05 2008
@@ -45,7 +45,7 @@
}
-
+
protected ClassFileEntry[] getNestedClassFileEntries() {
int attributeCount = attributes.size();
ClassFileEntry[] entries = new ClassFileEntry[attributeCount+2];
@@ -58,7 +58,7 @@
}
-
+
protected void resolve(ClassConstantPool pool) {
super.resolve(pool);
nameIndex = pool.indexOf(name);
@@ -69,12 +69,12 @@
}
}
-
+
public String toString() {
return "Field: " + name + "(" + descriptor + ")";
}
-
+
public int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -86,7 +86,7 @@
}
-
+
public boolean equals(Object obj) {
if (this == obj)
return true;
@@ -116,7 +116,7 @@
}
-
+
protected void doWrite(DataOutputStream dos) throws IOException {
dos.writeShort(flags);
dos.writeShort(nameIndex);
@@ -127,7 +127,7 @@
Attribute attribute = (Attribute) attributes.get(i);
attribute.doWrite(dos);
}
-
+
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPNameAndType.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPNameAndType.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPNameAndType.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPNameAndType.java Thu Jan 31 02:04:05 2008
@@ -68,7 +68,7 @@
return new ClassFileEntry[] { name, descriptor };
}
-
+
protected void resolve(ClassConstantPool pool) {
super.resolve(pool);
descriptorIndex = pool.indexOf(descriptor);
@@ -79,18 +79,18 @@
* field_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2
* attributes_count; attribute_info attributes[attributes_count]; }
*/
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeShort(nameIndex);
dos.writeShort(descriptorIndex);
}
-
+
public String toString() {
return "NameAndType: " + name + "(" + descriptor + ")";
}
-
+
public int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -99,7 +99,7 @@
return result;
}
-
+
public boolean equals(Object obj) {
if (this == obj)
return true;
@@ -131,14 +131,14 @@
public int invokeInterfaceCount() {
return 1 + SegmentUtils.countInvokeInterfaceArgs(descriptor.underlyingString());
}
-
+
/* (non-Javadoc)
* @see org.apache.harmony.pack200.bytecode.ConstantPoolEntry#comparisonString()
*/
public String comparisonString() {
// First come those things which don't have an
- // associated signature. Then come the native signatures,
+ // associated signature. Then come the native signatures,
// then finally the class signatures.
// TODO: I think Character.MAX_VALUE is no longer the
// biggest character, what with the weird codepage thing
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java Thu Jan 31 02:04:05 2008
@@ -81,13 +81,13 @@
// This one is tricky. The sorting appears to be
// done based on the indices of the method descriptor
// and class name in the classpool *after* sorting them.
-
+
// If we haven't yet been resolved, just do a normal
// compare (so things like .contains() work).
if(!isResolved()) {
return super.comparisonString();
}
-
+
// If we get here, the receiver has been resolved; there
// is a different sort order.
StringBuffer result = new StringBuffer();
@@ -95,7 +95,7 @@
int padLength = 6;
int classIndexLength = ("" + classNameIndex).length();
int nameAndTypeIndexLength = ("" + nameAndTypeIndex).length();
-
+
for(int index=0; index < (padLength - classIndexLength); index++) {
result.append('0');
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPString.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPString.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPString.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPString.java Thu Jan 31 02:04:05 2008
@@ -30,19 +30,19 @@
}
-
+
protected void writeBody(DataOutputStream dos) throws IOException {
dos.writeShort(nameIndex);
}
-
+
public String toString() {
return "String: " + getValue();
}
/**
* Allows the constant pool entries to resolve their nested entries
- *
+ *
* @param pool
*/
protected void resolve(ClassConstantPool pool) {
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPUTF8.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPUTF8.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPUTF8.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPUTF8.java Thu Jan 31 02:04:05 2008
@@ -44,7 +44,7 @@
return false;
return true;
}
-
+
public int hashCode() {
final int PRIME = 31;
int result = 1;
@@ -76,7 +76,7 @@
public String underlyingString() {
return utf8;
}
-
+
public String comparisonString() {
// Should use either normalComparisonString or signatureComparisonString.
// If we get here, that might indicate an error.
@@ -84,10 +84,14 @@
}
public String normalComparisonString() {
+ // TODO: what to do about inner classes?
+ if(utf8==null) {return "null:utf8 (probably an inner class?)";};
return utf8;
}
public String signatureComparisonString() {
+ // TODO: what to do about inner classes?
+ if(utf8==null) {return "null:utf8 (probably an inner class?)";};
StringBuffer alphaChars = new StringBuffer();
StringBuffer extraChars = new StringBuffer();
if(utf8.length() > 0){
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java Thu Jan 31 02:04:05 2008
@@ -17,7 +17,6 @@
package org.apache.harmony.pack200.bytecode;
import java.util.ArrayList;
-import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
@@ -26,41 +25,7 @@
public class ClassConstantPool {
-
- class PoolComparator implements Comparator {
- /* (non-Javadoc)
- * Note: this comparator imposes orderings that are inconsistent with equals.
- * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
- */
- public int compare(Object o1, Object o2) {
- // If we compare anything other than ConstantPoolEntries
- // with this comparator, it is an error.
- ConstantPoolEntry cpe1 = (ConstantPoolEntry)o1;
- ConstantPoolEntry cpe2 = (ConstantPoolEntry)o2;
-
- int domain1 = cpe1.getDomain();
- int domain2 = cpe2.getDomain();
-
- if(domain1 < domain2) {
- return -1;
- }
- if(domain1 > domain2) {
- return 1;
- }
-
- // Domains must be the same, need to compare
- // based on name.
- // TODO: what means name?
- String compare1 = cpe1.comparisonString();
- String compare2 = cpe2.comparisonString();
- return compare1.compareTo(compare2);
-// if(cpe1.creationOrder < cpe2.creationOrder) {
-// return -1;
-// } else {
-// return 1;
-// }
- }
- }
+
// These are the domains in sorted order.
public static int DOMAIN_UNDEFINED = 0;
public static int DOMAIN_INTEGER = 1;
@@ -92,11 +57,11 @@
// We don't want duplicates.
// Only add in constant pools, but resolve all types since they may
// introduce new constant pool entries
-// This is a handy way to see what's adding a ClassFileEntry - set a breakpoint on the print
-// if(entry instanceof CPUTF8) {
-// System.out.println("AAH:" + ((CPUTF8)entry).comparisonString());
+// This is a handy way to see what's adding a ClassFileEntry - set a breakpoint on the print
+// if(entry instanceof CPFieldRef) {
+// SegmentUtils.debug("AAH:" + ((CPFieldRef)entry).comparisonString());
// if (((CPUTF8)entry).underlyingString().matches("Code")) {
-// System.out.println("Adding");
+// SegmentUtils.debug("Adding");
// }
// }
if (entry instanceof ConstantPoolEntry) {
@@ -156,7 +121,7 @@
}
resolve();
}
-
+
public void resolve() {
resolved= true;
Iterator it = entries.iterator();
@@ -169,7 +134,7 @@
ClassFileEntry entry = (ClassFileEntry) it.next();
entry.resolve(this);
}
-
+
// Now that everything has been resolved, do one
// final sort of the class pool. This fixes up
// references, which are sorted by index in the
@@ -189,4 +154,22 @@
}
}
+ /**
+ * Answer the collection of CPClasses currently held
+ * by the ClassPoolSet. This is used to calculate relevant
+ * classes when generating the set of relevant inner
+ * classes (ic_relevant())
+ * @return ArrayList collection of all classes.
+ *
+ * NOTE: when this list is answered, the classes may not
+ * yet be resolved.
+ */
+ public List allClasses() {
+ List classesList = new ArrayList();
+ Iterator it = classPoolSet.partialIterator(DOMAIN_CLASSREF, DOMAIN_CLASSREF);
+ while(it.hasNext()) {
+ classesList.add(it.next());
+ }
+ return classesList;
+ }
}
Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassFileEntry.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassFileEntry.java?rev=617085&r1=617084&r2=617085&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassFileEntry.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassFileEntry.java Thu Jan 31 02:04:05 2008
@@ -35,7 +35,7 @@
/**
* Allows the constant pool entries to resolve their nested entries
- *
+ *
* @param pool
*/
protected void resolve(ClassConstantPool pool) {
@@ -45,7 +45,7 @@
protected boolean isResolved() {
return resolved;
}
-
+
public abstract String toString();
public final void write(DataOutputStream dos) throws IOException {