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) {