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/11 12:15:45 UTC

svn commit: r666604 - in /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200: AttributeDefinitionBands.java BHSDCodec.java CpBands.java Segment.java

Author: sjanuary
Date: Wed Jun 11 03:15:41 2008
New Revision: 666604

URL: http://svn.apache.org/viewvc?rev=666604&view=rev
Log:
Pack200 - some code for attribute defintion bands

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/CpBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.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=666604&r1=666603&r2=666604&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 Wed Jun 11 03:15:41 2008
@@ -16,42 +16,163 @@
  */
 package org.apache.harmony.pack200;
 
+import java.io.IOException;
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.bcel.classfile.Field;
+import org.apache.bcel.classfile.JavaClass;
+import org.apache.bcel.classfile.Method;
 import org.apache.bcel.classfile.Unknown;
 
-
+/**
+ * Attribute Definition bands define how any unknown attributes should be
+ * read by the decompressor.
+ */
 public class AttributeDefinitionBands extends BandSet {
 
+    private final Map layouts = new HashMap();
+
     private final SegmentHeader segmentHeader;
 
-    private final Map namesToAttributes = new HashMap();
+    private final Map classAttributes = new HashMap();
+    private final Map methodAttributes = new HashMap();
+    private final Map fieldAttributes = new HashMap();
+    private final Map codeAttributes = new HashMap();
+
+    private final List attributeDefinitions = new ArrayList();
 
-    public AttributeDefinitionBands(SegmentHeader segmentHeader) {
+    private final CpBands cpBands;
+
+    public AttributeDefinitionBands(SegmentHeader segmentHeader, CpBands cpBands) {
         this.segmentHeader = segmentHeader;
+        this.cpBands = cpBands;
     }
 
     public void finaliseBands() {
-        segmentHeader.setAttribute_definition_count(namesToAttributes.keySet().size());
+        segmentHeader.setAttribute_definition_count(classAttributes.keySet()
+                .size()
+                + methodAttributes.keySet().size()
+                + fieldAttributes.keySet().size()
+                + codeAttributes.keySet().size());
+        if (classAttributes.keySet().size() > 7) {
+            segmentHeader.setHave_class_flags_hi(true);
+        }
+        if(methodAttributes.keySet().size() > 6) {
+            segmentHeader.setHave_method_flags_hi(true);
+        }
+        if(fieldAttributes.keySet().size() > 10) {
+            segmentHeader.setHave_field_flags_hi(true);
+        }
+        if(codeAttributes.keySet().size() > 15) {
+            segmentHeader.setHave_code_flags_hi(true);
+        }
+    }
+
+    public void pack(OutputStream out) throws IOException, Pack200Exception {
+        int[] availableClassIndices = new int[] {25, 26, 27, 28, 29, 30, 31};
+        if(classAttributes.size() > 7) {
+            availableClassIndices = addHighIndices(availableClassIndices);
+        }
+        addAttributeDefinitions(classAttributes, availableClassIndices, 0);
+        int[] availableMethodIndices = new int[] {26, 27, 28, 29, 30, 31};
+        if(methodAttributes.size() > 6) {
+            availableMethodIndices = addHighIndices(availableMethodIndices);
+        }
+        addAttributeDefinitions(methodAttributes, availableMethodIndices, 0);
+        int[] availableFieldIndices = new int[] {18, 23, 24, 25, 26, 27, 28, 29, 30, 31};
+        if(fieldAttributes.size() > 10) {
+            availableFieldIndices = addHighIndices(availableFieldIndices);
+        }
+        addAttributeDefinitions(fieldAttributes, availableFieldIndices, 0);
+        int[] availableCodeIndices = new int[] {17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
+        if(codeAttributes.size() > 15) {
+            availableCodeIndices = addHighIndices(availableCodeIndices);
+        }
+        addAttributeDefinitions(codeAttributes, availableCodeIndices, 0);
+
+        int[] attributeDefinitionHeader = new int[attributeDefinitions.size()];
+        int[] attributeDefinitionName = new int[attributeDefinitions.size()];
+        int[] attributeDefinitionLayout = new int[attributeDefinitions.size()];
+        for (int i = 0; i < attributeDefinitionLayout.length; i++) {
+            AttributeDefinition def = (AttributeDefinition) attributeDefinitions.get(i);
+            attributeDefinitionHeader[i] = def.contextType | (def.index << 2);
+            attributeDefinitionName[i] = cpBands.getCpUtf8(def.name).getIndex();
+            attributeDefinitionLayout[i] = cpBands.getCpUtf8(def.layout).getIndex();
+        }
+
+        out.write(encodeBandInt(attributeDefinitionHeader, Codec.BYTE1));
+        out.write(encodeBandInt(attributeDefinitionName, Codec.UNSIGNED5));
+        out.write(encodeBandInt(attributeDefinitionLayout, Codec.UNSIGNED5));
     }
 
-    public void pack(OutputStream out) {
-        // TODO Auto-generated method stub
+    private int[] addHighIndices(int[] availableIndices) {
+        int[] temp = new int[availableIndices.length + 32];
+        for (int i = 0; i < availableIndices.length; i++) {
+            temp[i] = availableIndices[i];
+        }
+        int j = 32;
+        for (int i = availableIndices.length; i < temp.length ; i++) {
+            temp[i] = j;
+            j++;
+        }
+        return temp;
+    }
 
+    private void addAttributeDefinitions(Map attributes,
+            int[] availableIndices, int contextType) {
+        int i = 0;
+        for (Iterator iterator = attributes.keySet().iterator(); iterator.hasNext();) {
+            String name = (String) iterator.next();
+            String layout = (String) layouts.get(name);
+            int index = availableIndices[i];
+            attributeDefinitions.add(new AttributeDefinition(index, contextType, name, layout));
+        }
     }
 
-    public void addUnknownAttribute(Unknown attribute) {
+    public void addLayout(String name, String layout) {
+        layouts.put(name, layout);
+    }
+
+    public void addUnknownAttribute(Unknown attribute, Object parent) {
+        Map map;
+        if(parent instanceof JavaClass) {
+            map = classAttributes;
+        } else if (parent instanceof Method) {
+            map = methodAttributes;
+        } else if (parent instanceof Field) {
+            map = fieldAttributes;
+        } else {
+            map = codeAttributes;
+        }
         String name = attribute.getName();
-        List attributes = (List) namesToAttributes.get(name);
+        List attributes = (List) map.get(name);
         if(attributes == null) {
             attributes = new ArrayList();
-            namesToAttributes.put(name, attributes);
+            map.put(name, attributes);
         }
         attributes.add(attribute);
     }
 
+    private static class AttributeDefinition {
+
+        public int index;
+        public int contextType;
+        public String name;
+        public String layout;
+
+        public AttributeDefinition(int index, int contextType, String name,
+                String layout) {
+            this.index = index;
+            this.contextType = contextType;
+            this.name = name;
+            this.layout = layout;
+        }
+
+    }
+
 }

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=666604&r1=666603&r2=666604&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 Wed Jun 11 03:15:41 2008
@@ -285,8 +285,8 @@
             }
         } else {
             if (z < 0) {
-                // need to use integer overflow here to represent negatives.
-                z += 4294967296L; // this value is eq
+                // Need to use integer overflow here to represent negatives.
+                z += 4294967296L; // this value is equal to (1 << 32).
             }
         }
         List byteList = new ArrayList();

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=666604&r1=666603&r2=666604&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 Wed Jun 11 03:15:41 2008
@@ -440,7 +440,7 @@
         getCpUtf8(utf8);
     }
 
-    private CPUTF8 getCpUtf8(String utf8) {
+    public CPUTF8 getCpUtf8(String utf8) {
         CPUTF8 cpUtf8 = (CPUTF8) stringsToCpUtf8.get(utf8);
         if (cpUtf8 == null) {
             cpUtf8 = new CPUTF8(utf8);

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=666604&r1=666603&r2=666604&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 Wed Jun 11 03:15:41 2008
@@ -21,6 +21,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.bcel.classfile.Attribute;
 import org.apache.bcel.classfile.Code;
 import org.apache.bcel.classfile.CodeException;
 import org.apache.bcel.classfile.ConstantClass;
@@ -66,11 +67,12 @@
     private ClassBands classBands;
     private BcBands bcBands;
     private FileBands fileBands;
+    
 
     public void pack(List classes, List files, OutputStream out) throws IOException, Pack200Exception {
         segmentHeader = new SegmentHeader();
         cpBands = new CpBands(segmentHeader);
-        attributeDefinitionBands = new AttributeDefinitionBands(segmentHeader);
+        attributeDefinitionBands = new AttributeDefinitionBands(segmentHeader, cpBands);
         icBands = new IcBands(segmentHeader);
         classBands = new ClassBands(cpBands, classes.size());
         bcBands = new BcBands();
@@ -102,6 +104,12 @@
 
     public void visitCode(Code obj) {
         bcBands.addCode(obj);
+        Attribute[] attributes = obj.getAttributes();
+        for (int i = 0; i < attributes.length; i++) {
+            if(attributes[i] instanceof Unknown) {
+                attributeDefinitionBands.addUnknownAttribute((Unknown)attributes[i], obj);
+            }
+        }
     }
 
     public void visitCodeException(CodeException obj) {
@@ -171,10 +179,15 @@
 
     public void visitField(Field obj) {
         cpBands.addCPNameAndType(obj.getName(), obj.getSignature());
+        Attribute[] attributes = obj.getAttributes();
+        for (int i = 0; i < attributes.length; i++) {
+            if(attributes[i] instanceof Unknown) {
+                attributeDefinitionBands.addUnknownAttribute((Unknown)attributes[i], obj);
+            }
+        }
     }
 
     public void visitInnerClass(InnerClass obj) {
-        // TODO Auto-generated method stub
 
     }
 
@@ -187,6 +200,12 @@
         classBands.addClass(obj);
         segmentHeader.addMinorVersion(obj.getMinor());
         segmentHeader.addMajorVersion(obj.getMajor());
+        Attribute[] attributes = obj.getAttributes();
+        for (int i = 0; i < attributes.length; i++) {
+            if(attributes[i] instanceof Unknown) {
+                attributeDefinitionBands.addUnknownAttribute((Unknown)attributes[i], obj);
+            }
+        }
     }
 
     public void visitLineNumber(LineNumber obj) {
@@ -210,6 +229,12 @@
 
     public void visitMethod(Method obj) {
         cpBands.addCPNameAndType(obj.getName(), obj.getSignature());
+        Attribute[] attributes = obj.getAttributes();
+        for (int i = 0; i < attributes.length; i++) {
+            if(attributes[i] instanceof Unknown) {
+                attributeDefinitionBands.addUnknownAttribute((Unknown)attributes[i], obj);
+            }
+        }
     }
 
     public void visitSignature(Signature obj) {
@@ -236,7 +261,6 @@
     }
 
     public void visitUnknown(Unknown obj) {
-        attributeDefinitionBands.addUnknownAttribute(obj);
     }
 
 }