Author: tcurdt
Date: Mon Jan 12 14:59:10 2009
New Revision: 733955
URL: http://svn.apache.org/viewvc?rev=733955&view=rev
Log:
upgrade to asm 3.1 ...the asm code needs a major overhaul
Modified:
commons/sandbox/javaflow/trunk/pom.xml
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/BytecodeClassLoader.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/AsmClassTransformer.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAdapter.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
Modified: commons/sandbox/javaflow/trunk/pom.xml
URL:
http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/pom.xml?rev=733955&r1=733954&r2=733955&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/pom.xml (original)
+++ commons/sandbox/javaflow/trunk/pom.xml Mon Jan 12 14:59:10 2009
@@ -17,47 +17,17 @@
<url>http://commons.apache.org/sandbox/javaflow/</url>
<inceptionYear>2004</inceptionYear>
- <repositories>
-<!--
- <repository>
- <id>apache-maven1-snapshots</id>
- <name>Apache Maven1 Repository</name>
- <url>http://people.apache.org/repository</url>
- <layout>legacy</layout>
- </repository>
- <repository>
- <id>apache-maven2-snapshots</id>
- <name>Apache Maven2 Repository</name>
- <url>http://people.apache.org/maven-snapshot-repository</url>
- </repository>
- <repository>
- <id>codehaus-snapshot</id>
- <name>Maven snapshot Repository</name>
- <url>http://snapshots.maven.codehaus.org/maven2</url>
- </repository>
--->
- </repositories>
-
<developers>
<developer>
<id>tcurdt</id>
<name>Torsten Curdt</name>
<email>tcurdt at apache.org</email>
- <organization>ASF</organization>
- <organizationUrl>http://www.apache.org/</organizationUrl>
- <timezone>+10</timezone>
</developer>
<developer>
<id>kohsuke</id>
<name>Kohsuke Kawaguchi</name>
<email>kohsuke at apache.org</email>
</developer>
- <developer>
- <id>martinc</id>
- <name>Martin Cooper</name>
- <email>[email protected]</email>
- <organization>EMC</organization>
- </developer>
</developers>
<contributors>
@@ -74,13 +44,6 @@
</scm>
<distributionManagement>
-<!--
- <repository>
- <id>apache-maven-snapshot</id>
- <name>repository</name>
-
<url>scpexe://people.apache.org/www/www.apache.org/dist/java-repository</url>
- </repository>
--->
<snapshotRepository>
<id>apache-maven-snapshot</id>
<name>repository</name>
@@ -96,7 +59,7 @@
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
- <version>1.1</version>
+ <version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.bcel</groupId>
@@ -111,32 +74,32 @@
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
- <version>2.2.3</version>
+ <version>3.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-analysis</artifactId>
- <version>2.2.3</version>
+ <version>3.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
- <version>2.2.3</version>
+ <version>3.1</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-util</artifactId>
- <version>2.2.3</version>
+ <version>3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
- <version>1.1</version>
+ <version>1.4</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
- <version>1.5.4</version>
+ <version>1.7.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
@@ -177,6 +140,7 @@
</plugins>
+<!--
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
@@ -184,50 +148,7 @@
<version>1.0-alpha-2</version>
</extension>
</extensions>
+-->
</build>
- <reporting>
-
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-changelog-plugin</artifactId>
- <version>2.1</version>
- </plugin>
-
-<!--
- <plugin>
- <artifactId>maven-surefire-report-plugin</artifactId>
- <version>2.0</version>
- <configuration>
- <forkMode>never</forkMode>
- <includes>
- <include>**/*TestCase.java</include>
- </includes>
- <excludes>
- <exclude>**/Abstract*</exclude>
- </excludes>
- <testFailureIgnore>true</testFailureIgnore>
- </configuration>
- </plugin>
-
- <plugin>
- <artifactId>maven-project-info-reports-plugin</artifactId>
- <inherited>false</inherited>
- <reportSets>
- <reportSet>
- <reports>
- <report>project-team</report>
- <report>mailing-list</report>
- <report>dependencies</report>
- <report>issue-tracking</report>
- <report>license</report>
- <report>scm</report>
- </reports>
- </reportSet>
- </reportSets>
- </plugin>
--->
- </plugins>
- </reporting>
</project>
Modified:
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/BytecodeClassLoader.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/BytecodeClassLoader.java?rev=733955&r1=733954&r2=733955&view=diff
==============================================================================
---
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/BytecodeClassLoader.java
(original)
+++
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/BytecodeClassLoader.java
Mon Jan 12 14:59:10 2009
@@ -26,7 +26,7 @@
public Class loadClass( final byte[] bytecode ) {
final NameClassAdapter nameClassAdapter = new NameClassAdapter();
- new ClassReader(bytecode).accept(nameClassAdapter, false);
+ new ClassReader(bytecode).accept(nameClassAdapter, 0);
final String name = nameClassAdapter.getName().replace('/', '.');
Modified:
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/AsmClassTransformer.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/AsmClassTransformer.java?rev=733955&r1=733954&r2=733955&view=diff
==============================================================================
---
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/AsmClassTransformer.java
(original)
+++
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/AsmClassTransformer.java
Mon Jan 12 14:59:10 2009
@@ -41,8 +41,7 @@
}
private byte[] transform(ClassReader cr) {
- // final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- final ClassWriter cw = new ClassWriter(true, false);
+ final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
// print bytecode before transformation
// cr.accept(new TraceClassVisitor(new ContinuationClassAdapter(this,
cw), new PrintWriter(System.out)), false);
@@ -51,7 +50,7 @@
// cr.accept(new ContinuationClassAdapter(this, new
TraceClassVisitor(cw, new PrintWriter(System.err))), 0);
// cr.accept(new ContinuationClassAdapter(this, new
TraceClassVisitor(cw, new PrintWriter(System.err))), false);
- cr.accept(new ContinuationClassAdapter(new CheckClassAdapter(cw)),
false);
+ cr.accept(new ContinuationClassAdapter(new CheckClassAdapter(cw)), 0);
byte[] bytecode = cw.toByteArray();
Modified:
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAdapter.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAdapter.java?rev=733955&r1=733954&r2=733955&view=diff
==============================================================================
---
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAdapter.java
(original)
+++
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAdapter.java
Mon Jan 12 14:59:10 2009
@@ -19,27 +19,22 @@
import java.util.List;
import org.apache.commons.javaflow.bytecode.StackRecorder;
-
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.analysis.Analyzer;
import org.objectweb.asm.tree.analysis.BasicValue;
import org.objectweb.asm.tree.analysis.Frame;
-
-/**
- * ContinuationMethodAdapter
- *
- * @author Evgueni Koulechov
- */
public final class ContinuationMethodAdapter extends MethodAdapter implements
Opcodes {
private static final String STACK_RECORDER =
Type.getInternalName(StackRecorder.class);
private static final String POP_METHOD = "pop";
private static final String PUSH_METHOD = "push";
+ private final ContinuationMethodAnalyzer canalyzer;
private final Analyzer analyzer;
private Label startLabel = new Label();
private final List labels;
@@ -54,6 +49,7 @@
public ContinuationMethodAdapter(ContinuationMethodAnalyzer a) {
super(a.mv);
+ this.canalyzer = a;
this.analyzer = a.analyzer;
this.labels = a.labels;
this.nodes = a.nodes;
@@ -97,8 +93,7 @@
mv.visitLabel(restoreLabels[i]);
MethodInsnNode mnode = (MethodInsnNode) nodes.get(i);
-
- Frame frame = analyzer.getFrames()[analyzer.getIndex(mnode)];
+ Frame frame = analyzer.getFrames()[canalyzer.getIndex(mnode)];
// for each local variable store the value in locals popping it
from the stack!
// locals
@@ -190,7 +185,7 @@
public void visitLabel(Label label) {
if (currentIndex < labels.size() && label == labels.get(currentIndex))
{
- int i = analyzer.getIndex(nodes.get(currentIndex));
+ int i =
canalyzer.getIndex((AbstractInsnNode)nodes.get(currentIndex));
currentFrame = analyzer.getFrames()[i];
}
mv.visitLabel(label);
Modified:
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
URL:
http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java?rev=733955&r1=733954&r2=733955&view=diff
==============================================================================
---
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
(original)
+++
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
Mon Jan 12 14:59:10 2009
@@ -23,7 +23,6 @@
import java.util.Map;
import java.util.Set;
-
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
@@ -36,17 +35,11 @@
import org.objectweb.asm.tree.VarInsnNode;
import org.objectweb.asm.tree.analysis.Analyzer;
import org.objectweb.asm.tree.analysis.AnalyzerException;
-import org.objectweb.asm.tree.analysis.DataflowInterpreter;
-import org.objectweb.asm.tree.analysis.DataflowValue;
import org.objectweb.asm.tree.analysis.Frame;
import org.objectweb.asm.tree.analysis.SimpleVerifier;
+import org.objectweb.asm.tree.analysis.SourceInterpreter;
+import org.objectweb.asm.tree.analysis.SourceValue;
-
-/**
- * ContinuationMethodAdapter
- *
- * @author Evgueni Koulechov
- */
public class ContinuationMethodAnalyzer extends MethodNode implements Opcodes {
protected final String className;
protected final ClassVisitor cv;
@@ -60,14 +53,17 @@
public int stackRecorderVar;
- public ContinuationMethodAnalyzer(String className, ClassVisitor cv,
- MethodVisitor mv, int access, String
name, String desc, String signature, String[] exceptions) {
+ public ContinuationMethodAnalyzer(String className, ClassVisitor cv,
MethodVisitor mv, int access, String name, String desc, String signature,
String[] exceptions) {
super(access, name, desc, signature, exceptions);
this.className = className;
this.cv = cv;
this.mv = mv;
}
+ public int getIndex(AbstractInsnNode node) {
+ return instructions.indexOf(node);
+ }
+
public void visitMethodInsn(int opcode, String owner, String name, String
desc) {
MethodInsnNode mnode = new MethodInsnNode(opcode, owner, name, desc);
if (opcode == INVOKESPECIAL || "<init>".equals(name)) {
@@ -123,14 +119,13 @@
return new MonitoringFrame(src);
}
- public Frame[] analyze(String owner, MethodNode m)
- throws AnalyzerException {
- System.out.println("Analyze:
"+owner+"|"+m.name+"|"+m.signature+"|"+m.tryCatchBlocks);
+ public Frame[] analyze(String owner, MethodNode m) throws
AnalyzerException {
+ //System.out.println("Analyze:
"+owner+"|"+m.name+"|"+m.signature+"|"+m.tryCatchBlocks);
Frame[] framesa = super.analyze(owner, m);
for (int i = 0; i < m.instructions.size(); i++) {
int opcode = ((AbstractInsnNode)
m.instructions.get(i)).getOpcode();
if (opcode == MONITORENTER || opcode == MONITOREXIT) {
- System.out.println(i);
+ //System.out.println(i);
}
}
@@ -149,7 +144,7 @@
}
void moveNew() throws AnalyzerException {
- DataflowInterpreter i = new DataflowInterpreter();
+ SourceInterpreter i = new SourceInterpreter();
Analyzer a = new Analyzer(i);
a.analyze(className, this);
@@ -159,11 +154,11 @@
for (int j = 0; j < methods.size(); j++) {
MethodInsnNode mnode = (MethodInsnNode) methods.get(j);
// require to move NEW instruction
- int n = a.getIndex(mnode);
+ int n = instructions.indexOf(mnode);
Frame f = frames[n];
Type[] args = Type.getArgumentTypes(mnode.desc);
- DataflowValue v = (DataflowValue) f.getStack(f.getStackSize() -
args.length - 1);
+ SourceValue v = (SourceValue) f.getStack(f.getStackSize() -
args.length - 1);
Set insns = v.insns;
for (Iterator it = insns.iterator(); it.hasNext();) {
AbstractInsnNode ins = (AbstractInsnNode) it.next();
@@ -171,7 +166,7 @@
movable.put(ins, mnode);
} else {
// other known patterns
- int n1 = a.getIndex(ins);
+ int n1 = instructions.indexOf(ins);
if (ins.getOpcode() == DUP) { // <init> with params
AbstractInsnNode ins1 = (AbstractInsnNode)
instructions.get(n1 - 1);
if (ins1.getOpcode() == NEW) {
@@ -209,29 +204,47 @@
}
MethodInsnNode mnode = (MethodInsnNode) e.getValue();
- int nm = instructions.indexOf(mnode);
+ AbstractInsnNode nm = mnode;
+ AbstractInsnNode next;
int varOffset = stackRecorderVar + 1;
Type[] args = Type.getArgumentTypes(mnode.desc);
// optimizations for some common cases
if (args.length == 0) {
- instructions.add(nm++, node1); // NEW
+ next = node1;
+ instructions.insert(nm, next); // NEW
+ nm = next;
if (requireDup) {
- instructions.add(nm++, new InsnNode(DUP));
+ next = new InsnNode(DUP);
+ instructions.insert(nm, next);
+ nm = next;
}
continue;
}
if (args.length == 1 && args[0].getSize() == 1) {
- instructions.add(nm++, node1); // NEW
+ next = node1;
+ instructions.insert(nm, next); // NEW
+ nm = next;
if (requireDup) {
- instructions.add(nm++, new InsnNode(DUP));
- instructions.add(nm++, new InsnNode(DUP2_X1));
- instructions.add(nm++, new InsnNode(POP2));
+ next = new InsnNode(DUP);
+ instructions.insert(nm, next);
+ nm = next;
+
+ next = new InsnNode(DUP2_X1);
+ instructions.insert(nm, next);
+ nm = next;
+
+ next = new InsnNode(POP2);
+ instructions.insert(nm, next);
+ nm = next;
+
updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack;
// a two extra slots for temp values
} else {
- instructions.add(nm++, new InsnNode(SWAP));
+ next = new InsnNode(SWAP);
+ instructions.insert(nm, next);
+ nm = next;
}
continue;
}
@@ -239,15 +252,32 @@
// TODO this one untested!
if ((args.length == 1 && args[0].getSize() == 2) ||
(args.length == 2 && args[0].getSize() == 1 &&
args[1].getSize() == 1)) {
- instructions.add(nm++, node1); // NEW
+ next = node1;
+ instructions.insert(nm, next); // NEW
+ nm = next;
if (requireDup) {
- instructions.add(nm++, new InsnNode(DUP));
- instructions.add(nm++, new InsnNode(DUP2_X2));
- instructions.add(nm++, new InsnNode(POP2));
+ next = new InsnNode(DUP);
+ instructions.insert(nm, next);
+ nm = next;
+
+ next = new InsnNode(DUP2_X2);
+ instructions.insert(nm, next);
+ nm = next;
+
+ next = new InsnNode(POP2);
+ instructions.insert(nm, next);
+ nm = next;
+
updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack;
// a two extra slots for temp values
} else {
- instructions.add(nm++, new InsnNode(DUP_X2));
- instructions.add(nm++, new InsnNode(POP));
+ next = new InsnNode(DUP_X2);
+ instructions.insert(nm, next);
+ nm = next;
+
+ next = new InsnNode(POP);
+ instructions.insert(nm, next);
+ nm = next;
+
updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack;
// an extra slot for temp value
}
continue;
@@ -257,28 +287,47 @@
// save stack
for (int j = args.length - 1; j >= 0; j--) {
Type type = args[j];
- instructions.add(nm++, new VarInsnNode(type.getOpcode(ISTORE),
varOffset));
+
+ next = new VarInsnNode(type.getOpcode(ISTORE), varOffset);
+ instructions.insert(nm, next);
+ nm = next;
+
varOffset += type.getSize();
}
if (varOffset > maxLocals) {
maxLocals = varOffset;
}
- instructions.add(nm++, node1); // NEW
+ next = node1;
+ instructions.insert(nm, next); // NEW
+ nm = next;
+
if (requireDup) {
- instructions.add(nm++, new InsnNode(DUP));
+ next = new InsnNode(DUP);
+ instructions.insert(nm, next);
+ nm = next;
}
// restore stack
for (int j = 0; j < args.length; j++) {
Type type = args[j];
varOffset -= type.getSize();
- instructions.add(nm++, new VarInsnNode(type.getOpcode(ILOAD),
varOffset));
+
+ next = new VarInsnNode(type.getOpcode(ILOAD), varOffset);
+ instructions.insert(nm, next);
+ nm = next;
+
// clean up store to avoid memory leak?
if (type.getSort() == Type.OBJECT || type.getSort() ==
Type.ARRAY) {
updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack;
// an extra slot for ACONST_NULL
- instructions.add(nm++, new InsnNode(ACONST_NULL));
- instructions.add(nm++, new
VarInsnNode(type.getOpcode(ISTORE), varOffset));
+
+ next = new InsnNode(ACONST_NULL);
+ instructions.insert(nm, next);
+ nm = next;
+
+ next = new VarInsnNode(type.getOpcode(ISTORE), varOffset);
+ instructions.insert(nm, next);
+ nm = next;
}
}
}