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/03/05 15:52:05 UTC

svn commit: r633865 - in /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms: ClassRefForm.java NewClassRefForm.java

Author: sjanuary
Date: Wed Mar  5 06:52:02 2008
New Revision: 633865

URL: http://svn.apache.org/viewvc?rev=633865&view=rev
Log:
Apply patch for HARMONY-5572 ([classlib][pack200] Checkcast bytecode has incorrect class)

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassRefForm.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassRefForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassRefForm.java?rev=633865&r1=633864&r2=633865&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassRefForm.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/ClassRefForm.java Wed Mar  5 06:52:02 2008
@@ -16,7 +16,10 @@
  */
 package org.apache.harmony.pack200.bytecode.forms;
 
+import org.apache.harmony.pack200.Pack200Exception;
 import org.apache.harmony.pack200.SegmentConstantPool;
+import org.apache.harmony.pack200.bytecode.ByteCode;
+import org.apache.harmony.pack200.bytecode.ClassFileEntry;
 import org.apache.harmony.pack200.bytecode.OperandManager;
 
 /**
@@ -38,6 +41,26 @@
         this.widened = widened;
     }
 
+    protected void setNestedEntries(ByteCode byteCode, OperandManager operandManager, int offset) throws Pack200Exception {
+        // If the offset is not zero, proceed normally.
+        if(offset != 0) {
+            super.setNestedEntries(byteCode, operandManager, offset - 1);
+            return;
+        }
+        // If the offset is 0, ClassRefForms refer to
+        // the current class. Add that as the nested class.
+        // (This is true for all bc_classref forms in
+        // the spec except for multianewarray, which has
+        // its own form.)
+        SegmentConstantPool globalPool = operandManager.globalConstantPool();
+        ClassFileEntry[] nested = null;
+        // How do I get this class? 
+        nested = new ClassFileEntry[] {
+                globalPool.getClassPoolEntry(operandManager.getCurrentClass())
+            };
+        byteCode.setNested(nested);
+        byteCode.setNestedPositions(new int[][] {{0,2}});
+    }
     public int getOperandType() {
         return TYPE_CLASSREF;
     }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java?rev=633865&r1=633864&r2=633865&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/forms/NewClassRefForm.java Wed Mar  5 06:52:02 2008
@@ -58,7 +58,9 @@
         } else {
             // Look up the class in the classpool
             try {
-                setNestedEntries(byteCode, operandManager, offset - 1);
+                // Parent takes care of subtracting one from offset
+                // to adjust for 1-based global pool
+                setNestedEntries(byteCode, operandManager, offset);
             } catch (Pack200Exception ex) {
                 throw new Error("Got a pack200 exception. What to do?");
             }