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/08/26 16:52:08 UTC

svn commit: r689101 - /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java

Author: sjanuary
Date: Tue Aug 26 07:52:07 2008
New Revision: 689101

URL: http://svn.apache.org/viewvc?rev=689101&view=rev
Log:
Apply patch for HARMONY-5929 ([classlib][pack200][performance] Segment.computeIcStored rewrite)

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java?rev=689101&r1=689100&r2=689101&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/Segment.java Tue Aug 26 07:52:07 2008
@@ -25,7 +25,10 @@
 import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarOutputStream;
 import java.util.zip.GZIPInputStream;
@@ -236,15 +239,16 @@
         InnerClassesAttribute innerClassesAttribute = new InnerClassesAttribute(
                 "InnerClasses");
         IcTuple[] ic_relevant = getIcBands().getRelevantIcTuples(fullName, cp);
-        IcTuple[] ic_stored = computeIcStored(ic_local, ic_relevant);
-        for (int index = 0; index < ic_stored.length; index++) {
-            int innerClassIndex = ic_stored[index].thisClassIndex();
-            int outerClassIndex = ic_stored[index].outerClassIndex();
-            int simpleClassNameIndex = ic_stored[index].simpleClassNameIndex();
-
-            String innerClassString = ic_stored[index].thisClassString();
-            String outerClassString = ic_stored[index].outerClassString();
-            String simpleClassName = ic_stored[index].simpleClassName();
+        List ic_stored = computeIcStored(ic_local, ic_relevant);
+        for (int index = 0; index < ic_stored.size(); index++) {
+        	IcTuple icStored = (IcTuple)ic_stored.get(index);
+            int innerClassIndex = icStored.thisClassIndex();
+            int outerClassIndex = icStored.outerClassIndex();
+            int simpleClassNameIndex = icStored.simpleClassNameIndex();
+
+            String innerClassString = icStored.thisClassString();
+            String outerClassString = icStored.outerClassString();
+            String simpleClassName = icStored.simpleClassName();
 
             CPClass innerClass = null;
             CPUTF8 innerName = null;
@@ -253,18 +257,18 @@
             innerClass = innerClassIndex != -1 ? cpBands
                     .cpClassValue(innerClassIndex) : cpBands
                     .cpClassValue(innerClassString);
-            if (!ic_stored[index].isAnonymous()) {
+            if (!icStored.isAnonymous()) {
                 innerName = simpleClassNameIndex != -1 ? cpBands.cpUTF8Value(
                         simpleClassNameIndex) : cpBands
                         .cpUTF8Value(simpleClassName);
             }
 
-            if (ic_stored[index].isMember()) {
+            if (icStored.isMember()) {
                 outerClass = outerClassIndex != -1 ? cpBands
                         .cpClassValue(outerClassIndex) : cpBands
                         .cpClassValue(outerClassString);
             }
-            int flags = ic_stored[index].F;
+            int flags = icStored.F;
             innerClassesAttribute.addInnerClassesEntry(innerClass, outerClass,
                     innerName, flags);
             addInnerClassesAttr = true;
@@ -318,44 +322,43 @@
      *            IcTuple[] array of local transmitted tuples
      * @param ic_relevant
      *            IcTuple[] array of relevant tuples
-     * @return IcTuple[] array of tuples to be stored. If ic_local is null or
+     * @return List of tuples to be stored. If ic_local is null or
      *         empty, the values returned may not be correct. The caller will
      *         have to determine if this is the case.
      */
-    private IcTuple[] computeIcStored(IcTuple[] ic_local, IcTuple[] ic_relevant) {
-        List result = new ArrayList(ic_relevant.length);
-        List resultCopy = new ArrayList(ic_relevant.length);
-        List localList = new ArrayList(ic_relevant.length);
-        List relevantList = new ArrayList(ic_relevant.length);
-        if (ic_local != null) {
-            // If ic_local is null, this code doesn't get
-            // executed - which means the list ends up being
-            // ic_relevant.
-            for (int index = 0; index < ic_local.length; index++) {
-                result.add(ic_local[index]);
-                resultCopy.add(ic_local[index]);
-                localList.add(ic_local[index]);
-            }
-        }
-        for (int index = 0; index < ic_relevant.length; index++) {
-            result.add(ic_relevant[index]);
-            resultCopy.add(ic_relevant[index]);
-            relevantList.add(ic_relevant[index]);
-        }
-
-        // Since we're removing while iterating, iterate over
-        // a copy.
-        for(int i = 0; i < resultCopy.size(); i++) {
-            IcTuple tuple = (IcTuple) resultCopy.get(i);
-            if (localList.contains(tuple) && relevantList.contains(tuple)) {
-                while (result.remove(tuple));
-            }
-        }
-        IcTuple[] resultArray = new IcTuple[result.size()];
-        for (int index = 0; index < resultArray.length; index++) {
-            resultArray[index] = (IcTuple) result.get(index);
-        }
-        return resultArray;
+    private List computeIcStored(IcTuple[] ic_local, IcTuple[] ic_relevant) {
+    	List result = new ArrayList(ic_relevant.length);
+    	List duplicates = new ArrayList(ic_relevant.length);
+    	Set isInResult = new HashSet(ic_relevant.length);
+
+    	// need to compute:
+    	//   result = ic_local XOR ic_relevant
+    	
+    	// add ic_local
+    	if (ic_local != null) {
+    		for(int index = 0; index < ic_local.length; index++) {
+    			if (isInResult.add(ic_local[index])) { 
+    				result.add(ic_local[index]);
+    			}
+    		}
+    	}
+
+    	// add ic_relevant
+		for(int index = 0; index < ic_relevant.length; index++) {
+			if (isInResult.add(ic_relevant[index])) { 
+				result.add(ic_relevant[index]);
+			} else {
+				duplicates.add(ic_relevant[index]);
+			}
+		}
+
+		// eliminate "duplicates"
+		for(int index = 0; index < duplicates.size(); index++) {
+			IcTuple tuple = (IcTuple)duplicates.get(index);
+			result.remove(tuple);
+		}
+		
+        return result;
     }
 
     /**