You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tc...@apache.org on 2005/10/14 01:44:33 UTC
svn commit: r320947 - in /jakarta/commons/sandbox/javaflow/trunk: ./
src/java/org/apache/commons/javaflow/
src/java/org/apache/commons/javaflow/ant/
src/java/org/apache/commons/javaflow/bytecode/
src/java/org/apache/commons/javaflow/utils/ src/test/org...
Author: tcurdt
Date: Thu Oct 13 16:44:08 2005
New Revision: 320947
URL: http://svn.apache.org/viewcvs?rev=320947&view=rev
Log:
reworked the testcases (unfortunately some are currently failing)
Added:
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java (with props)
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java (with props)
Removed:
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractClassLoaderTestCase.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationCompilingClassLoaderTestCase.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationTestCase.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/ContinuationTests.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SerializationTests.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/TestClassLoader.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/testcode/
Modified:
jakarta/commons/sandbox/javaflow/trunk/TODO
jakarta/commons/sandbox/javaflow/trunk/project.properties
jakarta/commons/sandbox/javaflow/trunk/project.xml
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ant/AntRewriteTask.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java
jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SerializationTestCase.java
Modified: jakarta/commons/sandbox/javaflow/trunk/TODO
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/TODO?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/TODO (original)
+++ jakarta/commons/sandbox/javaflow/trunk/TODO Thu Oct 13 16:44:08 2005
@@ -8,16 +8,15 @@
o inner classes
o try/catch/finally
o synchronized(obj)
-o addition to async ContinuationCompilingClassLoader
- also re-implement the old sync behaviour in the
- ContinuationClassLoader
-o evaluate makeing the Stack class use a hierarchical
- approach to support differential continuations
-o maybe only wrap the function calls
+ o accessing .class
+ o new Object() without assignment
+o only wrap the function calls
that may lead to a suspend (control
flow analysis) requires 2-pass
analysing/rewriting
-o asm implementation instead of BCEL
+o maybe: evaluate making the Stack class use a hierarchical
+ approach to support differential continuations
+o maybe: asm implementation instead of BCEL
o BCEL
o commit bug fixes in BCEL
Modified: jakarta/commons/sandbox/javaflow/trunk/project.properties
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/project.properties?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/project.properties (original)
+++ jakarta/commons/sandbox/javaflow/trunk/project.properties Thu Oct 13 16:44:08 2005
@@ -20,6 +20,7 @@
maven.jar.excludes=**/package.html
maven.junit.fork=true
maven.test.failure.ignore = true
+#maven.test.skip = true
maven.junit.sysproperties=org.xml.sax.driver
org.xml.sax.driver=org.apache.xerces.parsers.SAXParser
Modified: jakarta/commons/sandbox/javaflow/trunk/project.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/project.xml?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/project.xml (original)
+++ jakarta/commons/sandbox/javaflow/trunk/project.xml Thu Oct 13 16:44:08 2005
@@ -99,6 +99,11 @@
<version>3.8.1</version>
</dependency>
<dependency>
+ <groupId>junit-addons</groupId>
+ <artifactId>junit-addons</artifactId>
+ <version>1.4</version>
+ </dependency>
+ <dependency>
<groupId>xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.1</version>
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/Continuation.java Thu Oct 13 16:44:08 2005
@@ -178,6 +178,10 @@
}
}
+ public boolean isSerializable() {
+ return stack.isSerializable();
+ }
+
/**
* Stops the running continuation.
*
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ant/AntRewriteTask.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ant/AntRewriteTask.java?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ant/AntRewriteTask.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/ant/AntRewriteTask.java Thu Oct 13 16:44:08 2005
@@ -19,13 +19,11 @@
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-import java.util.zip.ZipOutputStream;
-import org.apache.commons.io.IOUtils;
+import java.util.jar.JarInputStream;
+import java.util.jar.JarOutputStream;
import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer;
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;
import org.apache.tools.ant.Project;
@@ -68,93 +66,100 @@
private void checkDir(File dir,String name) {
if (dir==null) {
- throw new BuildException("no "+name+" directory is specified",getLocation());
+ throw new BuildException("no " + name + " directory is specified", getLocation());
}
if (!dir.exists()) {
- throw new BuildException(
- name+" directory \""
- + dir
- + "\" does not exist ",
- getLocation());
+ throw new BuildException(name + " directory \"" + dir + "\" does not exist", getLocation());
}
if (!dir.isDirectory()) {
- throw new BuildException(
- name+" directory \""
- + dir
- + "\" is not a directory",
- getLocation());
+ throw new BuildException(name + " directory \"" + dir + "\" is not a directory", getLocation());
}
}
public void execute() throws BuildException {
+ // FIXME do we really need the super call?
super.execute();
+
checkParameters();
fileset.setDir(srcDir);
- DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
- String[] files = ds.getIncludedFiles();
+ final DirectoryScanner ds = fileset.getDirectoryScanner(getProject());
+ final String[] fileNames = ds.getIncludedFiles();
try {
- for (int i = 0; i < files.length; i++) {
- String one = files[i];
+ for (int i = 0; i < fileNames.length; i++) {
+ final String fileName = fileNames[i];
- File source = new File(srcDir, one);
- File destination = new File(getDestDir(), one);
+ final File source = new File(srcDir, fileName);
+ final File destination = new File(getDestDir(), fileName);
+
if (!destination.getParentFile().exists()) {
- log("Making dir: "+destination.getParentFile(), Project.MSG_VERBOSE);
+ log("Creating dir: " + destination.getParentFile(), Project.MSG_VERBOSE);
destination.getParentFile().mkdirs();
}
-
if (source.lastModified() < destination.lastModified()) {
- log(source+" omitted as "+destination+" is up to date", Project.MSG_VERBOSE);
+ log("Omitting " + source + " as " + destination + " is up to date", Project.MSG_VERBOSE);
continue;
}
- if (one.endsWith(".class")) {
- log("source: "+source + " to "+destination, Project.MSG_VERBOSE);
-
+
+ if (fileName.endsWith(".class")) {
+ log("Rewriting " + source + " to " + destination, Project.MSG_VERBOSE);
+
+ RewritingUtils.rewriteClassFile(
+ source,
+ transformer,
+ destination);
+
// source might be the same as destination, so be careful
- long origSize = source.length();
- InputStream in = new FileInputStream(source);
- byte[] bytes = IOUtils.toByteArray(in);
- in.close();
- byte[] newBytes = transformer.transform(bytes);
- if(bytes!=newBytes) {
- FileOutputStream out = new FileOutputStream(destination);
- out.write(newBytes);
- out.close();
- log("size: " + 100*destination.length()/origSize+ '%');
- } else {
- log("skipped");
- }
+// long origSize = source.length();
+// InputStream in = new FileInputStream(source);
+// byte[] bytes = IOUtils.toByteArray(in);
+// in.close();
+// byte[] newBytes = transformer.transform(bytes);
+// if(bytes!=newBytes) {
+// FileOutputStream out = new FileOutputStream(destination);
+// out.write(newBytes);
+// out.close();
+// log("size: " + 100*destination.length()/origSize+ '%');
+// } else {
+// log("skipped");
+// }
}
- if (one.endsWith(".jar")
- || one.endsWith(".ear")
- || one.endsWith(".zip")
- || one.endsWith(".war")) {
-
- log("source: "+source + " to "+destination, Project.MSG_VERBOSE);
+ if (fileName.endsWith(".jar")
+ || fileName.endsWith(".ear")
+ || fileName.endsWith(".zip")
+ || fileName.endsWith(".war")) {
+
+ log("Rewriting " + source + " to " + destination, Project.MSG_VERBOSE);
+
+ RewritingUtils.rewriteJar(
+ new JarInputStream(new FileInputStream(source)),
+ transformer,
+ new JarOutputStream(new FileOutputStream(destination)),
+ null);
+
// write to a temporary file first because
// source might be the same as destination
- File tmp = File.createTempFile("javaflow","tmp",destination.getParentFile());
-
- ZipInputStream in = new ZipInputStream(new FileInputStream(source));
- ZipOutputStream out = new ZipOutputStream(new FileOutputStream(tmp));
- boolean changed;
- try {
- changed = processArchive(in,out,1);
- } finally {
- in.close();
- out.close();
- }
-
- if(changed) {
- if(destination.exists()) {
- destination.delete();
- }
- tmp.renameTo(destination);
- }
+// File tmp = File.createTempFile("javaflow","tmp",destination.getParentFile());
+//
+// ZipInputStream in = new ZipInputStream(new FileInputStream(source));
+// ZipOutputStream out = new ZipOutputStream(new FileOutputStream(tmp));
+// boolean changed;
+// try {
+// changed = processArchive(in,out,1);
+// } finally {
+// in.close();
+// out.close();
+// }
+//
+// if(changed) {
+// if(destination.exists()) {
+// destination.delete();
+// }
+// tmp.renameTo(destination);
+// }
}
}
} catch (IOException e) {
@@ -173,52 +178,52 @@
* true if at least one file has been modified. false
* if otherwise (meaning input and output are identical.)
*/
- private boolean processArchive(ZipInputStream in, ZipOutputStream out, int nestLevel) throws IOException {
- boolean changed = false;
- ZipEntry e;
-
- while((e=in.getNextEntry())!=null) {
- // log the entry
- StringBuffer buf = new StringBuffer();
- for( int i=0; i<nestLevel; i++ )
- buf.append(" ");
- buf.append("processing "+e.getName());
- log(buf.toString(), Project.MSG_VERBOSE);
-
- String one = e.getName();
-
- if (one.endsWith(".class")) {
- // source might be the same as destination, so be careful
- long origSize = e.getSize();
- byte[] bytes = IOUtils.toByteArray(in);
- in.close();
- byte[] newBytes = transformer.transform(bytes);
- out.putNextEntry(e);
- out.write(newBytes);
- out.closeEntry();
-
- log("Size: " + 100*newBytes.length/origSize+ '%');
-
- changed |= (bytes!=newBytes);
- }
- else
- if (one.endsWith(".jar")
- || one.endsWith(".ear")
- || one.endsWith(".zip")
- || one.endsWith(".war")) {
-
- out.putNextEntry(e);
- changed |= processArchive(new ZipInputStream(in),new ZipOutputStream(out),nestLevel++);
- out.closeEntry();
-
- // TODO: compute the size increase
- } else {
- // just copy the file as-is.
- out.putNextEntry(e);
- IOUtils.copy(in,out);
- out.closeEntry();
- }
- }
- return changed;
- }
+// private boolean processArchive(ZipInputStream in, ZipOutputStream out, int nestLevel) throws IOException {
+// boolean changed = false;
+// ZipEntry e;
+//
+// while((e=in.getNextEntry())!=null) {
+// // log the entry
+// StringBuffer buf = new StringBuffer();
+// for( int i=0; i<nestLevel; i++ )
+// buf.append(" ");
+// buf.append("processing "+e.getName());
+// log(buf.toString(), Project.MSG_VERBOSE);
+//
+// String one = e.getName();
+//
+// if (one.endsWith(".class")) {
+// // source might be the same as destination, so be careful
+// long origSize = e.getSize();
+// byte[] bytes = IOUtils.toByteArray(in);
+// in.close();
+// byte[] newBytes = transformer.transform(bytes);
+// out.putNextEntry(e);
+// out.write(newBytes);
+// out.closeEntry();
+//
+// log("Size: " + 100*newBytes.length/origSize+ '%');
+//
+// changed |= (bytes!=newBytes);
+// }
+// else
+// if (one.endsWith(".jar")
+// || one.endsWith(".ear")
+// || one.endsWith(".zip")
+// || one.endsWith(".war")) {
+//
+// out.putNextEntry(e);
+// changed |= processArchive(new ZipInputStream(in),new ZipOutputStream(out),nestLevel++);
+// out.closeEntry();
+//
+// // TODO: compute the size increase
+// } else {
+// // just copy the file as-is.
+// out.putNextEntry(e);
+// IOUtils.copy(in,out);
+// out.closeEntry();
+// }
+// }
+// return changed;
+// }
}
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/Stack.java Thu Oct 13 16:44:08 2005
@@ -43,7 +43,7 @@
private Object[] ostack;
private Object[] rstack;
private int iTop, fTop, dTop, lTop, oTop, rTop;
- public Runnable runnable;
+ protected Runnable runnable;
public Stack(Runnable pRunnable) {
istack = new int[10];
@@ -55,26 +55,26 @@
runnable = pRunnable;
}
- public Stack(final Stack parent) {
- istack = new int[parent.istack.length];
- lstack = new long[parent.lstack.length];
- dstack = new double[parent.dstack.length];
- fstack = new float[parent.fstack.length];
- ostack = new Object[parent.ostack.length];
- rstack = new Object[parent.rstack.length];
- iTop = parent.iTop;
- fTop = parent.fTop;
- dTop = parent.dTop;
- lTop = parent.lTop;
- oTop = parent.oTop;
- rTop = parent.rTop;
- System.arraycopy(parent.istack, 0, istack, 0, iTop);
- System.arraycopy(parent.fstack, 0, fstack, 0, fTop);
- System.arraycopy(parent.dstack, 0, dstack, 0, dTop);
- System.arraycopy(parent.lstack, 0, lstack, 0, lTop);
- System.arraycopy(parent.ostack, 0, ostack, 0, oTop);
- System.arraycopy(parent.rstack, 0, rstack, 0, rTop);
- runnable = parent.runnable;
+ public Stack(final Stack pParent) {
+ istack = new int[pParent.istack.length];
+ lstack = new long[pParent.lstack.length];
+ dstack = new double[pParent.dstack.length];
+ fstack = new float[pParent.fstack.length];
+ ostack = new Object[pParent.ostack.length];
+ rstack = new Object[pParent.rstack.length];
+ iTop = pParent.iTop;
+ fTop = pParent.fTop;
+ dTop = pParent.dTop;
+ lTop = pParent.lTop;
+ oTop = pParent.oTop;
+ rTop = pParent.rTop;
+ System.arraycopy(pParent.istack, 0, istack, 0, iTop);
+ System.arraycopy(pParent.fstack, 0, fstack, 0, fTop);
+ System.arraycopy(pParent.dstack, 0, dstack, 0, dTop);
+ System.arraycopy(pParent.lstack, 0, lstack, 0, lTop);
+ System.arraycopy(pParent.ostack, 0, ostack, 0, oTop);
+ System.arraycopy(pParent.rstack, 0, rstack, 0, rTop);
+ runnable = pParent.runnable;
}
public boolean hasDouble() {
@@ -82,7 +82,7 @@
}
public double popDouble() {
- if (dTop==0) {
+ if (dTop == 0) {
throw new EmptyStackException("pop double");
}
@@ -96,7 +96,7 @@
}
public float popFloat() {
- if (fTop==0) {
+ if (fTop == 0) {
throw new EmptyStackException("pop float");
}
@@ -110,7 +110,7 @@
}
public int popInt() {
- if (iTop==0) {
+ if (iTop == 0) {
throw new EmptyStackException("pop int");
}
@@ -124,7 +124,7 @@
}
public long popLong() {
- if (lTop==0) {
+ if (lTop == 0) {
throw new EmptyStackException("pop long");
}
@@ -138,12 +138,12 @@
}
public Object popObject() {
- if (oTop==0) {
+ if (oTop == 0) {
throw new EmptyStackException("pop object");
}
final Object o = ostack[--oTop];
- ostack[oTop]=null; // avoid unnecessary reference to object
+ ostack[oTop] = null; // avoid unnecessary reference to object
if(log.isDebugEnabled()) {
final String clazz = ReflectionUtils.getClassName(o);
@@ -160,12 +160,12 @@
}
public Object popReference() {
- if (rTop==0) {
+ if (rTop == 0) {
throw new EmptyStackException("pop reference");
}
final Object o = rstack[--rTop];
- rstack[rTop]=null; // avoid unnecessary reference to object
+ rstack[rTop] = null; // avoid unnecessary reference to object
if(log.isDebugEnabled()) {
final String clazz = ReflectionUtils.getClassName(o);
@@ -222,15 +222,11 @@
}
public void pushObject(Object o) {
-
- final String clazz = ReflectionUtils.getClassName(o);
- final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
-
- log.debug("push object " + clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
-
- if (o != null && !(o instanceof Serializable)) {
- log.warn("continuation is using class " + clazz + " which is not serializable");
+ if (log.isDebugEnabled()) {
+ final String clazz = ReflectionUtils.getClassName(o);
+ final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
+ log.debug("push object " + clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
}
if (oTop == ostack.length) {
@@ -242,15 +238,14 @@
}
public void pushReference(Object o) {
- final String clazz = ReflectionUtils.getClassName(o);
- final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
-
- log.debug("push reference " + clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
- if (o != null && !(o instanceof Serializable)) {
- log.warn("continuation is referencing class " + clazz + " which is not serializable");
+ if (log.isDebugEnabled()) {
+ final String clazz = ReflectionUtils.getClassName(o);
+ final String clazzLoader = ReflectionUtils.getClassLoaderName(o);
+
+ log.debug("push reference " + clazz + "/" + clazzLoader + " [" + o + "] " + getStats());
}
-
+
if (rTop == rstack.length) {
Object[] hlp = new Object[rstack.length*2];
System.arraycopy(rstack, 0, hlp, 0, rstack.length);
@@ -259,6 +254,21 @@
rstack[rTop++] = o;
}
+ public boolean isSerializable() {
+ for (int i = 0; i < rTop; i++) {
+ final Object r = rstack[i];
+ if (!(r instanceof Serializable)) {
+ return false;
+ }
+ }
+ for (int i = 0; i < oTop; i++) {
+ final Object o = ostack[i];
+ if (!(o instanceof Serializable)) {
+ return false;
+ }
+ }
+ return true;
+ }
public boolean isEmpty() {
return iTop==0 && lTop==0 && dTop==0 && fTop==0 && oTop==0 && rTop==0;
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/ReflectionUtils.java Thu Oct 13 16:44:08 2005
@@ -15,11 +15,15 @@
*/
package org.apache.commons.javaflow.utils;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -139,6 +143,15 @@
return result;
}
+ public static Object cast(Object o) throws IOException, ClassNotFoundException {
+ final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ final ObjectOutputStream oos = new ObjectOutputStream(buffer);
+ oos.writeObject(o);
+ oos.flush();
+ final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray()));
+ return ois.readObject();
+ }
+
public static String getClassName(final Object o) {
if (o == null) {
return "unknown";
Modified: jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/utils/RewritingUtils.java Thu Oct 13 16:44:08 2005
@@ -39,14 +39,14 @@
* @todo multiple transformers
*/
public static void rewriteClassFile(
- final File input,
- final ResourceTransformer transformer,
- final File output
+ final File pInput,
+ final ResourceTransformer pTransformer,
+ final File pOutput
) throws IOException {
- final byte[] original = FileUtils.readFileToByteArray(input);
- final byte[] transformed = transformer.transform(original);
- final FileOutputStream os = new FileOutputStream(output);
+ final byte[] original = FileUtils.readFileToByteArray(pInput);
+ final byte[] transformed = pTransformer.transform(original);
+ final FileOutputStream os = new FileOutputStream(pOutput);
os.write(transformed);
os.close();
}
@@ -61,29 +61,29 @@
* @todo multiple transformers
*/
public static boolean rewriteJar(
- final JarInputStream input,
- final ResourceTransformer transformer,
- final JarOutputStream output,
- final String pattern
+ final JarInputStream pInput,
+ final ResourceTransformer pTransformer,
+ final JarOutputStream pOutput,
+ final String pattern //FIXME matcher class
) throws IOException {
boolean changed = false;
while(true) {
- final JarEntry entry = input.getNextJarEntry();
+ final JarEntry entry = pInput.getNextJarEntry();
if (entry == null) {
break;
}
if (entry.isDirectory()) {
- output.putNextEntry(new JarEntry(entry));
+ pOutput.putNextEntry(new JarEntry(entry));
continue;
}
final String name = entry.getName();
- output.putNextEntry(new JarEntry(name));
+ pOutput.putNextEntry(new JarEntry(name));
if (name.endsWith(".class")) {
if (isMatching(name, pattern)) {
@@ -94,10 +94,10 @@
System.out.println(name);
- final byte[] original = IOUtils.toByteArray(input);
+ final byte[] original = IOUtils.toByteArray(pInput);
- final byte[] transformed = transformer.transform(original);
- IOUtils.copy(new ByteArrayInputStream(transformed), output);
+ final byte[] transformed = pTransformer.transform(original);
+ IOUtils.copy(new ByteArrayInputStream(transformed), pOutput);
changed |= transformed.length != original.length;
@@ -109,23 +109,23 @@
|| name.endsWith(".war")) {
changed |= rewriteJar(
- new JarInputStream(input),
- transformer,
- new JarOutputStream(output),
+ new JarInputStream(pInput),
+ pTransformer,
+ new JarOutputStream(pOutput),
pattern
);
continue;
}
- final byte[] original = IOUtils.toByteArray(input);
- IOUtils.copy(new ByteArrayInputStream(original), output);
+ final byte[] original = IOUtils.toByteArray(pInput);
+ IOUtils.copy(new ByteArrayInputStream(original), pOutput);
System.out.println("copied " + name + "(" + original.length + ")");
}
- input.close();
- output.close();
+ pInput.close();
+ pOutput.close();
return changed;
}
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,33 @@
+package org.apache.commons.javaflow;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import junit.framework.TestCase;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.javaflow.bytecode.BytecodeClassLoader;
+import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer;
+import org.apache.commons.javaflow.bytecode.transformation.bcel.BcelClassTransformer;
+
+
+public abstract class AbstractTestCase extends TestCase {
+
+ public Runnable createRunnable(final Class pClazz) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException {
+ return createRunnable(pClazz, new Class[] {}, new Object[] {});
+ }
+
+ public Runnable createRunnable(final Class pClazz, final Class[] pParameterTypes, final Object[] pParameters) throws IOException, InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
+ final BytecodeClassLoader clazzloader = new BytecodeClassLoader();
+ final String clazzName = pClazz.getName().replace('.', '/') + ".class";
+ final InputStream is = pClazz.getClassLoader().getResourceAsStream(clazzName);
+ final byte[] clazzBytes = IOUtils.toByteArray(is);
+ final ResourceTransformer t = new BcelClassTransformer();
+ final byte[] newClazzBytes = t.transform(clazzBytes);
+ final Class clazz = clazzloader.loadClass(newClazzBytes);
+ final Constructor constructor = clazz.getConstructor(pParameterTypes);
+ final Object o = constructor.newInstance(pParameters);
+ return (Runnable) o;
+ }
+
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/AbstractTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,43 @@
+package org.apache.commons.javaflow;
+
+import org.apache.commons.javaflow.runnables.BlackRed;
+import org.apache.commons.javaflow.runnables.Counter;
+import org.apache.commons.javaflow.runnables.NewObject;
+import org.apache.commons.javaflow.runnables.StackBug;
+
+
+public final class RewritingTestCase extends AbstractTestCase {
+
+ public void testNewObject() throws Exception {
+ final Runnable r = createRunnable(NewObject.class);
+ final Continuation c = Continuation.startWith(r);
+ assertTrue(c == null);
+ }
+
+ public void testStackBug() throws Exception {
+ final Runnable r = createRunnable(StackBug.class);
+ final Continuation c = Continuation.startWith(r);
+ assertTrue(c == null);
+ }
+
+ public void testBlackRed() throws Exception {
+ final Runnable r = createRunnable(BlackRed.class);
+ final Continuation c1 = Continuation.startWith(r);
+ assertTrue(c1 != null);
+ final Continuation c2 = Continuation.continueWith(c1);
+ assertTrue(c2 == null);
+ }
+
+ public void testCounter() throws Exception {
+ final int count = 5;
+ final Runnable r = createRunnable(Counter.class, new Class[] { Integer.class }, new Object[] { new Integer(count) });
+
+ int i = 0;
+ for(Continuation c = Continuation.startWith(r); c != null; c = Continuation.continueWith(c)) {
+ i++;
+ }
+
+ assertTrue(i == count);
+ }
+
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/RewritingTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SerializationTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SerializationTestCase.java?rev=320947&r1=320946&r2=320947&view=diff
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SerializationTestCase.java (original)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SerializationTestCase.java Thu Oct 13 16:44:08 2005
@@ -1,42 +1,88 @@
-/*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed 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.textui.TestRunner;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import junitx.util.PrivateAccessor;
+import org.apache.commons.javaflow.Continuation;
+import org.apache.commons.javaflow.runnables.Invoker;
+import org.apache.commons.javaflow.runnables.Simple;
+import org.apache.commons.javaflow.runnables.SimpleSerializable;
+import org.apache.commons.javaflow.utils.ReflectionUtils;
+import org.apache.tools.ant.util.FileUtils;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
-/**
- * @author tcurdt
- *
- */
-public final class SerializationTestCase extends AbstractClassLoaderTestCase {
+public final class SerializationTestCase extends AbstractTestCase {
- public SerializationTestCase() {
- super("org.apache.commons.javaflow.SerializationTests");
+ public SimpleSerializable cast(Object o) throws IOException, ClassNotFoundException {
+ return (SimpleSerializable) ReflectionUtils.cast(o);
}
+
+ private File output;
+
+ public void testSuspend() throws Exception {
+ final Runnable r = createRunnable(SimpleSerializable.class);
+
+ assertTrue(cast(r).g == -1);
+ assertTrue(cast(r).l == -1);
+
+ Continuation c1 = Continuation.startWith(r);
+
+ assertTrue(cast(r).g == 0);
+ assertTrue(cast(r).l == 0);
+
+ final XStream xstream = new XStream(new DomDriver());
+ final String xml = xstream.toXML(c1);
+
+ output = File.createTempFile("continuation", "xml");
+ output.deleteOnExit();
- public static void main(String[] args) {
- TestRunner.run(SerializationTestCase.class);
+ final FileOutputStream fos = new FileOutputStream(output);
+ fos.write(xml.getBytes());
}
- public void testStart() throws Exception {
- call("testStart");
+
+ public void testResume() throws Exception {
+ testSuspend();
+
+ assertTrue("suspend must succeed to create the output first", output != null);
+
+ final String xml = FileUtils.readFully(new FileReader(output));
+ final XStream xstream = new XStream(new DomDriver());
+ final Object o = xstream.fromXML(xml);
+
+ assertTrue(o instanceof Continuation);
+
+ final Continuation c1 = (Continuation) o;
+
+ final Runnable r1 = (Runnable) PrivateAccessor.getField(PrivateAccessor.getField(c1, "stack"), "runnable");
+ assertTrue(cast(r1).g == 0);
+ assertTrue(cast(r1).l == 0);
+
+ final Continuation c2 = Continuation.continueWith(c1);
+
+ final Runnable r2 = (Runnable) PrivateAccessor.getField(PrivateAccessor.getField(c1, "stack"), "runnable");
+ assertTrue(cast(r2).g == 1);
+ assertTrue(cast(r2).l == 1);
+
+ assertTrue(r1 == r2);
}
- public void testResume() throws Exception {
- call("testResume");
- }
+ public void testSerializableCheck() throws Exception {
+ final Runnable r1 = createRunnable(SimpleSerializable.class);
+ Continuation c1 = Continuation.startWith(r1);
+ assertTrue(c1.isSerializable());
+
+ final Runnable r2 = createRunnable(SimpleSerializable.class);
+ Continuation c2 = Continuation.startWith(new Invoker(r2));
+ assertTrue(c2.isSerializable());
+
+ final Runnable r3 = createRunnable(Simple.class);
+ Continuation c3 = Continuation.startWith(r3);
+ assertTrue(!c3.isSerializable());
+ }
+
}
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,63 @@
+package org.apache.commons.javaflow;
+
+import java.io.IOException;
+import org.apache.commons.javaflow.Continuation;
+import org.apache.commons.javaflow.runnables.SimpleSerializable;
+import org.apache.commons.javaflow.utils.ReflectionUtils;
+
+
+public class SuspendResumeTestCase extends AbstractTestCase {
+
+ public SimpleSerializable cast(Object o) throws IOException, ClassNotFoundException {
+ return (SimpleSerializable) ReflectionUtils.cast(o);
+ }
+
+ public void testSimpleSuspendResume() throws Exception {
+ final Runnable r = createRunnable(SimpleSerializable.class);
+
+ assertTrue(cast(r).g == -1);
+ assertTrue(cast(r).l == -1);
+
+ Continuation c1 = Continuation.startWith(r);
+
+ assertTrue(cast(r).g == 0);
+ assertTrue(cast(r).l == 0);
+
+ Continuation c2 = Continuation.continueWith(c1);
+
+ assertTrue(cast(r).g == 1);
+ assertTrue(cast(r).l == 1);
+
+ Continuation c3 = Continuation.continueWith(c2);
+
+ assertTrue(cast(r).g == 2);
+ assertTrue(cast(r).l == 2);
+ }
+
+ public void testContinuationBranching() throws Exception {
+ final Runnable r = createRunnable(SimpleSerializable.class);
+
+ assertTrue(cast(r).g == -1);
+ assertTrue(cast(r).l == -1);
+
+ Continuation c1 = Continuation.startWith(r);
+
+ assertTrue(cast(r).g == 0);
+ assertTrue(cast(r).l == 0);
+
+ Continuation c2 = Continuation.continueWith(c1);
+
+ assertTrue(cast(r).g == 1);
+ assertTrue(cast(r).l == 1);
+
+ Continuation c31 = Continuation.continueWith(c2);
+
+ assertTrue(cast(r).g == 2);
+ assertTrue(cast(r).l == 2);
+
+ Continuation c32 = Continuation.continueWith(c2);
+
+ assertTrue(cast(r).g == 3);
+ assertTrue(cast(r).l == 2);
+ }
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/SuspendResumeTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,18 @@
+package org.apache.commons.javaflow;
+
+import org.apache.commons.javaflow.runnables.SimpleSerializable;
+
+
+
+public final class UsageTestCase extends AbstractTestCase {
+
+ public void testIncorrectUsageWithNormalClassLoader() throws Exception {
+ try {
+ final Runnable r = new SimpleSerializable();
+ r.run();
+ fail();
+ } catch (final Exception e) {
+ assertTrue(e instanceof IllegalStateException);
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/UsageTestCase.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,52 @@
+package org.apache.commons.javaflow.runnables;
+
+import org.apache.commons.javaflow.Continuation;
+
+import java.io.Serializable;
+
+/**
+ * Test for making sure that rstack works correctly.
+ *
+ * For this test we need to have a stack frame that goes through multiple objects
+ * of different types.
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public final class BlackRed implements Runnable, Serializable {
+ public void run() {
+ new Black(new Red(new Black(new Suspend()))).run();
+ }
+
+ class Black implements Runnable {
+ final Runnable r;
+
+ public Black(Runnable r) {
+ this.r = r;
+ }
+
+ public void run() {
+ String s = "foo"; // have some random variable
+ r.run();
+ }
+ }
+
+ class Red implements Runnable {
+ final Runnable r;
+
+ public Red(Runnable r) {
+ this.r = r;
+ }
+
+ public void run() {
+ int i = 5; // have some random variable
+ r.run();
+ }
+ }
+
+ class Suspend implements Runnable {
+ public void run() {
+ Continuation.suspend();
+ }
+ }
+
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/BlackRed.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,21 @@
+package org.apache.commons.javaflow.runnables;
+
+import org.apache.commons.javaflow.Continuation;
+
+/**
+ * @author Kohsuke Kawaguchi
+ */
+public final class Counter implements Runnable {
+
+ final int up;
+
+ public Counter(Integer up) {
+ this.up = up.intValue();
+ }
+
+ public void run() {
+ for( int i=0; i<up; i++ ) {
+ Continuation.suspend();
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Counter.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,16 @@
+package org.apache.commons.javaflow.runnables;
+
+
+public final class Invoker implements Runnable {
+
+ private final Runnable runnable;
+
+ public Invoker(final Runnable pRunnable) {
+ runnable = pRunnable;
+ }
+
+ public void run() {
+ runnable.run();
+ }
+
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Invoker.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,25 @@
+package org.apache.commons.javaflow.runnables;
+
+import junit.framework.Assert;
+
+/**
+ * Test that allocates a lot of new objects.
+ *
+ * Javaflow performs some tricky instrumentation on new object allocations,
+ * especially when it has arguments.
+ *
+ * Nesting object allocations makes it even more interesting.
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public final class NewObject implements Runnable {
+ public void run() {
+ char[] ch = {'a','b','c'};
+
+ String s = new String(new String(
+ new String(ch,0,ch.length).toCharArray(), 0, ch.length ));
+
+ Assert.assertEquals(s,"abc");
+ }
+
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/NewObject.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,22 @@
+package org.apache.commons.javaflow.runnables;
+
+import org.apache.commons.javaflow.Continuation;
+
+public final class Simple implements Runnable {
+
+ public int g = -1; // global count throughout all continuations
+ public int l = -1; // local count mapped to a global variable so
+ // we can access is
+
+ public void run() {
+ int local = -1;
+ ++g; l=++local;
+ Continuation.suspend();
+ ++g; l=++local;
+ Continuation.suspend();
+ ++g; l=++local;
+ Continuation.suspend();
+ ++g; l=++local;
+ }
+
+}
\ No newline at end of file
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/Simple.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,25 @@
+package org.apache.commons.javaflow.runnables;
+
+import java.io.Serializable;
+import org.apache.commons.javaflow.Continuation;
+
+public final class SimpleSerializable implements Runnable, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ public int g = -1; // global count throughout all continuations
+ public int l = -1; // local count mapped to a global variable so
+ // we can access is
+
+ public void run() {
+ int local = -1;
+ ++g; l=++local;
+ Continuation.suspend();
+ ++g; l=++local;
+ Continuation.suspend();
+ ++g; l=++local;
+ Continuation.suspend();
+ ++g; l=++local;
+ }
+
+}
\ No newline at end of file
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/SimpleSerializable.java
------------------------------------------------------------------------------
svn:keywords = Id
Added: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java?rev=320947&view=auto
==============================================================================
--- jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java (added)
+++ jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java Thu Oct 13 16:44:08 2005
@@ -0,0 +1,35 @@
+package org.apache.commons.javaflow.runnables;
+
+/**
+ * Regression test case.
+ *
+ * <p>
+ * When the stack size reaches the maximum in a constructor method invocation,
+ * there was a bug where we failed to expand the stack size appropriately.
+ *
+ * This is a regression test for that case.
+ *
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public final class StackBug implements Runnable {
+ public void run() {
+ final Object o = foo("abc","def");
+ }
+
+ private Object foo(String a, String b) {
+ return new StrStr(a,b);
+ }
+
+ private static final class StrStr {
+ private final String value;
+
+ public StrStr(String a, String b) {
+ value = a+b;
+ }
+
+ public String toString() {
+ return value;
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/javaflow/trunk/src/test/org/apache/commons/javaflow/runnables/StackBug.java
------------------------------------------------------------------------------
svn:keywords = Id
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org
Re: svn commit: r320947 - in /jakarta/commons/sandbox/javaflow/trunk:
./ src/java/org/apache/commons/javaflow/ src/java/org/apache/commons/javaflow/ant/
src/java/org/apache/commons/javaflow/bytecode/ src/java/org/apache/commons/javaflow/utils/
src/test/org...
Posted by Kohsuke Kawaguchi <ko...@sun.com>.
I fixed all the unit tests to pass.
I noticed that you've changed the unit test to use a one-time throw-away
ClassLoader (BytecodeClassLoader) to just instrument one class, but many
tests already require multiple instrumented classes, so this approach
doesn't work very well.
I modified this area so that a test case has a classloader, and it will
load all the test classes in this classloader. I hope this change was OK.
With this change, BytecodeClassLoader is no longer necessary, but I
noticed that you put that in the src/java, not src/test. Are you using
this class outside the javaflow unit test? Or should I remove it?
--
Kohsuke Kawaguchi
Sun Microsystems kohsuke.kawaguchi@sun.com