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/05/15 12:50:41 UTC

svn commit: r775082 - in /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200: BcBands.java Segment.java

Author: sjanuary
Date: Fri May 15 10:50:40 2009
New Revision: 775082

URL: http://svn.apache.org/viewvc?rev=775082&view=rev
Log:
Pack200 - complete implementation of BcBands

Modified:
    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/Segment.java

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=775082&r1=775081&r2=775082&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 Fri May 15 10:50:40 2009
@@ -58,10 +58,12 @@
     private List bcThisField = new ArrayList();
     private final List bcSuperField = new ArrayList();
     private List bcThisMethod = new ArrayList();
-    private final List bcSuperMethod = new ArrayList();
-    private final List bcInitRef = new ArrayList();
+    private List bcSuperMethod = new ArrayList();
+    private List bcInitRef = new ArrayList();
 
     private String currentClass;
+    private String superClass;
+    private String currentNewClass;
 
     private static final int MULTIANEWARRAY = 197;
     private static final int ALOAD_0 = 42;
@@ -78,13 +80,16 @@
     private int renumberedOffset;
     private final IntList bcLabelRelativeOffsets = new IntList();
 
-    public void setCurrentClass(String name) {
+    public void setCurrentClass(String name, String superName) {
         currentClass = name;
+        superClass = superName;
     }
 
     public void finaliseBands() {
         bcThisField = getIndexInClass(bcThisField);
         bcThisMethod = getIndexInClass(bcThisMethod);
+        bcSuperMethod = getIndexInClass(bcSuperMethod);
+        bcInitRef = getIndexInClassForConstructor(bcInitRef);
     }
 
     public void pack(OutputStream out) throws IOException, Pack200Exception {
@@ -144,6 +149,15 @@
         return indices;
     }
 
+    private List getIndexInClassForConstructor(List cPMethodList) {
+        List indices = new ArrayList(cPMethodList.size());
+        for (int i = 0; i < cPMethodList.size(); i++) {
+            CPMethodOrField cpMF = (CPMethodOrField) cPMethodList.get(i);
+            indices.add(new Integer(cpMF.getIndexInClassForConstructor()));
+        }
+        return indices;
+    }
+
     public void visitEnd() {
         for (int i = 0; i < bciRenumbering.size(); i++) {
             if (bciRenumbering.get(i) == -1) {
@@ -351,23 +365,25 @@
                 aload_0 = true;
                 opcode += 7;
             }
-
-//            if (opcode == 183 && name.equals("<init>") && !aload_0
-//                    && owner.equals(currentClass)) {
-//                opcode = 230;
-//            } else if (opcode == 183 && name.equals("<init>") && !aload_0
-//                    && owner.equals(superClass)) {
-//                opcode = 231;
-//                // TODO: 232
-//            } else
             if (owner.equals(currentClass)) {
                 opcode += 24; // change to invokevirtual_this,
                 // invokespecial_this etc.
-                bcThisMethod.add(cpBands.getCPMethod(owner, name, desc));
-//            } else if (owner.equals(superClass)) { // TODO
-//                opcode += 38; // change to invokevirtual_super,
-//                // invokespecial_super etc.
-//                bcSuperMethod.add(cpBands.getCPMethod(owner, name, desc));
+
+                if(name.equals("<init>") && opcode == 207) {
+                    opcode = 230; // invokespecial_this_init
+                    bcInitRef.add(cpBands.getCPMethod(owner, name, desc));
+                } else {
+                    bcThisMethod.add(cpBands.getCPMethod(owner, name, desc));
+                }
+            } else if (owner.equals(superClass)) { // TODO
+                opcode += 38; // change to invokevirtual_super,
+                // invokespecial_super etc.
+                if(name.equals("<init>") && opcode == 221) {
+                    opcode = 231; // invokespecial_super_init
+                    bcInitRef.add(cpBands.getCPMethod(owner, name, desc));
+                } else {
+                    bcSuperMethod.add(cpBands.getCPMethod(owner, name, desc));
+                }
             } else {
                 if (aload_0) {
                     opcode -= 7;
@@ -376,7 +392,12 @@
                     // special rewrite in this
                     // case.
                 }
-                bcMethodRef.add(cpBands.getCPMethod(owner, name, desc));
+                if(name.equals("<init>") && opcode == 183 && owner.equals(currentNewClass)) {
+                    opcode = 232; // invokespecial_new_init
+                    bcInitRef.add(cpBands.getCPMethod(owner, name, desc));
+                } else {
+                    bcMethodRef.add(cpBands.getCPMethod(owner, name, desc));
+                }
             }
             bcCodes.add(opcode);
             break;
@@ -419,6 +440,9 @@
         updateRenumbering();
         bcCodes.add(opcode);
         bcClassRef.add(cpBands.getCPClass(type));
+        if(opcode == 187) { // NEW
+            currentNewClass = type;
+        }
     }
 
     public void visitVarInsn(int opcode, int var) {

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=775082&r1=775081&r2=775082&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 Fri May 15 10:50:40 2009
@@ -95,7 +95,7 @@
 
     public void visit(int version, int access, String name, String signature,
             String superName, String[] interfaces) {
-        bcBands.setCurrentClass(name);
+        bcBands.setCurrentClass(name, superName);
         segmentHeader.addMajorVersion(version);
         classBands.addClass(version, access, name, signature, superName,
                 interfaces);