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 16:39:20 UTC

svn commit: r633879 - in /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200: BcBands.java bytecode/CodeAttribute.java bytecode/ExceptionTableEntry.java

Author: sjanuary
Date: Wed Mar  5 07:39:18 2008
New Revision: 633879

URL: http://svn.apache.org/viewvc?rev=633879&view=rev
Log:
Apply patch for HARMONY-5573 ([classlib][pack200] Caught exceptions may not resolve correctly)

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/bytecode/CodeAttribute.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ExceptionTableEntry.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=633879&r1=633878&r2=633879&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 Wed Mar  5 07:39:18 2008
@@ -386,7 +386,13 @@
                     if(handlerCount != null) {
                         for (int j = 0; j < handlerCount[i]; j++) {
                             String handlerClass = handlerClassTypes[i][j];
-                            CPClass cpHandlerClass = segment.getCpBands().cpClassValue(handlerClass);
+                            CPClass cpHandlerClass = null;
+                            if(handlerClass != null) {
+                                // The handlerClass will be null if the
+                                // catch is a finally (that is, the
+                                // exception table catch_type should be 0
+                                cpHandlerClass = segment.getCpBands().cpClassValue(handlerClass);
+                            }
                             ExceptionTableEntry entry = new ExceptionTableEntry(
                                     handlerStartPCs[i][j], handlerEndPCs[i][j],
                                     handlerCatchPCs[i][j], cpHandlerClass);

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java?rev=633879&r1=633878&r2=633879&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/CodeAttribute.java Wed Mar  5 07:39:18 2008
@@ -101,9 +101,18 @@
         ArrayList nestedEntries = new ArrayList();
         nestedEntries.add(getAttributeName());
         nestedEntries.addAll(byteCodes);
-        // TODO: Is this the right place to add code attribute
-        // attributes?
         nestedEntries.addAll(attributes);
+        // Don't forget to add the ExceptionTable catch_types
+        for (Iterator iter = exceptionTable.iterator(); iter.hasNext();) {
+            ExceptionTableEntry entry = (ExceptionTableEntry) iter.next();
+            CPClass catchType = entry.getCatchType();
+            // If the catch type is null, this is a finally
+            // block. If it's not null, we need to add the
+            // CPClass to the list of nested class file entries.
+            if(catchType != null) {
+                nestedEntries.add(catchType);
+            }
+        }
         ClassFileEntry[] nestedEntryArray = new ClassFileEntry[nestedEntries
                 .size()];
         nestedEntries.toArray(nestedEntryArray);

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ExceptionTableEntry.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ExceptionTableEntry.java?rev=633879&r1=633878&r2=633879&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ExceptionTableEntry.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/bytecode/ExceptionTableEntry.java Wed Mar  5 07:39:18 2008
@@ -32,6 +32,22 @@
     private int handlerPcRenumbered;
     private int catchTypeIndex;
 
+    /**
+     * Create a new ExceptionTableEntry. Exception tables are
+     * of two kinds: either a normal one (with a Throwable as
+     * the catch_type) or a finally clause (which has no
+     * catch_type). In the class file, the finally clause is
+     * represented as catch_type == 0.
+     * 
+     * To create a finally clause with this method, pass in
+     * null for the catchType.
+     * 
+     * @param startPC int
+     * @param endPC int
+     * @param handlerPC int
+     * @param catchType CPClass (if it's a normal catch) or null
+     *  (if it's a finally clause).
+     */
     public ExceptionTableEntry(int startPC, int endPC, int handlerPC, CPClass catchType) {
         this.startPC = startPC;
         this.endPC = endPC;
@@ -54,7 +70,17 @@
         handlerPcRenumbered = ((Integer)byteCodeOffsets.get(handlerPcIndex)).intValue();
     }
 
+    public CPClass getCatchType() {
+        return catchType;
+    }
+    
     public void resolve(ClassConstantPool pool) {
+        if(catchType == null) {
+            // If the catch type is a finally clause
+            // the index is always 0.
+            catchTypeIndex = 0;
+            return;
+        }
         catchType.resolve(pool);
         catchTypeIndex = pool.indexOf(catchType);
     }