You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tc...@apache.org on 2012/06/29 09:25:01 UTC

svn commit: r1355250 - in /commons/sandbox/javaflow/trunk: ./ src/main/java/org/apache/commons/javaflow/ant/ src/main/java/org/apache/commons/javaflow/bytecode/ src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ src/main/java/org/ap...

Author: tcurdt
Date: Fri Jun 29 07:24:56 2012
New Revision: 1355250

URL: http://svn.apache.org/viewvc?rev=1355250&view=rev
Log:
applied https://issues.apache.org/jira/browse/SANDBOX-418 from Marc Bridner, removed BCEL in favour of ASM4 with java7 support, trunk is now 2.0

Added:
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java   (with props)
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java   (with props)
Removed:
    commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/
Modified:
    commons/sandbox/javaflow/trunk/CREDITS.txt
    commons/sandbox/javaflow/trunk/pom.xml
    commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ant/AntRewriteTask.java
    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/Continuable.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/ContinuationClassAdapter.java
    commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAdapter.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/AsmTestSuite.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/BcelTestSuite.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/helper/ClassTransformerClassLoader.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess1.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess3.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/RewriteBugs.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/SerializationTestCase.java
    commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/VerificationTestCase.java

Modified: commons/sandbox/javaflow/trunk/CREDITS.txt
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/CREDITS.txt?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/CREDITS.txt (original)
+++ commons/sandbox/javaflow/trunk/CREDITS.txt Fri Jun 29 07:24:56 2012
@@ -9,4 +9,4 @@ and migration mechanism was borrowed fro
 Brakes research project. The javaflow project would like
 to thank the Brakes team for their efforts in this space.
 
-http://www.cs.kuleuven.ac.be/cwis/research/distrinet/public/research/showproject.php?ABBREV=brakes
+http://people.cs.kuleuven.be/~eddy.truyen/BRAKES/brakes.html

Modified: commons/sandbox/javaflow/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/pom.xml?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/pom.xml (original)
+++ commons/sandbox/javaflow/trunk/pom.xml Fri Jun 29 07:24:56 2012
@@ -12,7 +12,7 @@
   </parent>
   
   <artifactId>commons-javaflow</artifactId>
-  <version>1.0-SNAPSHOT</version>
+  <version>2.0-SNAPSHOT</version>
   <name>Commons Javaflow (Sandbox)</name>
   <url>http://commons.apache.org/sandbox/javaflow/</url>
   <inceptionYear>2004</inceptionYear>
@@ -39,6 +39,10 @@
       <name>Valery Silaev</name>
       <email>vsilaev at gmail.com</email>
     </contributor>
+    <contributor>
+      <name>Marc Bridner</name>
+      <email>marc at bridner.com</email>
+    </contributor>
   </contributors>
 
   <scm>
@@ -61,39 +65,34 @@
       <version>1.1.1</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.bcel</groupId>
-      <artifactId>bcel</artifactId>
-      <version>5.2</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-jci-core</artifactId>
       <version>1.0</version>
     </dependency>
     <dependency>
-      <groupId>asm</groupId>
+      <groupId>org.ow2.asm</groupId>
       <artifactId>asm</artifactId>
-      <version>3.2</version>
+      <version>4.0</version>
     </dependency>
     <dependency>
-      <groupId>asm</groupId>
+      <groupId>org.ow2.asm</groupId>
       <artifactId>asm-analysis</artifactId>
-      <version>3.2</version>
+      <version>4.0</version>
     </dependency>
     <dependency>
-      <groupId>asm</groupId>
+      <groupId>org.ow2.asm</groupId>
       <artifactId>asm-commons</artifactId>
-      <version>3.2</version>
+      <version>4.0</version>
     </dependency>
     <dependency>
-      <groupId>asm</groupId>
+      <groupId>org.ow2.asm</groupId>
       <artifactId>asm-util</artifactId>
-      <version>3.2</version>
+      <version>4.0</version>
     </dependency>
     <dependency>
-      <groupId>asm</groupId>
+      <groupId>org.ow2.asm</groupId>
       <artifactId>asm-tree</artifactId>
-      <version>3.2</version>
+      <version>4.0</version>
     </dependency>
     <dependency>
       <groupId>commons-io</groupId>
@@ -120,8 +119,8 @@
   </dependencies>
 
   <properties>
-    <maven.compile.source>1.5</maven.compile.source>
-    <maven.compile.target>1.5</maven.compile.target>
+    <maven.compile.source>1.6</maven.compile.source>
+    <maven.compile.target>1.6</maven.compile.target>
     <commons.componentid>javaflow</commons.componentid>
     <commons.jira.componentid>12311186</commons.jira.componentid>
   </properties> 

Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ant/AntRewriteTask.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ant/AntRewriteTask.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ant/AntRewriteTask.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ant/AntRewriteTask.java Fri Jun 29 07:24:56 2012
@@ -25,7 +25,6 @@ import java.util.jar.JarOutputStream;
 
 import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer;
 import org.apache.commons.javaflow.bytecode.transformation.asm.AsmClassTransformer;
-import org.apache.commons.javaflow.bytecode.transformation.bcel.BcelClassTransformer;
 import org.apache.commons.javaflow.utils.RewritingUtils;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DirectoryScanner;
@@ -36,7 +35,6 @@ import org.apache.tools.ant.types.FileSe
 /**
  * Ant task that enhances class files with javaflow instrumentation.
  */
-@SuppressWarnings("deprecation")
 public class AntRewriteTask extends MatchingTask {
 
     private ResourceTransformer transformer;
@@ -71,13 +69,10 @@ public class AntRewriteTask extends Matc
      * of the other (and this option will be removed then.)
      *
      * @param name
-     *      either "BCEL" or "ASM". Case insensitive.
+     *      "ASM". Case insensitive.
      */
     public void setMode(String name) {
-        name = name.toLowerCase();
-        if(name.equals("bcel")) {
-            transformer = new BcelClassTransformer(srcDir);
-        } else if(name.equals("asm")) {
+        if(name.equalsIgnoreCase("asm")) {
             transformer = new AsmClassTransformer();
         } else {
             throw new BuildException("Unrecognized mode: "+name);
@@ -158,6 +153,5 @@ public class AntRewriteTask extends Matc
         } catch (IOException e) {
             throw new BuildException(e);
         }
-
     }
 }

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=1355250&r1=1355249&r2=1355250&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 Fri Jun 29 07:24:56 2012
@@ -16,17 +16,17 @@
  */
 package org.apache.commons.javaflow.bytecode;
 
-import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.commons.EmptyVisitor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Opcodes;
 
 public class BytecodeClassLoader extends ClassLoader {
 
-    class NameClassAdapter extends ClassAdapter {
+    class NameClassAdapter extends ClassVisitor {
         private String className;
 
         public NameClassAdapter() {
-            super(new EmptyVisitor());
+            super(Opcodes.ASM4);
         }
         
         public void visit( int version, int access, String name, String signature, String superName, String[] interfaces ) {

Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Continuable.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Continuable.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Continuable.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Continuable.java Fri Jun 29 07:24:56 2012
@@ -17,9 +17,7 @@
 package org.apache.commons.javaflow.bytecode;
 
 /**
- * Marker interface to mark classes, which are transformed by the 
- * ContinuationClassLoader.
- *
+ * Marker interface to mark classes that are transformed by the AsmClassTransformer.
  */
 public interface Continuable {
 }

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=1355250&r1=1355249&r2=1355250&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 Fri Jun 29 07:24:56 2012
@@ -42,7 +42,7 @@ public final class AsmClassTransformer i
     }
 
     private byte[] transform(final ClassReader cr) {
-        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
+        final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
         // print bytecode before transformation
         // cr.accept(new TraceClassVisitor(new ContinuationClassAdapter(this, cw), new PrintWriter(System.out)), false);
 

Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationClassAdapter.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationClassAdapter.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationClassAdapter.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationClassAdapter.java Fri Jun 29 07:24:56 2012
@@ -16,22 +16,39 @@
  */
 package org.apache.commons.javaflow.bytecode.transformation.asm;
 
-import org.objectweb.asm.ClassAdapter;
+import org.apache.commons.javaflow.bytecode.Continuable;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
 
-public final class ContinuationClassAdapter extends ClassAdapter {
+public final class ContinuationClassAdapter extends ClassVisitor {
 
     private String className;
 
     public ContinuationClassAdapter(ClassVisitor cv) {
-        super(cv);
+        super(Opcodes.ASM4, cv);
     }
 
-
     public void visit( int version, int access, String name, String signature, String superName, String[] interfaces ) {
-        cv.visit(version, access, name, signature, superName, interfaces);
         className = name;
+        
+        // Check that it doesn't implement Continuable (already been instrumented)
+        String[] newInterfaces = new String[interfaces.length + 1];
+        for(int i = 0; i < interfaces.length; i++)
+        {
+            if(interfaces[i].equals(Type.getInternalName(Continuable.class)))
+            {
+                throw new RuntimeException(className + " has already been instrumented");
+            }
+            
+            newInterfaces[i] = interfaces[i];
+        }
+        
+        // Add the Continuable interface so that the class is marked and wont be instrumented again by mistake
+        newInterfaces[newInterfaces.length - 1] = Type.getInternalName(Continuable.class);
+
+        cv.visit(version, access, name, signature, superName, newInterfaces);        
     }
 
     public MethodVisitor visitMethod( int access, String name, String desc, String signature, String[] exceptions ) {

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=1355250&r1=1355249&r2=1355250&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 Fri Jun 29 07:24:56 2012
@@ -20,7 +20,7 @@ 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.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.tree.AbstractInsnNode;
@@ -29,7 +29,7 @@ import org.objectweb.asm.tree.analysis.A
 import org.objectweb.asm.tree.analysis.BasicValue;
 import org.objectweb.asm.tree.analysis.Frame;
 
-public final class ContinuationMethodAdapter extends MethodAdapter implements Opcodes {
+public final class ContinuationMethodAdapter extends MethodVisitor implements Opcodes {
 
     private static final String STACK_RECORDER = Type.getInternalName(StackRecorder.class);
     private static final String POP_METHOD = "pop";
@@ -49,7 +49,7 @@ public final class ContinuationMethodAda
 
 
     public ContinuationMethodAdapter(ContinuationMethodAnalyzer a) {
-        super(a.mv);
+        super(Opcodes.ASM4, a.mv);
         this.canalyzer = a;
         this.analyzer = a.analyzer;
         this.labels = a.labels;

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/AsmTestSuite.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/AsmTestSuite.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/AsmTestSuite.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/AsmTestSuite.java Fri Jun 29 07:24:56 2012
@@ -25,10 +25,15 @@ import org.apache.commons.javaflow.helpe
 import org.apache.commons.javaflow.rewrite.BlackRed;
 import org.apache.commons.javaflow.rewrite.ClassAccess1;
 import org.apache.commons.javaflow.rewrite.ClassAccess2;
+import org.apache.commons.javaflow.rewrite.ClassAccess3;
+import org.apache.commons.javaflow.rewrite.ConstructorInvocation;
 import org.apache.commons.javaflow.rewrite.CounterFlow;
 import org.apache.commons.javaflow.rewrite.DefaultConstructor;
+import org.apache.commons.javaflow.rewrite.NestedSynchronized;
 import org.apache.commons.javaflow.rewrite.NewObject;
 import org.apache.commons.javaflow.rewrite.NoReference;
+import org.apache.commons.javaflow.rewrite.NullLocalVariable;
+import org.apache.commons.javaflow.rewrite.NullVariableMethodFlow;
 import org.apache.commons.javaflow.rewrite.RewriteBugs;
 import org.apache.commons.javaflow.rewrite.Simple;
 import org.apache.commons.javaflow.rewrite.SimpleSerializable;
@@ -40,34 +45,40 @@ import org.apache.commons.javaflow.suite
 
 public final class AsmTestSuite extends TestSuite {
 
-	public static Test suite() throws Exception {
+    @SuppressWarnings("unchecked")
+    public static Test suite() throws Exception {
 
 		// LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", SimpleLog.class.getName());
 		// System.setProperty("org.apache.commons.logging.simplelog.defaultlog", "debug");
 		
-    	final ClassTransformerClassLoader classloader =
+        final ClassTransformerClassLoader classloader =
             new ClassTransformerClassLoader(
-            		new AsmClassTransformer(),
-            		new Class[] { // instrument
-            			BlackRed.class,
-            			ClassAccess1.class,
-            			ClassAccess2.class,
-            			CounterFlow.class,
-            			DefaultConstructor.class,
-            			Simple.class,
-            			NewObject.class,
-            			NoReference.class,
-            			SimpleSerializable.class,
-            			RewriteBugs.class,
-            			SimpleTryCatch.class,
-            			SimpleSynchronized.class,
-            			Stack.class,	
-            			}, 
-            		new Class[] { // load
-            			VerificationTestCase.class,
-            			SerializationTestCase.class
-            			}  
-            		);
+            	    new AsmClassTransformer(),
+                    new Class[] { // instrument
+                        BlackRed.class,
+                        ClassAccess1.class,
+                        ClassAccess2.class,
+                        ClassAccess3.class,
+                        CounterFlow.class,
+                        ConstructorInvocation.class,
+                        DefaultConstructor.class,
+                        NestedSynchronized.class,
+                        NewObject.class,
+                        NoReference.class,
+                        NullVariableMethodFlow.class,
+                        NullLocalVariable.class,
+                        RewriteBugs.class,
+                        Simple.class,
+                        SimpleSerializable.class,
+                        SimpleSynchronized.class,
+                        SimpleTryCatch.class,
+                        Stack.class,
+                        },  
+                    new Class[] { // load
+                        VerificationTestCase.class,
+                        SerializationTestCase.class
+                        }  
+                    );
         
         final TestSuite suite = new TestSuite();
         suite.setName("ASM");
@@ -75,5 +86,4 @@ public final class AsmTestSuite extends 
         suite.addTestSuite((Class<? extends TestCase>)classloader.loadClass(SerializationTestCase.class.getName()));
         return suite;
     }
-
 }

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/BcelTestSuite.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/BcelTestSuite.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/BcelTestSuite.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/BcelTestSuite.java Fri Jun 29 07:24:56 2012
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.javaflow;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public final class BcelTestSuite extends TestSuite {
-
-	public static Test suite() throws Exception {
-
-//    	final ClassTransformerClassLoader classloader =
-//            new ClassTransformerClassLoader(
-//            		new BcelClassTransformer(),
-//            		new Class[] { // instrument
-//            			BlackRed.class,
-//            			ClassAccess1.class,
-//            			ClassAccess2.class,
-//            			CounterFlow.class,
-//            			DefaultConstructor.class,
-//            			Simple.class,
-//            			NewObject.class,
-//            			NoReference.class,
-//            			SimpleSerializable.class,
-//            			RewriteBugs.class,
-//            			SimpleTryCatch.class,
-//            			SimpleSynchronized.class,
-//            			Stack.class,	
-//            			}, 
-//            		new Class[] { // load
-//            			VerificationTestCase.class,
-//            			SerializationTestCase.class
-//            			}  
-//            		);
-        
-        final TestSuite suite = new TestSuite();
-        suite.setName("BCEL");
-        // BCEL is deprecated and the ASM implementation is moving on
-        // suite.addTestSuite(classloader.loadClass(VerificationTestCase.class.getName()));
-        // suite.addTestSuite(classloader.loadClass(SerializationTestCase.class.getName()));        
-        return suite;
-    }
-
-}

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/helper/ClassTransformerClassLoader.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/helper/ClassTransformerClassLoader.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/helper/ClassTransformerClassLoader.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/helper/ClassTransformerClassLoader.java Fri Jun 29 07:24:56 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.commons.javaflow.helper;
 
+import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -27,7 +28,9 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.javaflow.bytecode.BytecodeClassLoader;
 import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer;
 import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.util.ASMifierClassVisitor;
+import org.objectweb.asm.util.ASMifier;
+import org.objectweb.asm.util.CheckClassAdapter;
+import org.objectweb.asm.util.TraceClassVisitor;
 
 public final class ClassTransformerClassLoader extends BytecodeClassLoader {
 
@@ -56,18 +59,21 @@ public final class ClassTransformerClass
 
         // CheckClassAdapter.verify(new ClassReader(newClass), true);
 
-    	new ClassReader(oldClass).accept(
-    			new ASMifierClassVisitor(
-    					new PrintWriter(
-    							new FileOutputStream(
-    									transformer.getClass().getSimpleName() + pName + ".old"))), 0);
-
-    	new ClassReader(newClass).accept(
-    			new ASMifierClassVisitor(
-    					new PrintWriter(
-    							new FileOutputStream(
-    									transformer.getClass().getSimpleName() + pName + ".new"))), 0);
-    	
+        // Test case output has been moved to target/test-instrumentation to reduce clutter in main directory
+        new File("target/test-instrumentation").mkdirs();
+
+        CheckClassAdapter.verify(new ClassReader(newClass), true, new PrintWriter(
+                new FileOutputStream("target/test-instrumentation/" + transformer.getClass().getSimpleName()
+                        + "_" + pName + ".new.check")));
+
+        new ClassReader(oldClass).accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(
+                new FileOutputStream("target/test-instrumentation/" + transformer.getClass().getSimpleName() 
+                        + "_" + pName + ".old"))), 0);
+
+        new ClassReader(newClass).accept(new TraceClassVisitor(null, new ASMifier(), new PrintWriter(
+                new FileOutputStream("target/test-instrumentation/" + transformer.getClass().getSimpleName()
+                        + "_" + pName + ".new"))), 0);
+
         return newClass;
     }
 

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess1.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess1.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess1.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess1.java Fri Jun 29 07:24:56 2012
@@ -18,7 +18,7 @@ package org.apache.commons.javaflow.rewr
 
 import org.apache.commons.javaflow.Continuation;
 
-@SuppressWarnings({ "unchecked", "unused" })
+@SuppressWarnings({ "unused", "rawtypes" })
 public final class ClassAccess1 implements Runnable {
 
     public void run() {

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess3.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess3.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess3.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ClassAccess3.java Fri Jun 29 07:24:56 2012
@@ -18,7 +18,6 @@ package org.apache.commons.javaflow.rewr
 
 import org.apache.commons.javaflow.Continuation;
 
-@SuppressWarnings("unchecked")
 public final class ClassAccess3 implements Runnable {
 
     /*
@@ -56,6 +55,7 @@ public final class ClassAccess3 implemen
         TRYCATCHBLOCK L2 L3 L4 ClassNotFoundException
      */
   
+    @SuppressWarnings("rawtypes")
     static Class class$0;
   
     public void run() {
@@ -63,7 +63,7 @@ public final class ClassAccess3 implemen
         // final Class clazz2 = this.getClass();
         // if(class$0==null) {
           try {
-            class$0 = Class.forName("asm.data.ClassAccess2");
+            class$0 = Class.forName("org.apache.commons.javaflow.rewrite.ClassAccess2");
           } catch(ClassNotFoundException ex) {
             throw new NoClassDefFoundError(ex.getMessage());
           }

Added: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java?rev=1355250&view=auto
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java (added)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java Fri Jun 29 07:24:56 2012
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.javaflow.rewrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.Assert;
+
+import org.apache.commons.javaflow.Continuation;
+
+public class ConstructorInvocation implements Runnable {
+
+    final Object d = new java.util.Date();
+
+    public void run() {
+        // No problem for fields
+        System.out.println(d);
+
+        // No problem for primitives
+        for (int i = 0; i < 3; i++)
+            System.out.println(i);
+
+        // No problem for "externalized" constructor call
+        final Map<String, String> map1 = newMap();
+
+        // But direct constructor invocation always causes an error
+        final Map<String, String> map2 = new HashMap<String, String>();
+
+        map1.put("A", "B");
+        System.out.println(map1);
+
+        map2.put("B", "C");
+        System.out.println(map2);
+
+        Continuation.suspend();
+        System.out.println("RESUMED, YES!");
+
+        Assert.assertEquals("B", map1.get("A"));
+        Assert.assertEquals("C", map2.get("B"));
+    }
+
+    protected Map<String, String> newMap() {
+        return new HashMap<String, String>();
+    }
+}

Propchange: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/ConstructorInvocation.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java?rev=1355250&view=auto
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java (added)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java Fri Jun 29 07:24:56 2012
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.javaflow.rewrite;
+
+public class NullLocalVariable implements Runnable {
+    @SuppressWarnings("null")
+    public void method1() {
+        Integer result = null;
+        if (result != 0)
+            result = 1;
+    }
+
+    @SuppressWarnings("unused")
+    public void run() {
+        NullLocalVariable bug1 = new NullLocalVariable();
+    }
+}
\ No newline at end of file

Propchange: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullLocalVariable.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/RewriteBugs.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/RewriteBugs.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/RewriteBugs.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/RewriteBugs.java Fri Jun 29 07:24:56 2012
@@ -26,7 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-@SuppressWarnings("unchecked")
+@SuppressWarnings({ "unchecked", "rawtypes" })
 public final class RewriteBugs implements Runnable {
 
     public void run() {
@@ -43,7 +43,7 @@ public final class RewriteBugs implement
 	 *  @param names The names.
 	 *  @param values The values (must be some form of collection, i.e. array, list, iterator etc.)
 	 */
-	public static List calculateCartesianProduct(String[] names, Object[] values)
+    public static List calculateCartesianProduct(String[] names, Object[] values)
 	{
 		//ArrayList ret = SCollection.createArrayList();
 		ArrayList ret = new ArrayList();

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/SerializationTestCase.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/SerializationTestCase.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/SerializationTestCase.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/SerializationTestCase.java Fri Jun 29 07:24:56 2012
@@ -70,11 +70,13 @@ public final class SerializationTestCase
             this.classloader = loader;
         }
 
+        @SuppressWarnings("rawtypes")
         protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException {
 
         	return Class.forName(classDesc.getName(), true, classloader);
         }
 
+        @SuppressWarnings("rawtypes")
         protected Class resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException {
             Class[] cinterfaces = new Class[interfaces.length];
             for (int i = 0; i < interfaces.length; i++) {

Modified: commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/VerificationTestCase.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/VerificationTestCase.java?rev=1355250&r1=1355249&r2=1355250&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/VerificationTestCase.java (original)
+++ commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/suite/VerificationTestCase.java Fri Jun 29 07:24:56 2012
@@ -22,11 +22,17 @@ import org.apache.commons.javaflow.Conti
 import org.apache.commons.javaflow.rewrite.BlackRed;
 import org.apache.commons.javaflow.rewrite.ClassAccess1;
 import org.apache.commons.javaflow.rewrite.ClassAccess2;
+import org.apache.commons.javaflow.rewrite.ClassAccess3;
+import org.apache.commons.javaflow.rewrite.ConstructorInvocation;
 import org.apache.commons.javaflow.rewrite.CounterFlow;
 import org.apache.commons.javaflow.rewrite.DefaultConstructor;
 import org.apache.commons.javaflow.rewrite.Invoker;
+import org.apache.commons.javaflow.rewrite.NestedSynchronized;
 import org.apache.commons.javaflow.rewrite.NewObject;
 import org.apache.commons.javaflow.rewrite.NoReference;
+import org.apache.commons.javaflow.rewrite.NullLocalVariable;
+import org.apache.commons.javaflow.rewrite.NullVariableMethodFlow;
+import org.apache.commons.javaflow.rewrite.RewriteBugs;
 import org.apache.commons.javaflow.rewrite.Simple;
 import org.apache.commons.javaflow.rewrite.SimpleSerializable;
 import org.apache.commons.javaflow.rewrite.SimpleSynchronized;
@@ -35,248 +41,345 @@ import org.apache.commons.javaflow.rewri
 
 public final class VerificationTestCase extends TestCase {
 
-    private boolean fromSuite() {
-        final String cl = this.getClass().getClassLoader().getClass().getName();
-        return cl.contains("ClassTransformerClassLoader");
-    }
-    
-    public void testBlackRed2() {        
-        assertTrue(fromSuite());        
-        final Runnable r = new BlackRed();
-        final Continuation c1 = Continuation.startWith(r);
-        assertTrue(c1 != null);
-        final Continuation c2 = Continuation.continueWith(c1);
-        assertTrue(c2 == null);
-    }
-
-    public void testClassAccess1() throws Exception {
-        assertTrue(fromSuite());        
-        final ClassAccess1 r = new ClassAccess1();
-        final Continuation c = Continuation.startWith(r);
-        assertTrue(c != null);
-    }
-    
-    public void testClassAccess2() throws Exception {
-        assertTrue(fromSuite());        
-        final ClassAccess2 r = new ClassAccess2();
-        final Continuation c = Continuation.startWith(r);
-        assertTrue(c != null);
-    }
-
-    public void testCounter() {
-        assertTrue(fromSuite());        
-        final int count = 5;
-        final Runnable r = new CounterFlow(count);
-        int i = 0;
-        Continuation c = Continuation.startWith(r);
-        while (c != null) {
-            c = Continuation.continueWith(c);
-            i++;
-        }
-        assertTrue(i == count);
-    }
-
-    public void testInvoker() {
-        assertTrue(fromSuite());        
-        Runnable o = new DefaultConstructor();
-        Continuation c = Continuation.startWith(o);
-        assertTrue(c == null);
-    }
-
-    public void testInvoker2() {
-        assertTrue(fromSuite());        
-        final Runnable r = new Simple();
-        final Runnable o = new Invoker(r);
-        final Continuation c = Continuation.startWith(o);
-        assertNotNull(c);
-    }
-
-    public void testNewObject() throws Exception {
-        assertTrue(fromSuite());        
-        final Runnable r = new NewObject();
-        final Continuation c = Continuation.startWith(r);
-        assertTrue(c == null);
-    }
-
-    public void testNoReference() throws Exception {
-        assertTrue(fromSuite());        
-        final Runnable r = new NoReference();
-        final Continuation c = Continuation.startWith(r);
-        assertTrue(c != null);
-    }
-    public void testSimpleSuspendResume() throws Exception {
-        assertTrue(fromSuite());        
-        final SimpleSerializable r = new SimpleSerializable();
-        assertTrue(r.g == -1);
-        assertTrue(r.l == -1);
-        Continuation c1 = Continuation.startWith(r);
-        assertNotNull(c1);
-        assertTrue(r.g == 0);
-        assertTrue(r.l == 0);
-        Continuation c2 = Continuation.continueWith(c1);
-        assertNotNull(c2);
-        assertTrue(r.g == 1);
-        assertTrue(r.l == 1);
-        Continuation c3 = Continuation.continueWith(c2);
-        assertNotNull(c3);
-        assertTrue(r.g == 2);
-        assertTrue(r.l == 2);
-    }
-
-
-    public void testContinuationBranching() throws Exception {
-        assertTrue(fromSuite());        
-        final SimpleSerializable r = new SimpleSerializable();
-        assertTrue(r.g == -1);
-        assertTrue(r.l == -1);
-        Continuation c1 = Continuation.startWith(r);
-        assertNotNull(c1);
-        assertTrue(r.g == 0);
-        assertTrue(r.l == 0);
-        Continuation c2 = Continuation.continueWith(c1);
-        assertNotNull(c2);
-        assertTrue(r.g == 1);
-        assertTrue(r.l == 1);
-        Continuation c31 = Continuation.continueWith(c2);
-        assertNotNull(c31);
-        assertTrue(r.g == 2);
-        assertTrue(r.l == 2);
-        Continuation c32 = Continuation.continueWith(c2);
-        assertNotNull(c32);
-        assertTrue(r.g == 3);
-        assertTrue(r.l == 2);
-    }
-
-    public void testSimpleSuspend() throws Exception {
-        assertTrue(fromSuite());        
-        final Simple r = new Simple();
-        final Continuation c = Continuation.startWith(r);
-        assertTrue(c != null);
-    }
-
-    public void testSimpleTryCatchWithoutException() throws Exception {
-        assertTrue(fromSuite());        
-        final SimpleTryCatch r = new SimpleTryCatch(false);
-        Continuation c;
-
-        c = Continuation.startWith(r); // suspend within the try/catch
-        assertTrue(c != null); 
-        assertTrue(r.a);
-        assertFalse(r.b);
-        assertFalse(r.c);
-        assertFalse(r.d);
-        assertFalse(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // continue without exception and end in finally
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertTrue(r.b);
-        assertFalse(r.c);
-        assertFalse(r.d);
-        assertTrue(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // continue within the finally and end in return
-        assertTrue(c == null);
-        assertTrue(r.a);
-        assertTrue(r.b);
-        assertFalse(r.c);
-        assertFalse(r.d);
-        assertTrue(r.e);
-        assertTrue(r.f);    
-
-    }
-
-    public void testSimpleTryCatchWithException() throws Exception {
-        assertTrue(fromSuite());        
-        final SimpleTryCatch r = new SimpleTryCatch(true);
-        Continuation c;
-
-        c = Continuation.startWith(r); // suspend in the try/catch
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertFalse(r.b);
-        assertFalse(r.c);
-        assertFalse(r.d);
-        assertFalse(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // exception jumps into exception block and suspends
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertFalse(r.b);
-        assertTrue(r.c);
-        assertFalse(r.d);
-        assertFalse(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // continue in the exception block and then suspends in finally
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertFalse(r.b);
-        assertTrue(r.c);
-        assertTrue(r.d);
-        assertTrue(r.e);
-        assertFalse(r.f);    
-
-        c = Continuation.continueWith(c); // continue in finally
-        assertTrue(c == null);
-        assertTrue(r.a);
-        assertFalse(r.b);
-        assertTrue(r.c);
-        assertTrue(r.d);
-        assertTrue(r.e);
-        assertTrue(r.f);    
-    }
-
-    public void testSimpleSynchronized() throws Exception {
-        assertTrue(fromSuite());        
-        final SimpleSynchronized r = new SimpleSynchronized();
-        Continuation c;
-
-        c = Continuation.startWith(r); // suspend right away
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertFalse(r.b);
-        assertFalse(r.c);
-        assertFalse(r.d);
-        assertFalse(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // resume and run into synchronized block where we suspend again
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertTrue(r.b);
-        assertTrue(r.c);
-        assertFalse(r.d);
-        assertFalse(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // continue inside the synchronized block and suspend after
-        assertTrue(c != null);
-        assertTrue(r.a);
-        assertTrue(r.b);
-        assertTrue(r.c);
-        assertTrue(r.d);
-        assertTrue(r.e);
-        assertFalse(r.f);
-
-        c = Continuation.continueWith(c); // resume and then return
-        assertTrue(c == null);
-        assertTrue(r.a);
-        assertTrue(r.b);
-        assertTrue(r.c);
-        assertTrue(r.d);
-        assertTrue(r.e);
-        assertTrue(r.f);
-    }
-
-    public void testStack() throws Exception {
-        assertTrue(fromSuite());        
-        final Runnable r = new Stack();
-        final Continuation c = Continuation.startWith(r);
-        assertNull(c); // does not have a suspend
-    }
-
+	private boolean fromSuite() {
+		final String cl = this.getClass().getClassLoader().getClass().getName();
+		return cl.contains("ClassTransformerClassLoader");
+	}
+
+	public void testBlackRed2() {
+		assertTrue(fromSuite());
+		final Runnable r = new BlackRed();
+		final Continuation c1 = Continuation.startWith(r);
+		assertTrue(c1 != null);
+		final Continuation c2 = Continuation.continueWith(c1);
+		assertTrue(c2 == null);
+	}
+
+	public void testClassAccess1() throws Exception {
+		assertTrue(fromSuite());
+		final ClassAccess1 r = new ClassAccess1();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c != null);
+	}
+
+	public void testClassAccess2() throws Exception {
+		assertTrue(fromSuite());
+		final ClassAccess2 r = new ClassAccess2();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c != null);
+	}
+
+	public void testClassAccess3() throws Exception {
+		assertTrue(fromSuite());
+		final ClassAccess3 r = new ClassAccess3();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c != null);
+	}
+
+	public void testCounter() {
+		assertTrue(fromSuite());
+		final int count = 5;
+		final Runnable r = new CounterFlow(count);
+		int i = 0;
+		Continuation c = Continuation.startWith(r);
+		while (c != null) {
+			c = Continuation.continueWith(c);
+			i++;
+		}
+		assertTrue(i == count);
+	}
+
+	public void testInvoker() {
+		assertTrue(fromSuite());
+		Runnable o = new DefaultConstructor();
+		Continuation c = Continuation.startWith(o);
+		assertTrue(c == null);
+	}
+
+	public void testInvoker2() {
+		assertTrue(fromSuite());
+		final Runnable r = new Simple();
+		final Runnable o = new Invoker(r);
+		final Continuation c = Continuation.startWith(o);
+		assertNotNull(c);
+	}
+
+	public void testConstructorInvocation() throws Exception {
+		assertTrue(fromSuite());
+		final Runnable r = new ConstructorInvocation();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c != null);
+		final Continuation c2 = Continuation.continueWith(c);
+		assertTrue(c2 == null);
+	}
+
+	public void testNewObject() throws Exception {
+		assertTrue(fromSuite());
+		final Runnable r = new NewObject();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c == null);
+	}
+
+	public void testNullVariableMethodFlow() throws Exception {
+		assertTrue(fromSuite());
+		final Runnable r = new NullVariableMethodFlow();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c == null);
+	}
+	
+	public void testNullLocalVariable() throws Exception {
+		assertTrue(fromSuite());
+		final Runnable r = new NullLocalVariable();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c == null);
+	}
+
+	public void testNoReference() throws Exception {
+		assertTrue(fromSuite());
+		final Runnable r = new NoReference();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c != null);
+	}
+
+	public void testSimpleSuspendResume() throws Exception {
+		assertTrue(fromSuite());
+		final SimpleSerializable r = new SimpleSerializable();
+		assertTrue(r.g == -1);
+		assertTrue(r.l == -1);
+		Continuation c1 = Continuation.startWith(r);
+		assertNotNull(c1);
+		assertTrue(r.g == 0);
+		assertTrue(r.l == 0);
+		Continuation c2 = Continuation.continueWith(c1);
+		assertNotNull(c2);
+		assertTrue(r.g == 1);
+		assertTrue(r.l == 1);
+		Continuation c3 = Continuation.continueWith(c2);
+		assertNotNull(c3);
+		assertTrue(r.g == 2);
+		assertTrue(r.l == 2);
+	}
+
+	public void testContinuationBranching() throws Exception {
+		assertTrue(fromSuite());
+		final SimpleSerializable r = new SimpleSerializable();
+		assertTrue(r.g == -1);
+		assertTrue(r.l == -1);
+		Continuation c1 = Continuation.startWith(r);
+		assertNotNull(c1);
+		assertTrue(r.g == 0);
+		assertTrue(r.l == 0);
+		Continuation c2 = Continuation.continueWith(c1);
+		assertNotNull(c2);
+		assertTrue(r.g == 1);
+		assertTrue(r.l == 1);
+		Continuation c31 = Continuation.continueWith(c2);
+		assertNotNull(c31);
+		assertTrue(r.g == 2);
+		assertTrue(r.l == 2);
+		Continuation c32 = Continuation.continueWith(c2);
+		assertNotNull(c32);
+		assertTrue(r.g == 3);
+		assertTrue(r.l == 2);
+	}
+
+	public void testSimpleSuspend() throws Exception {
+		assertTrue(fromSuite());
+		final Simple r = new Simple();
+		final Continuation c = Continuation.startWith(r);
+		assertTrue(c != null);
+	}
+
+	public void testSimpleTryCatchWithoutException() throws Exception {
+		assertTrue(fromSuite());
+		final SimpleTryCatch r = new SimpleTryCatch(false);
+		Continuation c;
+
+		c = Continuation.startWith(r); // suspend within the try/catch
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertFalse(r.c);
+		assertFalse(r.d);
+		assertFalse(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // continue without exception and end
+											// in finally
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertFalse(r.c);
+		assertFalse(r.d);
+		assertTrue(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // continue within the finally and end
+											// in return
+		assertTrue(c == null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertFalse(r.c);
+		assertFalse(r.d);
+		assertTrue(r.e);
+		assertTrue(r.f);
+
+	}
+
+	public void testSimpleTryCatchWithException() throws Exception {
+		assertTrue(fromSuite());
+		final SimpleTryCatch r = new SimpleTryCatch(true);
+		Continuation c;
+
+		c = Continuation.startWith(r); // suspend in the try/catch
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertFalse(r.c);
+		assertFalse(r.d);
+		assertFalse(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // exception jumps into exception
+											// block and suspends
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertTrue(r.c);
+		assertFalse(r.d);
+		assertFalse(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // continue in the exception block and
+											// then suspends in finally
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // continue in finally
+		assertTrue(c == null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertTrue(r.f);
+	}
+
+	public void testSimpleSynchronized() throws Exception {
+		assertTrue(fromSuite());
+		final SimpleSynchronized r = new SimpleSynchronized();
+		Continuation c;
+
+		c = Continuation.startWith(r); // suspend right away
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertFalse(r.c);
+		assertFalse(r.d);
+		assertFalse(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // resume and run into synchronized
+											// block where we suspend again
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertTrue(r.c);
+		assertFalse(r.d);
+		assertFalse(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // continue inside the synchronized
+											// block and suspend after
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertFalse(r.f);
+
+		c = Continuation.continueWith(c); // resume and then return
+		assertTrue(c == null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertTrue(r.f);
+	}
+
+	public void testStack() throws Exception {
+		assertTrue(fromSuite());
+		final Runnable r = new Stack();
+		final Continuation c = Continuation.startWith(r);
+		assertNull(c); // does not have a suspend
+	}
+
+	public void testNestedSynchronized() throws Exception {
+		final NestedSynchronized r = new NestedSynchronized();
+		Continuation c;
+
+		c = Continuation.startWith(r);
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertFalse(r.b);
+		assertFalse(r.c);
+		assertFalse(r.d);
+		assertFalse(r.e);
+		assertFalse(r.f);
+		assertFalse(r.g);
+		assertFalse(r.h);
+		assertFalse(r.i);
+		assertFalse(r.j);
+
+		c = Continuation.continueWith(c);
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertFalse(r.f);
+		assertFalse(r.g);
+		assertFalse(r.h);
+		assertFalse(r.i);
+		assertFalse(r.j);
+
+		c = Continuation.continueWith(c);
+		assertTrue(c != null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertTrue(r.f);
+		assertTrue(r.g);
+		assertTrue(r.h);
+		assertTrue(r.i);
+		assertFalse(r.j);
+
+		c = Continuation.continueWith(c);
+		assertTrue(c == null);
+		assertTrue(r.a);
+		assertTrue(r.b);
+		assertTrue(r.c);
+		assertTrue(r.d);
+		assertTrue(r.e);
+		assertTrue(r.f);
+		assertTrue(r.g);
+		assertTrue(r.h);
+		assertTrue(r.i);
+		assertTrue(r.j);
+	}
+
+	public void testASMRewriteBug() throws Exception {
+		RewriteBugs.calculateCartesianProduct(new String[] { "a", "b" },
+				new Object[][] { { "1", "2" }, { "3", "4" } });
+	}
 }