You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2008/02/05 12:48:48 UTC

svn commit: r618613 - in /harmony/enhanced/classlib/trunk/modules/pack200/src: main/java/org/apache/harmony/pack200/ main/java/org/apache/harmony/pack200/bytecode/ main/java/org/apache/harmony/pack200/bytecode/forms/ test/java/org/apache/harmony/pack20...

Author: tellison
Date: Tue Feb  5 03:48:43 2008
New Revision: 618613

URL: http://svn.apache.org/viewvc?rev=618613&view=rev
Log:
Apply patch HARMONY-5456 ([pack200][classlib] innerclass handling and invokespecial_new_init)

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java
    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
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/InnerClassesAttribute.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewInitMethodRefForm.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BcBands.java Tue Feb  5 03:48:43 2008
@@ -141,14 +141,6 @@
                    }
                    for (int i = 0; i < methodByteCodePacked[c][m].length; i++) {
                        int codePacked = 0xff & methodByteCodePacked[c][m][i];
-                       // TODO a lot of this needs to be encapsulated in the
-                       // place that
-                       // calculates what the arguments are, since (a) it will
-                       // need
-                       // to know where to get them, and (b) what to do with
-                       // them
-                       // once they've been gotten. But that's for another
-                       // time.
                        switch (codePacked) {
                        case 16: // bipush
                        case 188: // newarray
@@ -406,7 +398,6 @@
                             operandManager, exceptionTable);
                     methodAttributes[c][m].add(codeAttr);
                     codeAttr.renumber(codeAttr.byteCodeOffsets);
-                    // Should I add all the attributes in here?
                  ArrayList currentAttributes = (ArrayList)orderedCodeAttributes.get(i);
                  for(int index=0;index < currentAttributes.size(); index++) {
                      Attribute currentAttribute = (Attribute)currentAttributes.get(index);

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=618613&r1=618612&r2=618613&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 Feb  5 03:48:43 2008
@@ -29,8 +29,6 @@
  * Pack200 Inner Class Bands
  */
 public class IcBands extends BandSet {
-
-
     private IcTuple[] icAll;
 
     private String[] cpUTF8;
@@ -92,14 +90,12 @@
         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,
@@ -109,26 +105,12 @@
             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;
                         }
@@ -137,12 +119,21 @@
             }
         }
 
-        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());
+        // Now order the result as a subsequence of ic_all
+        IcTuple[] orderedRelevantTuples = new IcTuple[relevantTuples.size()];
+        int orderedRelevantIndex = 0;
+        for(int index=0; index < allTuplesSize; index++) {
+            if(relevantTuples.contains(allTuples[index])) {
+                orderedRelevantTuples[orderedRelevantIndex] = allTuples[index];
+                orderedRelevantIndex++;
+            }
+        }
+        if(orderedRelevantIndex != orderedRelevantTuples.length) {
+            // This should never happen. If it does, we have a
+            // logic error in the ordering code.
+            throw new Error("Missing a tuple when ordering them");
         }
-        return result;
+        return orderedRelevantTuples;
     }
 
 }

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=618613&r1=618612&r2=618613&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 Feb  5 03:48:43 2008
@@ -102,7 +102,8 @@
         if(predicted()) {
             return C;
         } else {
-            // TODO: this may not be right.
+            // TODO: this may not be right. What if I 
+            // get a class like Foo#Bar$Baz$Bug?
             return C2 + "$" + N;
         }
     }
@@ -146,26 +147,15 @@
                 member = false;
             }
             if(index + 1 != lastPosition) {
+                // TODO: might need more logic to handle
+                // classes with separators of non-$ characters
+                // (ie Foo#Bar)
                 cachedOuterClassString += '$';
             }
         }
-        // Now special-case: if the last part of the outer
-        // class name is all digits, then the cachedOuterClassString
-        // is null (an anonymous outer class). If the cachedInnerClassString
-        // is all digits, then the cachedInnerClassString is null (an
-        // anonymous inner class).
-        // TODO: Don't know about this - we might need to
-        // do this later on (after we've determined what's
-        // anonymous and what isn't) so we point to the right
-        // class file entries.
-//        if(isAllDigits(nameComponents[lastPosition - 1])) {
-//            cachedOuterClassString = null;
-//            anonymous = false;
-//        }
         if(isAllDigits(cachedSimpleClassName)) {
             anonymous = true;
             member = false;
-//            cachedSimpleClassName = C;
         }
     }
 

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=618613&r1=618612&r2=618613&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 Feb  5 03:48:43 2008
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 import java.util.zip.GZIPInputStream;
@@ -68,8 +71,6 @@
 
 
 	/**
-     * 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.
@@ -86,6 +87,19 @@
 	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;
 	}
@@ -128,7 +142,14 @@
 				.getAttributeLayout(AttributeLayout.ATTRIBUTE_SOURCE_FILE,
 						AttributeLayout.CONTEXT_CLASS);
 		if (SOURCE_FILE.matches(classBands.getClassFlags()[classNum])) {
-			String fileName = fullName.substring(i) + ".java";
+		    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(fileName)) };
 		} else {
@@ -156,40 +177,54 @@
 			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;
+
+		// add inner class attribute (if required)
+		boolean addInnerClassesAttr = false;
+		IcTuple[] ic_local = getClassBands().getIcLocal()[classNum];
+		boolean ic_local_sent = false;
+		if(ic_local != null) {
+		    ic_local_sent = true;
+		}
 		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();
+		IcTuple[] ic_stored = computeIcStored(ic_local, ic_relevant);
+		for(int index = 0; index < ic_stored.length; index++) {
+		    String innerClassString = ic_stored[index].thisClassString();
+		    String outerClassString = ic_stored[index].outerClassString();
+		    String simpleClassName = ic_stored[index].simpleClassName();
 
 		    CPClass innerClass = null;
 		    CPUTF8 innerName = null;
 		    CPClass outerClass = null;
 
-		    if(ic_relevant[index].isAnonymous()) {
+		    if(ic_stored[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()) {
+		    if(ic_stored[index].isMember()) {
 		        outerClass = new CPClass(outerClassString);
-//		    }
+		    }
 
-	        int flags = ic_relevant[index].F;
+	        int flags = ic_stored[index].F;
 	        innerClassesAttribute.addInnerClassesEntry(innerClass, outerClass, innerName, flags);
-	        addedClasses = true;
+	        addInnerClassesAttr = true;
+		}
+		// If ic_local is sent and it's empty, don't add
+		// the inner classes attribute.
+		if(ic_local_sent && (ic_local.length == 0)) {
+		    addInnerClassesAttr = false;
+		}
+		
+		// If ic_local is not sent and ic_relevant is empty,
+		// don't add the inner class attribute.
+		if(!ic_local_sent && (ic_relevant.length == 0)) {
+		    addInnerClassesAttr = false;
 		}
-		if(addedClasses) {
+		
+		if(addInnerClassesAttr) {
 		    // Need to add the InnerClasses attribute to the
 		    // existing classFile attributes.
 		    Attribute[] originalAttrs = classFile.attributes;
@@ -225,6 +260,54 @@
 
 
 	/**
+	 * Given an ic_local and an ic_relevant, use them to
+	 * calculate what should be added as ic_stored.
+	 * @param ic_local IcTuple[] array of local transmitted tuples
+	 * @param ic_relevant IcTuple[] array of relevant tuples
+	 * @return IcTuple[] array of tuples to be stored. If ic_local 
+	 *     is null or empty, the values returned may not be correct.
+	 *     The caller will have to determine if this is the case.
+	 */
+	private IcTuple[] computeIcStored(IcTuple[] ic_local, IcTuple[] ic_relevant) {
+	    List result = new ArrayList();
+	    List resultCopy = new ArrayList();
+	    List localList = new ArrayList();
+	    List relevantList = new ArrayList();
+	    if(ic_local != null) {
+	        // If ic_local is null, this code doesn't get
+	        // executed - which means the list ends up being
+	        // ic_relevant.
+	        for(int index=0; index < ic_local.length; index++) { 
+	            result.add(ic_local[index]);
+	            resultCopy.add(ic_local[index]);
+	            localList.add(ic_local[index]);
+	        }
+	    }
+	    for(int index=0; index < ic_relevant.length; index++) { 
+	        result.add(ic_relevant[index]);
+	        resultCopy.add(ic_relevant[index]);
+	        relevantList.add(ic_relevant[index]);
+	    }
+	    
+	    // Since we're removing while iterating, iterate over
+	    // a copy.
+	    Iterator it = resultCopy.iterator();
+	    
+	    while(it.hasNext()) {
+	        IcTuple tuple = (IcTuple)it.next();
+	        if(localList.contains(tuple) && relevantList.contains(tuple)) {
+	            while(result.remove(tuple)) {};
+	        }
+	    }
+	    IcTuple[] resultArray = new IcTuple[result.size()];
+	    for(int index=0; index < resultArray.length; index++) {
+	        resultArray[index] = (IcTuple)result.get(index);
+	    }
+	    return resultArray;
+    }
+
+
+    /**
 	 * This performs the actual work of parsing against a non-static instance of
 	 * Segment.
 	 *

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentConstantPool.java Tue Feb  5 03:48:43 2008
@@ -178,8 +178,8 @@
      *  String [position 2, 1st instance of String]
      *  Object [position 3, 1st instance of Object]
      *  Object [position 4, 2nd instance of Object]
-     * then classSpecificPoolEntryIndex(..., "Object", 2, false) will
-     * answer 4. classSpecificPoolEntryIndex(..., "String", 0, false)
+     * then matchSpecificPoolEntryIndex(..., "Object", 2, false) will
+     * answer 4. matchSpecificPoolEntryIndex(..., "String", 0, false)
      * will answer 1.
      *
      * @param nameArray Array of Strings against which the compareString is tested
@@ -220,9 +220,6 @@
     	}
     	// 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;
     }
 

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentUtils.java Tue Feb  5 03:48:43 2008
@@ -121,37 +121,22 @@
 	}
 
 	/**
-	 * 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
+	 * Answer the index of the first character <= '$'
+	 * in the parameter. This is used instead of indexOf('$')
+	 * because inner classes may be separated by any character
+	 * <= '$' (in other words, Foo#Bar is as valid as Foo$Bar).
+	 * If no $ character is found, answer -1.
+	 * @param string String to search for $
+	 * @return first index of $ character, or -1 if not found
 	 */
-	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;
+	public static int indexOfFirstDollar(String string) {
+	    for(int index=0; index<string.length(); index++) {
+	        if(string.charAt(index) <= '$') {
+	            return index;
+	        }
 	    }
-
-	    // Now we know that tuple.C is null, so it might be
-	    // relevant. Find out.
-	    return false;
+	    return -1;
 	}
-
 
 	private SegmentUtils() {
 		// Intended to be a helper class

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/BCIRenumberedAttribute.java Tue Feb  5 03:48:43 2008
@@ -20,8 +20,6 @@
 import java.io.IOException;
 import java.util.List;
 
-import org.apache.harmony.pack200.SegmentUtils;
-
 public abstract class BCIRenumberedAttribute extends Attribute {
 
     protected boolean renumbered = false;
@@ -54,9 +52,7 @@
      */
     public void renumber(List byteCodeOffsets) {
         if(renumbered) {
-            SegmentUtils.debug("Trying to renumber something renumbered");
-            return;
-//            throw new Error("Trying to renumber a line number table that has already been renumbered");
+            throw new Error("Trying to renumber a line number table that has already been renumbered");
         }
         renumbered = true;
         int[] startPCs = getStartPCs();

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ByteCode.java Tue Feb  5 03:48:43 2008
@@ -135,7 +135,8 @@
 
 				case 4:
 					// TODO: need to handle wides?
-					SegmentUtils.debug("Need to handle wides");
+                    SegmentUtils.debug("Need to handle wides");
+                    throw new Error("Instruction argument not handled");
 					// figure out and if so, handle and put a break here.
 					// break;
 

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java Tue Feb  5 03:48:43 2008
@@ -18,18 +18,15 @@
 
 public class CPMethodRef extends CPRef {
 
-	protected CPClass className = null;
-	protected CPNameAndType descriptor = null;
-
 	public CPMethodRef(String className, String descriptor) {
 		super(ConstantPoolEntry.CP_Methodref, className, descriptor);
 		this.className = new CPClass(className);
-		this.descriptor = new CPNameAndType(descriptor);
+		this.nameAndType = new CPNameAndType(descriptor);
         this.domain = ClassConstantPool.DOMAIN_METHOD;
 	}
 
 	protected ClassFileEntry[] getNestedClassFileEntries() {
-		return new ClassFileEntry[] { className, descriptor };
+		return new ClassFileEntry[] { className, nameAndType };
 	}
 
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPRef.java Tue Feb  5 03:48:43 2008
@@ -24,7 +24,7 @@
 	CPClass className;
 	transient int classNameIndex;
 
-	protected final CPNameAndType nameAndType;
+	protected CPNameAndType nameAndType;
 	transient int nameAndTypeIndex;
 
 	public CPRef(byte type, String className, String descriptor) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ClassConstantPool.java Tue Feb  5 03:48:43 2008
@@ -21,7 +21,6 @@
 import java.util.List;
 
 import org.apache.harmony.pack200.Segment;
-import org.apache.harmony.pack200.SegmentUtils;
 
 
 public class ClassConstantPool {
@@ -68,7 +67,6 @@
             classPoolSet.add(entry);
 			if (!entries.contains(entry)) {
 				entries.add(entry);
-				// TODO This will be a bugger when they're sorted.
 				if (entry instanceof CPLong ||entry instanceof CPDouble)
 					entries.add(entry); //these get 2 slots because of their size
 			}
@@ -105,11 +103,7 @@
 	}
 
 	public void resolve(Segment segment) {
-		SegmentUtils.debug("\n\nResolving (Segment.resolve(Segment)");
-		// TODO: Be careful here, you're obliterating the original entries.
-		// In an ideal world, you wouldn't actually add to it unless you're
-		// sure.
-        entries = new ArrayList();
+	    entries = new ArrayList();
       Iterator sortedIterator = classPoolSet.iterator();
       while(sortedIterator.hasNext()) {
           ConstantPoolEntry entry = (ConstantPoolEntry)sortedIterator.next();
@@ -152,6 +146,21 @@
 	        if (entry instanceof CPLong ||entry instanceof CPDouble)
 	            entries.add(entry); //these get 2 slots because of their size
 		}
+		
+		// Now that the indices have been re-sorted, need
+		// to re-resolve to update references. This should
+		// not add any new entries this time through.
+        it = entries.iterator();
+        while(it.hasNext()) {
+            ClassFileEntry entry = (ClassFileEntry)it.next();
+            entry.resolve(this);
+        }
+        // Also need to re-resolve the others.
+        it = others.iterator();
+        while(it.hasNext()) {
+            ClassFileEntry entry = (ClassFileEntry)it.next();
+            entry.resolve(this);
+        }
 	}
 
 	/**

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java Tue Feb  5 03:48:43 2008
@@ -83,8 +83,6 @@
             ByteCode byteCode = (ByteCode)byteCodes.get(i);
             byteCode.applyByteCodeTargetFixup(this);
         }
-        // TODO: By the time I get here, the input stream
-        // is somehow confused.
     }
 
     protected int getLength() {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/InnerClassesAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/InnerClassesAttribute.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/InnerClassesAttribute.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/InnerClassesAttribute.java Tue Feb  5 03:48:43 2008
@@ -23,7 +23,6 @@
 import java.util.List;
 
 import org.apache.harmony.pack200.IcTuple;
-import org.apache.harmony.pack200.SegmentUtils;
 
 
 public class InnerClassesAttribute extends Attribute {
@@ -59,11 +58,6 @@
          *      CPClass and CPUTF8 objects.
          */
         public void resolve(ClassConstantPool pool) {
-            SegmentUtils.debug("----");
-            SegmentUtils.debug("inner_class_info: " + inner_class_info);
-            SegmentUtils.debug("inner_class_name: " + inner_class_name);
-            SegmentUtils.debug("outer_class_info: " + outer_class_info);
-
             if(inner_class_info != null) {
                 inner_class_info.resolve(pool);
                 inner_class_info_index = pool.indexOf(inner_class_info);

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java Tue Feb  5 03:48:43 2008
@@ -251,7 +251,7 @@
         byteCodeArray[186] = new NoArgumentForm(186, "xxxunusedxxx");
         byteCodeArray[187] = new NewClassRefForm(187, "new", new int[] {187, -1, -1});
         byteCodeArray[188] = new ByteForm(188, "newarray", new int[] {188, -1});
-        byteCodeArray[189] = new NewClassRefForm(189, "anewarray", new int[] {189, -1, -1});
+        byteCodeArray[189] = new ClassRefForm(189, "anewarray", new int[] {189, -1, -1});
         byteCodeArray[190] = new NoArgumentForm(190, "arraylength");
         byteCodeArray[191] = new NoArgumentForm(191, "athrow");
         byteCodeArray[192] = new ClassRefForm(192, "checkcast", new int[] {192, -1, -1});

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java Tue Feb  5 03:48:43 2008
@@ -22,11 +22,12 @@
 /**
  * This class implements the byte code form for the
  * multianewarray instruction. It has a class reference
- * and a byte operand. Like other NewClassRefForms, it
- * keeps track of the last object created so other New
- * forms can make use of this information.
+ * and a byte operand.
+ * 
+ * MultiANewArrayForms (like other anewarray
+ * forms) do not track the last new().
  */
-public class MultiANewArrayForm extends NewClassRefForm {
+public class MultiANewArrayForm extends ClassRefForm {
 
     public MultiANewArrayForm(int opcode, String name,
             int[] rewrite) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewInitMethodRefForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewInitMethodRefForm.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewInitMethodRefForm.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewInitMethodRefForm.java Tue Feb  5 03:48:43 2008
@@ -54,15 +54,6 @@
         nested = new ClassFileEntry[] {
                 globalPool.getInitMethodPoolEntry(SegmentConstantPool.CP_METHOD, offset, context(operandManager))
         };
-        if(nested[0] == null) {
-            // One class in JNDI isn't finding its
-            // <init> method. Not sure why.
-            // TODO: find out why.
-            // org/apache/harmony/security/asn1/ASN1Type
-            byteCode.setNested(new ClassFileEntry[]{});
-            byteCode.setNestedPositions(new int[][] {{}});
-            return;
-        }
         byteCode.setNested(nested);
         byteCode.setNestedPositions(new int[][] {{0, 2}});
     }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java?rev=618613&r1=618612&r2=618613&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java Tue Feb  5 03:48:43 2008
@@ -65,7 +65,69 @@
         segment.writeJar(out);
     }
 
-     public void testInterfaceOnly() throws Exception {
+    // Test with an archive containing Harmony's SQL module, packed with -E1
+    public void testWithSqlE1() throws Exception {
+        in = Segment.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/sql-e1.pack.gz");
+        Segment segment = Segment.parse(in);
+        assertNotNull(segment);
+        out = new JarOutputStream(new FileOutputStream(File.createTempFile("sql", "-e1.jar")));
+        segment.writeJar(out);
+    }
+
+    // Test with an archive containing Harmony's SQL module
+    public void testWithSql() throws Exception {
+        in = Segment.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/sql.pack.gz");
+        Segment segment = Segment.parse(in);
+        assertNotNull(segment);
+        out = new JarOutputStream(new FileOutputStream(File.createTempFile("sql", ".jar")));
+        segment.writeJar(out);
+    }
+
+    // Test with an archive containing Harmony's Pack200 module, packed with -E1
+    public void testWithPack200E1() throws Exception {
+        in = Segment.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/pack200-e1.pack.gz");
+        Segment segment = Segment.parse(in);
+        assertNotNull(segment);
+        out = new JarOutputStream(new FileOutputStream(File.createTempFile("pack", "200-e1.jar")));
+        segment.writeJar(out);
+    }
+
+    // Test with an archive containing Harmony's Pack200 module
+    public void testWithPack200() throws Exception {
+        in = Segment.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/pack200.pack.gz");
+        Segment segment = Segment.parse(in);
+        assertNotNull(segment);
+        out = new JarOutputStream(new FileOutputStream(File.createTempFile("pack", "200.jar")));
+        segment.writeJar(out);
+    }
+
+    // Test with an archive containing Harmony's JNDI module
+    public void testWithJNDIE1() throws Exception {
+        in = Segment.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/jndi-e1.pack.gz");
+        Segment segment = Segment.parse(in);
+        assertNotNull(segment);
+        out = new JarOutputStream(new FileOutputStream(File.createTempFile("jndi", "-e1.jar")));
+        segment.writeJar(out);
+    }
+
+    // Test with an archive containing Annotations
+    public void testWithAnnotations() throws Exception {
+
+        in = Segment.class
+                .getResourceAsStream("/org/apache/harmony/pack200/tests/annotations.pack.gz");
+        Segment segment = Segment.parse(in);
+        assertNotNull(segment);
+        out = new JarOutputStream(new FileOutputStream(File.createTempFile("ann", "otations.jar")));
+        segment.writeJar(out);
+
+    }
+
+    public void testInterfaceOnly() throws Exception {
         in = Segment.class
                 .getResourceAsStream("/org/apache/harmony/pack200/tests/InterfaceOnly.pack");
         Segment segment = Segment.parse(in);