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/04 17:10:30 UTC

svn commit: r663163 - /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/

Author: sjanuary
Date: Wed Jun  4 08:10:29 2008
New Revision: 663163

URL: http://svn.apache.org/viewvc?rev=663163&view=rev
Log:
Pack200 - more code for creating the segment header

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java
    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/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/CpBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.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

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java?rev=663163&r1=663162&r2=663163&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.java Wed Jun  4 08:10:29 2008
@@ -52,32 +52,26 @@
 
     public void pack() throws Pack200Exception, IOException {
         List classes = new ArrayList();
+        List files = new ArrayList();
         if(inputStream != null) {
             while(inputStream.available() > 0) {
                 JarEntry jarEntry = inputStream.getNextJarEntry();
                 if(jarEntry != null) {
-                    addJarEntry(jarEntry, inputStream, classes);
+                    addJarEntry(jarEntry, inputStream, classes, files);
                 }
             }
         } else {
             Enumeration jarEntries = jarFile.entries();
             while(jarEntries.hasMoreElements()) {
                 JarEntry jarEntry = (JarEntry) jarEntries.nextElement();
-                addJarEntry(jarEntry, jarFile.getInputStream(jarEntry), classes);
+                addJarEntry(jarEntry, jarFile.getInputStream(jarEntry), classes, files);
             }
         }
-        new Segment().pack(classes, outputStream);  // TODO: Multiple segments
+        new Segment().pack(classes, files, outputStream);  // TODO: Multiple segments
     }
 
-    private void addJarEntry(JarEntry jarEntry, InputStream stream, List javaClasses) throws IOException, Pack200Exception {
+    private void addJarEntry(JarEntry jarEntry, InputStream stream, List javaClasses, List files) throws IOException, Pack200Exception {
         String name = jarEntry.getName();
-//        long size = jarEntry.getSize();
-//        long compressedSize = jarEntry.getCompressedSize();
-//        char[] bytes = new char[(int)size];
-//        int bytesRead = new InputStreamReader(stream).read(bytes);
-//        if(bytesRead != size) {
-//            throw new Pack200Exception("An error occurred reading from the Jar file");
-//        }
         if(name.endsWith(".class")) {
             ClassParser classParser = new ClassParser(stream, name);
             JavaClass javaClass = classParser.parse();

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=663163&r1=663162&r2=663163&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  4 08:10:29 2008
@@ -17,20 +17,41 @@
 package org.apache.harmony.pack200;
 
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.bcel.classfile.Unknown;
 
 
 public class AttributeDefinitionBands extends BandSet {
 
-    public void pack(OutputStream out) {
-        // TODO Auto-generated method stub
+    private final SegmentHeader segmentHeader;
+    
+    private final Map namesToAttributes = new HashMap();
+
+    public AttributeDefinitionBands(SegmentHeader segmentHeader) {
+        this.segmentHeader = segmentHeader;
+    }
 
+    public void finaliseBands() {
+        segmentHeader.setAttribute_definition_count(namesToAttributes.keySet().size());
     }
 
-    public void addUnknownAttribute(Unknown obj) {
+    public void pack(OutputStream out) {
         // TODO Auto-generated method stub
 
     }
 
+    public void addUnknownAttribute(Unknown attribute) {
+        String name = attribute.getName();
+        List attributes = (List) namesToAttributes.get(name);
+        if(attributes == null) {
+            attributes = new ArrayList();
+            namesToAttributes.put(name, attributes);
+        }
+        attributes.add(attribute);
+    }
+
 }

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=663163&r1=663162&r2=663163&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 Wed Jun  4 08:10:29 2008
@@ -23,6 +23,10 @@
 
 public class BcBands extends BandSet {
 
+    public void finaliseBands() {
+        
+    }
+
     public void pack(OutputStream out) {
         // TODO Auto-generated method stub
 

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=663163&r1=663162&r2=663163&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 Wed Jun  4 08:10:29 2008
@@ -50,6 +50,10 @@
     private final CPNameAndType[][] field_descr;
     private final CPNameAndType[][] method_descr;
 
+    public void finaliseBands() {
+        
+    }
+
     public void pack(OutputStream out) {
         // TODO Auto-generated method stub
 
@@ -64,7 +68,6 @@
             class_interface[index][i] = cpBands.getCPClass(interfaces[i]);
         }
 
-
         Field[] fields = obj.getFields();
         class_field_count[index] = fields.length;
         field_descr[index] = new CPNameAndType[fields.length];

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=663163&r1=663162&r2=663163&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  4 08:10:29 2008
@@ -37,6 +37,8 @@
 
 public class CpBands extends BandSet {
 
+    private final SegmentHeader segmentHeader;
+
     private final Set cp_Utf8 = new TreeSet();
     private final Set cp_Int = new TreeSet();
     private final Set cp_Float = new TreeSet();
@@ -55,6 +57,11 @@
     private final Map stringsToCpNameAndType = new HashMap();
     private final Map stringsToCpString = new HashMap();
     private final Map stringsToCpSignature = new HashMap();
+    
+    
+    public CpBands(SegmentHeader segmentHeader) {
+        this.segmentHeader = segmentHeader;
+    }
 
     public void pack(OutputStream out) {
         // TODO Auto-generated method stub
@@ -65,9 +72,22 @@
         this.currentConstantPool = cp;
     }
 
-    public void sortPool() {
+    public void finaliseBands() {
 
         System.out.println("pool");
+        
+        segmentHeader.setCp_Utf8_count(cp_Utf8.size());
+        segmentHeader.setCp_Int_count(cp_Int.size());
+        segmentHeader.setCp_Float_count(cp_Float.size());
+        segmentHeader.setCp_Long_count(cp_Long.size());
+        segmentHeader.setCp_Double_count(cp_Double.size());
+        segmentHeader.setCp_String_count(cp_String.size());
+        segmentHeader.setCp_Class_count(cp_Class.size());
+        segmentHeader.setCp_Signature_count(cp_Signature.size());
+        segmentHeader.setCp_Descr_count(cp_Descr.size());
+        segmentHeader.setCp_Field_count(cp_Field.size());
+        segmentHeader.setCp_Method_count(cp_Method.size());
+        segmentHeader.setCp_Imethod_count(cp_Imethod.size());
     }
 
     public void addConstantClass(ConstantClass constant) {

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java?rev=663163&r1=663162&r2=663163&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/FileBands.java Wed Jun  4 08:10:29 2008
@@ -17,10 +17,23 @@
 package org.apache.harmony.pack200;
 
 import java.io.OutputStream;
+import java.util.List;
 
 
 public class FileBands extends BandSet {
 
+    private final List files;
+    private final SegmentHeader segmentHeader;
+
+    public FileBands(SegmentHeader segmentHeader, List files) {
+        this.segmentHeader = segmentHeader;
+        this.files = files;
+        int size = files.size();
+        if(size > 0) {
+            
+        }
+    }
+
     public void pack(OutputStream out) {
         // TODO Auto-generated method stub
 

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java?rev=663163&r1=663162&r2=663163&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/IcBands.java Wed Jun  4 08:10:29 2008
@@ -26,6 +26,15 @@
 public class IcBands extends BandSet {
 
     private final List innerClasses = new ArrayList();
+    private final SegmentHeader segmentHeader;
+
+    public IcBands(SegmentHeader segmentHeader) {
+        this.segmentHeader = segmentHeader;
+    }
+
+    public void finaliseBands() {
+        segmentHeader.setIc_count(innerClasses.size());
+    }
 
     public void pack(OutputStream out) {
         // TODO Auto-generated method stub

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=663163&r1=663162&r2=663163&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  4 08:10:29 2008
@@ -56,27 +56,33 @@
 import org.apache.bcel.classfile.Unknown;
 import org.apache.bcel.classfile.Visitor;
 
+
 public class Segment implements Visitor {
 
+    private SegmentHeader segmentHeader;
+    private CpBands cpBands;
     private AttributeDefinitionBands attributeDefinitionBands;
-    private BcBands bcBands;
+    private IcBands icBands;
     private ClassBands classBands;
-    private CpBands cpBands;
+    private BcBands bcBands;
     private FileBands fileBands;
-    private IcBands icBands;
-    private SegmentHeader segmentHeader;
 
-    public void pack(List classes, OutputStream out) throws IOException,
-            Pack200Exception {
+    public void pack(List classes, List files, OutputStream out) throws IOException, Pack200Exception {
         segmentHeader = new SegmentHeader();
-        cpBands = new CpBands();
-        attributeDefinitionBands = new AttributeDefinitionBands();
-        icBands = new IcBands();
+        cpBands = new CpBands(segmentHeader);
+        attributeDefinitionBands = new AttributeDefinitionBands(segmentHeader);
+        icBands = new IcBands(segmentHeader);
         classBands = new ClassBands(cpBands, classes.size());
         bcBands = new BcBands();
-        fileBands = new FileBands();
+        fileBands = new FileBands(segmentHeader, files);
 
         processClasses(classes);
+        
+        cpBands.finaliseBands();
+        attributeDefinitionBands.finaliseBands();
+        icBands.finaliseBands();
+        classBands.finaliseBands();
+        bcBands.finaliseBands();
 
         segmentHeader.pack(out);
         cpBands.pack(out);
@@ -179,6 +185,8 @@
 
     public void visitJavaClass(JavaClass obj) {
         classBands.addClass(obj);
+        segmentHeader.addMinorVersion(obj.getMinor());
+        segmentHeader.addMajorVersion(obj.getMajor());
     }
 
     public void visitLineNumber(LineNumber obj) {
@@ -210,7 +218,6 @@
 
     public void visitSourceFile(SourceFile obj) {
         // TODO Auto-generated method stub
-
     }
 
     public void visitStackMap(StackMap 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=663163&r1=663162&r2=663163&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 Wed Jun  4 08:10:29 2008
@@ -64,9 +64,9 @@
     private boolean  have_code_flags_hi;
 
     private int ic_count;
-    private int default_class_minver;
-    private int default_class_majver;
     private int class_count;
+    private final Counter minverCounter = new Counter();
+    private final Counter majverCounter = new Counter();
 
     /**
      * Encode and write the SegmentHeader bands to the OutputStream
@@ -173,11 +173,6 @@
         cp_Imethod_count = count;
     }
 
-    public void setAttributeDefinition_count(int count) {
-        attribute_definition_count = count;
-    }
-
-
     public void setAttribute_definition_count(int attribute_definition_count) {
         this.attribute_definition_count = attribute_definition_count;
     }
@@ -257,17 +252,6 @@
         this.ic_count = ic_count;
     }
 
-
-    public void setDefault_class_minver(int default_class_minver) {
-        this.default_class_minver = default_class_minver;
-    }
-
-
-    public void setDefault_class_majver(int default_class_majver) {
-        this.default_class_majver = default_class_majver;
-    }
-
-
     public void setClass_count(int class_count) {
         this.class_count = class_count;
     }
@@ -290,6 +274,8 @@
     }
 
     private void writeClassCounts(OutputStream out) throws IOException, Pack200Exception {
+        int default_class_minver = minverCounter.getMostCommon();
+        int default_class_majver = majverCounter.getMostCommon();
         out.write(encodeScalar(ic_count, Codec.UNSIGNED5));
         out.write(encodeScalar(default_class_minver, Codec.UNSIGNED5));
         out.write(encodeScalar(default_class_majver, Codec.UNSIGNED5));
@@ -313,4 +299,51 @@
         }
     }
 
+    public void addMinorVersion(int minor) {
+        minverCounter.add(minor);
+    }
+
+    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++) {
+                if(objs[i] == obj) {
+                    counts[i]++;
+                    found = true;
+                }
+            }
+            if(!found) {
+                objs[length] = obj;
+                counts[length] = 1;
+                length ++;
+                if(length > objs.length - 1) {
+                    Object[] newArray = new Object[objs.length + 8];
+                    System.arraycopy(objs, 0, newArray, 0, length);
+                }
+            }
+        }
+
+        public int getMostCommon() {
+            int returnIndex = 0;
+            for (int i = 0; i < length; i++) {
+                if(counts[i] > counts[returnIndex]) {
+                    returnIndex = i;
+                }
+            }
+            return objs[returnIndex];
+        }
+    }
+
 }
\ No newline at end of file