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/01/22 14:54:12 UTC

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

Author: sjanuary
Date: Thu Jan 22 05:54:11 2009
New Revision: 736640

URL: http://svn.apache.org/viewvc?rev=736640&view=rev
Log:
Unpack200 - bug fix to correct ordering of method and field attributes

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

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java?rev=736640&r1=736639&r2=736640&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/unpack200/ClassBands.java Thu Jan 22 05:54:11 2009
@@ -207,39 +207,6 @@
                 Codec.UNSIGNED5, signatureCount);
         int signatureIndex = 0;
 
-        int backwardsCallsUsed = parseFieldMetadataBands(in, fieldAttrCalls);
-
-        // Parse non-predefined attribute bands
-        int backwardsCallIndex = backwardsCallsUsed;
-        int limit = options.hasFieldFlagsHi() ? 62 : 31;
-        AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
-        int[] counts = new int[limit + 1];
-        List[] otherAttributes = new List[limit + 1];
-        for (int i = 0; i < limit; i++) {
-            AttributeLayout layout = attrMap.getAttributeLayout(i,
-                    AttributeLayout.CONTEXT_FIELD);
-            if (layout != null && !(layout.isDefaultLayout())) {
-                otherLayouts[i] = layout;
-                counts[i] = SegmentUtils.countMatches(fieldFlags, layout);
-            }
-        }
-        for (int i = 0; i < counts.length; i++) {
-            if (counts[i] > 0) {
-                NewAttributeBands bands = attrMap
-                        .getAttributeBands(otherLayouts[i]);
-                otherAttributes[i] = bands.parseAttributes(in, counts[i]);
-                int numBackwardsCallables = otherLayouts[i]
-                        .numBackwardsCallables();
-                if (numBackwardsCallables > 0) {
-                    int[] backwardsCalls = new int[numBackwardsCallables];
-                    System.arraycopy(fieldAttrCalls, backwardsCallIndex,
-                            backwardsCalls, 0, numBackwardsCallables);
-                    bands.setBackwardsCalls(backwardsCalls);
-                    backwardsCallIndex += numBackwardsCallables;
-                }
-            }
-        }
-
         AttributeLayout deprecatedLayout = attrMap.getAttributeLayout(
                 AttributeLayout.ATTRIBUTE_DEPRECATED,
                 AttributeLayout.CONTEXT_FIELD);
@@ -276,12 +243,56 @@
                     fieldAttributes[i][j].add(new SignatureAttribute(value));
                     signatureIndex++;
                 }
-                // Non-predefined attributes
+            }
+        }
+
+        int backwardsCallsUsed = parseFieldMetadataBands(in, fieldAttrCalls);
+
+        // Parse non-predefined attribute bands
+        int backwardsCallIndex = backwardsCallsUsed;
+        int limit = options.hasFieldFlagsHi() ? 62 : 31;
+        AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
+        int[] counts = new int[limit + 1];
+        List[] otherAttributes = new List[limit + 1];
+        for (int i = 0; i < limit; i++) {
+            AttributeLayout layout = attrMap.getAttributeLayout(i,
+                    AttributeLayout.CONTEXT_FIELD);
+            if (layout != null && !(layout.isDefaultLayout())) {
+                otherLayouts[i] = layout;
+                counts[i] = SegmentUtils.countMatches(fieldFlags, layout);
+            }
+        }
+        for (int i = 0; i < counts.length; i++) {
+            if (counts[i] > 0) {
+                NewAttributeBands bands = attrMap
+                        .getAttributeBands(otherLayouts[i]);
+                otherAttributes[i] = bands.parseAttributes(in, counts[i]);
+                int numBackwardsCallables = otherLayouts[i]
+                        .numBackwardsCallables();
+                if (numBackwardsCallables > 0) {
+                    int[] backwardsCalls = new int[numBackwardsCallables];
+                    System.arraycopy(fieldAttrCalls, backwardsCallIndex,
+                            backwardsCalls, 0, numBackwardsCallables);
+                    bands.setBackwardsCalls(backwardsCalls);
+                    backwardsCallIndex += numBackwardsCallables;
+                }
+            }
+        }
+
+        // Non-predefined attributes
+        for (int i = 0; i < classCount; i++) {
+            for (int j = 0; j < fieldFlags[i].length; j++) {
+                long flag = fieldFlags[i][j];
+                int othersAddedAtStart = 0;
                 for (int k = 0; k < otherLayouts.length; k++) {
                     if (otherLayouts[k] != null
                             && otherLayouts[k].matches(flag)) {
                         // Add the next attribute
-                        fieldAttributes[i][j].add(otherAttributes[k].get(0));
+                        if(otherLayouts[k].getIndex()<15) {
+                            fieldAttributes[i][j].add(othersAddedAtStart++, otherAttributes[k].get(0));
+                        } else {
+                            fieldAttributes[i][j].add(otherAttributes[k].get(0));
+                        }
                         otherAttributes[k].remove(0);
                     }
                 }
@@ -340,40 +351,6 @@
         long[] methodSignatureRS = decodeBandLong("method_signature_RS", in,
                 Codec.UNSIGNED5, count1);
 
-        // Parse method metadata bands
-        int backwardsCallsUsed = parseMethodMetadataBands(in, methodAttrCalls);
-
-        // Parse non-predefined attribute bands
-        int backwardsCallIndex = backwardsCallsUsed;
-        int limit = options.hasMethodFlagsHi() ? 62 : 31;
-        AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
-        int[] counts = new int[limit + 1];
-        List[] otherAttributes = new List[limit + 1];
-        for (int i = 0; i < limit; i++) {
-            AttributeLayout layout = attrMap.getAttributeLayout(i,
-                    AttributeLayout.CONTEXT_METHOD);
-            if (layout != null && !(layout.isDefaultLayout())) {
-                otherLayouts[i] = layout;
-                counts[i] = SegmentUtils.countMatches(methodFlags, layout);
-            }
-        }
-        for (int i = 0; i < counts.length; i++) {
-            if (counts[i] > 0) {
-                NewAttributeBands bands = attrMap
-                        .getAttributeBands(otherLayouts[i]);
-                otherAttributes[i] = bands.parseAttributes(in, counts[i]);
-                int numBackwardsCallables = otherLayouts[i]
-                        .numBackwardsCallables();
-                if (numBackwardsCallables > 0) {
-                    int[] backwardsCalls = new int[numBackwardsCallables];
-                    System.arraycopy(methodAttrCalls, backwardsCallIndex,
-                            backwardsCalls, 0, numBackwardsCallables);
-                    bands.setBackwardsCalls(backwardsCalls);
-                    backwardsCallIndex += numBackwardsCallables;
-                }
-            }
-        }
-
         AttributeLayout deprecatedLayout = attrMap.getAttributeLayout(
                 AttributeLayout.ATTRIBUTE_DEPRECATED,
                 AttributeLayout.CONTEXT_METHOD);
@@ -384,16 +361,6 @@
         for (int i = 0; i < methodAttributes.length; i++) {
             for (int j = 0; j < methodAttributes[i].length; j++) {
                 long flag = methodFlags[i][j];
-             // Non-predefined attributes
-                for (int k = 0; k < otherLayouts.length; k++) {
-                    if (otherLayouts[k] != null
-                            && otherLayouts[k].matches(flag)
-                            && otherLayouts[k].getIndex() < 15) {
-                        // Add the next attribute
-                        methodAttributes[i][j].add(otherAttributes[k].get(0));
-                        otherAttributes[k].remove(0);
-                    }
-                }
                 if (methodExceptionsLayout.matches(flag)) {
                     int n = numExceptions[methodExceptionsIndex];
                     int[] exceptions = methodExceptionsRS[methodExceptionsIndex];
@@ -425,13 +392,57 @@
                 if (deprecatedLayout.matches(flag)) {
                     methodAttributes[i][j].add(new DeprecatedAttribute());
                 }
-                // Non-predefined attributes
+            }
+        }
+
+        // Parse method metadata bands
+        int backwardsCallsUsed = parseMethodMetadataBands(in, methodAttrCalls);
+
+        // Parse non-predefined attribute bands
+        int backwardsCallIndex = backwardsCallsUsed;
+        int limit = options.hasMethodFlagsHi() ? 62 : 31;
+        AttributeLayout[] otherLayouts = new AttributeLayout[limit + 1];
+        int[] counts = new int[limit + 1];
+        List[] otherAttributes = new List[limit + 1];
+        for (int i = 0; i < limit; i++) {
+            AttributeLayout layout = attrMap.getAttributeLayout(i,
+                    AttributeLayout.CONTEXT_METHOD);
+            if (layout != null && !(layout.isDefaultLayout())) {
+                otherLayouts[i] = layout;
+                counts[i] = SegmentUtils.countMatches(methodFlags, layout);
+            }
+        }
+        for (int i = 0; i < counts.length; i++) {
+            if (counts[i] > 0) {
+                NewAttributeBands bands = attrMap
+                        .getAttributeBands(otherLayouts[i]);
+                otherAttributes[i] = bands.parseAttributes(in, counts[i]);
+                int numBackwardsCallables = otherLayouts[i]
+                        .numBackwardsCallables();
+                if (numBackwardsCallables > 0) {
+                    int[] backwardsCalls = new int[numBackwardsCallables];
+                    System.arraycopy(methodAttrCalls, backwardsCallIndex,
+                            backwardsCalls, 0, numBackwardsCallables);
+                    bands.setBackwardsCalls(backwardsCalls);
+                    backwardsCallIndex += numBackwardsCallables;
+                }
+            }
+        }
+
+        // Non-predefined attributes
+        for (int i = 0; i < methodAttributes.length; i++) {
+            for (int j = 0; j < methodAttributes[i].length; j++) {
+                long flag = methodFlags[i][j];
+                int othersAddedAtStart = 0;
                 for (int k = 0; k < otherLayouts.length; k++) {
                     if (otherLayouts[k] != null
-                            && otherLayouts[k].matches(flag)
-                            && otherLayouts[k].getIndex() >= 15) {
+                            && otherLayouts[k].matches(flag)) {
                         // Add the next attribute
-                        methodAttributes[i][j].add(otherAttributes[k].get(0));
+                        if(otherLayouts[k].getIndex() < 15) {
+                            methodAttributes[i][j].add(othersAddedAtStart++, otherAttributes[k].get(0));
+                        } else {
+                            methodAttributes[i][j].add(otherAttributes[k].get(0));
+                        }
                         otherAttributes[k].remove(0);
                     }
                 }