You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2007/10/09 22:04:11 UTC

svn commit: r583280 - in /harmony/enhanced/classlib/trunk/modules/pack200/src: main/java/org/apache/harmony/pack200/ main/java/org/apache/harmony/pack200/bytecode/ test/java/org/apache/harmony/pack200/tests/

Author: tellison
Date: Tue Oct  9 13:04:10 2007
New Revision: 583280

URL: http://svn.apache.org/viewvc?rev=583280&view=rev
Log:
Apply patch HARMONY-4886 ([classlib] [pack200] Pack200 - improved parser for bytecode bands and class bands and some tests)

Added:
    harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java   (with props)
Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java
    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/ClassBands.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/bytecode/ByteCode.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/BandSetTest.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/AttrDefinitionBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java?rev=583280&r1=583279&r2=583280&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttrDefinitionBands.java Tue Oct  9 13:04:10 2007
@@ -24,7 +24,7 @@
  *
  */
 public class AttrDefinitionBands extends BandSet {
-    
+
     private int[] attributeDefinitionHeader;
 
     private String[] attributeDefinitionLayout;    

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java?rev=583280&r1=583279&r2=583280&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeLayoutMap.java Tue Oct  9 13:04:10 2007
@@ -209,7 +209,7 @@
 	}
 
 	public void add(AttributeLayout layout) {
-        layouts[layout.getContext()].put(Integer.valueOf(layout.getIndex()), layout);
+        layouts[layout.getContext()].put(new Integer(layout.getIndex()), layout);
 	}
 
 	public AttributeLayout getAttributeLayout(String name, int context)

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java?rev=583280&r1=583279&r2=583280&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java Tue Oct  9 13:04:10 2007
@@ -71,6 +71,24 @@
         return result;
     }
     
+    public int[][] decodeBandInt(String name, InputStream in, BHSDCodec defaultCodec, int[] counts) throws IOException, Pack200Exception {
+        int[][] result = new int[counts.length][];
+        int totalCount = 0;
+        for (int i = 0; i < counts.length; i++) {
+            totalCount += counts[i];
+        }
+        int[] twoDResult = decodeBandInt(name, in, defaultCodec, totalCount);
+        int index = 0;
+        for (int i = 0; i < result.length; i++) {
+            result[i] = new int[counts[i]];
+            for(int j = 0; j < result[i].length; j++) {
+                result[i][j] = twoDResult[index];
+                index++;
+            }
+        }
+        return result;
+    }
+    
     /**
      * Decode a band and return an array of <code>long[]</code> values
      * 
@@ -184,7 +202,7 @@
     public String[] parseReferences(String name, InputStream in,
             BHSDCodec codec, int count, String[] reference) throws IOException,
             Pack200Exception {
-        return parseReferences(name, in, codec, 1, new int[] { count },
+        return parseReferences(name, in, codec, new int[] { count },
                 reference)[0];
     }
     
@@ -214,9 +232,10 @@
      *             if a problem occurs with an unexpected value or unsupported
      *             codec
      */
-    protected String[][] parseReferences(String name, InputStream in,
-            BHSDCodec codec, int count, int counts[], String[] reference)
+    public String[][] parseReferences(String name, InputStream in,
+            BHSDCodec codec, int counts[], String[] reference)
             throws IOException, Pack200Exception {
+        int count = counts.length;
         if (count == 0) {
             return new String[][] { {} };
         }

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=583280&r1=583279&r2=583280&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 Oct  9 13:04:10 2007
@@ -21,16 +21,42 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 
 import org.apache.harmony.pack200.bytecode.ByteCode;
 import org.apache.harmony.pack200.bytecode.CodeAttribute;
 
 /**
- *
+ * 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;
+    private int[] bcCaseCount;
+    private int[][] bcCaseValue;
+    private int[] bcByte;
+    private int[] bcLocal;
+    private int[] bcShort;
+    private int[] bcLabel;
+    private int[] bcIntRef;
+    private int[] bcFloatRef;
+    private int[] bcLongRef;
+    private int[] bcDoubleRef;
+    private int[] bcStringRef;
+    private int[] bcClassRef;
+    private int[] bcFieldRef;
+    private int[] bcMethodRef;
+    private int[] bcIMethodRef;
+    private int[] bcThisField;
+    private int[] bcSuperField;
+    private int[] bcThisMethod;
+    private int[] bcSuperMethod;
+    private int[] bcInitRef;
+    private int[] bcEscRef;
+    private int[] bcEscRefSize;
+    private int[] bcEscSize;
+    private int[][] bcEscByte;
 
     /**
      * @param header
@@ -61,12 +87,27 @@
        ArrayList[][] methodAttributes = segment.getClassBands().getMethodAttributes();
        String[][] methodDescr = segment.getClassBands().getMethodDescr();
        
+       int bcCaseCountCount = 0;
+       int bcByteCount = 0;
+       int bcShortCount = 0;
+       int bcLocalCount = 0;
+       int bcLabelCount = 0;
+       int bcIntRefCount = 0;
+       int bcFloatRefCount = 0;
+       int bcLongRefCount = 0;
+       int bcDoubleRefCount = 0;
        int bcStringRefCount = 0;
-       int bcInitRefCount = 0;
+       int bcClassRefCount = 0;       
        int bcFieldRefCount = 0;
-       int bcThisFieldCount = 0;
        int bcMethodRefCount = 0;
        int bcIMethodRefCount = 0;
+       int bcThisFieldCount = 0;
+       int bcSuperFieldCount = 0;
+       int bcThisMethodCount = 0;
+       int bcSuperMethodCount = 0;       
+       int bcInitRefCount = 0;
+       int bcEscCount = 0;
+       int bcEscRefCount = 0;
 
        AttributeLayout abstractModifier = attributeDefinitionMap
                .getAttributeLayout(AttributeLayout.ACC_ABSTRACT,
@@ -92,6 +133,11 @@
                        codeBytes.write(code);
                    methodByteCodePacked[c][m] = codeBytes.toByteArray();
                    bcParsed += methodByteCodePacked[c][m].length;
+                   int[] codes = new int[methodByteCodePacked[c][m].length];
+                   for (int i = 0; i < codes.length; i++) {
+                       codes[i] = methodByteCodePacked[c][m][i] & 0xff;
+                   }
+                   debug(Arrays.toString(codes));
                    for (int i = 0; i < methodByteCodePacked[c][m].length; i++) {
                        int codePacked = 0xff & methodByteCodePacked[c][m][i];
                        // TODO a lot of this needs to be encapsulated in the
@@ -103,9 +149,56 @@
                        // once they've been gotten. But that's for another
                        // time.
                        switch (codePacked) {
+                       case 16: // bipush
+                       case 188: // newarray
+                           bcByteCount++;
+                           break;
+                       case 17: // sipush
+                           bcShortCount++;
+                           break;
                        case 18: // (a)ldc
+                       case 19: // aldc_w
                            bcStringRefCount++;
                            break;
+                       case 234: // ildc
+                       case 237: // ildc_w
+                           bcIntRefCount++;
+                           break;
+                       case 235: // fldc
+                       case 238: // fldc_w
+                           bcFloatRefCount++;
+                           break;
+                       case 197: // multianewarray
+                           bcByteCount++;
+                           // fallthrough intended
+                       case 233: // cldc
+                       case 236: // cldc_w
+                       case 187: // new
+                       case 189: // anewarray
+                       case 192: // checkcast
+                       case 193: // instanceof                       
+                           bcClassRefCount++;
+                           break;
+                       case 20: // lldc2_w
+                           bcLongRefCount++;
+                           break;
+                       case 239: // dldc2_w
+                           bcDoubleRefCount++;
+                           break;
+                       case 169: // ret
+                           bcLocalCount++;
+                           break;
+                       case 167: // goto
+                       case 168: // jsr
+                       case 200: // goto_w
+                       case 201: // jsr_w
+                           bcLabelCount++;
+                           break;
+                       case 170: // tableswitch
+                       case 171: // lookupswitch
+                           bcCaseCountCount++;
+                           bcLabelCount++;
+                           break;
                        case 178: // getstatic
                        case 179: // putstatic
                        case 180: // getfield
@@ -124,55 +217,123 @@
                        case 203: // putstatic_this
                        case 204: // getfield_this
                        case 205: // putfield_this
+                       case 209: // aload_0_getstatic_this
+                       case 210: // aload_0_putstatic_this
+                       case 211: // aload_0_putfield_this
+                       case 212: // aload_0_putfield_this
                            bcThisFieldCount++;
                            break;
-                       case 231: // invoke_special_init
+                       case 206: // invokevirtual_this
+                       case 207: // invokespecial_this
+                       case 208: // invokestatic_this
+                       case 213: // aload_0_invokevirtual_this
+                       case 214: // aload_0_invokespecial_this
+                       case 215: // aload_0_invokestatic_this
+                           bcThisMethodCount++;
+                           break;
+                       case 216: // getstatic_super
+                       case 217: // putstatic_super
+                       case 218: // getfield_super
+                       case 219: // putfield_super
+                       case 223: // aload_0_getstatic_super
+                       case 224: // aload_0_putstatic_super
+                       case 225: // aload_0_getfield_super
+                       case 226: // aload_0_putfield_super
+                           bcSuperFieldCount++;
+                           break;
+                       case 220: // invokevirtual_super
+                       case 221: // invokespecial_super
+                       case 222: // invokestatic_super
+                       case 227: // aload_0_invokevirtual_super
+                       case 228: // aload_0_invokespecial_super
+                       case 229: // aload_0_invokestatic_super
+                           bcSuperMethodCount++;
+                           break;
+                       case 132: // iinc
+                           bcLocalCount++;
+                           bcByteCount++;
+                           break;
+                       case 196: // wide
+                            int nextInstruction = 0xff & methodByteCodePacked[c][m][i+1];
+                            if (nextInstruction == 132) { // iinc
+                                bcLocalCount += 2;
+                                bcShortCount++;
+                            } else if (endsWithLoad(nextInstruction)
+                                    || endsWithStore(nextInstruction)
+                                    || nextInstruction == 169) {
+                                bcLocalCount += 2;
+                            } else {
+                                debug("Found unhandled " + ByteCode.getByteCode(nextInstruction));
+                            }
+                            i++;
+                            break;
+                       case 230: // invokespecial_this_init
+                       case 231: // invokespecial_super_init
+                       case 232: // invokespecial_new_init
                            bcInitRefCount++;
                            break;
-
+                       case 253: // ref_escape
+                            bcEscRefCount++;
+                           break;
+                       case 254: // byte_escape
+                           bcEscCount++;
+                           break;
                        default: // unhandled specifically at this stage
-                           debug("Found unhandled "
-                            + ByteCode.getByteCode(codePacked));
+                           if(endsWithLoad(codePacked) || endsWithStore(codePacked)) {
+                               bcLocalCount++;
+                           } else if (startsWithIf(codePacked)) {
+                               bcLabelCount++;
+                           } else {
+                               debug("Found unhandled " + ByteCode.getByteCode(codePacked));
+                           }
                        }
                    }
                }
             }
         }
-       // other bytecode bands
-       debug("Parsed *bc_codes (" + bcParsed + ")");
-       debug("unimplemented bc_case_count");
-       debug("unimplemented bc_case_value");
-       debug("unimplemented bc_byte");
-       debug("unimplemented bc_short");
-       debug("unimplemented bc_local");
-       debug("unimplemented bc_label");
-       debug("unimplemented bc_intref");
-       debug("unimplemented bc_floatref");
-       debug("unimplemented bc_longref");
-       debug("unimplemented bc_doubleref");
-       int[] bcStringRef = decodeBandInt("bc_stringref", in, Codec.DELTA5,
-               bcStringRefCount);
-       debug("unimplemented bc_classref");
-       int[] bcFieldRef = decodeBandInt("bc_fieldref", in, Codec.DELTA5,
-               bcFieldRefCount);
-       int[] bcMethodRef = decodeBandInt("bc_methodref", in, Codec.UNSIGNED5,
-               bcMethodRefCount);
-       int[] bcIMethodRef = decodeBandInt("bc_imethodref", in, Codec.DELTA5,
-               bcIMethodRefCount);
-       int[] bcThisField = decodeBandInt("bc_thisfield", in, Codec.UNSIGNED5,
-               bcThisFieldCount);
-       debug("unimplemented bc_superfield");
-       debug("unimplemented bc_thismethod");
-       debug("unimplemented bc_supermethod");
-       debug("unimplemented bc_initref");
-       int[] bcInitRef = decodeBandInt("bc_initref", in, Codec.UNSIGNED5,
-               bcInitRefCount);
-       debug("unimplemented bc_escref");
-       debug("unimplemented bc_escrefsize");
-       debug("unimplemented bc_escsize");
-       debug("unimplemented bc_escbyte");
-       int i = 0;
-       for (int c = 0; c < classCount; c++) {
+        // other bytecode bands
+        debug("Parsed *bc_codes (" + bcParsed + ")");
+        bcCaseCount = decodeBandInt("bc_case_count", in, Codec.UNSIGNED5, bcCaseCountCount);
+        bcCaseValue = decodeBandInt("bc_case_value", in, Codec.DELTA5, bcCaseCount);
+        bcByte = decodeBandInt("bc_byte", in, Codec.BYTE1, bcByteCount);
+        bcShort = decodeBandInt("bc_short", in, Codec.DELTA5, bcShortCount);
+        bcLocal = decodeBandInt("bc_local", in, Codec.UNSIGNED5, bcLocalCount);
+        bcLabel = decodeBandInt("bc_label", in, Codec.BRANCH5, bcLabelCount);
+        bcIntRef = decodeBandInt("bc_intref", in, Codec.DELTA5, bcIntRefCount);
+        bcFloatRef = decodeBandInt("bc_floatref", in, Codec.DELTA5,
+                bcFloatRefCount);
+        bcLongRef = decodeBandInt("bc_longref", in, Codec.DELTA5,
+                bcLongRefCount);
+        bcDoubleRef = decodeBandInt("bc_doubleref", in, Codec.DELTA5,
+                bcDoubleRefCount);
+        bcStringRef = decodeBandInt("bc_stringref", in, Codec.DELTA5,
+                bcStringRefCount);
+        bcClassRef = decodeBandInt("bc_classref", in, Codec.UNSIGNED5,
+                bcClassRefCount);
+        bcFieldRef = decodeBandInt("bc_fieldref", in, Codec.DELTA5,
+                bcFieldRefCount);
+        bcMethodRef = decodeBandInt("bc_methodref", in, Codec.UNSIGNED5,
+                bcMethodRefCount);
+        bcIMethodRef = decodeBandInt("bc_imethodref", in, Codec.DELTA5,
+                bcIMethodRefCount);
+        bcThisField = decodeBandInt("bc_thisfield", in, Codec.UNSIGNED5,
+                bcThisFieldCount);
+        bcSuperField = decodeBandInt("bc_superfield", in, Codec.UNSIGNED5,
+                bcSuperFieldCount);
+        bcThisMethod = decodeBandInt("bc_thismethod", in, Codec.UNSIGNED5,
+                bcThisMethodCount);
+        bcSuperMethod = decodeBandInt("bc_supermethod", in, Codec.UNSIGNED5,
+                bcSuperMethodCount);
+        bcInitRef = decodeBandInt("bc_initref", in, Codec.UNSIGNED5,
+                bcInitRefCount);
+        bcEscRef = decodeBandInt("bc_escref", in, Codec.UNSIGNED5,
+                bcEscRefCount);
+        bcEscRefSize = decodeBandInt("bc_escrefsize", in, Codec.UNSIGNED5, bcEscRefCount);
+        bcEscSize = decodeBandInt("bc_escsize", in, Codec.UNSIGNED5, bcEscCount);
+        bcEscByte = decodeBandInt("bc_escbyte", in, Codec.BYTE1, bcEscSize);
+        
+        int i = 0;
+        for (int c = 0; c < classCount; c++) {
            int numberOfMethods = methodFlags[c].length;
            for (int m = 0; m < numberOfMethods; m++) {
                long methodFlag = methodFlags[c][m];
@@ -192,7 +353,120 @@
                }
            }
        }
+    }
+
+    private boolean startsWithIf(int codePacked) {
+        return (codePacked >= 153 && codePacked <= 166)
+        || (codePacked == 198)
+        || (codePacked == 199);
+    }
+
+    private boolean endsWithLoad(int codePacked) {
+        return (codePacked >= 21 && codePacked <= 25);
+    }
+
+    private boolean endsWithStore(int codePacked) {
+        return  (codePacked >= 54 && codePacked <= 58);
+    }
+
+    public byte[][][] getMethodByteCodePacked() {
+        return methodByteCodePacked;
+    }
+
+    public int[] getBcCaseCount() {
+        return bcCaseCount;
+    }
+
+    public int[][] getBcCaseValue() {
+        return bcCaseValue;
+    }
+
+    public int[] getBcByte() {
+        return bcByte;
+    }
 
+    public int[] getBcClassRef() {
+        return bcClassRef;
     }
+
+    public int[] getBcDoubleRef() {
+        return bcDoubleRef;
+    }
+
+    public int[] getBcFieldRef() {
+        return bcFieldRef;
+    }
+
+    public int[] getBcFloatRef() {
+        return bcFloatRef;
+    }
+
+    public int[] getBcIMethodRef() {
+        return bcIMethodRef;
+    }
+
+    public int[] getBcInitRef() {
+        return bcInitRef;
+    }
+
+    public int[] getBcIntRef() {
+        return bcIntRef;
+    }
+
+    public int[] getBcLabel() {
+        return bcLabel;
+    }
+
+    public int[] getBcLocal() {
+        return bcLocal;
+    }
+
+    public int[] getBcLongRef() {
+        return bcLongRef;
+    }
+
+    public int[] getBcMethodRef() {
+        return bcMethodRef;
+    }
+
+    public int[] getBcShort() {
+        return bcShort;
+    }
+
+    public int[] getBcStringRef() {
+        return bcStringRef;
+    }
+
+    public int[] getBcSuperField() {
+        return bcSuperField;
+    }
+
+    public int[] getBcSuperMethod() {
+        return bcSuperMethod;
+    }
+
+    public int[] getBcThisField() {
+        return bcThisField;
+    }
+
+    public int[] getBcThisMethod() {
+        return bcThisMethod;
+    }
+
+    public int[] getBcEscRef() {
+        return bcEscRef;
+    }
+
+    public int[] getBcEscRefSize() {
+        return bcEscRefSize;
+    }
+    
+    public int[] getBcEscSize() {
+        return bcEscSize;
+    }
+
+    public int[][] getBcEscByte() {
+        return bcEscByte;
+    }    
 
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java?rev=583280&r1=583279&r2=583280&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ClassBands.java Tue Oct  9 13:04:10 2007
@@ -20,13 +20,15 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
 
 import org.apache.harmony.pack200.bytecode.CPClass;
 import org.apache.harmony.pack200.bytecode.ConstantValueAttribute;
 import org.apache.harmony.pack200.bytecode.ExceptionsAttribute;
 
 /**
- *
+ * 
  */
 public class ClassBands extends BandSet {
 
@@ -41,7 +43,7 @@
     private int[] classMethodCount;
 
     private String[] classSuper;
-    
+
     private String[] classThis;
 
     private int[] codeHandlerCount;
@@ -57,11 +59,11 @@
     private String[][] fieldDescr;
 
     private long[][] fieldFlags;
-    
+
     private int methodAttrCount;
 
     private ArrayList[][] methodAttributes;
-    
+
     private String[][] methodDescr;
 
     private ExceptionsAttribute[][] methodExceptions;
@@ -71,13 +73,16 @@
     private AttributeLayoutMap attrMap;
 
     private CpBands cpBands;
-    
+
+    private int codeAttrCount;
+
     /**
      * @param header
      */
-    public ClassBands(Segment segment){
+    public ClassBands(Segment segment) {
         super(segment);
-        this.attrMap = segment.getAttrDefinitionBands().getAttributeDefinitionMap();
+        this.attrMap = segment.getAttrDefinitionBands()
+                .getAttributeDefinitionMap();
         this.cpBands = segment.getCpBands();
     }
 
@@ -96,8 +101,7 @@
      * 
      * @see org.apache.harmony.pack200.BandSet#unpack(java.io.InputStream)
      */
-    public void unpack(InputStream in) throws IOException,
-            Pack200Exception {
+    public void unpack(InputStream in) throws IOException, Pack200Exception {
         int classCount = header.getClassCount();
         classThis = parseReferences("class_this", in, Codec.DELTA5, classCount,
                 cpBands.getCpClass());
@@ -108,7 +112,7 @@
                 in, Codec.DELTA5, classCount);
         // for (int i = 0; i < classCount; i++) {
         classInterfaces = parseReferences("class_interface", in, Codec.DELTA5,
-                classCount, classInterfaceLengths, cpBands.getCpClass());
+                classInterfaceLengths, cpBands.getCpClass());
         // }
         classFieldCount = decodeBandInt("class_field_count", in, Codec.DELTA5,
                 classCount);
@@ -126,7 +130,7 @@
         int classCount = header.getClassCount();
         SegmentOptions options = header.getOptions();
         fieldDescr = parseReferences("field_descr", in, Codec.DELTA5,
-                classCount, classFieldCount, cpBands.getCpDescriptor());
+                classFieldCount, cpBands.getCpDescriptor());
         fieldFlags = parseFlags("field_flags", in, classCount, classFieldCount,
                 Codec.UNSIGNED5, options.hasFieldFlagsHi());
         for (int i = 0; i < classCount; i++) {
@@ -141,8 +145,8 @@
                     "There are attribute flags, and I don't know what to do with them");
         debug("unimplemented field_attr_indexes");
         debug("unimplemented field_attr_calls");
-        AttributeLayout layout = attrMap.getAttributeLayout(
-                        "ConstantValue", AttributeLayout.CONTEXT_FIELD);
+        AttributeLayout layout = attrMap.getAttributeLayout("ConstantValue",
+                AttributeLayout.CONTEXT_FIELD);
         Codec codec = layout.getCodec();
         fieldAttributes = new ArrayList[classCount][];
         for (int i = 0; i < classCount; i++) {
@@ -161,15 +165,45 @@
                     // be e.g. KIB or KIH
                     if (type.equals("B") || type.equals("H"))
                         type = "I";
-                    Object value = layout.getValue(result, type, cpBands.getConstantPool());
+                    Object value = layout.getValue(result, type, cpBands
+                            .getConstantPool());
                     fieldAttributes[i][j]
                             .add(new ConstantValueAttribute(value));
                     debug("Processed value " + value + " for ConstantValue");
                 }
             }
         }
-        debug("unimplemented field_Signature_RS");
-        parseMetadataBands(AttributeLayout.CONTEXT_FIELD);
+
+        layout = attrMap.getAttributeLayout(AttributeLayout.ATTRIBUTE_SIGNATURE,
+                AttributeLayout.CONTEXT_FIELD);
+        codec = layout.getCodec();
+//        fieldAttributes = new ArrayList[classCount][];
+        for (int i = 0; i < classCount; i++) {
+//            fieldAttributes[i] = new ArrayList[fieldFlags[i].length];
+            for (int j = 0; j < fieldFlags[i].length; j++) {
+//                fieldAttributes[i][j] = new ArrayList();
+                long flag = fieldFlags[i][j];
+                if (layout.matches(flag)) {
+                    // we've got a value to read
+                    long result = codec.decode(in);
+//                    String desc = fieldDescr[i][j];
+//                    int colon = desc.indexOf(':');
+//                    // String name = desc.substring(0, colon);
+//                    String type = desc.substring(colon + 1);
+//                    // TODO Got to get better at this ... in any case, it should
+//                    // be e.g. KIB or KIH
+//                    if (type.equals("B") || type.equals("H"))
+//                        type = "I";
+//                    Object value = layout.getValue(result, type, cpBands
+//                            .getConstantPool());
+//                    fieldAttributes[i][j]
+//                            .add(new ConstantValueAttribute(value));
+                    debug("Found a signature attribute: " + result);
+                }
+            }
+        }
+//        debug("unimplemented field_Signature_RS");
+        parseFieldMetadataBands();
     }
 
     private void parseMethodBands(InputStream in) throws IOException,
@@ -177,7 +211,7 @@
         int classCount = header.getClassCount();
         SegmentOptions options = header.getOptions();
         methodDescr = parseReferences("method_descr", in, Codec.MDELTA5,
-                classCount, classMethodCount, cpBands.getCpDescriptor());
+                classMethodCount, cpBands.getCpDescriptor());
         methodFlags = parseFlags("method_flags", in, classCount,
                 classMethodCount, Codec.UNSIGNED5, options.hasMethodFlagsHi());
         for (int i = 0; i < classCount; i++) {
@@ -203,9 +237,9 @@
         }
         parseAttributeMethodExceptions(in);
         parseAttributeMethodSignature(in);
-        parseMetadataBands(AttributeLayout.CONTEXT_METHOD);
+        parseMethodMetadataBands();
     }
-    
+
     /**
      * @param in
      * @throws Pack200Exception
@@ -215,8 +249,8 @@
             throws Pack200Exception, IOException {
         // TODO Should refactor this stuff into the layout somehow
         int classCount = header.getClassCount();
-        AttributeLayout layout = attrMap.getAttributeLayout(
-                "Exceptions", AttributeLayout.CONTEXT_METHOD);
+        AttributeLayout layout = attrMap.getAttributeLayout("Exceptions",
+                AttributeLayout.CONTEXT_METHOD);
         Codec codec = layout.getCodec();
         methodExceptions = new ExceptionsAttribute[classCount][];
         int[][] numExceptions = new int[classCount][];
@@ -235,20 +269,20 @@
                 long flag = methodFlags[i][j];
                 int n = numExceptions[i][j];
                 if (n > 0) {
-                   CPClass[] exceptions = new CPClass[n];
-                   if (layout.matches(flag)) {
-                       for (int k = 0; k < n; k++) {
-                           long result = codec.decode(in);
-                           exceptions[k] = new CPClass(cpBands.getCpClass()[(int) result]);
-                       }
-                   }
-                   methodExceptions[i][j] = new ExceptionsAttribute(exceptions);
-                   methodAttributes[i][j].add(methodExceptions[i][j]);
-               }
+                    CPClass[] exceptions = new CPClass[n];
+                    if (layout.matches(flag)) {
+                        for (int k = 0; k < n; k++) {
+                            long result = codec.decode(in);
+                            exceptions[k] = new CPClass(
+                                    cpBands.getCpClass()[(int) result]);
+                        }
+                    }
+                    methodExceptions[i][j] = new ExceptionsAttribute(exceptions);
+                    methodAttributes[i][j].add(methodExceptions[i][j]);
+                }
             }
         }
     }
-    
 
     /**
      * @param name
@@ -258,12 +292,11 @@
     private void parseAttributeUnknown(String name, int context, long[][] flags)
             throws Pack200Exception {
         debug("Parsing unknown attributes for " + name);
-        AttributeLayout layout = attrMap.getAttributeLayout(
-                name, context);
-       int count = SegmentUtils.countMatches(flags, layout);
-       if (count > 0)
-           throw new Error("We've got data for " + name
-                + " and we don't know what to do with it (yet)");
+        AttributeLayout layout = attrMap.getAttributeLayout(name, context);
+        int count = SegmentUtils.countMatches(flags, layout);
+        if (count > 0)
+            throw new Error("We've got data for " + name
+                    + " and we don't know what to do with it (yet)");
     }
 
     /**
@@ -294,8 +327,8 @@
         debug("unimplemented class_attr_indexes");
         debug("unimplemented class_attr_calls");
         AttributeLayout layout = attrMap.getAttributeLayout(
-                        AttributeLayout.ATTRIBUTE_SOURCE_FILE,
-                        AttributeLayout.CONTEXT_CLASS);
+                AttributeLayout.ATTRIBUTE_SOURCE_FILE,
+                AttributeLayout.CONTEXT_CLASS);
         for (int i = 0; i < classCount; i++) {
             long flag = classFlags[i];
             if (layout.matches(flag)) {
@@ -303,14 +336,15 @@
                 // TODO File this as a sourcefile attribute and don't generate
                 // everything below
                 long result = layout.getCodec().decode(in);
-                Object value = layout.getValue(result, cpBands.getConstantPool());
+                Object value = layout.getValue(result, cpBands
+                        .getConstantPool());
                 debug("Processed value " + value + " for SourceFile");
             }
         }
         debug("unimplemented class_EnclosingMethod_RC");
         debug("unimplemented class_EnclosingMethod_RDN");
         debug("unimplemented class_Signature_RS");
-        parseMetadataBands(AttributeLayout.CONTEXT_CLASS);
+        parseClassMetadataBands();
         debug("unimplemented class_InnerClasses_N");
         debug("unimplemented class_InnerClasses_RC");
         debug("unimplemented class_InnerClasses_F");
@@ -319,7 +353,6 @@
         debug("unimplemented class_file_version_minor_H");
         debug("unimplemented class_file_version_major_H");
     }
-    
 
     private void parseCodeBands(InputStream in) throws Pack200Exception,
             IOException {
@@ -370,57 +403,173 @@
                 throw new IllegalStateException("Shouldn't get here either");
             }
         }
-        debug("unimplemented code_headers");
-        debug("unimplemented code_max_stack");
-        debug("unimplemented code_max_na_locals");
-        debug("unimplemented code_hander_count");
-        debug("unimplemented code_hander_start_P");
-        debug("unimplemented code_hander_end_PO");
-        debug("unimplemented code_hander_catch_PO");
-        debug("unimplemented code_hander_class_RC");
-        parseCodeAttrBands(in);
+        int codeFlagsCount = segment.getSegmentHeader().getOptions().hasAllCodeFlags() ?
+                    codeBands : codeSpecialHeader;
+        parseCodeAttrBands(in, codeFlagsCount);
     }
-    
 
-    private void parseCodeAttrBands(InputStream in) {
-        debug("unimplemented code_flags");
+    private void parseCodeAttrBands(InputStream in, int codeFlagsCount) throws IOException, Pack200Exception {
+        long[] codeFlags = parseFlags("code_flags", in, codeFlagsCount, Codec.UNSIGNED5, segment.getSegmentHeader().getOptions().hasCodeFlagsHi());
+        for (int i = 0; i < codeFlagsCount; i++) {
+            long flag = codeFlags[i];
+            if ((flag & (1 << 16)) != 0)
+                codeAttrCount++;
+        }
+        if (codeAttrCount > 0)
+            throw new Error(
+                    "There are attribute flags, and I don't know what to do with them");
         debug("unimplemented code_attr_count");
         debug("unimplemented code_attr_indexes");
         debug("unimplemented code_attr_calls");
-        debug("unimplemented code_LineNumberTable_N");
-        debug("unimplemented code_LineNumberTable_bci_P");
-        debug("unimplemented code_LineNumberTable_line");
-        String[] types = { "LocalVariableTable", "LocalVariableTypeTable" };
+        
+        int lineNumberTableCount = SegmentUtils.countMatches(codeFlags, attrMap.getAttributeLayout(AttributeLayout.ATTRIBUTE_LINE_NUMBER_TABLE, AttributeLayout.CONTEXT_CODE));
+        int[] lineNumberTableN = decodeBandInt("code_LineNumberTable_N", in, Codec.UNSIGNED5, lineNumberTableCount);
+        int[][] lineNumberTableBciP = decodeBandInt("code_LineNumberTable_bci_P", in, Codec.BCI5, lineNumberTableN);
+        int[][] lineNumberTableLine = decodeBandInt("code_LineNumberTable_line", in, Codec.UNSIGNED5, lineNumberTableN);
+        String[] types = { AttributeLayout.ATTRIBUTE_LOCAL_VARIABLE_TABLE, AttributeLayout.ATTRIBUTE_LOCAL_VARIABLE_TYPE_TABLE };
         for (int i = 0; i < types.length; i++) {
             String type = types[i];
-            debug("unimplemented code_" + type + "_N");
-            debug("unimplemented code_" + type + "_bci_P");
-            debug("unimplemented code_" + type + "_span_O");
-            debug("unimplemented code_" + type + "_name_RU");
-            debug("unimplemented code_" + type + "_type_RS");
-            debug("unimplemented code_" + type + "_slot");
+            int lengthNBand = SegmentUtils.countMatches(codeFlags, attrMap.getAttributeLayout(type, AttributeLayout.CONTEXT_CODE));
+            int[] nBand = decodeBandInt("code_" + type + "_N", in, Codec.UNSIGNED5, lengthNBand);
+            int[][] bciP = decodeBandInt("code_" + type + "_bci_P", in, Codec.BCI5, nBand);
+            int[][] spanO = decodeBandInt("code_" + type + "_span_O", in, Codec.BRANCH5, nBand);
+            String[][] nameRU = parseReferences("code_" + type + "_name_RU", in, Codec.UNSIGNED5, nBand, cpBands.getCpUTF8());
+            String[][] typeRS = parseReferences("code_" + type + "_type_RS", in, Codec.UNSIGNED5, nBand, cpBands.getCpSignature());
+            int[][] slot = decodeBandInt("code_" + type + "_slot", in, Codec.UNSIGNED5, nBand);
+        }
+    }
+
+
+
+    private void parseFieldMetadataBands() throws Pack200Exception {
+        String[] RxA = new String[] { "RVA", "RIA" };
+        
+        AttributeLayout rvaLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS,
+                AttributeLayout.CONTEXT_FIELD);
+        AttributeLayout riaLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS,
+                AttributeLayout.CONTEXT_FIELD);
+
+        int rvaCount = SegmentUtils.countMatches(fieldFlags, rvaLayout);
+        int riaCount = SegmentUtils.countMatches(fieldFlags, riaLayout);
+        if (rvaCount > 0 || riaCount > 0) {
+            throw new Error("Field metadata not handled");
+        }
+
+        // AttributeLayout layout =
+        // map.get(RuntimeVisibleAnnotations,class/field/method as int)
+        // foreachheader ...
+        // if layout.matches(header[n] or whatever)
+        String contextName = "field";
+        for (int i = 0; i < RxA.length; i++) {
+            String rxa = RxA[i];
+            if (rxa.indexOf("P") >= 0) {
+                debug("unimplemented " + contextName + "_" + rxa + "_param_NB");
+            }
+            if (!rxa.equals("AD")) {
+                debug("unimplemented " + contextName + "_" + rxa + "_anno_N");
+                debug("unimplemented " + contextName + "_" + rxa + "_type_RS");
+                debug("unimplemented " + contextName + "_" + rxa + "_pair_N");
+                debug("unimplemented " + contextName + "_" + rxa + "_name_RU");
+            }
+            debug("unimplemented " + contextName + "_" + rxa + "_T");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseI_KI");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseD_KD");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseF_KF");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseJ_KJ");
+            debug("unimplemented " + contextName + "_" + rxa + "_casec_RS");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseet_RS");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseec_RU");
+            debug("unimplemented " + contextName + "_" + rxa + "_cases_RU");
+            debug("unimplemented " + contextName + "_" + rxa + "_casearray_N");
+            debug("unimplemented " + contextName + "_" + rxa + "_nesttype_RS");
+            debug("unimplemented " + contextName + "_" + rxa + "_nestpair_N");
+            debug("unimplemented " + contextName + "_" + rxa + "_nestname_RU");
+        }
+    }
+
+    private void parseMethodMetadataBands() throws Pack200Exception {
+        String[] RxA = new String[] { "RVA", "RIA", "RVPA", "RIPA", "AD" };
+        int[] rxaCounts = new int[] { 0, 0, 0, 0, 0 };
+        AttributeLayout rvaLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS,
+                AttributeLayout.CONTEXT_METHOD);
+        AttributeLayout riaLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS,
+                AttributeLayout.CONTEXT_METHOD);
+        AttributeLayout rvpaLayout = attrMap
+                .getAttributeLayout(
+                        AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS,
+                        AttributeLayout.CONTEXT_METHOD);
+        AttributeLayout ripaLayout = attrMap
+                .getAttributeLayout(
+                        AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS,
+                        AttributeLayout.CONTEXT_METHOD);
+        AttributeLayout adLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_ANNOTATION_DEFAULT,
+                AttributeLayout.CONTEXT_METHOD);
+        AttributeLayout[] rxaLayouts = new AttributeLayout[] { rvaLayout,
+                riaLayout, rvpaLayout, ripaLayout, adLayout };
+
+        for (int i = 0; i < rxaLayouts.length; i++) {
+            rxaCounts[i] = SegmentUtils.countMatches(methodFlags, rxaLayouts[i]);
+            if (rxaCounts[i] > 0) {
+                throw new Error("Found method metadata");
+            }
+        }
+
+        // AttributeLayout layout =
+        // map.get(RuntimeVisibleAnnotations,class/field/method as int)
+        // foreachheader ...
+        // if layout.matches(header[n] or whatever)
+        String contextName = "method";
+        for (int i = 0; i < RxA.length; i++) {
+            String rxa = RxA[i];
+            if (rxa.indexOf("P") >= 0) {
+                debug("unimplemented " + contextName + "_" + rxa + "_param_NB");
+            }
+            if (!rxa.equals("AD")) {
+                debug("unimplemented " + contextName + "_" + rxa + "_anno_N");
+                debug("unimplemented " + contextName + "_" + rxa + "_type_RS");
+                debug("unimplemented " + contextName + "_" + rxa + "_pair_N");
+                debug("unimplemented " + contextName + "_" + rxa + "_name_RU");
+            }
+            debug("unimplemented " + contextName + "_" + rxa + "_T");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseI_KI");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseD_KD");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseF_KF");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseJ_KJ");
+            debug("unimplemented " + contextName + "_" + rxa + "_casec_RS");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseet_RS");
+            debug("unimplemented " + contextName + "_" + rxa + "_caseec_RU");
+            debug("unimplemented " + contextName + "_" + rxa + "_cases_RU");
+            debug("unimplemented " + contextName + "_" + rxa + "_casearray_N");
+            debug("unimplemented " + contextName + "_" + rxa + "_nesttype_RS");
+            debug("unimplemented " + contextName + "_" + rxa + "_nestpair_N");
+            debug("unimplemented " + contextName + "_" + rxa + "_nestname_RU");
         }
     }
 
-    private void parseMetadataBands(int context) throws Pack200Exception {
-        String[] RxA;
-        if (AttributeLayout.CONTEXT_METHOD == context) {
-            RxA = new String[] { "RVA", "RIA", "RVPA", "RIPA", "AD" };
-        } else if (AttributeLayout.CONTEXT_FIELD == context
-                || AttributeLayout.CONTEXT_CLASS == context) {
-            RxA = new String[] { "RVA", "RIA" };
-        } else {
-            throw new Pack200Exception("Unknown type of metadata unit "
-                 + context);
+    private void parseClassMetadataBands() throws Pack200Exception {
+        String[] RxA = new String[] { "RVA", "RIA" };
+
+        AttributeLayout rvaLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS,
+                AttributeLayout.CONTEXT_CLASS);
+        AttributeLayout riaLayout = attrMap.getAttributeLayout(
+                AttributeLayout.ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS,
+                AttributeLayout.CONTEXT_CLASS);
+        int rvaCount = SegmentUtils.countMatches(classFlags, rvaLayout);
+        int riaCount = SegmentUtils.countMatches(classFlags, riaLayout);
+        if (rvaCount > 0 || riaCount > 0) {
+            throw new Error("Class metadata not handled");
         }
         // AttributeLayout layout =
         // map.get(RuntimeVisibleAnnotations,class/field/method as int)
         // foreachheader ...
         // if layout.matches(header[n] or whatever)
-        String contextName = (AttributeLayout.CONTEXT_METHOD == context ? "method"
-                : (AttributeLayout.CONTEXT_FIELD == context ? "field"
-                        : (AttributeLayout.CONTEXT_CLASS == context ? "class"
-                                : "unkowon")));
+        String contextName = "class";
         for (int i = 0; i < RxA.length; i++) {
             String rxa = RxA[i];
             if (rxa.indexOf("P") >= 0) {

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=583280&r1=583279&r2=583280&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 Oct  9 13:04:10 2007
@@ -357,19 +357,12 @@
         return cpBands;
     }
 
-
     protected FileBands getFileBands() {
         return fileBands;
     }
 
-
-    protected SegmentHeader getHeader() {
-        return header;
-    }
-
-
     protected IcBands getIcBands() {
         return icBands;
     }
 
-}
+}
\ No newline at end of file

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=583280&r1=583279&r2=583280&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 Oct  9 13:04:10 2007
@@ -240,11 +240,71 @@
 		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[231] = new ByteCode(231, "invokespecial_super_init",
-				new int[] { 183, 0, 0 });
+                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");
@@ -261,7 +321,7 @@
 		ByteCode byteCode = (ByteCode) byteCodes
 				.get(new Integer(0xff & opcode));
 		if (byteCode == null)
-			throw new Error("Unknown bytecode");
+			throw new Error("Unknown bytecode: " + opcode);
 		return byteCode;
 	}
 

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=583280&r1=583279&r2=583280&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 Oct  9 13:04:10 2007
@@ -37,7 +37,7 @@
 		this.maxStack = maxStack;
 		this.codeLength = 0;
 		for (int i = 0; i < codePacked.length; i++) {
-			ByteCode byteCode = ByteCode.getByteCode(codePacked[i]);
+			ByteCode byteCode = ByteCode.getByteCode(codePacked[i] & 0xff);
 			byteCodes.add(byteCode);
 			this.codeLength += byteCode.getLength();
 		}

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java?rev=583280&r1=583279&r2=583280&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BandSetTest.java Tue Oct  9 13:04:10 2007
@@ -34,13 +34,9 @@
     private BandSet bandSet = new BandSet(new Segment()) {
 
         public void pack(OutputStream outputStream) {
-            // TODO Auto-generated method stub
-            
         }
 
         public void unpack(InputStream inputStream) throws IOException, Pack200Exception {
-            // TODO Auto-generated method stub
-            
         }
     };
     

Added: harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java?rev=583280&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java Tue Oct  9 13:04:10 2007
@@ -0,0 +1,551 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.harmony.pack200.tests;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+
+import org.apache.harmony.pack200.AttrDefinitionBands;
+import org.apache.harmony.pack200.AttributeLayoutMap;
+import org.apache.harmony.pack200.BandSet;
+import org.apache.harmony.pack200.BcBands;
+import org.apache.harmony.pack200.ClassBands;
+import org.apache.harmony.pack200.CpBands;
+import org.apache.harmony.pack200.Pack200Exception;
+import org.apache.harmony.pack200.Segment;
+import org.apache.harmony.pack200.SegmentHeader;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for Pack200 bytecode bands
+ */
+
+/*
+ * TODO: The number 8 is used in most of the tests in this class as a low
+ * (non-zero) number that is not likely to indicate a multiple byte number, but
+ * should be replaced with properly encoded byte arrays when encoding is
+ * implemented.
+ */
+public class BcBandsTest extends TestCase {
+
+    
+    private int numClasses = 1;
+    private int[] numMethods = {1};
+
+    public class MockSegmentHeader extends SegmentHeader {
+        public int getClassCount() {
+            return numClasses;
+        }
+    }
+
+    public class MockClassBands extends ClassBands {
+        public MockClassBands(Segment segment) {
+            super(segment);
+        }
+        
+        public long[][] getMethodFlags() {
+            long[][] flags = new long[numClasses][] ;
+            for (int i = 0; i < flags.length; i++) {
+                flags[i] = new long[numMethods[i]];
+            }
+            return flags;
+        }
+        
+        public int[] getCodeMaxStack() {
+            int totalMethods = 0;
+            for (int i = 0; i < numClasses; i++) {
+                totalMethods += numMethods[i];
+            }
+            return new int[totalMethods];
+        }
+        
+        public int[] getCodeMaxNALocals() {
+            int totalMethods = 0;
+            for (int i = 0; i < numClasses; i++) {
+                totalMethods += numMethods[i];
+            }
+            return new int[totalMethods];
+        }
+        
+        public String[][] getMethodDescr() {
+            String[][] descr =  new String[numClasses][];
+            for (int i = 0; i < descr.length; i++) {
+                descr[i] = new String[numMethods[i]];
+                for (int j = 0; j < descr[i].length; j++) {
+                    descr[i][j] = "hello()";
+                }
+            }
+            return descr;
+        }
+        
+        public ArrayList[][] getMethodAttributes() {
+            ArrayList[][] attributes =  new ArrayList[numClasses][];
+            for (int i = 0; i < attributes.length; i++) {
+                attributes[i] = new ArrayList[numMethods[i]];
+                for (int j = 0; j < attributes[i].length; j++) {
+                    attributes[i][j] = new ArrayList();
+                }
+            }
+            return attributes;
+        }
+    }
+
+    public class MockAttributeDefinitionBands extends AttrDefinitionBands {
+
+        public MockAttributeDefinitionBands(Segment segment) {
+            super(segment);
+        }
+        
+        public AttributeLayoutMap getAttributeDefinitionMap() {
+            try {
+                return new AttributeLayoutMap();
+            } catch (Pack200Exception e) {
+                fail(e.getLocalizedMessage());
+            }
+            return null;
+        }
+        
+       
+
+    }
+
+    public class MockSegment extends Segment {
+        protected AttrDefinitionBands getAttrDefinitionBands() {
+            return new MockAttributeDefinitionBands(this);
+        }
+        
+        protected CpBands getCpBands() {
+            return new CpBands(this);
+        }
+        
+        protected ClassBands getClassBands() {
+            return new MockClassBands(this);
+        }
+        
+        public SegmentHeader getSegmentHeader() {
+            return new MockSegmentHeader();
+        }
+    }
+
+    BcBands bcBands = new BcBands(new MockSegment());
+    
+    /**
+     * Test with single byte instructions that mean all other bands apart from
+     * bc_codes will be empty.
+     * 
+     * @throws IOException
+     * @throws Pack200Exception
+     */
+    public void testSimple() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+                13, 14, 15, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
+                39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 59,
+                60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+                76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+                92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
+                106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
+                118, 119, 120, 121, 122, 123, 124, 125, 126, 127, (byte) 128,
+                (byte) 129, (byte) 130, (byte) 131, (byte) 133, (byte) 134,
+                (byte) 135, (byte) 136, (byte) 137, (byte) 138, (byte) 139,
+                (byte) 140, (byte) 141, (byte) 142, (byte) 143, (byte) 144,
+                (byte) 145, (byte) 146, (byte) 147, (byte) 148, (byte) 149,
+                (byte) 150, (byte) 151, (byte) 172, (byte) 173, (byte) 174,
+                (byte) 175, (byte) 176, (byte) 177, (byte) 190, (byte) 191, 
+                (byte) 194, (byte) 195, (byte) 255 };
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(bytes.length - 1, bcBands.getMethodByteCodePacked()[0][0].length);
+    }
+    
+    /**
+     * Test with multiple classes but single byte instructions
+     * 
+     * @throws IOException
+     * @throws Pack200Exception
+     */
+    public void testMultipleClassesSimple() throws IOException, Pack200Exception {
+        numClasses = 2;
+        numMethods = new int[] {1,1};
+        byte[] bytes = new byte[] {50, 50, (byte)255, 50, 50, (byte)255};
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        
+        numClasses = 1;
+        numMethods = new int[] {1};
+    }
+    
+    /**
+     * Test with multiple classes and multiple methods but single byte instructions
+     * @throws IOException
+     * @throws Pack200Exception
+     */
+    public void testMultipleMethodsSimple() throws IOException, Pack200Exception {
+        numClasses = 2;
+        numMethods = new int[] {3,1};
+        byte[] bytes = new byte[] {50, 50, (byte)255,50, 50, (byte)255, 50, 50, (byte)255, 50, 50, (byte)255};
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        
+        numClasses = 1;
+        numMethods = new int[] {1};        
+    }
+    
+    
+    /**
+     * Test with codes that require entries in the bc_case_count and bc_case_value bands
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcCaseBands() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)170,(byte)171, (byte)255,
+                2, 5, // bc_case_count
+                8, 8, 8, 8, 8, 8, 8, // bc_case_value
+                8, 8}; // bc_label                
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, 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);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_byte band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcByteBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {16, (byte)132, (byte)188, (byte)197, (byte)255, 
+                8, 8, 8, 8, // bc_byte band
+                8, // bc_locals band (required by iinc (132))
+                8}; // bc_class band (required by multianewarray (197))
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(4, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_byte = bcBands.getBcByte(); 
+        assertEquals(4, bc_byte.length);
+        for (int i = 0; i < bc_byte.length; i++) {
+            assertEquals(8, bc_byte[i]);
+        }
+        assertEquals(1, bcBands.getBcLocal().length);
+        assertEquals(1, bcBands.getBcClassRef().length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_short band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcShortBand() throws IOException, Pack200Exception {
+        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))
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(2, bcBands.getBcShort().length);
+        assertEquals(2, bcBands.getBcLocal().length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_local band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcLocalBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {21, 22, 23, 24, 25, 
+                54, 55, 56, 57, 58, (byte)169, (byte) 255,
+                8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; // bc_local band
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(11, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(11, bcBands.getBcLocal().length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_label band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    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))
+                8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}; // bc_label band
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(16, bcBands.getMethodByteCodePacked()[0][0].length);
+        assertEquals(16, bcBands.getBcLabel().length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_intref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcIntRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)234, (byte)237, (byte)255, 
+                8, 8}; // bc_intref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_intref = bcBands.getBcIntRef(); 
+        assertEquals(2, bc_intref.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_floatref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcFloatRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)235, (byte)238, (byte)255, 
+                8, 8}; // bc_floatref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_floatref = bcBands.getBcFloatRef(); 
+        assertEquals(2, bc_floatref.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_longref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcLongRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {20, (byte)255, 
+                8}; // bc_longref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(1, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_longref = bcBands.getBcLongRef(); 
+        assertEquals(1, bc_longref.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_doubleref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcDoubleRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)239, (byte)255, 
+                8}; // bc_doubleref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(1, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_doubleref = bcBands.getBcDoubleRef(); 
+        assertEquals(1, bc_doubleref.length);        
+    }
+    
+    
+    /**
+     * Test with codes that should require entries in the bc_stringref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcStringRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {18, 19, (byte)255, 
+                8, 8}; // bc_stringref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_stringref = bcBands.getBcStringRef(); 
+        assertEquals(2, bc_stringref.length);
+    }
+    
+    
+    /**
+     * Test with codes that should require entries in the bc_classref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcClassRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)233, (byte)236, (byte)255, 
+                8, 8}; // bc_classref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(2, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_classref = bcBands.getBcClassRef(); 
+        assertEquals(2, bc_classref.length);        
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_fieldref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcFieldRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)178, (byte)179, (byte)180, (byte)181, (byte)255, 
+                8, 8, 8, 8}; // bc_fieldref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(4, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_fieldref = bcBands.getBcFieldRef(); 
+        assertEquals(4, bc_fieldref.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_methodref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcMethodRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)182, (byte)183, (byte)184, (byte)255, 
+                8, 8, 8}; // bc_methodref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_methodref = bcBands.getBcMethodRef(); 
+        assertEquals(3, bc_methodref.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_imethodref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcIMethodRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)185, (byte)255, 
+                8}; // bc_imethodref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(1, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_imethodref = bcBands.getBcIMethodRef(); 
+        assertEquals(1, bc_imethodref.length);        
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_thisfieldref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcThisFieldBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] { (byte) 202, (byte) 203, (byte) 204,
+                (byte) 205, (byte) 209, (byte) 210, (byte) 211, (byte) 212,
+                (byte) 255, 
+                8, 8, 8, 8, 8, 8, 8, 8 }; // bc_thisfieldref band
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(8, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_thisfield = bcBands.getBcThisField(); 
+        assertEquals(8, bc_thisfield.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_superfield band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcSuperFieldBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] { (byte) 216, (byte) 217, (byte) 218,
+                (byte) 219, (byte) 223, (byte) 224, (byte) 225, (byte) 226,
+                (byte) 255, 
+                8, 8, 8, 8, 8, 8, 8, 8}; // bc_superfield band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(8, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_superfield = bcBands.getBcSuperField(); 
+        assertEquals(8, bc_superfield.length);        
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_thismethod band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcThisMethodBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)206, (byte)207, (byte)208, (byte)213, (byte)214, (byte)215, (byte)255, 
+                8, 8, 8, 8, 8, 8}; // bc_thismethod band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(6, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_thismethod = bcBands.getBcThisMethod(); 
+        assertEquals(6, bc_thismethod.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_supermethod band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcSuperMethodBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)220, (byte)221, (byte)222, (byte)227, (byte)228, (byte)229, (byte)255, 
+                8, 8, 8, 8, 8, 8}; // bc_supermethod band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(6, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_supermethod = bcBands.getBcSuperMethod(); 
+        assertEquals(6, bc_supermethod.length);
+    }
+    
+    /**
+     * Test with codes that should require entries in the bc_initrefref band
+     * 
+     * @throws Pack200Exception 
+     * @throws IOException 
+     */
+    public void testBcInitRefRefBand() throws IOException, Pack200Exception {
+        byte[] bytes = new byte[] {(byte)230, (byte)231, (byte)232, (byte)255, 
+                8, 8, 8}; // bc_initrefref band               
+        InputStream in = new ByteArrayInputStream(bytes);
+        bcBands.unpack(in);
+        assertEquals(3, bcBands.getMethodByteCodePacked()[0][0].length);
+        int[] bc_initrefref = bcBands.getBcInitRef(); 
+        assertEquals(3, bc_initrefref.length);
+    }
+    
+    public void testBcEscRefBands() throws IOException, Pack200Exception {
+        // TODO
+    }
+    
+    public void testBcEscBands() throws IOException, Pack200Exception {
+        // TODO
+    }
+    
+}

Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BcBandsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java?rev=583280&r1=583279&r2=583280&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/SegmentTest.java Tue Oct  9 13:04:10 2007
@@ -16,46 +16,36 @@
  */
 package org.apache.harmony.pack200.tests;
 
-// NOTE: Do not use generics in this code; it needs to run on JVMs < 1.5
-// NOTE: Do not extract strings as messages; this code is still a
-// work-in-progress
-// NOTE: Also, don't get rid of 'else' statements for the hell of it ...
 import org.apache.harmony.pack200.Segment;
 
 import junit.framework.TestCase;
 
 /**
- * @author Alex Blewitt
- * @version $Revision: $
+ * Tests for org.apache.harmony.pack200.Segment, which is the main class for pack200.
  */
 public class SegmentTest extends TestCase {
-// Commented on request in HARMONY-2246
-// Will be uncommented later     
-//	public void testHelloWorld() throws Exception {
-//		assertNotNull(Segment.parse(Segment.class
-//				.getResourceAsStream("/org/apache/harmony/pack200/tests/HelloWorld.pack")));
-//	}
-	/**
-	 * @throws Exception
-	 */
+
+	public void testHelloWorld() throws Exception {
+		assertNotNull(Segment.parse(Segment.class
+				.getResourceAsStream("/org/apache/harmony/pack200/tests/HelloWorld.pack")));
+	}
+
 	public void testJustResources() throws Exception {
 		assertNotNull(Segment
 				.parse(Segment.class
 						.getResourceAsStream("/org/apache/harmony/pack200/tests/JustResources.pack")));
 	}
-	/**
-	 * @throws Exception
-	 */
+
 	public void testJustResourcesGZip() throws Exception {
 		assertNotNull(Segment
 				.parse(Segment.class
 						.getResourceAsStream("/org/apache/harmony/pack200/tests/JustResources.pack.gz")));
 	}
-    
+
     public void testInterfaceOnly() throws Exception {
         assertNotNull(Segment
                 .parse(Segment.class
                         .getResourceAsStream("/org/apache/harmony/pack200/tests/InterfaceOnly.pack")));
     }
 
-}
+}
\ No newline at end of file