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

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

Author: sjanuary
Date: Fri Jun  6 03:25:30 2008
New Revision: 663883

URL: http://svn.apache.org/viewvc?rev=663883&view=rev
Log:
Pack200 - code to pack constant pool bands

Added:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java   (contents, props changed)
      - copied, changed from r662730, harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/MethodOrField.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPSignature.java   (with props)
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPUTF8.java   (contents, props changed)
      - copied, changed from r662730, harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java   (with props)
Removed:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/MethodOrField.java
Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.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/CPNameAndType.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/Codec.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/SegmentHeader.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java?rev=663883&r1=663882&r2=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/AttributeDefinitionBands.java Fri Jun  6 03:25:30 2008
@@ -28,7 +28,7 @@
 public class AttributeDefinitionBands extends BandSet {
 
     private final SegmentHeader segmentHeader;
-    
+
     private final Map namesToAttributes = new HashMap();
 
     public AttributeDefinitionBands(SegmentHeader segmentHeader) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java?rev=663883&r1=663882&r2=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java Fri Jun  6 03:25:30 2008
@@ -283,6 +283,11 @@
                     z += (z - z % 3) / 3;
                 }
             }
+        } else {
+            if (z < 0) {
+                // need to use integer overflow here to represent negatives.
+                z += 4294967296L; // this value is eq
+            }
         }
         List byteList = new ArrayList();
         for (int n = 0; n < b; n++) {

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=663883&r1=663882&r2=663883&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 Fri Jun  6 03:25:30 2008
@@ -32,4 +32,9 @@
         return codec.encode(value);
     }
 
+    public byte[] encodeBandInt(int[] ints, Codec defaultCodec) throws Pack200Exception {
+        // TODO non-default codecs
+        return defaultCodec.encode(ints);
+    }
+
 }

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=663883&r1=663882&r2=663883&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 Fri Jun  6 03:25:30 2008
@@ -24,7 +24,7 @@
 public class BcBands extends BandSet {
 
     public void finaliseBands() {
-        
+
     }
 
     public void pack(OutputStream out) {

Added: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java?rev=663883&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java Fri Jun  6 03:25:30 2008
@@ -0,0 +1,42 @@
+/*
+ *  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;
+
+
+public class CPClass extends ConstantPoolEntry implements Comparable {
+
+    private final String className;
+    private final CPUTF8 utf8;
+
+    public CPClass(CPUTF8 utf8) {
+        this.utf8 = utf8;
+        this.className = utf8.getUnderlyingString();
+    }
+
+    public int compareTo(Object arg0) {
+        return className.compareTo(((CPClass)arg0).className);
+    }
+
+    public String toString() {
+        return className;
+    }
+
+    public int getIndexInCpUtf8() {
+        return utf8.getIndex();
+    }
+
+}

Copied: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java (from r662730, harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/MethodOrField.java)
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java?p2=harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java&p1=harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/MethodOrField.java&r1=662730&r2=663883&rev=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/MethodOrField.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java Fri Jun  6 03:25:30 2008
@@ -16,22 +16,22 @@
  */
 package org.apache.harmony.pack200;
 
-public class MethodOrField implements Comparable {
+public class CPMethodOrField implements Comparable {
 
-    private final String className;
+    private final CPClass className;
     private final CPNameAndType nameAndType;
 
-    public MethodOrField(String className, CPNameAndType nameAndType) {
+    public CPMethodOrField(CPClass className, CPNameAndType nameAndType) {
         this.className = className;
         this.nameAndType = nameAndType;
     }
 
     public boolean equals(Object obj) {
-        if (obj == null || !(obj instanceof MethodOrField)) {
+        if (obj == null || !(obj instanceof CPMethodOrField)) {
             return false;
         }
-        return ((MethodOrField) obj).className.equals(className)
-                && ((MethodOrField) obj).nameAndType.equals(nameAndType);
+        return ((CPMethodOrField) obj).className.equals(className)
+                && ((CPMethodOrField) obj).nameAndType.equals(nameAndType);
     }
 
     public int hashCode() {
@@ -43,8 +43,8 @@
     }
 
     public int compareTo(Object obj) {
-        if (obj instanceof MethodOrField) {
-            MethodOrField mof = (MethodOrField) obj;
+        if (obj instanceof CPMethodOrField) {
+            CPMethodOrField mof = (CPMethodOrField) obj;
             int compareName = className.compareTo(mof.className);
             if (compareName == 0) {
                 return nameAndType.compareTo(mof.nameAndType);
@@ -54,4 +54,12 @@
         }
         return 0;
     }
+    
+    public int getClassIndex() {
+        return className.getIndex();
+    }
+    
+    public int getDescIndex() {
+        return nameAndType.getIndex();
+    }
 }
\ No newline at end of file

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

Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPMethodOrField.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPNameAndType.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPNameAndType.java?rev=663883&r1=663882&r2=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPNameAndType.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPNameAndType.java Fri Jun  6 03:25:30 2008
@@ -16,12 +16,12 @@
  */
 package org.apache.harmony.pack200;
 
-public class CPNameAndType implements Comparable {
+public class CPNameAndType extends ConstantPoolEntry implements Comparable {
 
-    private final String name;
-    private final String signature;
+    private final CPUTF8 name;
+    private final CPSignature signature;
 
-    public CPNameAndType(String name, String signature) {
+    public CPNameAndType(CPUTF8 name, CPSignature signature) {
         this.name = name;
         this.signature = signature;
     }
@@ -55,4 +55,12 @@
         return 0;
     }
 
+    public int getNameIndex() {
+        return name.getIndex();
+    }
+
+    public int getTypeIndex() {
+        return signature.getIndex();
+    }
+
 }
\ No newline at end of file

Added: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPSignature.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPSignature.java?rev=663883&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPSignature.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPSignature.java Fri Jun  6 03:25:30 2008
@@ -0,0 +1,56 @@
+/*
+ *  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;
+
+import java.util.List;
+
+public class CPSignature extends ConstantPoolEntry implements Comparable {
+    
+    private final CPUTF8 signatureForm;
+    private final List classes;
+    private final String signature;
+
+    public CPSignature(String signature, CPUTF8 signatureForm, List classes) {
+        this.signature = signature;
+        this.signatureForm = signatureForm;
+        this.classes = classes;
+    }
+
+    public int compareTo(Object arg0) {
+        return signature.compareTo(((CPSignature)arg0).signature);
+    }
+
+    public int getIndexInCpUtf8() {
+        return signatureForm.getIndex();
+    }
+    
+    public List getClasses() {
+        return classes;
+    }
+    
+    public String toString() {
+        return signature;
+    }
+
+    public String getUnderlyingString() {
+        return signature;
+    }
+
+    public CPUTF8 getSignatureForm() {
+        return signatureForm;
+    }
+}

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

Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPSignature.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java?rev=663883&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java Fri Jun  6 03:25:30 2008
@@ -0,0 +1,42 @@
+/*
+ *  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;
+
+
+public class CPString extends ConstantPoolEntry implements Comparable {
+
+    private final String string;
+    private final CPUTF8 utf8;
+
+    public CPString(CPUTF8 utf8) {
+        this.utf8 = utf8;
+        this.string = utf8.getUnderlyingString();
+    }
+
+    public int compareTo(Object arg0) {
+        return string.compareTo(((CPString)arg0).string);
+    }
+
+    public String toString() {
+        return string;
+    }
+
+    public int getIndexInCpUtf8() {
+        return utf8.getIndex();
+    }
+
+}

Copied: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPUTF8.java (from r662730, harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java)
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPUTF8.java?p2=harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPUTF8.java&p1=harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java&r1=662730&r2=663883&rev=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPString.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPUTF8.java Fri Jun  6 03:25:30 2008
@@ -17,13 +17,24 @@
 package org.apache.harmony.pack200;
 
 
-public class CPString {
-
+public class CPUTF8 extends ConstantPoolEntry implements Comparable {
 
     private final String string;
 
-    public CPString(String string) {
+    public CPUTF8(String string) {
         this.string = string;
     }
 
+    public int compareTo(Object arg0) {
+        return string.compareTo(((CPUTF8)arg0).string);
+    }
+
+    public String toString() {
+        return string;
+    }
+
+    public String getUnderlyingString() {
+        return string;
+    }
+
 }

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

Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPUTF8.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=663883&r1=663882&r2=663883&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 Fri Jun  6 03:25:30 2008
@@ -51,7 +51,7 @@
     private final CPNameAndType[][] method_descr;
 
     public void finaliseBands() {
-        
+
     }
 
     public void pack(OutputStream out) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java?rev=663883&r1=663882&r2=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java Fri Jun  6 03:25:30 2008
@@ -104,7 +104,7 @@
 
     /**
      * Encode a single value into a sequence of bytes.
-     * 
+     *
      * @param value
      *            the value to encode
      * @param last
@@ -118,7 +118,7 @@
     /**
      * Encode a single value into a sequence of bytes. Note that this method can
      * only be used for non-delta encodings.
-     * 
+     *
      * @param value
      *            the value to encode
      * @return the encoded bytes
@@ -277,7 +277,7 @@
 
     /**
      * Encode a sequence of integers into a byte array
-     * 
+     *
      * @param ints
      *            the values to encode
      * @return byte[] encoded bytes
@@ -288,7 +288,7 @@
         int total = 0;
         byte[][] bytes = new byte[ints.length][];
         for (int i = 0; i < ints.length; i++) {
-            bytes[i] = encode(ints[i]);
+            bytes[i] = encode(ints[i], i > 0 ? ints[i-1] : 0);
             total += bytes[i].length;
         }
         byte[] encoded = new byte[total];

Added: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java?rev=663883&view=auto
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java (added)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java Fri Jun  6 03:25:30 2008
@@ -0,0 +1,32 @@
+/*
+ *  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;
+
+
+public abstract class ConstantPoolEntry {
+
+    private int index = -1;
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+}

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

Propchange: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/ConstantPoolEntry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

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=663883&r1=663882&r2=663883&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 Fri Jun  6 03:25:30 2008
@@ -16,8 +16,13 @@
  */
 package org.apache.harmony.pack200;
 
+import java.io.IOException;
 import java.io.OutputStream;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
@@ -34,11 +39,18 @@
 import org.apache.bcel.classfile.ConstantPool;
 import org.apache.bcel.classfile.ConstantString;
 import org.apache.bcel.classfile.ConstantUtf8;
+import org.apache.bcel.classfile.JavaClass;
 
+/**
+ * Pack200 Constant Pool Bands
+ */
 public class CpBands extends BandSet {
 
     private final SegmentHeader segmentHeader;
 
+    // Don't need to include default attribute names in the constant pool bands
+    private final Set defaultAttributeNames = new HashSet();
+
     private final Set cp_Utf8 = new TreeSet();
     private final Set cp_Int = new TreeSet();
     private final Set cp_Float = new TreeSet();
@@ -52,30 +64,250 @@
     private final Set cp_Method = new TreeSet();
     private final Set cp_Imethod = new TreeSet();
 
-    private ConstantPool currentConstantPool;
-    private final Map stringsToCpClass = new HashMap();
+    private final Map stringsToCpUtf8 = new HashMap();
     private final Map stringsToCpNameAndType = new HashMap();
-    private final Map stringsToCpString = new HashMap();
+    // private final Map stringsToCpString = new HashMap();
+    private final Map stringsToCpClass = new HashMap();
     private final Map stringsToCpSignature = new HashMap();
-    
-    
+
+    private ConstantPool currentConstantPool;
+    private JavaClass currentClass;
+
     public CpBands(SegmentHeader segmentHeader) {
         this.segmentHeader = segmentHeader;
+        defaultAttributeNames.add("AnnotationDefault");
+        defaultAttributeNames.add("RuntimeVisibleAnnotations");
+        defaultAttributeNames.add("RuntimeInvisibleAnnotations");
+        defaultAttributeNames.add("RuntimeVisibleParameterAnnotations");
+        defaultAttributeNames.add("RuntimeInvisibleParameterAnnotations");
+        defaultAttributeNames.add("Code");
+        defaultAttributeNames.add("LineNumberTable");
+        defaultAttributeNames.add("LocalVariableTable");
+        defaultAttributeNames.add("LocalVariableTypeTable");
+        defaultAttributeNames.add("ConstantValue");
+        defaultAttributeNames.add("Deprecated");
+        defaultAttributeNames.add("EnclosingMethod");
+        defaultAttributeNames.add("Exceptions");
+        defaultAttributeNames.add("InnerClasses");
+        defaultAttributeNames.add("Signature");
+        defaultAttributeNames.add("SourceFile");
+    }
+
+    public void pack(OutputStream out) throws IOException, Pack200Exception {
+        writeCpUtf8(out);
+        writeCpInt(out);
+        writeCpFloat(out);
+        writeCpLong(out);
+        writeCpDouble(out);
+        writeCpString(out);
+        writeCpClass(out);
+        writeCpSignature(out);
+        writeCpDescr(out);
+        writeCpMethodOrField(cp_Field, out);
+        writeCpMethodOrField(cp_Method, out);
+        writeCpMethodOrField(cp_Imethod, out);
+    }
+
+    private void writeCpUtf8(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpUtf8Prefix = new int[cp_Utf8.size() - 2];
+        int[] cpUtf8Suffix = new int[cp_Utf8.size() - 1];
+        List chars = new ArrayList();
+        List bigSuffix = new ArrayList();
+        List bigChars = new ArrayList();
+        Object[] cpUtf8Array = cp_Utf8.toArray();
+        String first = ((CPUTF8) cpUtf8Array[1]).getUnderlyingString();
+        cpUtf8Suffix[0] = first.length();
+        addCharacters(chars, first.toCharArray());
+        for (int i = 2; i < cpUtf8Array.length; i++) {
+            char[] previous = ((CPUTF8) cpUtf8Array[i - 1])
+                    .getUnderlyingString().toCharArray();
+            String currentStr = ((CPUTF8) cpUtf8Array[i]).getUnderlyingString();
+            char[] current = currentStr.toCharArray();
+            int prefix = 0;
+            for (int j = 0; j < previous.length; j++) {
+                if (previous[j] == current[j]) {
+                    prefix++;
+                } else {
+                    break;
+                }
+            }
+            cpUtf8Prefix[i - 2] = prefix;
+            currentStr = currentStr.substring(prefix);
+            char[] suffix = currentStr.toCharArray();
+            if (suffix.length > 100) { // big suffix (100 is arbitrary - can we
+                                        // do better?)
+                cpUtf8Suffix[i - 1] = 0;
+                bigSuffix.add(new Integer(suffix.length));
+                addCharacters(bigChars, suffix);
+            } else {
+                cpUtf8Suffix[i - 1] = suffix.length;
+                addCharacters(chars, suffix);
+            }
+        }
+        int[] cpUtf8Chars = new int[chars.size()];
+        int[] cpUtf8BigSuffix = new int[bigSuffix.size()];
+        int[] cpUtf8BigChars = new int[bigChars.size()];
+        for (int i = 0; i < cpUtf8Chars.length; i++) {
+            cpUtf8Chars[i] = ((Character) chars.get(i)).charValue();
+        }
+        for (int i = 0; i < cpUtf8BigSuffix.length; i++) {
+            cpUtf8BigSuffix[i] = ((Integer) bigSuffix.get(i)).intValue();
+        }
+        for (int i = 0; i < cpUtf8BigChars.length; i++) {
+            cpUtf8BigChars[i] = ((Character) bigChars.get(i)).charValue();
+        }
+        out.write(encodeBandInt(cpUtf8Prefix, Codec.DELTA5));
+        out.write(encodeBandInt(cpUtf8Suffix, Codec.UNSIGNED5));
+        out.write(encodeBandInt(cpUtf8Chars, Codec.CHAR3));
+        out.write(encodeBandInt(cpUtf8BigSuffix, Codec.DELTA5));
+        out.write(encodeBandInt(cpUtf8BigChars, Codec.DELTA5));
     }
 
-    public void pack(OutputStream out) {
-        // TODO Auto-generated method stub
+    private void addCharacters(List chars, char[] charArray) {
+        for (int i = 0; i < charArray.length; i++) {
+            chars.add(new Character(charArray[i]));
+        }
+    }
 
+    private void writeCpInt(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpInt = new int[cp_Int.size()];
+        int i = 0;
+        for (Iterator iterator = cp_Int.iterator(); iterator.hasNext();) {
+            Integer integer = (Integer) iterator.next();
+            cpInt[i] = integer.intValue();
+            i++;
+        }
+        out.write(encodeBandInt(cpInt, Codec.UDELTA5));
     }
 
-    public void setCurrentConstantPool(ConstantPool cp) {
-        this.currentConstantPool = cp;
+    private void writeCpFloat(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpFloat = new int[cp_Float.size()];
+        int i = 0;
+        for (Iterator iterator = cp_Float.iterator(); iterator.hasNext();) {
+            Float fl = (Float) iterator.next();
+            cpFloat[i] = Float.floatToIntBits(fl.floatValue());
+            i++;
+        }
+        out.write(encodeBandInt(cpFloat, Codec.UDELTA5));
     }
 
-    public void finaliseBands() {
+    private void writeCpLong(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] highBits = new int[cp_Long.size()];
+        int[] loBits = new int[cp_Long.size()];
+        int i = 0;
+        for (Iterator iterator = cp_Long.iterator(); iterator.hasNext();) {
+            Long lng = (Long) iterator.next();
+            long l = lng.longValue();
+            highBits[i] = (int) (l >> 32);
+            loBits[i] = (int) l;
+            i++;
+        }
+        out.write(encodeBandInt(highBits, Codec.UDELTA5));
+        out.write(encodeBandInt(loBits, Codec.DELTA5));
+    }
+
+    private void writeCpDouble(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] highBits = new int[cp_Double.size()];
+        int[] loBits = new int[cp_Double.size()];
+        int i = 0;
+        for (Iterator iterator = cp_Double.iterator(); iterator.hasNext();) {
+            Double dbl = (Double) iterator.next();
+            long l = Double.doubleToLongBits(dbl.doubleValue());
+            highBits[i] = (int) (l >> 32);
+            loBits[i] = (int) l;
+            i++;
+        }
+        out.write(encodeBandInt(highBits, Codec.UDELTA5));
+        out.write(encodeBandInt(loBits, Codec.DELTA5));
+    }
+
+    private void writeCpString(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpString = new int[cp_String.size()];
+        int i = 0;
+        for (Iterator iterator = cp_String.iterator(); iterator.hasNext();) {
+            CPString cpStr = (CPString) iterator.next();
+            cpString[i] = cpStr.getIndexInCpUtf8();
+            i++;
+        }
+        out.write(encodeBandInt(cpString, Codec.UDELTA5));
+    }
+
+    private void writeCpClass(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpClass = new int[cp_Class.size()];
+        int i = 0;
+        for (Iterator iterator = cp_Class.iterator(); iterator.hasNext();) {
+            CPClass cpCl = (CPClass) iterator.next();
+            cpClass[i] = cpCl.getIndexInCpUtf8();
+            i++;
+        }
+        out.write(encodeBandInt(cpClass, Codec.UDELTA5));
+    }
+
+    private void writeCpSignature(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpSignatureForm = new int[cp_Signature.size()];
+        List classes = new ArrayList();
+        int i = 0;
+        for (Iterator iterator = cp_Signature.iterator(); iterator.hasNext();) {
+            CPSignature cpS = (CPSignature) iterator.next();
+            classes.addAll(cpS.getClasses());
+            cpSignatureForm[i] = cpS.getIndexInCpUtf8();
+            i++;
+        }
+        int[] cpSignatureClasses = new int[classes.size()];
+        for (int j = 0; j < cpSignatureClasses.length; j++) {
+            cpSignatureClasses[j] = ((CPClass) classes.get(j)).getIndex();
+        }
+        out.write(encodeBandInt(cpSignatureForm, Codec.DELTA5));
+        out.write(encodeBandInt(cpSignatureClasses, Codec.UDELTA5));
+    }
+
+    private void writeCpDescr(OutputStream out) throws IOException,
+            Pack200Exception {
+        int[] cpDescrName = new int[cp_Descr.size()];
+        int[] cpDescrType = new int[cp_Descr.size()];
+        int i = 0;
+        for (Iterator iterator = cp_Descr.iterator(); iterator.hasNext();) {
+            CPNameAndType nameAndType = (CPNameAndType) iterator.next();
+            cpDescrName[i] = nameAndType.getNameIndex();
+            cpDescrType[i] = nameAndType.getTypeIndex();
+            i++;
+        }
+        out.write(encodeBandInt(cpDescrName, Codec.DELTA5));
+        out.write(encodeBandInt(cpDescrType, Codec.UDELTA5));
+    }
+
+    private void writeCpMethodOrField(Set cp, OutputStream out)
+            throws IOException, Pack200Exception {
+        int[] cp_methodOrField_class = new int[cp.size()];
+        int[] cp_methodOrField_desc = new int[cp.size()];
+        int i = 0;
+        for (Iterator iterator = cp.iterator(); iterator.hasNext();) {
+            CPMethodOrField mOrF = (CPMethodOrField) iterator.next();
+            cp_methodOrField_class[i] = mOrF.getClassIndex();
+            cp_methodOrField_desc[i] = mOrF.getDescIndex();
+            i++;
+        }
+        out.write(encodeBandInt(cp_methodOrField_class, Codec.DELTA5));
+        out.write(encodeBandInt(cp_methodOrField_desc, Codec.UDELTA5));
+    }
+
+    public void setCurrentClass(JavaClass javaClass) {
+        this.currentClass = javaClass;
+        this.currentConstantPool = javaClass.getConstantPool();
+    }
 
-        System.out.println("pool");
-        
+    public void finaliseBands() {
+        addCpUtf8("");
+        removeSignaturesFromCpUTF8();
+        addIndices();
         segmentHeader.setCp_Utf8_count(cp_Utf8.size());
         segmentHeader.setCp_Int_count(cp_Int.size());
         segmentHeader.setCp_Float_count(cp_Float.size());
@@ -90,13 +322,42 @@
         segmentHeader.setCp_Imethod_count(cp_Imethod.size());
     }
 
+    private void removeSignaturesFromCpUTF8() {
+        for (Iterator iterator = cp_Signature.iterator(); iterator.hasNext();) {
+            CPSignature signature = (CPSignature) iterator.next();
+            String sigStr = signature.getUnderlyingString();
+            CPUTF8 utf8 = signature.getSignatureForm();
+            String form = utf8.getUnderlyingString();
+            if (!sigStr.equals(form)) {
+                removeCpUtf8(sigStr);
+            }
+        }
+    }
+
+    private void addIndices() {
+        Set[] sets = new Set[] { cp_Utf8, cp_String, cp_Class, cp_Signature,
+                cp_Descr };
+        for (int i = 0; i < sets.length; i++) {
+            int j = 0;
+            for (Iterator iterator = sets[i].iterator(); iterator.hasNext();) {
+                ConstantPoolEntry entry = (ConstantPoolEntry) iterator.next();
+                entry.setIndex(j);
+                j++;
+            }
+        }
+    }
+
+    private void removeCpUtf8(String string) {
+        CPUTF8 utf8 = (CPUTF8) stringsToCpUtf8.get(string);
+        if (utf8 != null) {
+            stringsToCpUtf8.remove(string);
+            cp_Utf8.remove(utf8);
+        }
+    }
+
     public void addConstantClass(ConstantClass constant) {
         String className = constant.getBytes(currentConstantPool);
-        if(stringsToCpClass.get(className) == null) {
-            CPClass cpClass = new CPClass(className);
-            cp_Class.add(cpClass);
-            stringsToCpClass.put(className, cpClass);
-        }
+        addCPClass(className);
     }
 
     public void addConstantDouble(ConstantDouble constant) {
@@ -107,10 +368,10 @@
         ConstantFieldref cf = constant;
         ConstantNameAndType cnat = (ConstantNameAndType) currentConstantPool
                 .getConstant(cf.getNameAndTypeIndex());
-        CPNameAndType nat = new CPNameAndType(cnat.getName(currentConstantPool),
+        CPNameAndType nat = getCPNameAndType(cnat.getName(currentConstantPool),
                 cnat.getSignature(currentConstantPool));
-        cp_Signature.add(cnat.getSignature(currentConstantPool));
-        cp_Field.add(new MethodOrField(cf.getClass(currentConstantPool), nat));
+        cp_Field.add(new CPMethodOrField(getCPClass(cf
+                .getClass(currentConstantPool)), nat));
     }
 
     public void addConstantFloat(ConstantFloat constant) {
@@ -126,9 +387,10 @@
         ConstantNameAndType cnat = (ConstantNameAndType) currentConstantPool
                 .getConstant(constant.getNameAndTypeIndex());
         String signature = cnat.getSignature(currentConstantPool);
-        cp_Signature.add(signature);
-        CPNameAndType nat = new CPNameAndType(cnat.getName(currentConstantPool), signature);
-        cp_Imethod.add(new MethodOrField(constant.getClass(currentConstantPool), nat));
+        CPNameAndType nat = getCPNameAndType(cnat.getName(currentConstantPool),
+                signature);
+        cp_Imethod.add(new CPMethodOrField(getCPClass(constant
+                .getClass(currentConstantPool)), nat));
     }
 
     public void addConstantLong(ConstantLong constant) {
@@ -139,69 +401,145 @@
         ConstantNameAndType cnat = (ConstantNameAndType) currentConstantPool
                 .getConstant(constant.getNameAndTypeIndex());
         String signature = cnat.getSignature(currentConstantPool);
-        cp_Signature.add(signature);
-        CPNameAndType nat = new CPNameAndType(cnat.getName(currentConstantPool),
+        CPNameAndType nat = getCPNameAndType(cnat.getName(currentConstantPool),
                 signature);
-        cp_Method.add(new MethodOrField(constant.getClass(currentConstantPool),
-                nat));
+        cp_Method.add(new CPMethodOrField(getCPClass(constant
+                .getClass(currentConstantPool)), nat));
     }
 
     public void addConstantNameAndType(ConstantNameAndType constant) {
         String name = constant.getName(currentConstantPool);
         String signature = constant.getSignature(currentConstantPool);
-        String descr = name + ":" + signature;
-        if(stringsToCpNameAndType.get(descr) != null) {
-            cp_Signature.add(signature);
-            CPNameAndType nameAndType = new CPNameAndType(name,
-                    signature);
-            stringsToCpNameAndType.put(descr, nameAndType);
-            cp_Descr.add(nameAndType);
-        }
+        addCPNameAndType(name, signature);
     }
 
     public void addConstantString(ConstantString constant) {
         String string = constant.getBytes(currentConstantPool);
-        CPString cpString = (CPString) stringsToCpString.get(string);
-        if(cpString == null) {
-            cpString = new CPString(string);
-            cp_String.add(cpString);
-            stringsToCpString.put(string, cpString);
-        }
+        // CPString cpString = (CPString) stringsToCpString.get(string);
+        // if(cpString == null) {
+        CPString cpString = new CPString(getCpUtf8(string));
+        cp_String.add(cpString);
+        // stringsToCpString.put(string, cpString);
+        // }
     }
 
     public void addConstantUtf8(ConstantUtf8 constant) {
-        cp_Utf8.add((constant).getBytes());
+        String utf8 = constant.getBytes();
+        if (!defaultAttributeNames.contains(utf8)) {
+            if (utf8.endsWith(".java")) {
+                if (!isPredictableSourceFileName(utf8)) {
+                    addCpUtf8(utf8);
+                }
+            } else {
+                addCpUtf8(utf8);
+            }
+        }
+    }
+
+    private void addCpUtf8(String utf8) {
+        getCpUtf8(utf8);
+    }
+
+    private CPUTF8 getCpUtf8(String utf8) {
+        CPUTF8 cpUtf8 = (CPUTF8) stringsToCpUtf8.get(utf8);
+        if (cpUtf8 == null) {
+            cpUtf8 = new CPUTF8(utf8);
+            cp_Utf8.add(cpUtf8);
+            stringsToCpUtf8.put(utf8, cpUtf8);
+        }
+        return cpUtf8;
     }
 
-    public void addDesc(String name, String signature) {
-        cp_Signature.add(signature);
-        cp_Descr.add(new CPNameAndType(name, signature));
+    public void addCPNameAndType(String name, String signature) {
+        getCPNameAndType(name, signature);
     }
 
     public void addSignature(String signature) {
-        cp_Signature.add(signature);
+        getSignature(signature);
+    }
+
+    private CPSignature getSignature(String signature) {
+        CPSignature cpS = (CPSignature) stringsToCpSignature.get(signature);
+        if (cpS == null) {
+            List cpClasses = new ArrayList();
+            CPUTF8 signatureUTF8;
+            if (signature.length() > 1 && signature.indexOf("L") != -1) {
+                List classes = new ArrayList();
+                char[] chars = signature.toCharArray();
+                StringBuffer signatureString = new StringBuffer();
+                for (int i = 0; i < chars.length; i++) {
+                    signatureString.append(chars[i]);
+                    if (chars[i] == 'L') {
+                        StringBuffer className = new StringBuffer();
+                        for (int j = i + 1; j < chars.length; j++) {
+                            char c = chars[j];
+                            if (Character.isLetter(c) || Character.isDigit(c)
+                                    || c == '/') {
+                                className.append(c);
+                            } else {
+                                classes.add(className.toString());
+                                i = j - 1;
+                                break;
+                            }
+                        }
+                    }
+                }
+                removeCpUtf8(signature);
+                for (Iterator iterator2 = classes.iterator(); iterator2
+                        .hasNext();) {
+                    cpClasses.add(getCPClass((String) iterator2.next()));
+                }
+
+                signatureUTF8 = getCpUtf8(signatureString.toString());
+            } else {
+                signatureUTF8 = getCpUtf8(signature);
+            }
+            cpS = new CPSignature(signature, signatureUTF8, cpClasses);
+            cp_Signature.add(cpS);
+            stringsToCpSignature.put(signature, cpS);
+        }
+        return cpS;
     }
 
     public CPClass getCPClass(String className) {
+        className = className.replace('.', '/');
         CPClass cpClass = (CPClass) stringsToCpClass.get(className);
-        if(cpClass == null) {
-            cpClass = new CPClass(className);
+        if (cpClass == null) {
+            CPUTF8 cpUtf8 = getCpUtf8(className);
+            cpClass = new CPClass(cpUtf8);
             cp_Class.add(cpClass);
             stringsToCpClass.put(className, cpClass);
         }
         return cpClass;
     }
 
+    public void addCPClass(String className) {
+        getCPClass(className);
+    }
+
     public CPNameAndType getCPNameAndType(String name, String signature) {
         String descr = name + ":" + signature;
-        CPNameAndType nameAndType = (CPNameAndType) stringsToCpNameAndType.get(descr);
+        CPNameAndType nameAndType = (CPNameAndType) stringsToCpNameAndType
+                .get(descr);
         if (nameAndType == null) {
-            cp_Signature.add(signature);
-            nameAndType = new CPNameAndType(name, signature);
+            nameAndType = new CPNameAndType(getCpUtf8(name),
+                    getSignature(signature));
             stringsToCpNameAndType.put(descr, nameAndType);
             cp_Descr.add(nameAndType);
         }
         return nameAndType;
     }
 
+    public boolean isPredictableSourceFileName(String name) {
+        String className = currentClass.getClassName();
+        if (className.indexOf(".") != -1) {
+            className = className.substring(className.lastIndexOf(".") + 1);
+        }
+        if (className.indexOf("$") != -1) {
+            className = className.substring(0, className.indexOf("$"));
+        }
+        className += ".java";
+        return className.equals(name);
+    }
+
 }

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=663883&r1=663882&r2=663883&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 Fri Jun  6 03:25:30 2008
@@ -5,9 +5,9 @@
  * 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
@@ -77,7 +77,7 @@
         fileBands = new FileBands(segmentHeader, files);
 
         processClasses(classes);
-        
+
         cpBands.finaliseBands();
         attributeDefinitionBands.finaliseBands();
         icBands.finaliseBands();
@@ -147,7 +147,6 @@
     }
 
     public void visitConstantPool(ConstantPool obj) {
-        cpBands.setCurrentConstantPool(obj);
     }
 
     public void visitConstantString(ConstantString obj) {
@@ -171,7 +170,7 @@
     }
 
     public void visitField(Field obj) {
-        cpBands.addDesc(obj.getName(), obj.getSignature());
+        cpBands.addCPNameAndType(obj.getName(), obj.getSignature());
     }
 
     public void visitInnerClass(InnerClass obj) {
@@ -184,6 +183,7 @@
     }
 
     public void visitJavaClass(JavaClass obj) {
+        cpBands.setCurrentClass(obj);
         classBands.addClass(obj);
         segmentHeader.addMinorVersion(obj.getMinor());
         segmentHeader.addMajorVersion(obj.getMajor());
@@ -209,7 +209,7 @@
     }
 
     public void visitMethod(Method obj) {
-        cpBands.addDesc(obj.getName(), obj.getSignature());
+        cpBands.addCPNameAndType(obj.getName(), obj.getSignature());
     }
 
     public void visitSignature(Signature obj) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java?rev=663883&r1=663882&r2=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java Fri Jun  6 03:25:30 2008
@@ -306,16 +306,16 @@
     public void addMajorVersion(int major) {
         majverCounter.add(major);
     }
-    
+
     /**
      * Counter for major/minor class file numbers so we can work out the default
      */
     private class Counter {
-        
+
         private final int[] objs = new int[8];
         private final int[] counts = new int[8];
         private int length;
-        
+
         public void add(int obj) {
             boolean found = false;
             for (int i = 0; i < length; i++) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java?rev=663883&r1=663882&r2=663883&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/test/java/org/apache/harmony/pack200/tests/BHSDCodecTest.java Fri Jun  6 03:25:30 2008
@@ -23,6 +23,7 @@
 import junit.framework.TestCase;
 
 import org.apache.harmony.pack200.BHSDCodec;
+import org.apache.harmony.pack200.Codec;
 import org.apache.harmony.pack200.CodecEncoding;
 import org.apache.harmony.pack200.Pack200Exception;
 
@@ -64,4 +65,14 @@
         }
     }
 
+    public void testDeltaEncodings() throws IOException, Pack200Exception {
+        Codec c = Codec.UDELTA5;
+        int[] sequence = new int[] {0, 2, 4, 2, 2, 4};
+        byte[] encoded = c.encode(sequence);
+        int[] decoded = c.decodeInts(6, new ByteArrayInputStream(encoded));
+        for (int i = 0; i < decoded.length; i++) {
+            assertEquals(sequence[i], decoded[i]);
+        }
+    }
+
 }
\ No newline at end of file