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 2009/02/05 11:48:30 UTC

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

Author: sjanuary
Date: Thu Feb  5 10:48:29 2009
New Revision: 741072

URL: http://svn.apache.org/viewvc?rev=741072&view=rev
Log:
Pack200 - improved size estimate for multiple segments

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Archive.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=741072&r1=741071&r2=741072&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 Thu Feb  5 10:48:29 2009
@@ -147,8 +147,12 @@
         if(segmentLimit != -1 && segmentLimit != 0) {
             // -1 is a special case where only one segment is created and
             // 0 is a special case where one segment is created for each file
-            int packedSize = name.endsWith(".class") ? estimatePackedSize(size)
-                    : (int) size;
+
+            // This is fairly close to the RI, but still a little smaller as the exact sum is not given in the spec.
+            int packedSize  = (int)size // size of the file
+                    + 24 // 3x8 bytes for 3 longs in file_modtime, file_options and file_size bands
+                    + (name.endsWith(".class") ? 1 : name.getBytes().length); // size of entry in file_name band
+
             if (packedSize + currentSegmentSize > segmentLimit) {
                 return false;
             } else {
@@ -169,10 +173,6 @@
         return true;
     }
 
-    private int estimatePackedSize(long size) {
-        return (int) size; // TODO: try to match the RI as closely as possible
-    }
-
     static class File {
 
         private final String name;