harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From telli...@apache.org
Subject svn commit: r596594 [1/3] - 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/...
Date Tue, 20 Nov 2007 10:05:23 GMT
Author: tellison
Date: Tue Nov 20 02:05:20 2007
New Revision: 596594

URL: http://svn.apache.org/viewvc?rev=596594&view=rev
Log:
Apply patch HARMONY-5140 ([classlib][pack200] Added code to allow operand output)

Added:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteCodeForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ByteForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassSpecificReferenceForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/DoubleForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/FieldRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/FloatRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IMethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IincForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/InitMethodReferenceForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/IntRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LabelForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LocalForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/LongForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/MultiANewArrayForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewInitMethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NoArgumentForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ReferenceForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ShortForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SingleByteReferenceForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/StringRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SuperFieldRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SuperInitMethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SuperMethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/SwitchForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ThisFieldRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ThisInitMethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ThisMethodRefForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/WideForm.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentConstantPoolTest.java   (with props)
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/CpBands.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/bytecode/ByteCode.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.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/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/test/java/org/apache/harmony/pack200/tests/AttributeLayoutTest.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -24,12 +24,13 @@
 
 import org.apache.harmony.pack200.bytecode.ByteCode;
 import org.apache.harmony.pack200.bytecode.CodeAttribute;
+import org.apache.harmony.pack200.bytecode.OperandManager;
 
 /**
  * Pack200 Bytecode bands
  */
 public class BcBands extends BandSet {
-    
+
     // The bytecodes for each method in each class as they come (i.e. in their packed format)
     private byte[][][] methodByteCodePacked;
     
@@ -177,7 +178,7 @@
                        case 187: // new
                        case 189: // anewarray
                        case 192: // checkcast
-                       case 193: // instanceof                       
+                       case 193: // instanceof
                            bcClassRefCount++;
                            break;
                        case 20: // lldc2_w
@@ -285,7 +286,7 @@
                            } else if (startsWithIf(codePacked)) {
                                bcLabelCount++;
                            } else {
-                               debug("Found unhandled " + ByteCode.getByteCode(codePacked));
+                               debug("Found unhandled " + codePacked + " " + ByteCode.getByteCode(codePacked));
                            }
                        }
                    }
@@ -332,7 +333,14 @@
         bcEscRefSize = decodeBandInt("bc_escrefsize", in, Codec.UNSIGNED5, bcEscRefCount);
         bcEscSize = decodeBandInt("bc_escsize", in, Codec.UNSIGNED5, bcEscCount);
         bcEscByte = decodeBandInt("bc_escbyte", in, Codec.BYTE1, bcEscSize);
-        
+
+        OperandManager operandManager = new OperandManager(bcByte, bcShort,
+                bcLocal, bcLabel, bcIntRef, bcFloatRef, bcLongRef, bcDoubleRef,
+                bcStringRef, bcClassRef, bcFieldRef, bcMethodRef, bcIMethodRef,
+                bcThisField, bcSuperField, bcThisMethod, bcSuperMethod,
+                bcInitRef);
+        operandManager.setSegment(segment);
+
         int i = 0;
         for (int c = 0; c < classCount; c++) {
            int numberOfMethods = methodFlags[c].length;
@@ -347,15 +355,17 @@
                    maxLocal += SegmentUtils.countArgs(methodDescr[c][m]);
                    // TODO Move creation of code attribute until after constant
                    // pool resolved
+                   operandManager.setCurrentClass(segment.getClassBands().getClassThis()[c]);
+                   operandManager.setSuperClass(segment.getClassBands().getClassSuper()[c]);
                    CodeAttribute attr = new CodeAttribute(maxStack, maxLocal,
-                           methodByteCodePacked[c][m]);
+                           methodByteCodePacked[c][m], segment, operandManager);
                    methodAttributes[c][m].add(attr);
                    i++;
                }
            }
        }
     }
-
+    
     private boolean startsWithIf(int codePacked) {
         return (codePacked >= 153 && codePacked <= 166)
         || (codePacked == 198)
@@ -367,7 +377,7 @@
     }
 
     private boolean endsWithStore(int codePacked) {
-        return  (codePacked >= 54 && codePacked <= 58);
+        return (codePacked >= 54 && codePacked <= 58);
     }
 
     public byte[][][] getMethodByteCodePacked() {
@@ -461,7 +471,7 @@
     public int[] getBcEscRefSize() {
         return bcEscRefSize;
     }
-    
+
     public int[] getBcEscSize() {
         return bcEscSize;
     }
@@ -469,4 +479,6 @@
     public int[][] getBcEscByte() {
         return bcEscByte;
     }
+
+
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java?rev=596594&r1=596593&r2=596594&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java Tue Nov 20 02:05:20 2007
@@ -38,7 +38,7 @@
 
     private String[] cpFieldClass;
 
-    private Object cpFieldDescriptor;
+    private String[] cpFieldDescriptor;
 
     private float[] cpFloat;
 
@@ -380,7 +380,7 @@
         return cpFieldClass;
     }
 
-    public Object getCpFieldDescriptor() {
+    public String[] getCpFieldDescriptor() {
         return cpFieldDescriptor;
     }
 

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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -164,7 +164,7 @@
                     classBands.getMethodFlags()[classNum][i], classBands.getMethodAttributes()[classNum][i]));
 		}
 		// sort CP according to cp_All
-		cp.resolve();
+		cp.resolve(this);
 		// print out entries
 		debug("Constant pool looks like:");
 		for (i = 1; i <= cp.size(); i++) {

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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -16,6 +16,22 @@
  */
 package org.apache.harmony.pack200;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.apache.harmony.pack200.bytecode.CPClass;
+import org.apache.harmony.pack200.bytecode.CPDouble;
+import org.apache.harmony.pack200.bytecode.CPFieldRef;
+import org.apache.harmony.pack200.bytecode.CPFloat;
+import org.apache.harmony.pack200.bytecode.CPInteger;
+import org.apache.harmony.pack200.bytecode.CPInterfaceMethodRef;
+import org.apache.harmony.pack200.bytecode.CPLong;
+import org.apache.harmony.pack200.bytecode.CPMethodRef;
+import org.apache.harmony.pack200.bytecode.CPString;
+import org.apache.harmony.pack200.bytecode.CPUTF8;
+import org.apache.harmony.pack200.bytecode.ClassFileEntry;
+import org.apache.harmony.pack200.bytecode.ConstantPoolEntry;
+
 public class SegmentConstantPool {
     /**
      * 
@@ -29,23 +45,21 @@
         this.bands = bands;
     }
 
-    public static final int ALL = 0;
-
-    public static final int CP_DOUBLE = 7;
-
     // define in archive order
 
-    public static final int CP_FLOAT = 4; // TODO Check this
-
-    public static final int CP_INT = 3;
-
-    public static final int CP_LONG = 6;
-
-    public static final int CP_STRING = 5;
-
-    public static final int SIGNATURE = 2; // TODO and more to come --
-
+    public static final int ALL = 0;
     public static final int UTF_8 = 1;
+    public static final int CP_INT = 2;
+    public static final int CP_FLOAT = 3;
+    public static final int CP_LONG = 4;
+    public static final int CP_DOUBLE = 5;
+    public static final int CP_STRING = 6;
+    public static final int CP_CLASS = 7;
+    public static final int SIGNATURE = 8; // TODO and more to come --
+    public static final int CP_DESCR = 9;
+    public static final int CP_FIELD = 10;
+    public static final int CP_METHOD = 11;
+    public static final int CP_IMETHOD = 12;
 
     public Object getValue(int cp, long value) throws Pack200Exception {
         int index = (int) value;
@@ -55,21 +69,239 @@
             throw new Pack200Exception("Cannot have a negative range");
         } else if (cp == UTF_8) {
             return bands.getCpUTF8()[index];
-        } else if (cp == CP_STRING) {
-            return bands.getCpString()[index];
-        } else if (cp == SIGNATURE) {
-            return bands.getCpSignature()[index];
         } else if (cp == CP_INT) {
             return new Integer(bands.getCpInt()[index]);
         } else if (cp == CP_FLOAT) {
             return new Float(bands.getCpFloat()[index]);
+        } else if (cp == CP_LONG) {
+            return new Long(bands.getCpLong()[index]);
         } else if (cp == CP_DOUBLE) {
             return new Double(bands.getCpDouble()[index]);
+        } else if (cp == CP_STRING) {
+            return bands.getCpString()[index];
+        } else if (cp == CP_CLASS) {
+            return bands.getCpClass()[index];
+        } else if (cp == SIGNATURE) {
+            return bands.getCpSignature()[index];
+        } else if (cp == CP_DESCR) {
+            return bands.getCpDescriptor()[index];
+        } else {
+            // etc
+            throw new Error("Get value incomplete");
+        }
+    }
+    
+    /**
+     * Subset the constant pool of the specified type
+     * to be just that which has the specified class
+     * name. Answer the ConstantPoolEntry at the
+     * desiredIndex of the subsetted pool.
+     * 
+     * @param cp type of constant pool array to search
+     * @param desiredIndex index of the constant pool
+     * @param desiredClassName class to use to generate a
+     * 		subset of the pool
+     * @return ConstantPoolEntry
+     * @throws Pack200Exception
+     */
+    public ConstantPoolEntry getClassSpecificPoolEntry(int cp, long desiredIndex, String desiredClassName) throws Pack200Exception {
+    	int index = (int)desiredIndex;
+    	int realIndex = -1;
+    	String array[] = null;
+    	if (cp == CP_FIELD) {
+    		array = bands.getCpFieldClass();
+    	} else if (cp == CP_METHOD) {
+    		array = bands.getCpMethodClass();
+    	} else if (cp == CP_IMETHOD) {
+    		array = bands.getCpIMethodClass();
+    	} else {
+    		throw new Error("Don't know how to handle " + cp);
+    	}
+    	realIndex = matchSpecificPoolEntryIndex(array, desiredClassName, index);
+    	return getConstantPoolEntry(cp, (long)realIndex);
+    }
+    
+    /**
+     * Given the name of a class, answer the CPClass associated
+     * with that class. Answer null if the class doesn't exist.
+     * @param name Class name to look for (form: java/lang/Object)
+     * @return CPClass for that class name, or null if not found.
+     */
+    public ConstantPoolEntry getClassPoolEntry(String name) {
+    	String classes[] = bands.getCpClass();
+    	int index = matchSpecificPoolEntryIndex(classes, name, 0);
+    	if(index == -1) {
+    		return null;
+    	}
+    	try {
+    		return getConstantPoolEntry(CP_CLASS, (long)index);
+    	}
+    	catch (Pack200Exception ex) {
+    		throw new Error("Error getting class pool entry");
+    	}
+    }
+    
+    /**
+     * Answer the init method for the specified class.
+     * @param cp constant pool to search (must be CP_METHOD)
+     * @param value index of init method
+     * @param desiredClassName String class name of the init method
+     * @return CPMethod init method
+     * @throws Pack200Exception
+     */
+    public ConstantPoolEntry getInitMethodPoolEntry(int cp, long value, String desiredClassName) throws Pack200Exception {
+    	int realIndex = -1;
+    	String desiredRegex = "^<init>.*";
+    	if (cp == CP_METHOD) {
+    		realIndex = matchSpecificPoolEntryIndex(bands.getCpMethodClass(), bands.getCpMethodDescriptor(), desiredClassName, desiredRegex, (int)value);
+    	} else {
+    		throw new Error("Nothing but CP_METHOD can be an <init>");
+    	}
+    	return getConstantPoolEntry(cp, (long)realIndex);
+    }
+
+    /**
+     * A number of things make use of subsets of structures.
+     * In one particular example, _super bytecodes will use a subset
+     * of method or field classes which have just those methods /
+     * fields defined in the superclass. Similarly, _this bytecodes
+     * use just those methods/fields defined in this class, and _init
+     * bytecodes use just those methods that start with <init>.
+     * 
+     * This method takes an array of names, a String to match for,
+     * an index and a boolean as parameters, and answers the array
+     * position in the array of the indexth element which matches
+     * (or equals) the String (depending on the state of the boolean)
+     * 
+     * In other words, if the class array consists of:
+     *  Object [position 0, 0th instance of Object]
+     *  String [position 1, 0th instance of String]
+     *  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)
+     * will answer 1.
+     * 
+     * @param nameArray Array of Strings against which the compareString is tested
+     * @param compareString String for which to search
+     * @param desiredIndex nth element with that match (counting from 0)
+     * @return int index into nameArray, or -1 if not found.
+     */
+    protected int matchSpecificPoolEntryIndex(String[] nameArray, String compareString, int desiredIndex) {
+    	return matchSpecificPoolEntryIndex(nameArray, nameArray, compareString, ".*", desiredIndex);
+    }
+
+    /**
+     * This method's function is to look through pairs of arrays.
+     * It keeps track of the number of hits it finds using the
+     * following basis of comparison for a hit:
+     *  - the primaryArray[index] must be .equals() to the primaryCompareString
+     *  - the secondaryArray[index] .matches() the secondaryCompareString
+     * When the desiredIndex number of hits has been reached, the index
+     * into the original two arrays of the element hit is returned.
+     * 
+     * @param primaryArray The first array to search
+     * @param secondaryArray The second array (must be same .length as primaryArray)
+     * @param primaryCompareString The String to compare against primaryArray using .equals()
+     * @param secondaryCompareRegex The String to compare against secondaryArray using .matches()
+     * @param desiredIndex The nth hit whose position we're seeking
+     * @return int index that represents the position of the nth hit in primaryArray and secondaryArray
+     */
+    protected int matchSpecificPoolEntryIndex(String[] primaryArray, String[] secondaryArray, String primaryCompareString, String secondaryCompareRegex, int desiredIndex) {
+    	int instanceCount = -1;
+    	for(int index=0; index < primaryArray.length; index++) {
+    		if((primaryArray[index].equals(primaryCompareString)) && 
+    				secondaryArray[index].matches(secondaryCompareRegex)) {
+    			instanceCount++;
+    			if(instanceCount == desiredIndex) {
+    				return index;
+    			}
+    		}
+    	}
+    	// We didn't return in the for loop, so the desiredMatch
+    	// with desiredIndex must not exist in the array.
+    	return -1;
+    }
+    
+    
+    public ConstantPoolEntry getConstantPoolEntry(int cp, long value) throws Pack200Exception {
+        int index = (int) value;
+        if (index == -1) {
+            return null;
+        } else if (index < 0) {
+            throw new Pack200Exception("Cannot have a negative range");
+        } else if (cp == UTF_8) {
+            return new CPUTF8(bands.getCpUTF8()[index]);
+        } else if (cp == CP_INT) {
+            return new CPInteger(new Integer(bands.getCpInt()[index]));
+        } else if (cp == CP_FLOAT) {
+            return new CPFloat(new Float(bands.getCpFloat()[index]));
         } else if (cp == CP_LONG) {
-            return new Long(bands.getCpLong()[index]);
+            return new CPLong(new Long(bands.getCpLong()[index]));
+        } else if (cp == CP_DOUBLE) {
+            return new CPDouble(new Double(bands.getCpDouble()[index]));
+        } else if (cp == CP_STRING) {
+            return new CPString(bands.getCpString()[index]);
+        } else if (cp == CP_CLASS) {
+            return new CPClass(bands.getCpClass()[index]);
+        } else if (cp == SIGNATURE) {
+        	throw new Error("I don't know what to do with signatures yet");
+//            return null /* new CPSignature(bands.getCpSignature()[index]) */;
+        } else if (cp == CP_DESCR) {
+        	throw new Error("I don't know what to do with descriptors yet");
+//            return null /* new CPDescriptor(bands.getCpDescriptor()[index]) */;
+        } else if (cp == CP_FIELD) {
+            return new CPFieldRef(bands.getCpFieldClass()[index], bands.getCpFieldDescriptor()[index]);
+        } else if (cp == CP_METHOD) {
+            return new CPMethodRef(bands.getCpMethodClass()[index], bands.getCpMethodDescriptor()[index]);
+        } else if (cp == CP_IMETHOD) {
+            return new CPInterfaceMethodRef(bands.getCpIMethodClass()[index], bands.getCpIMethodDescriptor()[index]);
         } else {
             // etc
             throw new Error("Get value incomplete");
         }
     }
-}
+    
+    public ConstantPoolEntry[] getCpAll() throws Pack200Exception {
+        	ArrayList cpAll = new ArrayList();
+        	// TODO: this is 1.5-specific. Try to get rid
+        	// of it.
+        	for(int index=0; index < bands.getCpUTF8().length; index++) {
+        		cpAll.add(getConstantPoolEntry(UTF_8, index));
+        	}
+        	for(int index=0; index < bands.getCpInt().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_INT, index));
+        	}
+        	for(int index=0; index < bands.getCpFloat().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_FLOAT, index));
+        	}
+        	for(int index=0; index < bands.getCpLong().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_LONG, index));
+        	}
+        	for(int index=0; index < bands.getCpDouble().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_DOUBLE, index));
+        	}
+        	for(int index=0; index < bands.getCpString().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_STRING, index));
+        	}
+        	for(int index=0; index < bands.getCpClass().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_CLASS, index));
+        	}
+        	for(int index=0; index < bands.getCpFieldClass().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_FIELD, index));
+        	}
+        	for(int index=0; index < bands.getCpMethodClass().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_METHOD, index));
+        	}
+        	for(int index=0; index < bands.getCpIMethodClass().length; index++) {
+        		cpAll.add(getConstantPoolEntry(CP_IMETHOD, index));
+        	}
+        	
+        	ConstantPoolEntry[] result = new ConstantPoolEntry[cpAll.size()];
+        	cpAll.toArray(result);
+        	return result;
+        }
+
+	
+    }

Modified: harmony/enhanced/classlib/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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -18,336 +18,32 @@
 
 import java.io.DataOutputStream;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
+import org.apache.harmony.pack200.Segment;
+import org.apache.harmony.pack200.bytecode.forms.ByteCodeForm;
 
 public class ByteCode extends ClassFileEntry {
-	private static final Map byteCodes = new HashMap();
-	static {
-		ByteCode[] byteCodeArray = new ByteCode[256];
-		byteCodeArray[0] = new ByteCode(0, "nop");
-		byteCodeArray[1] = new ByteCode(1, "aconst_null");
-		byteCodeArray[2] = new ByteCode(2, "iconst_m1");
-		byteCodeArray[3] = new ByteCode(3, "iconst_0");
-		byteCodeArray[4] = new ByteCode(4, "iconst_1");
-		byteCodeArray[5] = new ByteCode(5, "iconst_2");
-		byteCodeArray[6] = new ByteCode(6, "iconst_3");
-		byteCodeArray[7] = new ByteCode(7, "iconst_4");
-		byteCodeArray[8] = new ByteCode(8, "iconst_5");
-		byteCodeArray[9] = new ByteCode(9, "lconst_0");
-		byteCodeArray[10] = new ByteCode(10, "lconst_1");
-		byteCodeArray[11] = new ByteCode(11, "fconst_0");
-		byteCodeArray[12] = new ByteCode(12, "fconst_1");
-		byteCodeArray[13] = new ByteCode(13, "fconst_2");
-		byteCodeArray[14] = new ByteCode(14, "dconst_0");
-		byteCodeArray[15] = new ByteCode(15, "dconst_1");
-		byteCodeArray[16] = new ByteCode(16, "bipush");
-		byteCodeArray[17] = new ByteCode(17, "sipush");
-		byteCodeArray[18] = new ByteCode(18, "ldc", new int[] { 18, 0 });
-		byteCodeArray[19] = new ByteCode(19, "ldc_w");
-		byteCodeArray[20] = new ByteCode(20, "ldc2_w");
-		byteCodeArray[21] = new ByteCode(21, "iload");
-		byteCodeArray[22] = new ByteCode(22, "lload");
-		byteCodeArray[23] = new ByteCode(23, "fload");
-		byteCodeArray[24] = new ByteCode(24, "dload");
-		byteCodeArray[25] = new ByteCode(25, "aload");
-		byteCodeArray[26] = new ByteCode(26, "iload_0");
-		byteCodeArray[27] = new ByteCode(27, "iload_1");
-		byteCodeArray[28] = new ByteCode(28, "iload_2");
-		byteCodeArray[29] = new ByteCode(29, "iload_3");
-		byteCodeArray[30] = new ByteCode(30, "lload_0");
-		byteCodeArray[31] = new ByteCode(31, "lload_1");
-		byteCodeArray[32] = new ByteCode(32, "lload_2");
-		byteCodeArray[33] = new ByteCode(33, "lload_3");
-		byteCodeArray[34] = new ByteCode(34, "fload_0");
-		byteCodeArray[35] = new ByteCode(35, "fload_1");
-		byteCodeArray[36] = new ByteCode(36, "fload_2");
-		byteCodeArray[37] = new ByteCode(37, "fload_3");
-		byteCodeArray[38] = new ByteCode(38, "dload_0");
-		byteCodeArray[39] = new ByteCode(39, "dload_1");
-		byteCodeArray[40] = new ByteCode(40, "dload_2");
-		byteCodeArray[41] = new ByteCode(41, "dload_3");
-		byteCodeArray[42] = new ByteCode(42, "aload_0");
-		byteCodeArray[43] = new ByteCode(43, "aload_1");
-		byteCodeArray[44] = new ByteCode(44, "aload_2");
-		byteCodeArray[45] = new ByteCode(45, "aload_3");
-		byteCodeArray[46] = new ByteCode(46, "iaload");
-		byteCodeArray[47] = new ByteCode(47, "laload");
-		byteCodeArray[48] = new ByteCode(48, "faload");
-		byteCodeArray[49] = new ByteCode(49, "daload");
-		byteCodeArray[50] = new ByteCode(50, "aaload");
-		byteCodeArray[51] = new ByteCode(51, "baload");
-		byteCodeArray[52] = new ByteCode(52, "caload");
-		byteCodeArray[53] = new ByteCode(53, "saload");
-		byteCodeArray[54] = new ByteCode(54, "istore");
-		byteCodeArray[55] = new ByteCode(55, "lstore");
-		byteCodeArray[56] = new ByteCode(56, "fstore");
-		byteCodeArray[57] = new ByteCode(57, "dstore");
-		byteCodeArray[58] = new ByteCode(58, "astore");
-		byteCodeArray[59] = new ByteCode(59, "istore_0");
-		byteCodeArray[60] = new ByteCode(60, "istore_1");
-		byteCodeArray[61] = new ByteCode(61, "istore_2");
-		byteCodeArray[62] = new ByteCode(62, "istore_3");
-		byteCodeArray[63] = new ByteCode(63, "lstore_0");
-		byteCodeArray[64] = new ByteCode(64, "lstore_1");
-		byteCodeArray[65] = new ByteCode(65, "lstore_2");
-		byteCodeArray[66] = new ByteCode(66, "lstore_3");
-		byteCodeArray[67] = new ByteCode(67, "fstore_0");
-		byteCodeArray[68] = new ByteCode(68, "fstore_1");
-		byteCodeArray[69] = new ByteCode(69, "fstore_2");
-		byteCodeArray[70] = new ByteCode(70, "fstore_3");
-		byteCodeArray[71] = new ByteCode(71, "dstore_0");
-		byteCodeArray[72] = new ByteCode(72, "dstore_1");
-		byteCodeArray[73] = new ByteCode(73, "dstore_2");
-		byteCodeArray[74] = new ByteCode(74, "dstore_3");
-		byteCodeArray[75] = new ByteCode(75, "astore_0");
-		byteCodeArray[76] = new ByteCode(76, "astore_1");
-		byteCodeArray[77] = new ByteCode(77, "astore_2");
-		byteCodeArray[78] = new ByteCode(78, "astore_3");
-		byteCodeArray[79] = new ByteCode(79, "iastore");
-		byteCodeArray[80] = new ByteCode(80, "lastore");
-		byteCodeArray[81] = new ByteCode(81, "fastore");
-		byteCodeArray[82] = new ByteCode(82, "dastore");
-		byteCodeArray[83] = new ByteCode(83, "aastore");
-		byteCodeArray[84] = new ByteCode(84, "bastore");
-		byteCodeArray[85] = new ByteCode(85, "castore");
-		byteCodeArray[86] = new ByteCode(86, "sastore");
-		byteCodeArray[87] = new ByteCode(87, "pop");
-		byteCodeArray[88] = new ByteCode(88, "pop2");
-		byteCodeArray[89] = new ByteCode(89, "dup");
-		byteCodeArray[90] = new ByteCode(90, "dup_x1");
-		byteCodeArray[91] = new ByteCode(91, "dup_x2");
-		byteCodeArray[92] = new ByteCode(92, "dup2");
-		byteCodeArray[93] = new ByteCode(93, "dup2_x1");
-		byteCodeArray[94] = new ByteCode(94, "dup2_x2");
-		byteCodeArray[95] = new ByteCode(95, "swap");
-		byteCodeArray[96] = new ByteCode(96, "iadd");
-		byteCodeArray[97] = new ByteCode(97, "ladd");
-		byteCodeArray[98] = new ByteCode(98, "fadd");
-		byteCodeArray[99] = new ByteCode(99, "dadd");
-		byteCodeArray[100] = new ByteCode(100, "isub");
-		byteCodeArray[101] = new ByteCode(101, "lsub");
-		byteCodeArray[102] = new ByteCode(102, "fsub");
-		byteCodeArray[103] = new ByteCode(103, "dsub");
-		byteCodeArray[104] = new ByteCode(104, "imul");
-		byteCodeArray[105] = new ByteCode(105, "lmul");
-		byteCodeArray[106] = new ByteCode(106, "fmul");
-		byteCodeArray[107] = new ByteCode(107, "dmul");
-		byteCodeArray[108] = new ByteCode(108, "idiv");
-		byteCodeArray[109] = new ByteCode(109, "ldiv");
-		byteCodeArray[110] = new ByteCode(110, "fdiv");
-		byteCodeArray[111] = new ByteCode(111, "ddiv");
-		byteCodeArray[112] = new ByteCode(112, "irem");
-		byteCodeArray[113] = new ByteCode(113, "lrem");
-		byteCodeArray[114] = new ByteCode(114, "frem");
-		byteCodeArray[115] = new ByteCode(115, "drem");
-		byteCodeArray[116] = new ByteCode(116, "");
-		byteCodeArray[117] = new ByteCode(117, "lneg");
-		byteCodeArray[118] = new ByteCode(118, "fneg");
-		byteCodeArray[119] = new ByteCode(119, "dneg");
-		byteCodeArray[120] = new ByteCode(120, "ishl");
-		byteCodeArray[121] = new ByteCode(121, "lshl");
-		byteCodeArray[122] = new ByteCode(122, "ishr");
-		byteCodeArray[123] = new ByteCode(123, "lshr");
-		byteCodeArray[124] = new ByteCode(124, "iushr");
-		byteCodeArray[125] = new ByteCode(125, "lushr");
-		byteCodeArray[126] = new ByteCode(126, "iand");
-		byteCodeArray[127] = new ByteCode(127, "land");
-		byteCodeArray[128] = new ByteCode(128, "ior");
-		byteCodeArray[129] = new ByteCode(129, "lor");
-		byteCodeArray[130] = new ByteCode(130, "ixor");
-		byteCodeArray[131] = new ByteCode(131, "lxor");
-		byteCodeArray[132] = new ByteCode(132, "iinc");
-		byteCodeArray[133] = new ByteCode(133, "i2l");
-		byteCodeArray[134] = new ByteCode(134, "i2f");
-		byteCodeArray[135] = new ByteCode(135, "i2d");
-		byteCodeArray[136] = new ByteCode(136, "l2i");
-		byteCodeArray[137] = new ByteCode(137, "l2f");
-		byteCodeArray[138] = new ByteCode(138, "l2d");
-		byteCodeArray[139] = new ByteCode(139, "f2i");
-		byteCodeArray[140] = new ByteCode(140, "f2l");
-		byteCodeArray[141] = new ByteCode(141, "f2d");
-		byteCodeArray[142] = new ByteCode(142, "d2i");
-		byteCodeArray[143] = new ByteCode(143, "d2l");
-		byteCodeArray[144] = new ByteCode(144, "d2f");
-		byteCodeArray[145] = new ByteCode(145, "i2b");
-		byteCodeArray[146] = new ByteCode(146, "i2c");
-		byteCodeArray[147] = new ByteCode(147, "i2s");
-		byteCodeArray[148] = new ByteCode(148, "lcmp");
-		byteCodeArray[149] = new ByteCode(149, "fcmpl");
-		byteCodeArray[150] = new ByteCode(150, "fcmpg");
-		byteCodeArray[151] = new ByteCode(151, "dcmpl");
-		byteCodeArray[152] = new ByteCode(152, "dcmpg");
-		byteCodeArray[153] = new ByteCode(153, "ifeq");
-		byteCodeArray[154] = new ByteCode(154, "ifne");
-		byteCodeArray[155] = new ByteCode(155, "iflt");
-		byteCodeArray[156] = new ByteCode(156, "ifge");
-		byteCodeArray[157] = new ByteCode(157, "ifgt");
-		byteCodeArray[158] = new ByteCode(158, "ifle");
-		byteCodeArray[159] = new ByteCode(159, "if_icmpeq");
-		byteCodeArray[160] = new ByteCode(160, "if_icmpne");
-		byteCodeArray[161] = new ByteCode(161, "if_icmplt");
-		byteCodeArray[162] = new ByteCode(162, "if_icmpge");
-		byteCodeArray[163] = new ByteCode(163, "if_icmpgt");
-		byteCodeArray[164] = new ByteCode(164, "if_icmple");
-		byteCodeArray[165] = new ByteCode(165, "if_acmpeq");
-		byteCodeArray[166] = new ByteCode(166, "if_acmpne");
-		byteCodeArray[167] = new ByteCode(167, "goto");
-		byteCodeArray[168] = new ByteCode(168, "jsr");
-		byteCodeArray[169] = new ByteCode(169, "ret");
-		byteCodeArray[170] = new ByteCode(170, "tableswitch");
-		byteCodeArray[171] = new ByteCode(171, "lookupswitch");
-		byteCodeArray[172] = new ByteCode(172, "ireturn");
-		byteCodeArray[173] = new ByteCode(173, "lreturn");
-		byteCodeArray[174] = new ByteCode(174, "freturn");
-		byteCodeArray[175] = new ByteCode(175, "dreturn");
-		byteCodeArray[176] = new ByteCode(176, "areturn");
-		byteCodeArray[177] = new ByteCode(177, "return");
-		byteCodeArray[178] = new ByteCode(178, "getstatic", new int[] { 178, 0,
-				0 });
-		byteCodeArray[179] = new ByteCode(179, "putstatic", new int[] { 179, 0,
-				0 });
-		byteCodeArray[180] = new ByteCode(180, "getfield", new int[] { 180, 0,
-				0 });
-		byteCodeArray[181] = new ByteCode(181, "putfield", new int[] { 181, 0,
-				0 });
-		byteCodeArray[182] = new ByteCode(182, "invokevirtual", new int[] {
-				182, 0, 0 });
-		byteCodeArray[183] = new ByteCode(183, "invokespecial", new int[] {
-				183, 0, 0 });
-		byteCodeArray[184] = new ByteCode(184, "invokestatic", new int[] { 184,
-				0, 0 });
-		byteCodeArray[185] = new ByteCode(185, "invokeinterface");
-		byteCodeArray[186] = new ByteCode(186, "xxxunusedxxx");
-		byteCodeArray[187] = new ByteCode(187, "new");
-		byteCodeArray[188] = new ByteCode(188, "newarray");
-		byteCodeArray[189] = new ByteCode(189, "anewarray");
-		byteCodeArray[190] = new ByteCode(190, "arraylength");
-		byteCodeArray[191] = new ByteCode(191, "athrow");
-		byteCodeArray[192] = new ByteCode(192, "checkcast");
-		byteCodeArray[193] = new ByteCode(193, "instanceof");
-		byteCodeArray[194] = new ByteCode(194, "monitorenter");
-		byteCodeArray[195] = new ByteCode(195, "monitorexit");
-		byteCodeArray[196] = new ByteCode(196, "wide");
-		byteCodeArray[197] = new ByteCode(197, "multianewarray");
-		byteCodeArray[198] = new ByteCode(198, "ifnull");
-		byteCodeArray[199] = new ByteCode(199, "ifnonnull");
-		byteCodeArray[200] = new ByteCode(200, "goto_w");
-		byteCodeArray[201] = new ByteCode(201, "jsr_w");
-		// Extra ones defined by pack200
-		byteCodeArray[202] = new ByteCode(202, "getstatic_this", new int[] {
-				178, 0, 0 });
-		byteCodeArray[203] = new ByteCode(203, "putstatic_this", new int[] {
-				179, 0, 0 });
-		byteCodeArray[204] = new ByteCode(204, "getfield_this", new int[] {
-                180, 0, 0 });
-        byteCodeArray[205] = new ByteCode(205, "putfield_this", new int[] {
-                181, 0, 0 });
-        byteCodeArray[206] = new ByteCode(206, "invokevirtual_this", new int[] {
-                182, 0, 0 });
-        byteCodeArray[207] = new ByteCode(207, "invokespecial_this", new int[] {
-                183, 0, 0 });
-        byteCodeArray[208] = new ByteCode(208, "invokestatic_this", new int[] {
-                184, 0, 0 });
-        byteCodeArray[209] = new ByteCode(209, "aload_0_getstatic_this",
-                new int[] { 42, 178, 0, 0 });
-        byteCodeArray[210] = new ByteCode(210, "aload_0_putstatic_this",
-                new int[] { 42, 179, 0, 0 });
-        byteCodeArray[211] = new ByteCode(211, "aload_0_getfield_this",
-                new int[] { 42, 180, 0, 0 });
-        byteCodeArray[212] = new ByteCode(212, "aload_0_putfield_this",
-                new int[] { 42, 181, 0, 0 });
-        byteCodeArray[213] = new ByteCode(213, "aload_0_invokevirtual_this",
-                new int[] { 42, 182, 0, 0 });
-        byteCodeArray[214] = new ByteCode(214, "aload_0_invokespecial_this",
-                new int[] { 42, 183, 0, 0 });
-        byteCodeArray[215] = new ByteCode(215, "aload_0_invokestatic_this",
-                new int[] { 42, 184, 0, 0 });
-        byteCodeArray[216] = new ByteCode(216, "getstatic_super", new int[] {
-                178, 0, 0 });
-        byteCodeArray[217] = new ByteCode(217, "putstatic_super", new int[] {
-                179, 0, 0 });
-        byteCodeArray[218] = new ByteCode(218, "getfield_super", new int[] {
-                180, 0, 0 });
-        byteCodeArray[219] = new ByteCode(219, "putfield_super", new int[] {
-                181, 0, 0 });
-        byteCodeArray[220] = new ByteCode(220, "invokevirtual_super",
-                new int[] { 182, 0, 0 });
-        byteCodeArray[221] = new ByteCode(221, "invokespecial_super",
-                new int[] { 183, 0, 0 });
-        byteCodeArray[222] = new ByteCode(222, "invokestatic_super", new int[] {
-                184, 0, 0 });
-        byteCodeArray[223] = new ByteCode(223, "aload_0_getstatic_super",
-                new int[] { 42, 178, 0, 0 });
-        byteCodeArray[224] = new ByteCode(224, "aload_0_putstatic_super",
-                new int[] { 42, 179, 0, 0 });
-        byteCodeArray[225] = new ByteCode(225, "aload_0_getfield_super",
-                new int[] { 42, 180, 0, 0 });
-        byteCodeArray[226] = new ByteCode(226, "aload_0_putfield_super",
-                new int[] { 42, 181, 0, 0 });
-        byteCodeArray[227] = new ByteCode(227, "aload_0_invokevirtual_super",
-                new int[] { 42, 182, 0, 0 });
-        byteCodeArray[228] = new ByteCode(228, "aload_0_invokespecial_super",
-                new int[] { 42, 183, 0, 0 });
-        byteCodeArray[229] = new ByteCode(229, "aload_0_invokestatic_super",
-                new int[] { 42, 184, 0, 0 });
-        byteCodeArray[230] = new ByteCode(230, "invokespecial_this_init",
-                new int[] { 183, 0, 0 });
-        byteCodeArray[231] = new ByteCode(231, "invokespecial_super_init",
-                new int[] { 183, 0, 0 });
-        byteCodeArray[232] = new ByteCode(232, "invokespecial_new_init",
-                new int[] { 184, 0, 0 });
-        byteCodeArray[233] = new ByteCode(233, "cldc", new int[] { 18, 0 });
-        byteCodeArray[234] = new ByteCode(234, "ildc", new int[] { 18, 0 });
-        byteCodeArray[235] = new ByteCode(235, "fldc", new int[] { 18, 0 });
-        byteCodeArray[236] = new ByteCode(236, "cldc_w", new int[] { 19, 0 });
-        byteCodeArray[237] = new ByteCode(237, "ildc_w", new int[] { 19, 0 });
-        byteCodeArray[238] = new ByteCode(238, "fldc_w", new int[] { 19, 0 });
-        byteCodeArray[239] = new ByteCode(239, "dldc2_w", new int[] { 20, 0 });
-        
-		// Reserved bytecodes
-		byteCodeArray[254] = new ByteCode(254, "impdep1");
-		byteCodeArray[255] = new ByteCode(255, "impdep2");
-		for (int i = 0; i < byteCodeArray.length; i++) {
-			ByteCode byteCode = byteCodeArray[i];
-			if (byteCode != null) {
-				byteCodes.put(new Integer(i), byteCode);
-				byteCodes.put(byteCode.name, byteCode);
-			}
-		}
-	}
 
 	public static ByteCode getByteCode(int opcode) {
-		ByteCode byteCode = (ByteCode) byteCodes
-				.get(new Integer(0xff & opcode));
-		if (byteCode == null)
-			throw new Error("Unknown bytecode: " + opcode);
-		return byteCode;
+		return new ByteCode(0xFF & opcode);
 	}
 
-	private final String name;
-	private final ClassFileEntry[] nested;
-	private final int opcode;
-	private final int[] rewrite;
+	private final ByteCodeForm byteCodeForm;
 
-	protected ByteCode(int opcode, String name) {
-		this(opcode, name, new int[] { opcode });
-	}
+	private ClassFileEntry[] nested;
+	private int[][] nestedPositions;
+	private int[] rewrite;
 
-	protected ByteCode(int opcode, String name, int[] rewrite) {
-		this(opcode, name, rewrite, ClassFileEntry.NONE);
+	protected ByteCode(int opcode) {
+		this(opcode, ClassFileEntry.NONE);
 	}
 
-	protected ByteCode(int opcode, String name, int[] rewrite,
-			ClassFileEntry[] nested) {
-		this.opcode = opcode;
-		this.name = name;
-		this.rewrite = rewrite;
+	protected ByteCode(int opcode, ClassFileEntry[] nested) {
+		this.byteCodeForm = ByteCodeForm.get(opcode);
+		this.rewrite = byteCodeForm.getRewriteCopy();
 		this.nested = nested;
 	}
 
 	protected void doWrite(DataOutputStream dos) throws IOException {
-		// TODO operands?
 		for (int i = 0; i < rewrite.length; i++) {
 			dos.writeByte(rewrite[i]);
 		}
@@ -361,40 +57,207 @@
 		if (getClass() != obj.getClass())
 			return false;
 		final ByteCode other = (ByteCode) obj;
-		if (opcode != other.opcode)
+		if (getByteCodeForm() != other.getByteCodeForm())
+			return false;
+		if (!rewrite.equals(other.rewrite))
 			return false;
 		return true;
 	}
 
+	public void extractOperands(OperandManager operandManager, Segment segment) {
+		// 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);
+	}
+
+	protected ByteCodeForm getByteCodeForm() {
+		return byteCodeForm;
+	}
+
 	public int getLength() {
 		return rewrite.length;
 	}
 
 	public String getName() {
-		return name;
+		return getByteCodeForm().getName();
 	}
 
-	protected ClassFileEntry[] getNestedClassFileEntries() {
+	public ClassFileEntry[] getNestedClassFileEntries() {
 		return nested;
 	}
 
 	public int getOpcode() {
-		return opcode;
+		return getByteCodeForm().getOpcode();
+	}
+
+	public int getOperandType() {
+		return getByteCodeForm().getOperandType();
 	}
 
 	public int hashCode() {
 		final int prime = 31;
 		int result = 1;
-		result = prime * result + opcode;
+		result = prime * result + getByteCodeForm().getOpcode();
+		// Don't forget to take the operands = rewrite into account
+		for (int index = 1; index < rewrite.length; index++) {
+			result = result + rewrite[index];
+		}
 		return result;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.apache.harmony.pack200.bytecode.ClassFileEntry#resolve(org.apache.harmony.pack200.bytecode.ClassConstantPool)
+	 */
 	protected void resolve(ClassConstantPool pool) {
-		// TODO Auto-generated method stub
 		super.resolve(pool);
+		if(nested.length > 0) {
+			// Update the bytecode rewrite array so that it points
+			// to the elements of the nested array.
+			for(int index = 0; index < nested.length; index++) {
+				int argLength = getNestedPosition(index)[1];
+				switch(argLength) {
+				
+				case 1:
+					setOperandByte(pool.indexOf(nested[index]), getNestedPosition(index)[0]);
+					break;
+					
+				case 2: 
+					setOperandInt(pool.indexOf(nested[index]), getNestedPosition(index)[0]);
+					break;
+				
+				case 4:
+					// TODO: need to handle wides?
+					System.out.println("Need to handle wides");
+					// figure out and if so, handle and put a break here.
+					// break;
+				
+				default: 
+					System.out.println("Unhandled resolve " + this);
+				}
+			}
+		}
 	}
 
+
+	/**
+	 * Given an array of ints which correspond to bytes in the
+	 * operand of the bytecode, set the rewrite bytes of the
+	 * operand to be the appropriate values. All values in
+	 * operands[] will be masked with 0xFF so they fit into
+	 * a byte.
+	 * @param operands int[] rewrite operand bytes 
+	 */
+	public void setOperandBytes(int[] operands) {
+		int firstOperandIndex = getByteCodeForm().firstOperandIndex();
+		int byteCodeFormLength = getByteCodeForm().operandLength();
+		if (firstOperandIndex < 1) {
+			// No operand rewriting permitted for this bytecode
+			throw new Error("Trying to rewrite " + this + " that has no rewrite");
+		}
+		
+		if(byteCodeFormLength != operands.length) {
+			throw new Error("Trying to rewrite " + this + " with " + operands.length + " but bytecode has length " + byteCodeForm.operandLength());
+		}
+		
+		for(int index=0; index < byteCodeFormLength; index++) {
+			rewrite[index + firstOperandIndex] = operands[index] & 0xFF;
+		}
+	}
+	
+	/**
+	 * Given an int operand, set the rewrite bytes for
+	 * that position and the one immediately following it
+	 * to a high-byte, low-byte encoding of the operand.
+	 * 
+	 * @param operand int to set the rewrite bytes to
+	 * @param position int position in the operands of the 
+	 * 	rewrite bytes. For a rewrite array of {100, -1, -1, -1}
+	 *  position 0 is the first -1, position 1 is the second -1,
+	 *  etc.
+	 */
+	public void setOperandInt(int operand, int position) {
+		int firstOperandIndex = getByteCodeForm().firstOperandIndex();
+		int byteCodeFormLength = getByteCodeForm().operandLength();
+		if (firstOperandIndex < 1) {
+			// No operand rewriting permitted for this bytecode
+			throw new Error("Trying to rewrite " + this + " that has no rewrite");
+		}
+		
+		if(firstOperandIndex + position + 1 > byteCodeFormLength) {
+			throw new Error("Trying to rewrite " + this + " with an int at position " + position + " but this won't fit in the rewrite array");
+		}
+		
+		rewrite[firstOperandIndex + position] = (operand & 0xFF00) >> 8;
+		rewrite[firstOperandIndex + position + 1] = operand & 0xFF;		
+	}
+	
+	/**
+	 * Given an int operand, treat it as a byte and set
+	 * the rewrite byte for that position to that value.
+	 * Mask of anything beyond 0xFF.
+	 * 
+	 * @param operand int to set the rewrite byte to (unsigned)
+	 * @param position int position in the operands of the 
+	 * 	rewrite bytes. For a rewrite array of {100, -1, -1, -1}
+	 *  position 0 is the first -1, position 1 is the second -1,
+	 *  etc.
+	 */
+	public void setOperandByte(int operand, int position) {
+		int firstOperandIndex = getByteCodeForm().firstOperandIndex();
+		int byteCodeFormLength = getByteCodeForm().operandLength();
+		if (firstOperandIndex < 1) {
+			// No operand rewriting permitted for this bytecode
+			throw new Error("Trying to rewrite " + this + " that has no rewrite");
+		}
+		
+		if(firstOperandIndex + position > byteCodeFormLength) {
+			throw new Error("Trying to rewrite " + this + " with an byte at position " + position + " but this won't fit in the rewrite array");
+		}
+		
+		rewrite[firstOperandIndex + position] = operand & 0xFF;		
+	}
+	
+	
 	public String toString() {
-		return name;
+		return getByteCodeForm().getName();
+	}
+	
+	public void setNested(ClassFileEntry[] nested) {
+		this.nested = nested;
+	}
+	
+	/**
+	 * nestedPositions is an array of arrays of ints. Each
+	 * subarray specifies a position of a nested
+	 * element (from the nested[] array) and the length of
+	 * that element.
+	 * 
+	 * For instance, one might have a nested of:
+	 * 	{CPClass java/lang/Foo, CPFloat 3.14}
+	 * The nestedPositions would then be:
+	 * 	{{0,2},{2,2}}
+	 * In other words, when the bytecode is resolved, the
+	 * CPClass will be resolved to an int and inserted
+	 * at position 0 and 1 of the rewrite arguments (the first
+	 * occurrences of -1). The CPFloat will be resolved to
+	 * an int position and inserted at positions 2 and 3 of
+	 * the rewrite arguments.
+	 *  
+	 * @param nestedPositions
+	 */
+	public void setNestedPositions(int[][] nestedPositions) {
+		this.nestedPositions = nestedPositions;
+	}
+	
+	public int[][] getNestedPositions() {
+		return nestedPositions;
+	}
+	
+	public int[] getNestedPosition(int index) {
+		return getNestedPositions()[index];
 	}
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java?rev=596594&r1=596593&r2=596594&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPClass.java Tue Nov 20 02:05:20 2007
@@ -74,9 +74,13 @@
 	}
 
 	public String toString() {
-		return "Class: " + name;
+		return "Class: " + getName();
 	}
 
+	public String getName() {
+		return name;
+	}
+	
 	protected void writeBody(DataOutputStream dos) throws IOException {
 		dos.writeShort(index);
 	}

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java?rev=596594&r1=596593&r2=596594&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CPFieldRef.java Tue Nov 20 02:05:20 2007
@@ -37,10 +37,7 @@
 
 	
 	protected ClassFileEntry[] getNestedClassFileEntries() {
-		ClassFileEntry[] entries = new ClassFileEntry[2];
-		entries[0] = className;
-		entries[1] = nameAndType;
-		return entries;
+		return new ClassFileEntry[] {className, nameAndType};
 	}
 
 

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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -18,8 +18,17 @@
 
 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);
+	}
+
+	protected ClassFileEntry[] getNestedClassFileEntries() {
+		return new ClassFileEntry[] { className, 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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -17,8 +17,12 @@
 package org.apache.harmony.pack200.bytecode;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import org.apache.harmony.pack200.Pack200Exception;
+import org.apache.harmony.pack200.Segment;
 
 
 public class ClassConstantPool {
@@ -69,6 +73,39 @@
 		return (ClassFileEntry) entries.get(--i);
 	}
 
+	public void resolve(Segment segment) {
+		System.out.println("\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++) {
+			System.out.println(sortedList.get(xindex));
+		}
+		resolve();
+	}
+	
 	public void resolve() {
 		resolved= true;
 		Iterator it = entries.iterator();

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=596594&r1=596593&r2=596594&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 Nov 20 02:05:20 2007
@@ -22,6 +22,8 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.harmony.pack200.Segment;
+
 public class CodeAttribute extends Attribute {
 	public List attributes = new ArrayList();
 	public List byteCodes = new ArrayList();
@@ -31,13 +33,15 @@
 	public int maxLocals;
 	public int maxStack;
 
-	public CodeAttribute(int maxStack, int maxLocals, byte codePacked[]) {
+	public CodeAttribute(int maxStack, int maxLocals, byte codePacked[],
+			Segment segment, OperandManager operandManager) {
 		super("Code"); //$NON-NLS-1$
 		this.maxLocals = maxLocals;
 		this.maxStack = maxStack;
 		this.codeLength = 0;
 		for (int i = 0; i < codePacked.length; i++) {
 			ByteCode byteCode = ByteCode.getByteCode(codePacked[i] & 0xff);
+			byteCode.extractOperands(operandManager, segment);
 			byteCodes.add(byteCode);
 			this.codeLength += byteCode.getLength();
 		}
@@ -52,6 +56,15 @@
 		}
 		return 2 + 2 + 4 + codeLength + exceptionTable.size() * (2 + 2 + 2 + 2)
 				+ 2 + attributesSize;
+	}
+
+	protected ClassFileEntry[] getNestedClassFileEntries() {
+		ArrayList nestedEntries = new ArrayList();
+		nestedEntries.add(getAttributeName());
+		nestedEntries.addAll(byteCodes);
+		ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries.size()];
+		nestedEntries.toArray(nestedEntryArray);
+		return nestedEntryArray;
 	}
 
 	protected void resolve(ClassConstantPool pool) {

Added: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java?rev=596594&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java Tue Nov 20 02:05:20 2007
@@ -0,0 +1,202 @@
+package org.apache.harmony.pack200.bytecode;
+
+import org.apache.harmony.pack200.Segment;
+import org.apache.harmony.pack200.SegmentConstantPool;
+
+/**
+ * This class keeps track of operands used. It provides
+ * API to let other classes get next elements, and also
+ * knows about which classes have been used recently
+ * in super, this and new references.
+ */
+public class 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;
+    
+	int bcByteIndex = 0;
+	int bcShortIndex = 0;
+	int bcLocalIndex = 0;
+	int bcLabelIndex = 0;
+	int bcIntRefIndex = 0;
+	int bcFloatRefIndex = 0;
+	int bcLongRefIndex = 0;
+	int bcDoubleRefIndex = 0;
+	int bcStringRefIndex = 0;
+	int bcClassRefIndex = 0;
+	int bcFieldRefIndex = 0;
+	int bcMethodRefIndex = 0;
+	int bcIMethodRefIndex = 0;
+	int bcThisFieldIndex = 0;
+	int bcSuperFieldIndex = 0;
+	int bcThisMethodIndex = 0;
+	int bcSuperMethodIndex = 0;
+	int bcInitRefIndex = 0;
+    
+	Segment segment = null;
+	
+	String currentClass = null;
+	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) {
+	    this.bcByte = bcByte;
+	    this.bcShort = bcShort;
+	    this.bcLocal = bcLocal;
+	    this.bcLabel = bcLabel;
+	    this.bcIntRef = bcIntRef;
+	    this.bcFloatRef = bcFloatRef;
+	    this.bcLongRef = bcLongRef;
+	    this.bcDoubleRef = bcDoubleRef;
+	    this.bcStringRef = bcStringRef;
+	    this.bcClassRef = bcClassRef;
+	    this.bcFieldRef = bcFieldRef;
+	    this.bcMethodRef = bcMethodRef;
+	    this.bcIMethodRef = bcIMethodRef;
+
+	    this.bcThisField = bcThisField;
+	    this.bcSuperField = bcSuperField;
+	    this.bcThisMethod = bcThisMethod;
+	    this.bcSuperMethod = bcSuperMethod;
+	    this.bcInitRef = bcInitRef;
+	}
+    
+	public int nextByte() {
+		return bcByte[bcByteIndex++];		
+	}
+	
+	public int nextShort() {
+		return bcShort[bcShortIndex++];		
+	}
+	
+	public int nextLocal() {
+		return bcLocal[bcLocalIndex++];		
+	}
+	
+	public int nextLabel() {
+		return bcLabel[bcLabelIndex++];		
+	}
+	
+	public int nextIntRef() {
+		return bcIntRef[bcIntRefIndex++];		
+	}
+	
+	public int nextFloatRef() {
+		return bcFloatRef[bcFloatRefIndex++];		
+	}
+	
+	public int nextLongRef() {
+		return bcLongRef[bcLongRefIndex++];		
+	}
+	
+	public int nextDoubleRef() {
+		return bcDoubleRef[bcDoubleRefIndex++];		
+	}
+	
+	public int nextStringRef() {
+		return bcStringRef[bcStringRefIndex++];		
+	}
+	
+	public int nextClassRef() {
+		return bcClassRef[bcClassRefIndex++];		
+	}
+	
+	public int nextFieldRef() {
+		return bcFieldRef[bcFieldRefIndex++];		
+	}
+	
+	public int nextMethodRef() {
+		return bcMethodRef[bcMethodRefIndex++];		
+	}
+	
+	public int nextIMethodRef() {
+		return bcIMethodRef[bcIMethodRefIndex++];		
+	}
+	
+	public int nextThisFieldRef() {
+		return bcThisField[bcThisFieldIndex++];
+	}
+
+	public int nextSuperFieldRef() {
+		return bcSuperField[bcSuperFieldIndex++];
+	}
+
+	public int nextThisMethodRef() {
+		return bcThisMethod[bcThisMethodIndex++];
+	}
+
+	public int nextSuperMethodRef() {
+		return bcSuperMethod[bcSuperMethodIndex++];
+	}
+
+	public int nextInitRef() {
+		return bcInitRef[bcInitRefIndex++];
+	}
+
+	public static void main(String args[]) {
+		int foo[] = {1, 172, 3, 4};
+		OperandManager op = new OperandManager(foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo, foo);
+		for(int index=0; index < 4; index++) {
+			System.out.println(op.nextByte());
+		}
+	}
+
+	public void setSegment(Segment segment) {
+		this.segment = segment;
+	}
+	public Segment getSegment() {
+		return segment;
+	}
+	
+	public SegmentConstantPool globalConstantPool() {
+		return segment.getConstantPool();
+	}
+	
+	public void setCurrentClass(String string) {
+		currentClass = string;
+	}
+	public void setSuperClass(String string) {
+		superClass = string;
+	}
+	public void setNewClass(String string) {
+		newClass = string;
+	}
+	
+	public String getCurrentClass() {
+		if(null==currentClass) {
+			throw new Error("Current class not set yet");
+		} else {
+			return currentClass;
+		}
+	}
+	public String getSuperClass() {
+		if(null==superClass) {
+			throw new Error("SuperClass not set yet");
+		} else {
+			return superClass;
+		}
+	}
+	public String getNewClass() {
+		if(null==newClass) {
+			throw new Error("New class not set yet");
+		} else {
+			return newClass;
+		}
+	}
+}

Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/OperandManager.java
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message