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/08 11:55:41 UTC

svn commit: r609928 [4/5] - in /harmony/enhanced/classlib/branches/java6: ./ make/ modules/awt/src/main/java/unix/org/apache/harmony/awt/gl/linux/ modules/awt/src/main/java/windows/org/apache/harmony/awt/gl/windows/ modules/awt/src/main/native/gl/share...

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -36,7 +36,7 @@
 	private int[] rewrite;
 
     private int byteCodeOffset = -1;
-    private int byteCodeTarget = -1;
+    private int[] byteCodeTargets = null;
 
 	protected ByteCode(int opcode) {
 		this(opcode, ClassFileEntry.NONE);
@@ -69,14 +69,13 @@
 		return true;
 	}
 
-	public void extractOperands(OperandManager operandManager, Segment segment) {
+	public void extractOperands(OperandManager operandManager, Segment segment, int codeLength) {
 		// Given an OperandTable, figure out which operands
 		// the receiver needs and stuff them in operands.
 		// Later on the operands can be rewritten (But that's
 		// later, not now).
-
 		ByteCodeForm currentByteCodeForm = getByteCodeForm();
-		currentByteCodeForm.setByteCodeOperands(this, operandManager);
+		currentByteCodeForm.setByteCodeOperands(this, operandManager, codeLength);
 	}
 
 	protected ByteCodeForm getByteCodeForm() {
@@ -131,7 +130,7 @@
 					break;
 					
 				case 2: 
-					setOperandInt(pool.indexOf(nested[index]), getNestedPosition(index)[0]);
+					setOperand2Bytes(pool.indexOf(nested[index]), getNestedPosition(index)[0]);
 					break;
 				
 				case 4:
@@ -172,7 +171,7 @@
 			rewrite[index + firstOperandIndex] = operands[index] & 0xFF;
 		}
 	}
-	
+    
 	/**
 	 * Given an int operand, set the rewrite bytes for
 	 * that position and the one immediately following it
@@ -184,7 +183,7 @@
 	 *  position 0 is the first -1, position 1 is the second -1,
 	 *  etc.
 	 */
-	public void setOperandInt(int operand, int position) {
+	public void setOperand2Bytes(int operand, int position) {
 		int firstOperandIndex = getByteCodeForm().firstOperandIndex();
 		int byteCodeFormLength = getByteCodeForm().getRewrite().length;
 		if (firstOperandIndex < 1) {
@@ -206,12 +205,12 @@
 	 * @param operand int to set the rewrite bytes to
 	 * @param position int position of the operands in the rewrite bytes
 	 */
-	public void setOperandSignedInt(int operand, int position) {
+	public void setOperandSigned2Bytes(int operand, int position) {
 	    if(operand >= 0) {
-	        setOperandInt(operand, position);
+	        setOperand2Bytes(operand, position);
 	    } else {
 	        int twosComplementOperand = 0x10000 + operand;
-	        setOperandInt(twosComplementOperand, position);
+	        setOperand2Bytes(twosComplementOperand, position);
 	    }
 	}
 
@@ -315,31 +314,60 @@
     }
     
     /**
-     * Some ByteCodes (in particular, LabelForm bytecodes)
-     * have to keep track of a byteCodeTarget. This is
-     * initially an offset in the CodeAttribute array
-     * relative to the byteCodeOffset, but later gets fixed
+     * Some ByteCodes (in particular, those with labels)
+     * have to keep track of byteCodeTargets. These are
+     * initially offsets in the CodeAttribute array
+     * relative to the byteCodeOffset, but later get fixed
      * up to point to the absolute position in the CodeAttribute
-     * array. This method sets the target.
+     * array. This method sets the targets.
      * 
      * @param byteCodeTarget int index in array
      */
-    public void setByteCodeTarget(int byteCodeTarget) {
-        this.byteCodeTarget = byteCodeTarget;
+    public void setByteCodeTargets(int[] byteCodeTargets) {
+        this.byteCodeTargets = byteCodeTargets;
     }
     
-    public int getByteCodeTarget() {
-        return byteCodeTarget;
+    public int[] getByteCodeTargets() {
+        return byteCodeTargets;
     }
     
     /**
-     * Some ByteCodes (in particular, those with the Label
-     * form) need to be fixed up after all the bytecodes
-     * in the CodeAttribute have been added. (This can't
+     * Some ByteCodes (in particular, those with labels
+     * need to be fixed up after all the bytecodes in the
+     * CodeAttribute have been added. (This can't
      * be done beforehand because the CodeAttribute needs
      * to be complete before targets can be assigned.)
      */
     public void applyByteCodeTargetFixup(CodeAttribute codeAttribute) {
-        getByteCodeForm().fixUpByteCodeTarget(this, codeAttribute);
+        getByteCodeForm().fixUpByteCodeTargets(this, codeAttribute);
+    }
+
+    /**
+     * 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.
+     */
+    public int[] getRewrite() {
+        return rewrite;
     }
 }

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -30,7 +30,8 @@
 	public   CPClass(String name) {
 		super(ConstantPoolEntry.CP_Class);
 		this.name = name;
-		this.utf8 = new CPUTF8(name);
+		this.domain = ClassConstantPool.DOMAIN_CLASSREF;
+		this.utf8 = new CPUTF8(name, ClassConstantPool.DOMAIN_NORMALASCIIZ);
 	}
 
 	
@@ -84,4 +85,9 @@
 	protected void writeBody(DataOutputStream dos) throws IOException {
 		dos.writeShort(index);
 	}
+	
+   public String comparisonString() {
+        return getName();
+   }
+
 }

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -22,6 +22,7 @@
 public class CPDouble extends CPConstantNumber {
 	public CPDouble(java.lang.Double value) {
 		super(ConstantPoolEntry.CP_Double,value);
+        this.domain = ClassConstantPool.DOMAIN_DOUBLE;
 	}
 
 	

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -30,6 +30,7 @@
 	transient int nameAndTypeIndex;
 	public CPFieldRef(String className, String descriptor) {
 		super(ConstantPoolEntry.CP_Fieldref);
+		this.domain = ClassConstantPool.DOMAIN_FIELD;
 		this.className = new CPClass(className);
 		this.nameAndType = new CPNameAndType(descriptor);
 	}

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -22,6 +22,7 @@
 public class CPFloat extends CPConstantNumber {
 	public CPFloat(java.lang.Float value) {
 		super(ConstantPoolEntry.CP_Float,value);
+	      this.domain = ClassConstantPool.DOMAIN_FLOAT;
 	}
 
 	

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -23,6 +23,7 @@
 
 	public CPInteger(java.lang.Integer value) {
 		super(ConstantPoolEntry.CP_Integer,value);
+		this.domain = ClassConstantPool.DOMAIN_INTEGER;
 	}
 
 	

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -20,6 +20,18 @@
 
 	public CPInterfaceMethodRef(String className, String descriptor) {
 		super(ConstantPoolEntry.CP_InterfaceMethodref, className, descriptor);
+		this.domain = ClassConstantPool.DOMAIN_METHOD;
 	}
 
+	/**
+	 * This method answers the value this method will use
+	 * 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() {
+	    return nameAndType.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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -23,6 +23,7 @@
 
 	public CPLong(java.lang.Long value) {
 		super(ConstantPoolEntry.CP_Long,value);
+        this.domain = ClassConstantPool.DOMAIN_LONG;
 	}
 
 	

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -38,8 +38,8 @@
 	transient int descriptorIndex;
 	public CPMember(String descriptor, long flags, List attributes) {
 		int colon = descriptor.indexOf(':');
-		this.name = new CPUTF8(descriptor.substring(0,colon));
-		this.descriptor = new CPUTF8(descriptor.substring(colon+1));
+		this.name = new CPUTF8(descriptor.substring(0,colon), ClassConstantPool.DOMAIN_NORMALASCIIZ);
+		this.descriptor = new CPUTF8(descriptor.substring(colon+1), ClassConstantPool.DOMAIN_SIGNATUREASCIIZ);
 		this.flags = (short) flags;
 		this.attributes = (attributes == null ? new ArrayList() : attributes);
 	}

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPMethodRef.java Tue Jan  8 02:55:24 2008
@@ -25,6 +25,7 @@
 		super(ConstantPoolEntry.CP_Methodref, className, descriptor);
 		this.className = new CPClass(className);
 		this.descriptor = new CPNameAndType(descriptor);
+        this.domain = ClassConstantPool.DOMAIN_METHOD;
 	}
 
 	protected ClassFileEntry[] getNestedClassFileEntries() {

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -19,6 +19,8 @@
 import java.io.DataOutputStream;
 import java.io.IOException;
 
+import org.apache.harmony.pack200.SegmentUtils;
+
 
 public class CPNameAndType extends ConstantPoolEntry {
 
@@ -32,9 +34,35 @@
 
 	public CPNameAndType(String descriptor) {
 		super(ConstantPoolEntry.CP_NameAndType);
+		int descriptorDomain = ClassConstantPool.DOMAIN_UNDEFINED;
 		int colon = descriptor.indexOf(':');
-		this.name = new CPUTF8(descriptor.substring(0,colon));
-		this.descriptor = new CPUTF8(descriptor.substring(colon+1));
+		String nameString = descriptor.substring(0,colon);
+		String descriptorString = descriptor.substring(colon+1);
+		// For some reason, descriptors which have just plain
+		// native types are stored in DOMAIN_NORMALASCIIZ rather
+		// than in DOMAIN_SIGNATUREASCIIZ. This might indicate
+		// that DOMAIN_SIGNATUREASCIIZ is poorly named.
+		boolean nativeDescriptor = true;
+		for(int index=0; index < descriptorString.length(); index++) {
+		    char currentChar = descriptorString.charAt(index);
+		    if(Character.isLetter(currentChar)) {
+		        if(currentChar == 'L') {
+		            nativeDescriptor = false;
+		        }
+		        break;
+		    }
+		}
+		this.domain = ClassConstantPool.DOMAIN_NAMEANDTYPE;
+		this.name = new CPUTF8(nameString, ClassConstantPool.DOMAIN_NORMALASCIIZ);
+		if((nameString.equals("<init>")) || (nameString.equals("<clinit>")) || nativeDescriptor ) {
+		    // Signatures for init methods are stored with the init methods.
+		    // Not sure why. Similarly, native signatures are stored
+		    // there as well.
+		    descriptorDomain = ClassConstantPool.DOMAIN_NORMALASCIIZ;
+		} else {
+		    descriptorDomain = ClassConstantPool.DOMAIN_SIGNATUREASCIIZ;
+		}
+		this.descriptor = new CPUTF8(descriptorString, descriptorDomain);
 	}
 
 	protected ClassFileEntry[] getNestedClassFileEntries() {
@@ -94,4 +122,14 @@
 		return true;
 	}
 
+	/**
+	 * Answers the invokeinterface count argument when the
+	 * receiver is treated as an invokeinterface target.
+	 * This value is not meaningful if the receiver is not
+     * an invokeinterface target.
+	 * @return count
+	 */
+	public int invokeInterfaceCount() {
+	    return 1 + SegmentUtils.countInvokeInterfaceArgs(descriptor.underlyingString());
+	}
 }

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -24,7 +24,7 @@
 	CPClass className;
 	transient int classNameIndex;
 
-	private final CPNameAndType nameAndType;
+	protected final CPNameAndType nameAndType;
 	transient int nameAndTypeIndex;
 
 	public CPRef(byte type, String className, String descriptor) {

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -25,7 +25,8 @@
 
 	public CPString(java.lang.String value) {
 		super(ConstantPoolEntry.CP_String,value);
-		this.name = new CPUTF8((String) getValue());
+		this.domain = ClassConstantPool.DOMAIN_STRING;
+		this.name = new CPUTF8((String) getValue(), ClassConstantPool.DOMAIN_NORMALASCIIZ);
 
 	}
 
@@ -53,4 +54,7 @@
 		return new ClassFileEntry[] { name };
  	}
 
+	public String comparisonString() {
+	    return (String)getValue();
+	}
 }

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -23,9 +23,10 @@
 public class CPUTF8 extends ConstantPoolEntry {
 	private String utf8;
 
-	public CPUTF8(String utf8) {
+	public CPUTF8(String utf8, int domain) {
 		super(ConstantPoolEntry.CP_UTF8);
 		this.utf8 = utf8;
+		this.domain = domain;
 	}
 
 	
@@ -74,4 +75,25 @@
 		dos.write(bytes);
 	}
 
+	public String underlyingString() {
+	    return utf8;
+	}
+	
+	public String comparisonString() {
+	    String returnValue = utf8;
+	    if(utf8.endsWith(";")) {
+	        StringBuffer alphaChars = new StringBuffer();
+	        StringBuffer extraChars = new StringBuffer();
+	        extraChars.append((char)0xFFFF);
+	        for(int index=0; index < utf8.length(); index++) {
+	            if( (utf8.charAt(index) == '(') || (utf8.charAt(index) == ')') || (utf8.charAt(index) == '[') || (utf8.charAt(index) == ']') ) {
+	                extraChars.append(utf8.charAt(index));
+	            } else {
+	                alphaChars.append(utf8.charAt(index));
+	            }
+	        }
+	        returnValue = alphaChars.toString() + extraChars.toString();
+	    }
+	    return returnValue;
+	}
 }

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=609928&r1=609927&r2=609928&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 Tue Jan  8 02:55:24 2008
@@ -18,9 +18,13 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import org.apache.harmony.pack200.bytecode.ConstantPoolEntry;
 
 import org.apache.harmony.pack200.Pack200Exception;
 import org.apache.harmony.pack200.Segment;
@@ -28,6 +32,58 @@
 
 
 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;
+    public static int DOMAIN_FLOAT = 2;
+    public static int DOMAIN_STRING = 3;
+    public static int DOMAIN_NORMALASCIIZ = 4;
+    public static int DOMAIN_LONG = 5;
+    public static int DOMAIN_DOUBLE = 6;
+    public static int DOMAIN_CLASSREF = 7;
+    public static int DOMAIN_SIGNATUREASCIIZ = 8;
+    public static int DOMAIN_NAMEANDTYPE = 9;
+    public static int DOMAIN_FIELD = 10;
+    public static int DOMAIN_METHOD = 11;
+    public static int DOMAIN_ATTRIBUTEASCIIZ = 12;
+
+    protected SortedSet sortedEntries = new TreeSet(new PoolComparator());
+    
 	public String toString() {
 		return entries.toString();
 	}
@@ -38,15 +94,50 @@
 	private boolean resolved;
 
 	public ClassFileEntry add(ClassFileEntry entry) {
-		// TODO this should be a set - we don't want duplicates
+		// 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());
+//	        if (((CPUTF8)entry).comparisonString().matches("Ljava.*")) {
+//	            System.out.println("Adding");
+//	        }
+//	    }
 		if (entry instanceof ConstantPoolEntry) {
 			if (!entries.contains(entry)) {
 				entries.add(entry);
+				sortedEntries.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
+			} else {
+			    // TODO: This is awful. If I'm presented with
+			    // an entry that has a lower domain than the
+			    // current entry but is otherwise the same,
+			    // change its domain and rebalance the tree.
+			    // And by "rebalance" I mean destroy and recreate
+			    // the tree.
+			    Iterator iterator = sortedEntries.iterator();
+			    boolean replaceTree = false;
+			    SortedSet newSortedSet = new TreeSet(new PoolComparator());
+			    while(iterator.hasNext()) {
+			        ConstantPoolEntry storedEntry = (ConstantPoolEntry)iterator.next();
+			        if(storedEntry.equals(entry)) {
+			            if(storedEntry.getDomain() > ((ConstantPoolEntry)entry).getDomain()) {
+			                // need to blow away the tree.
+			                replaceTree = true;
+			                newSortedSet.add(entry);
+			            } else {
+			                newSortedSet.add(storedEntry);
+			            }
+			        } else {
+			            newSortedSet.add(storedEntry);
+			        }
+			        if(replaceTree) {
+			            sortedEntries = newSortedSet;
+			        }
+			    }
 			}
 		} else {
 			if (!others.contains(entry))
@@ -82,34 +173,46 @@
 
 	public void resolve(Segment segment) {
 		SegmentUtils.debug("\n\nResolving (Segment.resolve(Segment)");
-		HashMap sortMap = new HashMap();
-		List cpAll = null;
-		// TODO: HACK - this is a 1.5 api.
-		// Need to do the right thing and do it with 1.4 API.
-		try {
-			cpAll = Arrays.asList(segment.getConstantPool().getCpAll());
-		} catch (Pack200Exception ex) {
-			ex.printStackTrace();
-		}
-		Iterator it = entries.iterator();
-		while(it.hasNext()) {
-			ClassFileEntry entry = (ClassFileEntry) it.next();
-			int indexInCpAll = cpAll.indexOf(entry);
-			if(indexInCpAll > 0) {
-				sortMap.put(new Integer(indexInCpAll), entry);
-			} else {
-				sortMap.put(new Integer(99999), entry);
-			}
-		}
-		ArrayList sortedList = new ArrayList();
-		for(int index=0; index < 99999; index++) {
-			if(sortMap.containsKey(new Integer(index))) {
-				sortedList.add((ClassFileEntry)sortMap.get(new Integer(index)));
-			}
-		}
-		for(int xindex=0; xindex < sortedList.size(); xindex++) {
-			SegmentUtils.debug(sortedList.get(xindex).toString());
-		}
+		// 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.addAll(sortedEntries);
+      Iterator sortedIterator = sortedEntries.iterator();
+      while(sortedIterator.hasNext()) {
+          ConstantPoolEntry entry = (ConstantPoolEntry)sortedIterator.next();
+          entries.add(entry);
+          if (entry instanceof CPLong ||entry instanceof CPDouble)
+              entries.add(entry); //these get 2 slots because of their size
+      }
+//		HashMap sortMap = new HashMap();
+//		List cpAll = null;
+//		// TODO: HACK - this is a 1.5 api.
+//		// Need to do the right thing and do it with 1.4 API.
+//		try {
+//			cpAll = Arrays.asList(segment.getConstantPool().getCpAll());
+//		} catch (Pack200Exception ex) {
+//			ex.printStackTrace();
+//		}
+//		Iterator it = entries.iterator();
+//		while(it.hasNext()) {
+//			ClassFileEntry entry = (ClassFileEntry) it.next();
+//			int indexInCpAll = cpAll.indexOf(entry);
+//			if(indexInCpAll > 0) {
+//				sortMap.put(new Integer(indexInCpAll), entry);
+//			} else {
+//				sortMap.put(new Integer(99999), entry);
+//			}
+//		}
+//		ArrayList sortedList = new ArrayList();
+//		for(int index=0; index < 99999; index++) {
+//			if(sortMap.containsKey(new Integer(index))) {
+//				sortedList.add((ClassFileEntry)sortMap.get(new Integer(index)));
+//			}
+//		}
+//		for(int xindex=0; xindex < sortedList.size(); xindex++) {
+//			SegmentUtils.debug(sortedList.get(xindex).toString());
+//		}
 		resolve();
 	}
 	
@@ -124,7 +227,7 @@
 		while (it.hasNext()) {
 			ClassFileEntry entry = (ClassFileEntry) it.next();
 			entry.resolve(this);
-		}
+		}		
 	}
 
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java Tue Jan  8 02:55:24 2008
@@ -46,7 +46,7 @@
             // Setting the offset must happen before extracting operands
             // because label bytecodes need to know their offsets.
             byteCode.setByteCodeIndex(i);
-            byteCode.extractOperands(operandManager, segment);
+            byteCode.extractOperands(operandManager, segment, codeLength);
             byteCodes.add(byteCode);
             codeLength += byteCode.getLength();
             int lastBytecodePosition = ((Integer) byteCodeOffsets
@@ -64,13 +64,23 @@
                 byteCodeOffsets.add(new Integer(lastBytecodePosition
                         + byteCode.getLength()));
             }
+            if(byteCode.getOpcode() == 0xC4) {
+                // Special processing for wide bytecode - it knows what its
+                // instruction is from the opcode manager, so ignore the
+                // next instruction
+                i++;
+            }
         }
         // Now that all the bytecodes know their positions and
         // sizes, fix up the byte code targets
-        for (int i = 0; i < codePacked.length; i++) {
+        // At this point, byteCodes may be a different size than
+        // codePacked because of wide bytecodes.
+        for (int i = 0; i < byteCodes.size(); i++) {
             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() {
@@ -88,6 +98,9 @@
         ArrayList nestedEntries = new ArrayList();
         nestedEntries.add(getAttributeName());
         nestedEntries.addAll(byteCodes);
+        // TODO: Is this the right place to add code attribute
+        // attributes?
+        nestedEntries.addAll(attributes);
         ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries
                 .size()];
         nestedEntries.toArray(nestedEntryArray);
@@ -136,4 +149,11 @@
         }
     }
 
+    public void addAttribute(Attribute attribute) {
+        attributes.add(attribute);
+    }
+    
+    public List attributes() {
+        return attributes;
+    }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ConstantPoolEntry.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ConstantPoolEntry.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ConstantPoolEntry.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ConstantPoolEntry.java Tue Jan  8 02:55:24 2008
@@ -56,8 +56,15 @@
 
 	byte tag;
 
+	protected int domain = ClassConstantPool.DOMAIN_UNDEFINED;
+	public static int creationOrderCount = 100;
+	public String comparisonString() {
+	    return "" + creationOrder;
+	}
+	public int creationOrder = -1;
 	ConstantPoolEntry(byte tag) {
 		this.tag = tag;
+		this.creationOrder = creationOrderCount++;
 	}
 
 	public abstract boolean equals(Object obj);
@@ -66,6 +73,14 @@
 		return tag;
 	}
 
+	public int getDomain() {
+	    return domain;
+	}
+	
+	public void setDomain(int newDomain) {
+	    this.domain = newDomain;
+	}
+	
 	public abstract int hashCode();
 
 	public void doWrite(DataOutputStream dos) throws IOException {

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/EnclosingMethodAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/EnclosingMethodAttribute.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/EnclosingMethodAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/EnclosingMethodAttribute.java Tue Jan  8 02:55:24 2008
@@ -24,12 +24,12 @@
     private int class_index;
     private int method_index;
     private CPClass cpClass;
-    private CPMethod cpMethod;
+    private CPNameAndType method;
 
-    public EnclosingMethodAttribute(CPClass cpClass, CPMethod cpMethod) {
+    public EnclosingMethodAttribute(CPClass cpClass, CPNameAndType method) {
         super("EnclosingMethod");
         this.cpClass = cpClass;
-        this.cpMethod = cpMethod;
+        this.method = method;
     }
 
     /* (non-Javadoc)
@@ -43,8 +43,8 @@
         super.resolve(pool);
         cpClass.resolve(pool);
         class_index = pool.indexOf(cpClass);
-        cpMethod.resolve(pool);
-        method_index = pool.indexOf(cpMethod);
+        method.resolve(pool);
+        method_index = pool.indexOf(method);
     }
 
     /* (non-Javadoc)

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LineNumberTableAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LineNumberTableAttribute.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LineNumberTableAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LineNumberTableAttribute.java Tue Jan  8 02:55:24 2008
@@ -52,11 +52,17 @@
         return "LineNumberTable: " + line_number_table_length + " lines";
     }
 
+    /* (non-Javadoc)
+     * @see org.apache.harmony.pack200.bytecode.Attribute#getNestedClassFileEntries()
+     */
+    protected ClassFileEntry[] getNestedClassFileEntries() {
+        return new ClassFileEntry[] {getAttributeName()};
+    }
+    
 	/* (non-Javadoc)
 	 * @see org.apache.harmony.pack200.bytecode.Attribute#resolve(org.apache.harmony.pack200.bytecode.ClassConstantPool)
 	 */
 	protected void resolve(ClassConstantPool pool) {
-		pool.add(getAttributeName());
 		super.resolve(pool);
 	}
 

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LocalVariableTableAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LocalVariableTableAttribute.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LocalVariableTableAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/LocalVariableTableAttribute.java Tue Jan  8 02:55:24 2008
@@ -18,6 +18,7 @@
 
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 public class LocalVariableTableAttribute extends BCIRenumberedAttribute {
@@ -58,17 +59,25 @@
         }
     }
 
+
+    protected ClassFileEntry[] getNestedClassFileEntries() {
+        ArrayList nestedEntries = new ArrayList();
+        nestedEntries.add(getAttributeName());
+        for (int i = 0; i < local_variable_table_length; i++) {
+            nestedEntries.add(names[i]);
+            nestedEntries.add(descriptors[i]);
+        }
+        ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries
+                .size()];
+        nestedEntries.toArray(nestedEntryArray);
+        return nestedEntryArray;        
+    }
+    
     protected void resolve(ClassConstantPool pool) {
         super.resolve(pool);
-        pool.add(getAttributeName());
         name_indexes = new int[local_variable_table_length];
         descriptor_indexes = new int[local_variable_table_length];
         for (int i = 0; i < local_variable_table_length; i++) {
-            // TODO: is this the right place to add the names and descriptors?
-            // Maybe some API to say where they should be added if they're not
-            // already in the cp?
-            pool.add(names[i]);
-            pool.add(descriptors[i]);
             names[i].resolve(pool);
             descriptors[i].resolve(pool);
             name_indexes[i] = pool.indexOf(names[i]);
@@ -88,22 +97,47 @@
      * @see org.apache.harmony.pack200.bytecode.BCIRenumberedAttribute#renumber(java.util.List)
      */
     public void renumber(List byteCodeOffsets) {
-        // First fix up the start_pcs
+        // Remember the unrenumbered start_pcs, since that's used later
+        // to calculate end position.
+        int[] unrenumbered_start_pcs = new int[start_pcs.length];
+        System.arraycopy(start_pcs, 0, unrenumbered_start_pcs, 0, start_pcs.length);
+
+        // Next renumber start_pcs in place
         super.renumber(byteCodeOffsets);
-        // Next fix up the lengths
-        int maxLength = ((Integer)byteCodeOffsets.get(byteCodeOffsets.size() - 1)).intValue();
+
+        // lengths are BRANCH5 encoded, not BCI-encoded.
+        // In other words:
+        //  start_pc is BCI5 start_pc
+        //  end_pc is byteCodeOffset[(index of start_pc in byteCodeOffset) + (encoded length)]
+        //  real length = end_pc - start_pc
+        // special case if end_pc is beyond end of bytecode array
+
+        // First figure out the maximum size of the byteCodeOffsets array
+        int lastInstruction = ((Integer)byteCodeOffsets.get(byteCodeOffsets.size() - 1)).intValue();
+        int maxSize = lastInstruction + 1;
+        
+        // Iterate through the lengths and update each in turn.
+        // This is done in place in the lengths array.
         for(int index=0; index < lengths.length; index++) {
-            // Need to special case when the length is greater than the size
+            int start_pc = start_pcs[index];
             int revisedLength = -1;
             int encodedLength = lengths[index];
+            
+            // First get the index of the start_pc in the byteCodeOffsets
+            int indexOfStartPC = unrenumbered_start_pcs[index];
+            // Given the index of the start_pc, we can now add
+            // the encodedLength to it to get the stop index.
+            int stopIndex = indexOfStartPC + encodedLength;
+            
             // Length can either be an index into the byte code offsets, or one beyond the
             // end of the byte code offsets. Need to determine which this is.
-            if(encodedLength == byteCodeOffsets.size()) {
+            if(stopIndex == byteCodeOffsets.size()) {
                 // Pointing to one past the end of the byte code array
-                revisedLength = maxLength - start_pcs[index] + 1;
+                revisedLength = maxSize - start_pc;
             } else {
                 // We're indexed into the byte code array
-                revisedLength = ((Integer)byteCodeOffsets.get(encodedLength)).intValue();                
+                int stopValue = ((Integer)byteCodeOffsets.get(stopIndex)).intValue();
+                revisedLength = stopValue - start_pc;                
             }
             lengths[index] = revisedLength;
         }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java Tue Jan  8 02:55:24 2008
@@ -28,6 +28,8 @@
  */
 public class OperandManager {
 	
+    int[] bcCaseCount;
+    int[] bcCaseValue;
     int[] bcByte;
     int[] bcShort;
     int[] bcLocal;
@@ -46,7 +48,10 @@
 	int[] bcThisMethod;
 	int[] bcSuperMethod;
 	int[] bcInitRef;
+	int[] wideByteCodes;
     
+	int bcCaseCountIndex = 0;
+	int bcCaseValueIndex = 0;
 	int bcByteIndex = 0;
 	int bcShortIndex = 0;
 	int bcLocalIndex = 0;
@@ -65,6 +70,7 @@
 	int bcThisMethodIndex = 0;
 	int bcSuperMethodIndex = 0;
 	int bcInitRefIndex = 0;
+	int wideByteCodeIndex = 0;
     
 	Segment segment = null;
 	
@@ -72,7 +78,9 @@
 	String superClass = null;
 	String newClass = null;
 	
-	public OperandManager(int[] bcByte, int[]  bcShort, int[]  bcLocal, int[]  bcLabel, int[]  bcIntRef, int[]  bcFloatRef, int[]  bcLongRef, int[]  bcDoubleRef, int[]  bcStringRef, int[]  bcClassRef, int[]  bcFieldRef, int[]  bcMethodRef, int[] bcIMethodRef, int[] bcThisField, int[] bcSuperField, int[] bcThisMethod, int[] bcSuperMethod, int[] bcInitRef) {
+	public OperandManager(int[] bcCaseCount, int[] bcCaseValue, int[] bcByte, int[]  bcShort, int[]  bcLocal, int[]  bcLabel, int[]  bcIntRef, int[]  bcFloatRef, int[]  bcLongRef, int[]  bcDoubleRef, int[]  bcStringRef, int[]  bcClassRef, int[]  bcFieldRef, int[]  bcMethodRef, int[] bcIMethodRef, int[] bcThisField, int[] bcSuperField, int[] bcThisMethod, int[] bcSuperMethod, int[] bcInitRef, int[] wideByteCodes) {
+	    this.bcCaseCount = bcCaseCount;
+	    this.bcCaseValue = bcCaseValue;
 	    this.bcByte = bcByte;
 	    this.bcShort = bcShort;
 	    this.bcLocal = bcLocal;
@@ -92,8 +100,17 @@
 	    this.bcThisMethod = bcThisMethod;
 	    this.bcSuperMethod = bcSuperMethod;
 	    this.bcInitRef = bcInitRef;
+	    this.wideByteCodes = wideByteCodes;
 	}
     
+    public int nextCaseCount() {
+        return bcCaseCount[bcCaseCountIndex++];       
+    }
+    
+    public int nextCaseValues() {
+        return bcCaseValue[bcCaseValueIndex++];       
+    }
+    
 	public int nextByte() {
 		return bcByte[bcByteIndex++];		
 	}
@@ -166,6 +183,10 @@
 		return bcInitRef[bcInitRefIndex++];
 	}
 
+	public int nextWideByteCode() {
+	    return wideByteCodes[wideByteCodeIndex++];
+	}
+	
 	public void setSegment(Segment segment) {
 		this.segment = segment;
 	}

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/SourceFileAttribute.java Tue Jan  8 02:55:24 2008
@@ -27,7 +27,7 @@
 
 	public SourceFileAttribute(String name) {
 		super("SourceFile"); //$NON-NLS-1$
-		this.name = new CPUTF8(name);
+		this.name = new CPUTF8(name, ClassConstantPool.DOMAIN_ATTRIBUTEASCIIZ);
 	}
 
 	public boolean equals(Object obj) {

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java Tue Jan  8 02:55:24 2008
@@ -232,8 +232,8 @@
         byteCodeArray[167] = new LabelForm(167, "goto", new int[] {167, -1, -1});
         byteCodeArray[168] = new LabelForm(168, "jsr", new int[] {168, -1, -1});
         byteCodeArray[169] = new LocalForm(169, "ret", new int[] {169, -1});
-        byteCodeArray[170] = new SwitchForm(170, "tableswitch");
-        byteCodeArray[171] = new SwitchForm(171, "lookupswitch");
+        byteCodeArray[170] = new TableSwitchForm(170, "tableswitch");
+        byteCodeArray[171] = new LookupSwitchForm(171, "lookupswitch");
         byteCodeArray[172] = new NoArgumentForm(172, "ireturn");
         byteCodeArray[173] = new NoArgumentForm(173, "lreturn");
         byteCodeArray[174] = new NoArgumentForm(174, "freturn");
@@ -572,10 +572,13 @@
      * 
      * @param byteCode ByteCode to be updated (!)
      * @param operandManager OperandTable from which to draw info
-     * @param globalPool SegmentConstantPool used to index into
+     * @param codeLength Length of bytes (excluding this bytecode)
+     *      from the beginning of the method. Used in calculating
+     *      padding for some variable-length bytecodes (such as
+     *      lookupswitch, tableswitch).
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         throw new Error("My subclass should have implemented this");        
     }
 
@@ -587,7 +590,7 @@
      * @param codeAttribute a CodeAttribute used to determine how
      *   the ByteCode should be fixed up.
      */
-    public void fixUpByteCodeTarget(ByteCode byteCode, CodeAttribute codeAttribute) {
+    public void fixUpByteCodeTargets(ByteCode byteCode, CodeAttribute codeAttribute) {
         // Most ByteCodeForms don't have any fixing up to do.
         return;
     }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteForm.java Tue Jan  8 02:55:24 2008
@@ -41,7 +41,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         byteCode.setOperandByte(operandManager.nextByte() & 0xFF, 0);
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IMethodRefForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IMethodRefForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IMethodRefForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IMethodRefForm.java Tue Jan  8 02:55:24 2008
@@ -16,7 +16,9 @@
  */
 package org.apache.harmony.pack200.bytecode.forms;
 
+import org.apache.harmony.pack200.SegmentConstantPool;
 import org.apache.harmony.pack200.bytecode.ByteCode;
+import org.apache.harmony.pack200.bytecode.CPInterfaceMethodRef;
 import org.apache.harmony.pack200.bytecode.OperandManager;
 
 /**
@@ -24,7 +26,7 @@
  * bytecodes which have IMethod references (and only
  * IMethod references).
  */
-public class IMethodRefForm extends ByteCodeForm {
+public class IMethodRefForm extends ReferenceForm {
 
     public IMethodRefForm(int opcode, String name, 
             int[] rewrite) {
@@ -39,13 +41,21 @@
         return true;
     }
 
+    protected int getOffset(OperandManager operandManager) {
+        return operandManager.nextIMethodRef();
+    }
+
+    protected int getPoolID() {
+        return SegmentConstantPool.CP_IMETHOD;
+    }
+    
     /* (non-Javadoc)
-     * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
+     * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.Segment)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
-//TODO: implement this. Removed the error message because
-//        it causes failures in the JUnit tests.
-//        throw new Error("Not implemented yet");        
+            OperandManager operandManager, int codeLength) {
+        super.setByteCodeOperands(byteCode, operandManager, codeLength);
+        int count=((CPInterfaceMethodRef)byteCode.getNestedClassFileEntries()[0]).invokeInterfaceCount();
+        byteCode.getRewrite()[3] = count;
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IincForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IincForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IincForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IincForm.java Tue Jan  8 02:55:24 2008
@@ -41,7 +41,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         int local = operandManager.nextLocal();
         int constant = operandManager.nextByte();
         byteCode.setOperandBytes(new int[]{local, constant});

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LabelForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LabelForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LabelForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LabelForm.java Tue Jan  8 02:55:24 2008
@@ -50,9 +50,9 @@
     /* (non-Javadoc)
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#fixUpByteCodeTarget(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.CodeAttribute)
      */
-    public void fixUpByteCodeTarget(ByteCode byteCode, CodeAttribute codeAttribute) {
+    public void fixUpByteCodeTargets(ByteCode byteCode, CodeAttribute codeAttribute) {
         // LabelForms need to fix up the target of label operations
-        int originalTarget = byteCode.getByteCodeTarget();
+        int originalTarget = byteCode.getByteCodeTargets()[0];
         int sourceIndex = byteCode.getByteCodeIndex();
         int absoluteInstructionTargetIndex = sourceIndex + originalTarget;
         int targetValue = ((Integer)codeAttribute.byteCodeOffsets.get(absoluteInstructionTargetIndex)).intValue();
@@ -60,7 +60,7 @@
         // The operand is the difference between the source instruction
         // and the destination instruction.
         // TODO: Probably have to do something other than setOperandInt if this is widened.
-        byteCode.setOperandSignedInt(targetValue - sourceValue, 0);
+        byteCode.setOperandSigned2Bytes(targetValue - sourceValue, 0);
         if(widened) {
             byteCode.setNestedPositions(new int[][] {{0,4}});
         } else {
@@ -72,8 +72,8 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
-        byteCode.setByteCodeTarget(operandManager.nextLabel());
+            OperandManager operandManager, int codeLength) {
+        byteCode.setByteCodeTargets(new int[] {operandManager.nextLabel()});
         // The byte code operands actually get set later -
         // once we have all the bytecodes - in fixUpByteCodeTarget().
         return;

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LocalForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LocalForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LocalForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LocalForm.java Tue Jan  8 02:55:24 2008
@@ -48,7 +48,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         byteCode.setOperandBytes(new int[]{operandManager.nextLocal()});
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java Tue Jan  8 02:55:24 2008
@@ -50,10 +50,10 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         // multianewarray has a class ref and a dimension.
         // The superclass handles the class ref.
-        super.setByteCodeOperands(byteCode, operandManager);
+        super.setByteCodeOperands(byteCode, operandManager, codeLength);
         
         // We have to handle the dimension.
         int dimension = operandManager.nextByte();

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java Tue Jan  8 02:55:24 2008
@@ -44,7 +44,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ReferenceForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandManager)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         ClassFileEntry[] nested = null;
         int offset = getOffset(operandManager);
         if(offset == 0) {

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NoArgumentForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NoArgumentForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NoArgumentForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NoArgumentForm.java Tue Jan  8 02:55:24 2008
@@ -44,7 +44,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         // Nothing to do for no-argument form
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ReferenceForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ReferenceForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ReferenceForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ReferenceForm.java Tue Jan  8 02:55:24 2008
@@ -50,7 +50,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.Segment)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
+            OperandManager operandManager, int codeLength) {
         int offset = getOffset(operandManager);
         try {
             setNestedEntries(byteCode, operandManager, offset);

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ShortForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ShortForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ShortForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ShortForm.java Tue Jan  8 02:55:24 2008
@@ -42,7 +42,7 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
-        byteCode.setOperandInt(operandManager.nextShort(), 0);
+            OperandManager operandManager, int codeLength) {
+        byteCode.setOperand2Bytes(operandManager.nextShort(), 0);
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SwitchForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SwitchForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SwitchForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SwitchForm.java Tue Jan  8 02:55:24 2008
@@ -17,9 +17,10 @@
 package org.apache.harmony.pack200.bytecode.forms;
 
 import org.apache.harmony.pack200.bytecode.ByteCode;
+import org.apache.harmony.pack200.bytecode.CodeAttribute;
 import org.apache.harmony.pack200.bytecode.OperandManager;
 
-public class SwitchForm extends ByteCodeForm {
+public abstract class SwitchForm extends VariableInstructionForm {
 
     public SwitchForm(int opcode, String name) {
         super(opcode, name);
@@ -43,9 +44,29 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
-//TODO: implement this. Removed the error message because
-//        it causes failures in the JUnit tests.
-//        throw new Error("Not implemented yet");        
+            OperandManager operandManager, int codeLength) {
     }
+    
+    /* (non-Javadoc)
+     * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#fixUpByteCodeTargets(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.CodeAttribute)
+     */
+    public void fixUpByteCodeTargets(ByteCode byteCode, CodeAttribute codeAttribute) {
+        // SwitchForms need to fix up the target of label operations
+        int[] originalTargets = byteCode.getByteCodeTargets();
+        int numberOfLabels = originalTargets.length;
+        int[] replacementTargets = new int[numberOfLabels];
+        
+        int sourceIndex = byteCode.getByteCodeIndex();
+        int sourceValue = ((Integer)codeAttribute.byteCodeOffsets.get(sourceIndex)).intValue();
+        for(int index=0; index < numberOfLabels; index++) {
+            int absoluteInstructionTargetIndex = sourceIndex + originalTargets[index];
+            int targetValue = ((Integer)codeAttribute.byteCodeOffsets.get(absoluteInstructionTargetIndex)).intValue();
+            replacementTargets[index] = targetValue - sourceValue;
+        }
+        int[] rewriteArray = byteCode.getRewrite();
+        for(int index=0; index < numberOfLabels; index++) {
+            setRewrite4Bytes(replacementTargets[index], rewriteArray);
+        }
+    }
+
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/WideForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/WideForm.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/WideForm.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/WideForm.java Tue Jan  8 02:55:24 2008
@@ -25,7 +25,7 @@
  * can take multiple forms, depending on what is being
  * widened.
  */
-public class WideForm extends ByteCodeForm {
+public class WideForm extends VariableInstructionForm {
 
     public WideForm(int opcode, String name) {
         super(opcode, name);
@@ -47,9 +47,99 @@
      * @see org.apache.harmony.pack200.bytecode.forms.ByteCodeForm#setByteCodeOperands(org.apache.harmony.pack200.bytecode.ByteCode, org.apache.harmony.pack200.bytecode.OperandTable, org.apache.harmony.pack200.SegmentConstantPool)
      */
     public void setByteCodeOperands(ByteCode byteCode,
-            OperandManager operandManager) {
-//TODO: implement this. Removed the error message because
-//      it causes failures in the JUnit tests.
-//      throw new Error("Not implemented yet");        
+            OperandManager operandManager, int codeLength) {
+        int instruction = operandManager.nextWideByteCode();
+        if(instruction == 132) {
+            setByteCodeOperandsFormat2(instruction, byteCode, operandManager, codeLength);
+        } else {
+            setByteCodeOperandsFormat1(instruction, byteCode, operandManager, codeLength);
+        }
+    }
+
+    /**
+     * This method sets the rewrite array for the bytecode
+     * using Format 1 of the JVM spec: an opcode and two index
+     * bytes. This is used for ?load/?store/ret
+     * @param instruction should be 132
+     * @param byteCode the byte code whose rewrite array should be updated
+     * @param operandManager the source of the operands
+     * @param codeLength ignored
+     */
+    protected void setByteCodeOperandsFormat1(int instruction, ByteCode byteCode,
+            OperandManager operandManager, int codeLength) {
+        
+        // Even though this code is really similar to the
+        // code for setByteCodeOperandsFormat2, I've left it
+        // distinct here. This is so changing one will
+        // not change the other - if there is a need to change,
+        // there's a good chance that the formats will
+        // differ, so an updater will not have to disentangle
+        // it.
+        int local = operandManager.nextLocal();
+        
+        // Unlike most byte codes, the wide bytecode is a
+        // variable-sized bytecode. Because of this, the
+        // rewrite array has to be defined here individually
+        // for each bytecode, rather than in the ByteCodeForm
+        // class.
+        
+        int[] newRewrite = new int[4];
+        int rewriteIndex = 0;
+        
+        // Fill in what we can now
+        // wide opcode
+        newRewrite[rewriteIndex++] = byteCode.getOpcode();
+        
+        // "real" instruction that is widened
+        newRewrite[rewriteIndex++] = instruction;
+
+        // Index bytes
+        setRewrite2Bytes(local, rewriteIndex, newRewrite);
+        rewriteIndex +=2;
+        
+        byteCode.setRewrite(newRewrite);
+    }
+
+    
+    /**
+     * This method sets the rewrite array for the bytecode
+     * using Format 2 of the JVM spec: an opcode, two index
+     * bytes, and two constant bytes. This is used for iinc.
+     * @param instruction int should be 132
+     * @param byteCode ByteCode whose rewrite array should be updated
+     * @param operandManager OperandManager source of the operands
+     * @param codeLength ignored
+     */
+    protected void setByteCodeOperandsFormat2(int instruction, ByteCode byteCode,
+            OperandManager operandManager, int codeLength) {
+    
+        int local = operandManager.nextLocal();        
+        int constWord = operandManager.nextShort();
+        
+        // Unlike most byte codes, the wide bytecode is a
+        // variable-sized bytecode. Because of this, the
+        // rewrite array has to be defined here individually
+        // for each bytecode, rather than in the ByteCodeForm
+        // class.
+        
+        int[] newRewrite = new int[6];
+        int rewriteIndex = 0;
+        
+        // Fill in what we can now
+        // wide opcode
+        newRewrite[rewriteIndex++] = byteCode.getOpcode();
+        
+        // "real" instruction that is widened
+        newRewrite[rewriteIndex++] = instruction;
+
+        // Index bytes
+        setRewrite2Bytes(local, rewriteIndex, newRewrite);
+        rewriteIndex +=2;
+        
+        // constant bytes
+        setRewrite2Bytes(constWord, rewriteIndex, newRewrite);
+        rewriteIndex += 2; // not strictly necessary, but just in case something comes along later
+        
+        byteCode.setRewrite(newRewrite);
     }
 }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java Tue Jan  8 02:55:24 2008
@@ -26,7 +26,6 @@
 import org.apache.harmony.pack200.BHSDCodec;
 import org.apache.harmony.pack200.BandSet;
 import org.apache.harmony.pack200.Codec;
-import org.apache.harmony.pack200.CodecEncoding;
 import org.apache.harmony.pack200.Pack200Exception;
 import org.apache.harmony.pack200.Segment;
 import org.apache.harmony.pack200.SegmentHeader;

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java Tue Jan  8 02:55:24 2008
@@ -57,7 +57,7 @@
 	    public String[] getCpString() {
         	String[] classes = new String[100];
         	for(int index=0; index < 100; index++) {
-        		classes[index] = "java/lang/Stri:ng";
+        		classes[index] = "java/lang/Stri:ng(J)";
         	}
         	return classes;
 	    }
@@ -74,14 +74,22 @@
 	    	return getCpString();
 	    }
 	    
-	    public String[] getCpMethodClass() {
-	    	return getCpClass();
-	    }
-	    
-	    public String[] getCpMethodDescriptor() {
-	    	return getCpString();
-	    }
-	    
+        public String[] getCpMethodClass() {
+            return getCpClass();
+        }
+        
+        public String[] getCpMethodDescriptor() {
+            return getCpString();
+        }
+        
+        public String[] getCpIMethodClass() {
+            return getCpClass();
+        }
+        
+        public String[] getCpIMethodDescriptor() {
+            return getCpString();
+        }
+        
 	    public int[] getCpInt() {
         	int[] elements = new int[100];
         	for(int index=0; index < 100; index++) {
@@ -292,22 +300,21 @@
      * @throws IOException 
      */
     public void testBcCaseBands() throws IOException, Pack200Exception {
-        byte[] bytes = new byte[] {(byte)170,(byte)171, (byte)255,
+        byte[] bytes = new byte[] { (byte)170, (byte)171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte)255, 
                 2, 5, // bc_case_count
-                8, 8, 8, 8, 8, 8, 8, // bc_case_value
-                8, 8}; // bc_label                
+                0, 0, 0, 0, 0, 0, 0, // bc_case_value
+                0, 0, 0, 0, 0, 0, 0, 0, 0}; // bc_label                
         InputStream in = new ByteArrayInputStream(bytes);
         bcBands.unpack(in);
-        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(18, bcBands.getMethodByteCodePacked()[0][0].length);
         int[] bc_case_count = bcBands.getBcCaseCount();
         assertEquals(2, bc_case_count.length);
         assertEquals(2, bc_case_count[0]);
         assertEquals(5, bc_case_count[1]);
-        int[][] bc_case_value = bcBands.getBcCaseValue();
-        assertEquals(2, bc_case_value.length);
-        assertEquals(2, bc_case_value[0].length);
-        assertEquals(5, bc_case_value[1].length);
-        assertEquals(2, bcBands.getBcLabel().length);
+        int[] bc_case_value = bcBands.getBcCaseValue();
+        assertEquals(0, bc_case_value[0]);
+        assertEquals(0, bc_case_value[1]);
+        assertEquals(9, bcBands.getBcLabel().length);
     }
     
     /**
@@ -341,10 +348,9 @@
      */
     public void testBcShortBand() throws IOException, Pack200Exception {
     	//TODO: Need to fix this testcase so it has enough data to pass.
-    	if(true) return;
         byte[] bytes = new byte[] {17, (byte)196, (byte)132, (byte)255, 
                 8, 8,// bc_short band
-                8, 8}; // bc_locals band (required by wide iinc (196, 132))
+                8, 8, 8, 8}; // bc_locals band (required by wide iinc (196, 132))
         InputStream in = new ByteArrayInputStream(bytes);
         bcBands.unpack(in);
         assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length);
@@ -377,15 +383,29 @@
     public void testBcLabelBand() throws IOException, Pack200Exception {
         byte[] bytes = new byte[] {(byte) 159, (byte) 160, (byte) 161,
                 (byte) 162, (byte) 163, (byte) 164, (byte) 165, (byte) 166,
-                (byte) 167, (byte) 168, (byte) 170, (byte) 171, (byte) 198, (byte) 199, (byte) 200, (byte) 201, (byte) 255,
-                0, 0, // bc_case_count (required by tableswitch (170) and lookupswitch (171))
+                (byte) 167, (byte) 168,  (byte) 170, (byte) 171,  (byte) 198, (byte) 199, (byte) 200, (byte) 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (byte) 255,
+                2, 2, // bc_case_count (required by tableswitch (170) and lookupswitch (171))
+                0, 0, 0, 0, // bc_case_value
 //                Now that we're actually doing real label lookup, need valid labels
 //                8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; // bc_label band                
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // bc_label band
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // bc_label band
         InputStream in = new ByteArrayInputStream(bytes);
         bcBands.unpack(in);
-        assertEquals(16, bcBands.getMethodByteCodePacked()[0][0].length);
-        assertEquals(16, bcBands.getBcLabel().length);
+        assertEquals(36, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(20, bcBands.getBcLabel().length);
+    }
+    
+    public void testWideForms() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte) 196, (byte) 54, // wide istore
+                (byte) 196, (byte) 132, // wide iinc
+                (byte) 255, 
+                0, // bc_short band
+                0, 0, 0, 1}; // bc_locals band 
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(4, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(4, bcBands.getBcLocal().length);
+        assertEquals(1, bcBands.getBcShort().length);
     }
     
     /**

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/CodeAttributeTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/CodeAttributeTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/CodeAttributeTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/CodeAttributeTest.java Tue Jan  8 02:55:24 2008
@@ -77,7 +77,9 @@
     public class MockOperandManager extends OperandManager {
 
         public MockOperandManager() {
-            super(new int[] {}, // bcByte
+            super(new int[] {}, // bcCaseCount
+                    new int[] {}, // bcCaseValues
+                    new int[] {}, // bcByte
                     new int[] {}, // bcShort
                     new int[] {}, // bcLocal
                     new int[] {}, // bcLabel
@@ -95,6 +97,7 @@
                     new int[] { 0 }, // bcThisMethod
                     new int[] {}, // bcSuperMethod
                     new int[] {} // bcInitRef
+, null
             );
         }
     }

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentUtilsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentUtilsTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentUtilsTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentUtilsTest.java Tue Jan  8 02:55:24 2008
@@ -14,9 +14,9 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-
 package org.apache.harmony.pack200.tests;
 
+
 import junit.framework.TestCase;
 
 import org.apache.harmony.pack200.IMatcher;
@@ -50,6 +50,17 @@
 		assertEquals(3, SegmentUtils.countArgs("(Lblah/blah;DLbLah;)V"));
 	}
 
+	public void testCountInvokeInterfaceArgs() {
+	    assertEquals(1, SegmentUtils.countInvokeInterfaceArgs("(Z)V"));
+        assertEquals(2, SegmentUtils.countInvokeInterfaceArgs("(D)V"));
+        assertEquals(2, SegmentUtils.countInvokeInterfaceArgs("(J)V"));
+        assertEquals(1, SegmentUtils.countInvokeInterfaceArgs("([D)V"));
+        assertEquals(1, SegmentUtils.countInvokeInterfaceArgs("([[D)V"));
+        assertEquals(4, SegmentUtils.countInvokeInterfaceArgs("(DD)V"));
+        assertEquals(3, SegmentUtils.countInvokeInterfaceArgs("(Lblah/blah;D)V"));
+        assertEquals(4, SegmentUtils.countInvokeInterfaceArgs("(Lblah/blah;DLbLah;)V"));
+        assertEquals(4, SegmentUtils.countInvokeInterfaceArgs("([Lblah/blah;DLbLah;)V"));
+	}
 	public void testMatches() {
 		long[] oneToTen = new long[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 		assertEquals(6, SegmentUtils.countMatches(new long[][] { oneToTen,

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ClassFileEntryTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ClassFileEntryTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ClassFileEntryTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ClassFileEntryTest.java Tue Jan  8 02:55:24 2008
@@ -25,13 +25,14 @@
 import org.apache.harmony.pack200.bytecode.CPMember;
 import org.apache.harmony.pack200.bytecode.CPString;
 import org.apache.harmony.pack200.bytecode.CPUTF8;
+import org.apache.harmony.pack200.bytecode.ClassConstantPool;
 import org.apache.harmony.pack200.bytecode.SourceFileAttribute;
 
 public class ClassFileEntryTest extends TestCase {
 	public void testUTF8() {
-		CPUTF8 u1 = new CPUTF8(new String("thing")); //$NON-NLS-1$
-		CPUTF8 u2 = new CPUTF8(new String("thing")); //$NON-NLS-1$
-		CPUTF8 u3 = new CPUTF8(new String("otherthing")); //$NON-NLS-1$
+		CPUTF8 u1 = new CPUTF8(new String("thing"), ClassConstantPool.DOMAIN_UNDEFINED); //$NON-NLS-1$
+		CPUTF8 u2 = new CPUTF8(new String("thing"), ClassConstantPool.DOMAIN_UNDEFINED); //$NON-NLS-1$
+		CPUTF8 u3 = new CPUTF8(new String("otherthing"), ClassConstantPool.DOMAIN_UNDEFINED); //$NON-NLS-1$
 		checkEquality(u1, u2, "thing", u3);
 	}
 	private void checkEquality(Object equal1, Object equal2, String toString, Object unequal) {

Modified: harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ConstantPoolTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ConstantPoolTest.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ConstantPoolTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/bytecode/ConstantPoolTest.java Tue Jan  8 02:55:24 2008
@@ -29,8 +29,8 @@
 		pool = new ClassConstantPool();
 	}
 	public void testDuplicateUTF8() {
-		CPUTF8 u1 = new CPUTF8("thing");
-		CPUTF8 u2 = new CPUTF8("thing");
+		CPUTF8 u1 = new CPUTF8("thing", ClassConstantPool.DOMAIN_UNDEFINED);
+		CPUTF8 u2 = new CPUTF8("thing", ClassConstantPool.DOMAIN_UNDEFINED);
 		pool.add(u1);
 		pool.add(u2);
 		assertEquals(1,pool.size());
@@ -44,8 +44,8 @@
 		assertEquals(2,pool.size());
 	}
 	public void testIndex() {
-		pool.add(new CPUTF8("OtherThing"));
-		CPUTF8 u1 = new CPUTF8("thing");
+		pool.add(new CPUTF8("OtherThing", ClassConstantPool.DOMAIN_UNDEFINED));
+		CPUTF8 u1 = new CPUTF8("thing", ClassConstantPool.DOMAIN_UNDEFINED);
 		pool.add(u1);
 		pool.resolve();
 		assertTrue(pool.indexOf(u1) > 0);

Modified: harmony/enhanced/classlib/branches/java6/modules/print/src/main/java/windows/org/apache/harmony/x/print/WinPrintJob.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/print/src/main/java/windows/org/apache/harmony/x/print/WinPrintJob.java?rev=609928&r1=609927&r2=609928&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/print/src/main/java/windows/org/apache/harmony/x/print/WinPrintJob.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/print/src/main/java/windows/org/apache/harmony/x/print/WinPrintJob.java Tue Jan  8 02:55:24 2008
@@ -364,7 +364,7 @@
                 startJob(pdc, getDocName(pageable, docAttrs, attributes),
                                 getDestinationPath(attributes));
 
-                for (int i = 0; i <= pages; i++) {
+                for (int i = 0; i < pages; i++) {
                     if ((ranges != null) && !ranges.contains(i)) {
                         continue;
                     }