You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gu...@apache.org on 2013/05/02 21:24:05 UTC

svn commit: r1478497 - in /felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo: manipulation/InnerClassManipulator.java manipulation/Manipulator.java manipulator/ManipulationEngine.java

Author: guillaume
Date: Thu May  2 19:24:05 2013
New Revision: 1478497

URL: http://svn.apache.org/r1478497
Log:
FELIX-4046 Inner class manipulation fails with expanded frames

Modified:
    felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/InnerClassManipulator.java
    felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
    felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/ManipulationEngine.java

Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/InnerClassManipulator.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/InnerClassManipulator.java?rev=1478497&r1=1478496&r2=1478497&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/InnerClassManipulator.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/InnerClassManipulator.java Thu May  2 19:24:05 2013
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Opcodes;
 
 /**
  * Manipulates inner class allowing outer class access. The manipulated class
@@ -60,13 +61,17 @@ public class InnerClassManipulator {
      * @return manipulated class
      * @throws IOException the class cannot be read correctly
      */
-    public byte[] manipulate(byte[] in) throws IOException {
+    public byte[] manipulate(byte[] in, int version) throws IOException {
         InputStream is1 = new ByteArrayInputStream(in);
 
         ClassReader cr = new ClassReader(is1);
         ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
         InnerClassAdapter adapter = new InnerClassAdapter(cw, m_outer, m_fields);
-        cr.accept(adapter, ClassReader.SKIP_FRAMES);
+        if (version >= Opcodes.V1_6) {
+            cr.accept(adapter, ClassReader.EXPAND_FRAMES);
+        } else {
+            cr.accept(adapter, 0);
+        }
         is1.close();
 
         return cw.toByteArray();

Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java?rev=1478497&r1=1478496&r2=1478497&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java Thu May  2 19:24:05 2013
@@ -64,6 +64,11 @@ public class Manipulator {
     private List<String> m_inners;
 
     /**
+     * Java byte code version.
+     */
+    private int m_version;
+
+    /**
      * Manipulate the given byte array.
      * @param origin : original class.
      * @return the manipulated class, if the class is already manipulated, the original class.
@@ -89,6 +94,8 @@ public class Manipulator {
 
         m_inners = ck.getInnerClasses();
 
+        m_version = ck.getClassVersion();
+
         ClassWriter finalWriter = null;
         if (!ck.isalreadyManipulated()) {
             // Manipulation ->
@@ -160,4 +167,7 @@ public class Manipulator {
         return m_inners;
     }
 
+    public int getClassVersion() {
+        return m_version;
+    }
 }

Modified: felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/ManipulationEngine.java
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/ManipulationEngine.java?rev=1478497&r1=1478496&r2=1478497&view=diff
==============================================================================
--- felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/ManipulationEngine.java (original)
+++ felix/trunk/ipojo/manipulator/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/ManipulationEngine.java Thu May  2 19:24:05 2013
@@ -133,9 +133,12 @@ public class ManipulationEngine {
                     }
 
                     // Manipulate inner class
+                    // Notice that (for performance reason) re-use the class version information
+                    // discovered in the main class instead of re-parsing the inner class to find
+                    // its own class version
                     try {
                         InnerClassManipulator innerManipulator = new InnerClassManipulator(outerClassInternalName, manipulator.getFields().keySet());
-                        byte[] manipulated = innerManipulator.manipulate(innerClassBytecode);
+                        byte[] manipulated = innerManipulator.manipulate(innerClassBytecode, manipulator.getClassVersion());
                         // Propagate manipulated resource
                         result.visitManipulatedResource(resourcePath, manipulated);
                     } catch (IOException e) {