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" } });
+ }
}