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;
                 }
             }
         }


Reply via email to