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 2010/06/26 19:16:25 UTC
svn commit: r958247 [1/2] - in /commons/sandbox/javaflow/trunk: ./
src/main/java/org/apache/commons/javaflow/
src/main/java/org/apache/commons/javaflow/ant/
src/main/java/org/apache/commons/javaflow/bytecode/
src/main/java/org/apache/commons/javaflow/b...
Author: tcurdt
Date: Sat Jun 26 17:16:23 2010
New Revision: 958247
URL: http://svn.apache.org/viewvc?rev=958247&view=rev
Log:
applied https://issues.apache.org/jira/browse/SANDBOX-323 (thanks to Valery Silaev),
removed author tags,
added some missing license headers,
some cleanups,
requires java5 now
some general cleanups
deactivated the BCEL tests
Modified:
commons/sandbox/javaflow/trunk/pom.xml
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/Continuation.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationClassLoader.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationDeath.java
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/EmptyStackException.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Stack.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/StackRecorder.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/NopResourceTransformer.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/ResourceTransformer.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/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/MonitoringFrame.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/DecompilingVisitor.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ControlFlowGraph.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandler.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandlers.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionPath.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionVisitor.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Frame.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/InstructionContext.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/LocalVariables.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/OperandStack.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Subroutine.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Subroutines.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/UninitializedObjectType.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/stores/JavaflowResourceStore.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/stores/TransformingResourceStore.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/utils/CompositeTransformer.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/utils/ReflectionUtils.java
commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/utils/RewritingUtils.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/UsageTestCase.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/BlackRed.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/ClassAccess2.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/CounterFlow.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/DefaultConstructor.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/Invoker.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NestedSynchronized.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NewObject.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NoReference.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/NullVariableMethodFlow.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/rewrite/Simple.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/SimpleSerializable.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/SimpleSynchronized.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/SimpleTryCatch.java
commons/sandbox/javaflow/trunk/src/test/java/org/apache/commons/javaflow/rewrite/Stack.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/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/pom.xml?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/pom.xml (original)
+++ commons/sandbox/javaflow/trunk/pom.xml Sat Jun 26 17:16:23 2010
@@ -35,6 +35,10 @@
<name>Eugene Kuleshov</name>
<email>eu at javatx.org</email>
</contributor>
+ <contributor>
+ <name>Valery Silaev</name>
+ <email>vsilaev at gmail.com</email>
+ </contributor>
</contributors>
<scm>
@@ -74,27 +78,27 @@
<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
- <version>3.1</version>
+ <version>3.2</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-analysis</artifactId>
- <version>3.1</version>
+ <version>3.2</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-commons</artifactId>
- <version>3.1</version>
+ <version>3.2</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-util</artifactId>
- <version>3.1</version>
+ <version>3.2</version>
</dependency>
<dependency>
<groupId>asm</groupId>
<artifactId>asm-tree</artifactId>
- <version>3.1</version>
+ <version>3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
@@ -127,11 +131,20 @@
<build>
<plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ <encoding>UTF-8</encoding>
+ </configuration>
+ </plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
- <include>**/*TestSuite.java</include>
+ <include>**/AsmTestSuite.java</include>
</includes>
<excludes>
<exclude>**/Abstract*</exclude>
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/Continuation.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/Continuation.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/Continuation.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/Continuation.java Sat Jun 26 17:16:23 2010
@@ -122,7 +122,9 @@ public final class Continuation implemen
throw new IllegalArgumentException("target is null");
}
- log.debug("starting new flow from " + ReflectionUtils.getClassName(pTarget) + "/" + ReflectionUtils.getClassLoaderName(pTarget));
+ if (log.isDebugEnabled()) {
+ log.debug("starting new flow from " + ReflectionUtils.getClassName(pTarget) + "/" + ReflectionUtils.getClassLoaderName(pTarget));
+ }
return continueWith(new Continuation(new StackRecorder(pTarget)), pContext);
}
@@ -157,11 +159,13 @@ public final class Continuation implemen
* @see #getContext()
*/
public static Continuation continueWith(final Continuation pOldContinuation, final Object pContext) {
- if(pOldContinuation == null) {
+ if (pOldContinuation == null) {
throw new IllegalArgumentException("continuation parameter must not be null.");
}
- log.debug("continueing with continuation " + ReflectionUtils.getClassName(pOldContinuation) + "/" + ReflectionUtils.getClassLoaderName(pOldContinuation));
+ if (log.isDebugEnabled()) {
+ log.debug("continueing with continuation " + ReflectionUtils.getClassName(pOldContinuation) + "/" + ReflectionUtils.getClassLoaderName(pOldContinuation));
+ }
while(true) {
try {
@@ -189,6 +193,17 @@ public final class Continuation implemen
}
/**
+ * Accessor for value yielded by continuation
+ *
+ * @return
+ * The latest value yielded by suspended continuation.
+ * The value is passed from the continuation to the client code via {@link #suspend(Object)}
+ */
+ public Object value() {
+ return stackRecorder.value;
+ }
+
+ /**
* Stops the running continuation.
*
* <p>
@@ -196,13 +211,43 @@ public final class Continuation implemen
* When called, the thread returns from the above methods with a new {@link Continuation}
* object that captures the thread state.
*
+ * @return
+ * The value to be returned to suspended code after continuation is resumed.
+ * The value is passed from the client code via @link #continueWith(Continuation, Object)
+ * and is identical to value returned by {@link #getContext}.
+ *
* @throws IllegalStateException
* if this method is called outside the {@link #continueWith} or {@link #startWith} methods.
*/
- public static void suspend() {
- StackRecorder.suspend();
+ public static Object suspend() {
+ return suspend(null);
+ }
+
+ /**
+ * Stops the running continuation.
+ *
+ * <p>
+ * This method can be only called inside {@link #continueWith} or {@link #startWith} methods.
+ * When called, the thread returns from the above methods with a new {@link Continuation}
+ * object that captures the thread state and with {@link #value} equals to parameter passed.
+ *
+ * @param value
+ * The intermediate result yielded by suspended continuations
+ * The value may be accessed via {@link #value} method of continuation returned
+ *
+ * @return
+ * The value to be returned to suspended code after continuation is resumed.
+ * The value is passed from the client code via @link #continueWith(Continuation, Object)
+ * and is identical to value returned by {@link #getContext}.
+ *
+ * @throws IllegalStateException
+ * if this method is called outside the {@link #continueWith} or {@link #startWith} methods.
+ */
+ public static Object suspend(final Object value) {
+ return StackRecorder.suspend(value);
}
+
/**
* Completes the execution of the running continuation.
*
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationClassLoader.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationClassLoader.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationClassLoader.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationClassLoader.java Sat Jun 26 17:16:23 2010
@@ -31,7 +31,6 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
/**
@@ -62,14 +61,14 @@ public final class ContinuationClassLoad
* loader regardless of whether the parent class loader is being searched
* first or not.
*/
- private List systemPackages = new ArrayList();
+ private List<String> systemPackages = new ArrayList<String>();
/**
* These are the package roots that are to be loaded by this class loader
* regardless of whether the parent class loader is being searched first
* or not.
*/
- private List loaderPackages = new ArrayList();
+ private List<String> loaderPackages = new ArrayList<String>();
/**
* Whether or not this classloader will ignore the base
@@ -190,11 +189,11 @@ public final class ContinuationClassLoad
* @exception ClassNotFoundException if the requested class does not exist
* on this loader's classpath.
*/
- public Class forceLoadClass(String classname)
+ public Class<?> forceLoadClass(String classname)
throws ClassNotFoundException {
log.debug("force loading " + classname);
- Class theClass = findLoadedClass(classname);
+ Class<?> theClass = findLoadedClass(classname);
if (theClass == null) {
theClass = findClass(classname);
@@ -225,16 +224,14 @@ public final class ContinuationClassLoad
boolean useParentFirst = parentFirst;
- for (Iterator itr = systemPackages.iterator(); itr.hasNext();) {
- String packageName = (String) itr.next();
+ for (final String packageName : systemPackages) {
if (resourceName.startsWith(packageName)) {
useParentFirst = true;
break;
}
}
- for (Iterator itr = loaderPackages.iterator(); itr.hasNext();) {
- String packageName = (String) itr.next();
+ for (final String packageName : loaderPackages) {
if (resourceName.startsWith(packageName)) {
useParentFirst = false;
break;
@@ -264,13 +261,13 @@ public final class ContinuationClassLoad
* on the system classpath (when not in isolated mode) or this loader's
* classpath.
*/
- protected synchronized Class loadClass(String classname, boolean resolve)
+ protected synchronized Class<?> loadClass(String classname, boolean resolve)
throws ClassNotFoundException {
// 'sync' is needed - otherwise 2 threads can load the same class
// twice, resulting in LinkageError: duplicated class definition.
// findLoadedClass avoids that, but without sync it won't work.
- Class theClass = findLoadedClass(classname);
+ Class<?> theClass = findLoadedClass(classname);
if (theClass != null) {
return theClass;
}
@@ -313,24 +310,24 @@ public final class ContinuationClassLoad
*
* @return the Class instance created from the given data
*/
- protected Class defineClassFromData(final byte[] classData, final String classname) {
- return (Class)AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
+ protected Class<?> defineClassFromData(final byte[] classData, final String classname) {
+ return AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
+ public Class<?> run() {
// define a package if necessary.
int i = classname.lastIndexOf('.');
if (i>0) {
- String packageName = classname.substring(0,i);
- Package pkg = getPackage(packageName);
- if(pkg==null) {
+ final String packageName = classname.substring(0,i);
+ final Package pkg = getPackage(packageName);
+ if (pkg == null) {
definePackage(packageName,null,null,null,null,null,null,null);
}
}
- byte[] newData = transformer.transform(classData);
- ProtectionDomain domain = this.getClass().getProtectionDomain();
+ final byte[] newData = transformer.transform(classData);
+ final ProtectionDomain domain = this.getClass().getProtectionDomain();
return defineClass(classname,newData,0,newData.length,domain);
}
- },acc);
+ }, acc);
}
/**
@@ -348,10 +345,9 @@ public final class ContinuationClassLoad
* @exception SecurityException if there is a security problem while
* reading the class from the stream.
*/
- private Class getClassFromStream(InputStream stream, String classname) throws IOException, SecurityException {
+ private Class<?> getClassFromStream(InputStream stream, String classname) throws IOException, SecurityException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
int bytesRead;
@@ -380,7 +376,7 @@ public final class ContinuationClassLoad
* @exception ClassNotFoundException if the requested class does not exist
* on this loader's classpath.
*/
- public Class findClass(final String name) throws ClassNotFoundException {
+ public Class<?> findClass(final String name) throws ClassNotFoundException {
log.debug("Finding class " + name);
// locate the class file
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationDeath.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationDeath.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationDeath.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/ContinuationDeath.java Sat Jun 26 17:16:23 2010
@@ -1,3 +1,19 @@
+/*
+ * 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 org.apache.commons.javaflow.bytecode.StackRecorder;
@@ -9,8 +25,6 @@ import org.apache.commons.javaflow.bytec
*
* <p>
* This class is only for javaflow internal code.
- *
- * @author Kohsuke Kawaguchi
*/
public final class ContinuationDeath extends Error {
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=958247&r1=958246&r2=958247&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 Sat Jun 26 17:16:23 2010
@@ -35,10 +35,8 @@ import org.apache.tools.ant.types.FileSe
/**
* Ant task that enhances class files with javaflow instrumentation.
- *
- * @author tcurdt
- * @author Kohsuke Kawaguchi
*/
+@SuppressWarnings("deprecation")
public class AntRewriteTask extends MatchingTask {
private ResourceTransformer transformer;
@@ -137,7 +135,7 @@ public class AntRewriteTask extends Matc
if (fileName.endsWith(".class")) {
log("Rewriting " + source + " to " + destination, Project.MSG_VERBOSE);
- System.out.println("Rewriting " + source);
+ // System.out.println("Rewriting " + source);
RewritingUtils.rewriteClassFile( source, transformer, destination );
}
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=958247&r1=958246&r2=958247&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 Sat Jun 26 17:16:23 2010
@@ -1,10 +1,25 @@
+/*
+ * 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.bytecode;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.commons.EmptyVisitor;
-
public class BytecodeClassLoader extends ClassLoader {
class NameClassAdapter extends ClassAdapter {
@@ -23,16 +38,16 @@ public class BytecodeClassLoader extends
}
}
- public Class loadClass( final byte[] bytecode ) {
+ public Class<?> loadClass( final byte[] bytecode ) {
final NameClassAdapter nameClassAdapter = new NameClassAdapter();
new ClassReader(bytecode).accept(nameClassAdapter, 0);
final String name = nameClassAdapter.getName().replace('/', '.');
-// System.out.println("loading class " + name);
+ // System.out.println("loading class " + name);
- final Class clazz = defineClass(name, bytecode, 0, bytecode.length);
+ final Class<?> clazz = defineClass(name, bytecode, 0, bytecode.length);
return clazz;
}
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=958247&r1=958246&r2=958247&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 Sat Jun 26 17:16:23 2010
@@ -20,9 +20,6 @@ package org.apache.commons.javaflow.byte
* Marker interface to mark classes, which are transformed by the
* ContinuationClassLoader.
*
- * @author <a href="mailto:tcurdt@apache.org">Torsten Curdt</a>
- * @author <a href="mailto:stephan@apache.org">Stephan Michels</a>
- * @version CVS $Id$
*/
public interface Continuable {
}
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/EmptyStackException.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/EmptyStackException.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/EmptyStackException.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/EmptyStackException.java Sat Jun 26 17:16:23 2010
@@ -16,16 +16,11 @@
*/
package org.apache.commons.javaflow.bytecode;
-/**
- * @author tcurdt
- *
- */
-public class EmptyStackException extends RuntimeException {
+public final class EmptyStackException extends RuntimeException {
private static final long serialVersionUID = 1L;
public EmptyStackException(String message) {
super(message);
}
-
}
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Stack.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Stack.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Stack.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/Stack.java Sat Jun 26 17:16:23 2010
@@ -26,10 +26,6 @@ import org.apache.commons.logging.LogFac
/**
* Stack to store the frame information along the invocation trace.
- *
- * @author <a href="mailto:tcurdt@apache.org">Torsten Curdt</a>
- * @author <a href="mailto:stephan@apache.org">Stephan Michels</a>
- * @version CVS $Id$
*/
public class Stack implements Serializable {
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/StackRecorder.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/StackRecorder.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/StackRecorder.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/StackRecorder.java Sat Jun 26 17:16:23 2010
@@ -24,15 +24,13 @@ import org.apache.commons.logging.LogFac
/**
* Adds additional behaviors necessary for stack capture/restore
* on top of {@link Stack}.
- *
- * @author Kohsuke Kawaguchi
*/
public final class StackRecorder extends Stack {
private static final Log log = LogFactory.getLog(StackRecorder.class);
private static final long serialVersionUID = 2L;
- private static final ThreadLocal threadMap = new ThreadLocal();
+ private static final ThreadLocal<StackRecorder> threadMap = new ThreadLocal<StackRecorder>();
/**
* True, if the continuation restores the previous stack trace to the last
@@ -53,8 +51,10 @@ public final class StackRecorder extends
*/
public transient boolean isCapturing = false;
- /** Context object given by the user */
+ /** Context object passed by the client code to continuation during resume */
private transient Object context;
+ /** Result object passed by the continuation to the client code during suspend */
+ public transient Object value;
/**
* Creates a new empty {@link StackRecorder} that runs the given target.
@@ -70,7 +70,7 @@ public final class StackRecorder extends
super(pParent);
}
- public static void suspend() {
+ public static Object suspend(final Object value) {
log.debug("suspend()");
final StackRecorder stackRecorder = get();
@@ -80,6 +80,12 @@ public final class StackRecorder extends
stackRecorder.isCapturing = !stackRecorder.isRestoring;
stackRecorder.isRestoring = false;
+ stackRecorder.value = value;
+
+ // flow breaks here, actual return will be executed in resumed continuation
+ // return in continuation to be suspended is executed as well but ignored
+
+ return stackRecorder.context;
}
public StackRecorder execute(final Object context) {
@@ -89,7 +95,9 @@ public final class StackRecorder extends
this.context = context;
if (isRestoring) {
- log.debug("Restoring state of " + ReflectionUtils.getClassName(runnable) + "/" + ReflectionUtils.getClassLoaderName(runnable));
+ if (log.isDebugEnabled()) {
+ log.debug("Restoring state of " + ReflectionUtils.getClassName(runnable) + "/" + ReflectionUtils.getClassLoaderName(runnable));
+ }
}
log.debug("calling runnable");
@@ -110,14 +118,14 @@ public final class StackRecorder extends
} else {
return null; // nothing more to continue
}
- } catch(ContinuationDeath cd) {
+ } catch(final ContinuationDeath cd) {
// this isn't an error, so no need to log
throw cd;
- } catch(Error e) {
- log.error(e.getMessage(),e);
+ } catch(final Error e) {
+ log.error(e.getMessage(), e);
throw e;
- } catch(RuntimeException e) {
- log.error(e.getMessage(),e);
+ } catch(final RuntimeException e) {
+ log.error(e.getMessage(), e);
throw e;
} finally {
this.context = null;
@@ -133,7 +141,7 @@ public final class StackRecorder extends
* Bind this stack recorder to running thread.
*/
private StackRecorder registerThread() {
- StackRecorder old = get();
+ final StackRecorder old = get();
threadMap.set(this);
return old;
}
@@ -149,6 +157,6 @@ public final class StackRecorder extends
* Return the continuation, which is associated to the current thread.
*/
public static StackRecorder get() {
- return (StackRecorder)threadMap.get();
+ return threadMap.get();
}
}
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/NopResourceTransformer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/NopResourceTransformer.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/NopResourceTransformer.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/NopResourceTransformer.java Sat Jun 26 17:16:23 2010
@@ -23,5 +23,4 @@ public final class NopResourceTransforme
public byte[] transform( byte[] original ) {
return original;
}
-
}
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/ResourceTransformer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/ResourceTransformer.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/ResourceTransformer.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/ResourceTransformer.java Sat Jun 26 17:16:23 2010
@@ -23,10 +23,10 @@ package org.apache.commons.javaflow.byte
* When {@link Continuation#suspend()} is called, all the methods
* in the stack frame needs to be enhanced.
*
- * @author tcurdt
* @see BcelClassTransformer
* @see AsmClassTransformer
*/
public interface ResourceTransformer {
+
byte[] transform( final byte[] original );
}
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=958247&r1=958246&r2=958247&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 Sat Jun 26 17:16:23 2010
@@ -18,21 +18,22 @@ package org.apache.commons.javaflow.byte
import java.io.IOException;
import java.io.InputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+import java.lang.reflect.Field;
import org.apache.commons.javaflow.bytecode.transformation.ResourceTransformer;
+
import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.util.CheckClassAdapter;
+import org.objectweb.asm.util.TraceClassVisitor;
-
-/**
- * AsmClassTransformer
- *
- * @author Eugene Kuleshov
- */
public final class AsmClassTransformer implements ResourceTransformer {
- public byte[] transform(InputStream is) throws IOException {
+ public byte[] transform(final InputStream is) throws IOException {
return transform(new ClassReader(is));
}
@@ -40,29 +41,56 @@ public final class AsmClassTransformer i
return transform(new ClassReader(original));
}
- private byte[] transform(ClassReader cr) {
+ private byte[] transform(final ClassReader cr) {
final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-
// print bytecode before transformation
// cr.accept(new TraceClassVisitor(new ContinuationClassAdapter(this, cw), new PrintWriter(System.out)), false);
- // prints bytecode after transformation
- // cr.accept(new ContinuationClassAdapter(this, new TraceClassVisitor(cw, new PrintWriter(System.err))), 0);
- // cr.accept(new ContinuationClassAdapter(this, new TraceClassVisitor(cw, new PrintWriter(System.err))), false);
-
- cr.accept(new ContinuationClassAdapter(new CheckClassAdapter(cw)), 0);
+ cr.accept(
+ new ContinuationClassAdapter(
+ decorateClassVisitor(cw, true, null/* System.err */)
+ ),
+ 0);
- byte[] bytecode = cw.toByteArray();
+ final byte[] bytecode = cw.toByteArray();
// CheckClassAdapter.verify(new ClassReader(bytecode), true);
// new ClassReader(bytecode).accept(new ASMifierClassVisitor(new PrintWriter(System.err)), false);
+ return bytecode;
+ }
- // ClassWriter cww = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
- // new ClassReader(bytecode).accept(cww, ClassReader.SKIP_DEBUG);
- // new ClassReader(cww.toByteArray()).accept(new TraceClassVisitor(new PrintWriter(System.err)), 0);
+ private ClassVisitor decorateClassVisitor(ClassVisitor visitor, final boolean check, final PrintStream dumpStream) {
+ if (check) {
+ visitor = new CheckClassAdapter(visitor);
+ if (null != CHECK_DATA_FLOW) {
+ try {
+ // Currently CheckMethodAdapter throws error, so suppress flow checks
+ CHECK_DATA_FLOW.set(visitor, Boolean.FALSE);
+ } catch (final IllegalAccessException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ }
+
+ if (null != dumpStream) {
+ visitor = new TraceClassVisitor(visitor, new PrintWriter(dumpStream));
+ }
- return bytecode;
+ return visitor;
}
+ final private static Field CHECK_DATA_FLOW;
+
+ static {
+ Field checkDataFlow = null;
+ try {
+ checkDataFlow = CheckClassAdapter.class.getDeclaredField("checkDataFlow");
+ checkDataFlow.setAccessible(true);
+ } catch (final NoSuchFieldException ex) {
+ // Normal, the field is available only since ASM 3.2
+ }
+
+ CHECK_DATA_FLOW = checkDataFlow;
+ }
}
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=958247&r1=958246&r2=958247&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 Sat Jun 26 17:16:23 2010
@@ -20,13 +20,8 @@ import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
+public final class ContinuationClassAdapter extends ClassAdapter {
-/**
- * ContinuationClassAdapter
- *
- * @author Evgueni Koulechov
- */
-public class ContinuationClassAdapter extends ClassAdapter {
private String className;
public ContinuationClassAdapter(ClassVisitor cv) {
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=958247&r1=958246&r2=958247&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 Sat Jun 26 17:16:23 2010
@@ -30,6 +30,7 @@ import org.objectweb.asm.tree.analysis.B
import org.objectweb.asm.tree.analysis.Frame;
public final class ContinuationMethodAdapter extends MethodAdapter implements Opcodes {
+
private static final String STACK_RECORDER = Type.getInternalName(StackRecorder.class);
private static final String POP_METHOD = "pop";
private static final String PUSH_METHOD = "push";
@@ -37,8 +38,8 @@ public final class ContinuationMethodAda
private final ContinuationMethodAnalyzer canalyzer;
private final Analyzer analyzer;
private Label startLabel = new Label();
- private final List labels;
- private final List nodes;
+ private final List<Label> labels;
+ private final List<MethodInsnNode> nodes;
private final int stackRecorderVar;
private final boolean isStatic;
private final String methodDesc;
@@ -130,9 +131,9 @@ public final class ContinuationMethodAda
if (frame instanceof MonitoringFrame) {
int[] monitoredLocals = ((MonitoringFrame) frame).getMonitored();
- System.out.println(System.identityHashCode(frame)+" AMonitored locals "+monitoredLocals.length);
+ // System.out.println(System.identityHashCode(frame)+" AMonitored locals "+monitoredLocals.length);
for (int j = 0; j < monitoredLocals.length; j++) {
- System.out.println(System.identityHashCode(frame)+" AMonitored local "+monitoredLocals[j]);
+ // System.out.println(System.identityHashCode(frame)+" AMonitored local "+monitoredLocals[j]);
mv.visitVarInsn(ALOAD, monitoredLocals[j]);
mv.visitInsn(MONITORENTER);
}
@@ -280,9 +281,9 @@ public final class ContinuationMethodAda
if (currentFrame instanceof MonitoringFrame) {
int[] monitoredLocals = ((MonitoringFrame) currentFrame).getMonitored();
- System.out.println(System.identityHashCode(currentFrame)+" Monitored locals "+monitoredLocals.length);
+ // System.out.println(System.identityHashCode(currentFrame)+" Monitored locals "+monitoredLocals.length);
for (int j = 0; j < monitoredLocals.length; j++) {
- System.out.println(System.identityHashCode(currentFrame)+" Monitored local "+monitoredLocals[j]);
+ // System.out.println(System.identityHashCode(currentFrame)+" Monitored local "+monitoredLocals[j]);
mv.visitVarInsn(ALOAD, monitoredLocals[j]);
mv.visitInsn(MONITOREXIT);
}
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/ContinuationMethodAnalyzer.java Sat Jun 26 17:16:23 2010
@@ -18,7 +18,6 @@ package org.apache.commons.javaflow.byte
import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -42,18 +41,18 @@ import org.objectweb.asm.tree.analysis.S
import org.objectweb.asm.tree.analysis.SourceValue;
public class ContinuationMethodAnalyzer extends MethodNode implements Opcodes {
+
protected final String className;
protected final ClassVisitor cv;
protected final MethodVisitor mv;
- protected final List labels = new ArrayList();
- protected final List nodes = new ArrayList();
- protected final List methods = new ArrayList();
+ protected final List<Label> labels = new ArrayList<Label>();
+ protected final List<MethodInsnNode> nodes = new ArrayList<MethodInsnNode>();
+ protected final List<MethodInsnNode> methods = new ArrayList<MethodInsnNode>();
protected Analyzer analyzer;
public int stackRecorderVar;
-
public ContinuationMethodAnalyzer(String className, ClassVisitor cv, MethodVisitor mv, int access, String name, String desc, String signature, String[] exceptions) {
super(access, name, desc, signature, exceptions);
this.className = className;
@@ -62,9 +61,9 @@ public class ContinuationMethodAnalyzer
}
public int getIndex(AbstractInsnNode node) {
- return instructions.indexOf(node);
+ return instructions.indexOf(node);
}
-
+
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
MethodInsnNode mnode = new MethodInsnNode(opcode, owner, name, desc);
if (opcode == INVOKESPECIAL || "<init>".equals(name)) {
@@ -85,17 +84,17 @@ public class ContinuationMethodAnalyzer
return;
}
-/*
-{
- TraceMethodVisitor mv = new TraceMethodVisitor();
- System.err.println(name + desc);
- for (int j = 0; j < instructions.size(); ++j) {
- ((AbstractInsnNode) instructions.get(j)).accept(mv);
- System.err.print(" " + mv.text.get(j)); // mv.text.get(j));
- }
- System.err.println();
-}
-*/
+ /*
+ {
+ TraceMethodVisitor mv = new TraceMethodVisitor();
+ System.err.println(name + desc);
+ for (int j = 0; j < instructions.size(); ++j) {
+ ((AbstractInsnNode) instructions.get(j)).accept(mv);
+ System.err.print(" " + mv.text.get(j)); // mv.text.get(j));
+ }
+ System.err.println();
+ }
+ */
this.stackRecorderVar = maxLocals;
try {
@@ -103,7 +102,8 @@ public class ContinuationMethodAnalyzer
// analyzer = new Analyzer(new BasicVerifier());
analyzer = new Analyzer(new SimpleVerifier() {
- protected Class getClass(Type t) {
+
+ protected Class<?> getClass(Type t) {
try {
if (t.getSort() == Type.ARRAY) {
return Class.forName(t.getDescriptor().replace('/', '.'), true, Thread.currentThread().getContextClassLoader());
@@ -115,7 +115,6 @@ public class ContinuationMethodAnalyzer
}
}) {
-
protected Frame newFrame(final int nLocals, final int nStack) {
return new MonitoringFrame(nLocals, nStack);
}
@@ -124,36 +123,35 @@ public class ContinuationMethodAnalyzer
return new MonitoringFrame(src);
}
- public Frame[] analyze(String owner, MethodNode m) throws AnalyzerException {
- //System.out.println("Analyze: "+owner+"|"+m.name+"|"+m.signature+"|"+m.tryCatchBlocks);
- Frame[] framesa = super.analyze(owner, m);
+ public Frame[] analyze(final String owner, final MethodNode m) throws AnalyzerException {
+ // System.out.println("Analyze: "+owner+"|"+m.name+"|"+m.signature+"|"+m.tryCatchBlocks);
+ final Frame[] frames = super.analyze(owner, m);
for (int i = 0; i < m.instructions.size(); i++) {
- int opcode = ((AbstractInsnNode) m.instructions.get(i)).getOpcode();
+ int opcode = m.instructions.get(i).getOpcode();
if (opcode == MONITORENTER || opcode == MONITOREXIT) {
- //System.out.println(i);
+ // System.out.println(i);
}
-
}
- return framesa;
+ return frames;
}
};
analyzer.analyze(className, this);
accept(new ContinuationMethodAdapter(this));
-/*
-{
- TraceMethodVisitor mv = new TraceMethodVisitor();
- System.err.println("=================");
-
- System.err.println(name + desc);
- for (int j = 0; j < instructions.size(); ++j) {
- ((AbstractInsnNode) instructions.get(j)).accept(mv);
- System.err.print(" " + mv.text.get(j)); // mv.text.get(j));
- }
- System.err.println();
-}
-*/
+ /*
+ {
+ TraceMethodVisitor mv = new TraceMethodVisitor();
+ System.err.println("=================");
+
+ System.err.println(name + desc);
+ for (int j = 0; j < instructions.size(); ++j) {
+ ((AbstractInsnNode) instructions.get(j)).accept(mv);
+ System.err.print(" " + mv.text.get(j)); // mv.text.get(j));
+ }
+ System.err.println();
+ }
+ */
} catch (AnalyzerException ex) {
// TODO log the error or fail?
@@ -163,38 +161,38 @@ public class ContinuationMethodAnalyzer
}
}
+ @SuppressWarnings("unchecked")
void moveNew() throws AnalyzerException {
SourceInterpreter i = new SourceInterpreter();
Analyzer a = new Analyzer(i);
a.analyze(className, this);
- HashMap movable = new HashMap();
+ final HashMap<AbstractInsnNode, MethodInsnNode> movable = new HashMap<AbstractInsnNode, MethodInsnNode>();
Frame[] frames = a.getFrames();
for (int j = 0; j < methods.size(); j++) {
- MethodInsnNode mnode = (MethodInsnNode) methods.get(j);
+ MethodInsnNode mnode = methods.get(j);
// require to move NEW instruction
int n = instructions.indexOf(mnode);
Frame f = frames[n];
Type[] args = Type.getArgumentTypes(mnode.desc);
SourceValue v = (SourceValue) f.getStack(f.getStackSize() - args.length - 1);
- Set insns = v.insns;
- for (Iterator it = insns.iterator(); it.hasNext();) {
- AbstractInsnNode ins = (AbstractInsnNode) it.next();
+ Set<AbstractInsnNode> insns = v.insns;
+ for (final AbstractInsnNode ins : insns) {
if (ins.getOpcode() == NEW) {
movable.put(ins, mnode);
} else {
// other known patterns
int n1 = instructions.indexOf(ins);
if (ins.getOpcode() == DUP) { // <init> with params
- AbstractInsnNode ins1 = (AbstractInsnNode) instructions.get(n1 - 1);
+ AbstractInsnNode ins1 = instructions.get(n1 - 1);
if (ins1.getOpcode() == NEW) {
movable.put(ins1, mnode);
}
- } else if (ins.getOpcode() == SWAP) { // in exception handler
- AbstractInsnNode ins1 = (AbstractInsnNode) instructions.get(n1 - 1);
- AbstractInsnNode ins2 = (AbstractInsnNode) instructions.get(n1 - 2);
+ } else if (ins.getOpcode() == SWAP) { // in exception handler
+ AbstractInsnNode ins1 = instructions.get(n1 - 1);
+ AbstractInsnNode ins2 = instructions.get(n1 - 2);
if (ins1.getOpcode() == DUP_X1 && ins2.getOpcode() == NEW) {
movable.put(ins2, mnode);
}
@@ -204,33 +202,30 @@ public class ContinuationMethodAnalyzer
}
int updateMaxStack = 0;
- for (Iterator it = movable.entrySet().iterator(); it.hasNext();) {
- Map.Entry e = (Map.Entry) it.next();
- AbstractInsnNode node1 = (AbstractInsnNode) e.getKey();
+ for (final Map.Entry<AbstractInsnNode, MethodInsnNode> e : movable.entrySet()) {
+ AbstractInsnNode node1 = e.getKey();
int n1 = instructions.indexOf(node1);
- AbstractInsnNode node2 = (AbstractInsnNode) instructions.get(n1 + 1);
- AbstractInsnNode node3 = (AbstractInsnNode) instructions.get(n1 + 2);
+ AbstractInsnNode node2 = instructions.get(n1 + 1);
+ AbstractInsnNode node3 = instructions.get(n1 + 2);
int producer = node2.getOpcode();
- instructions.remove(node1); // NEW
+ instructions.remove(node1); // NEW
boolean requireDup = false;
if (producer == DUP) {
- instructions.remove(node2); // DUP
+ instructions.remove(node2); // DUP
requireDup = true;
} else if (producer == DUP_X1) {
- instructions.remove(node2); // DUP_X1
- instructions.remove(node3); // SWAP
+ instructions.remove(node2); // DUP_X1
+ instructions.remove(node3); // SWAP
requireDup = true;
}
MethodInsnNode mnode = (MethodInsnNode) e.getValue();
AbstractInsnNode nm = mnode;
- AbstractInsnNode next;
int varOffset = stackRecorderVar + 1;
Type[] args = Type.getArgumentTypes(mnode.desc);
-
// optimizations for some common cases
if (args.length == 0) {
final InsnList doNew = new InsnList();
@@ -238,31 +233,29 @@ public class ContinuationMethodAnalyzer
if (requireDup)
doNew.add(new InsnNode(DUP));
instructions.insertBefore(nm, doNew);
- nm = doNew.getLast();
+ nm = doNew.getLast();
continue;
}
if (args.length == 1 && args[0].getSize() == 1) {
final InsnList doNew = new InsnList();
- doNew.add(node1); // NEW
+ doNew.add(node1); // NEW
if (requireDup) {
doNew.add(new InsnNode(DUP));
doNew.add(new InsnNode(DUP2_X1));
doNew.add(new InsnNode(POP2));
updateMaxStack = updateMaxStack < 2 ? 2 : updateMaxStack; // a two extra slots for temp values
- } else
+ } else
doNew.add(new InsnNode(SWAP));
instructions.insertBefore(nm, doNew);
- nm = doNew.getLast();
+ nm = doNew.getLast();
continue;
}
-
// TODO this one untested!
- if ((args.length == 1 && args[0].getSize() == 2) ||
- (args.length == 2 && args[0].getSize() == 1 && args[1].getSize() == 1)) {
+ if ((args.length == 1 && args[0].getSize() == 2) || (args.length == 2 && args[0].getSize() == 1 && args[1].getSize() == 1)) {
final InsnList doNew = new InsnList();
- doNew.add(node1); // NEW
+ doNew.add(node1); // NEW
if (requireDup) {
doNew.add(new InsnNode(DUP));
doNew.add(new InsnNode(DUP2_X2));
@@ -274,10 +267,10 @@ public class ContinuationMethodAnalyzer
updateMaxStack = updateMaxStack < 1 ? 1 : updateMaxStack; // an extra slot for temp value
}
instructions.insertBefore(nm, doNew);
- nm = doNew.getLast();
+ nm = doNew.getLast();
continue;
}
-
+
final InsnList doNew = new InsnList();
// generic code using temporary locals
// save stack
@@ -294,7 +287,7 @@ public class ContinuationMethodAnalyzer
doNew.add(node1); // NEW
if (requireDup)
- doNew.add(new InsnNode(DUP));
+ doNew.add(new InsnNode(DUP));
// restore stack
for (int j = 0; j < args.length; j++) {
@@ -313,18 +306,22 @@ public class ContinuationMethodAnalyzer
}
}
instructions.insertBefore(nm, doNew);
- nm = doNew.getLast();
+ nm = doNew.getLast();
}
maxStack += updateMaxStack;
}
- // TODO
boolean needsFrameGuard(int opcode, String owner, String name, String desc) {
- if (opcode == Opcodes.INVOKEINTERFACE ||
- (opcode == Opcodes.INVOKESPECIAL && !"<init>".equals(name)) ||
- opcode == Opcodes.INVOKESTATIC ||
- opcode == Opcodes.INVOKEVIRTUAL) {
+ /* TODO: need to customize a way enchancer skips classes/methods
+ if (owner.startsWith("java/")) {
+ System.out.println("SKIP:: " + owner + "." + name + desc);
+ return false;
+ }
+ */
+
+ if (opcode == Opcodes.INVOKEINTERFACE || (opcode == Opcodes.INVOKESPECIAL && !"<init>".equals(name)) || opcode == Opcodes.INVOKESTATIC
+ || opcode == Opcodes.INVOKEVIRTUAL) {
return true;
}
return false;
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/MonitoringFrame.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/MonitoringFrame.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/MonitoringFrame.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/asm/MonitoringFrame.java Sat Jun 26 17:16:23 2010
@@ -26,10 +26,10 @@ import org.objectweb.asm.tree.analysis.V
import java.util.LinkedList;
import java.util.List;
-public class MonitoringFrame extends Frame {
+public final class MonitoringFrame extends Frame {
// keeps track of monitored locals
- private List monitored;
+ private List<Integer> monitored;
public MonitoringFrame(Frame arg0) {
super(arg0);
@@ -37,16 +37,18 @@ public class MonitoringFrame extends Fra
public MonitoringFrame(int arg0, int arg1) {
super(arg0, arg1);
- monitored = new LinkedList();
+ monitored = new LinkedList<Integer>();
}
public void execute(AbstractInsnNode insn, Interpreter interpreter)
throws AnalyzerException {
- if (false) {
+ boolean never = false;
+ if (never) {
super.execute(insn, interpreter);
return;
}
+
int insnOpcode = insn.getOpcode();
if (insnOpcode == Opcodes.MONITORENTER || insnOpcode == Opcodes.MONITOREXIT) {
@@ -71,12 +73,12 @@ public class MonitoringFrame extends Fra
}
}
- public Frame init(Frame arg0) {
- super.init(arg0);
- if (arg0 instanceof MonitoringFrame) {
- monitored = new LinkedList(((MonitoringFrame)arg0).monitored);
+ public Frame init(Frame frame) {
+ super.init(frame);
+ if (frame instanceof MonitoringFrame) {
+ monitored = new LinkedList<Integer>(MonitoringFrame.class.cast(frame).monitored);
} else {
- monitored = new LinkedList();
+ monitored = new LinkedList<Integer>();
}
return this;
}
@@ -84,7 +86,7 @@ public class MonitoringFrame extends Fra
public int[] getMonitored() {
int[] res = new int[monitored.size()];
for (int i = 0; i < monitored.size(); i++) {
- res[i] = ((Integer) monitored.get(i)).intValue();
+ res[i] = monitored.get(i);
}
return res;
}
@@ -94,7 +96,7 @@ public class MonitoringFrame extends Fra
}
public void monitorExit(int local) {
- int index = monitored.lastIndexOf(new Integer(local));
+ int index = monitored.lastIndexOf(local);
if (index == -1) {
// throw new IllegalStateException("Monitor Exit never entered");
} else {
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java Sat Jun 26 17:16:23 2010
@@ -74,13 +74,12 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
/**
* {@link ResourceTransformer} that uses BCEL.
*
- * @author tcurdt
- * @author Kohsuke Kawaguchi
* @deprecated use the AsmClassTransformer instead
*/
public final class BcelClassTransformer implements ResourceTransformer {
@@ -312,10 +311,10 @@ public final class BcelClassTransformer
private void analyse(ClassGen clazz, MethodGen method, ControlFlowGraph cfg, ExecutionVisitor ev) {
log.debug("analyse " + method.getName());
- final Frame vanillaFrame = craeteInitialFrame(method, clazz);
+ final Frame vanillaFrame = createInitialFrame(method, clazz);
- final Vector ics = new Vector(); // Type: InstructionContext
- final Vector ecs = new Vector(); // Type: ExecutionPath
+ final List<InstructionContext> ics = new ArrayList<InstructionContext>(); // Type: InstructionContext
+ final List<ExecutionPath> ecs = new ArrayList<ExecutionPath>(); // Type: ExecutionPath
final InstructionContext start = cfg.contextOf(method.getInstructionList().getStart());
@@ -326,8 +325,8 @@ public final class BcelClassTransformer
ecs.add(ExecutionPath.EMPTY);
while (!ics.isEmpty()) {
- final InstructionContext u = (InstructionContext) ics.remove(0);
- final ExecutionPath oldchain = (ExecutionPath) ecs.remove(0);
+ final InstructionContext u = ics.remove(0);
+ final ExecutionPath oldchain = ecs.remove(0);
final ExecutionPath newchain = oldchain.append(u);
if ((u.getInstruction().getInstruction()) instanceof RET) {
@@ -383,7 +382,7 @@ public final class BcelClassTransformer
* Creates a {@link Frame} object that represents the state of the stack frame
* at the beginning of a method.
*/
- private Frame craeteInitialFrame(MethodGen method, ClassGen clazz) {
+ private Frame createInitialFrame(MethodGen method, ClassGen clazz) {
final Frame vanillaFrame = new Frame(method.getMaxLocals(), method.getMaxStack());
if (!method.isStatic()) {
if (method.getName().equals(Constants.CONSTRUCTOR_NAME)) {
@@ -413,7 +412,7 @@ public final class BcelClassTransformer
private void rewrite(MethodGen method, ControlFlowGraph cfg) throws ClassNotFoundException {
final InstructionFactory insFactory = new InstructionFactory(method.getConstantPool());
- final Vector invokeIns = new Vector();
+ final List<InstructionHandle> invokeIns = new ArrayList<InstructionHandle>();
final InstructionList insList = method.getInstructionList();
InstructionHandle ins = insList.getStart();
final InstructionList restorer = new InstructionList();
@@ -449,7 +448,7 @@ public final class BcelClassTransformer
}
final InstructionList rList = restoreFrame(method, ins, insFactory, frame, objecttype);
insList.append(ins, saveFrame(method, ins, count++, insFactory, frame));
- invokeIns.addElement(rList.getStart());
+ invokeIns.add(rList.getStart());
restorer.append(rList);
}
// remove all new's
@@ -465,7 +464,7 @@ public final class BcelClassTransformer
}
// if there are any dup_x2 following new and dup, replace them with dup.
// some java compiler generates such bytecode for code like
- // someObject.someStringField += "abc"
+ // someObject.someStringField += "abc"
//
// which yield
// NEW StringBuffer
@@ -480,7 +479,7 @@ public final class BcelClassTransformer
// PUTFIELD someStringField
//
// replacing this DUP_x2 -> DUP is required for moving the new.
- if(next!=null && next.getNext()!=null && next.getNext().getInstruction().getOpcode() == Constants.DUP_X2) {
+ if (next != null && next.getNext() != null && next.getNext().getInstruction().getOpcode() == Constants.DUP_X2) {
InstructionHandle dupx2ptr = next.getNext();
final InstructionHandle newnext = dupx2ptr.getNext();
insList.insert(dupx2ptr, InstructionConstants.DUP);
@@ -532,12 +531,12 @@ public final class BcelClassTransformer
final InstructionHandle firstIns = insList.getStart();
if (count > 0) {
- final InstructionHandle[] tableTargets = new InstructionHandle[count];
int[] match = new int[count];
for (int i = 0; i < count; i++) {
match[i] = i;
}
- invokeIns.copyInto(tableTargets);
+ InstructionHandle[] tableTargets = new InstructionHandle[count];
+ tableTargets = invokeIns.toArray(tableTargets);
insList.insert(restorer);
// select frame restorer
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/DecompilingVisitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/DecompilingVisitor.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/DecompilingVisitor.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/DecompilingVisitor.java Sat Jun 26 17:16:23 2010
@@ -42,7 +42,8 @@ import org.apache.bcel.generic.Select;
import org.apache.bcel.generic.TABLESWITCH;
public final class DecompilingVisitor extends org.apache.bcel.classfile.EmptyVisitor {
- private JavaClass clazz;
+
+ private JavaClass clazz;
private PrintWriter out;
private String clazzname;
private ConstantPoolGen cp;
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ControlFlowGraph.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ControlFlowGraph.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ControlFlowGraph.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ControlFlowGraph.java Sat Jun 26 17:16:23 2010
@@ -17,7 +17,7 @@
package org.apache.commons.javaflow.bytecode.transformation.bcel.analyser;
import java.util.HashMap;
-import java.util.Hashtable;
+import java.util.Map;
import org.apache.bcel.generic.ATHROW;
import org.apache.bcel.generic.BranchInstruction;
@@ -38,8 +38,6 @@ import org.apache.bcel.verifier.exc.Stru
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class ControlFlowGraph {
@@ -57,12 +55,12 @@ public class ControlFlowGraph {
/**
* The 'incoming' execution Frames.
*/
- private HashMap inFrames; // key: the last-executed JSR
+ private Map<InstructionContext, Frame> inFrames; // key: the last-executed JSR
/**
* The 'outgoing' execution Frames.
*/
- private HashMap outFrames; // key: the last-executed JSR
+ private Map<InstructionContext, Frame> outFrames; // key: the last-executed JSR
/**
* The 'execution predecessors' - a list of {@link InstructionContext}
@@ -78,8 +76,8 @@ public class ControlFlowGraph {
if (inst == null) throw new AssertionViolatedException("Cannot instantiate InstructionContextImpl from NULL.");
instruction = inst;
- inFrames = new java.util.HashMap();
- outFrames = new java.util.HashMap();
+ inFrames = new java.util.HashMap<InstructionContext, Frame>();
+ outFrames = new java.util.HashMap<InstructionContext, Frame>();
}
/**
@@ -200,7 +198,7 @@ public class ControlFlowGraph {
*/
private boolean mergeInFrames(Frame inFrame){
// TODO: Can be performance-improved.
- Frame inF = (Frame) inFrames.get(lastExecutionJSR());
+ Frame inF = inFrames.get(lastExecutionJSR());
OperandStack oldstack = inF.getStack().getClone();
LocalVariables oldlocals = inF.getLocals().getClone();
try{
@@ -211,8 +209,8 @@ public class ControlFlowGraph {
extendMessageWithFlow(sce);
throw sce;
}
- if ( oldstack.equals(inF.getStack()) &&
- oldlocals.equals(inF.getLocals()) ){
+ if (oldstack.equals(inF.getStack()) &&
+ oldlocals.equals(inF.getLocals()) ){
return false;
}
else{
@@ -340,7 +338,7 @@ throw new AssertionViolatedException("DI
private final ExceptionHandlers exceptionhandlers;
/** All InstructionContext instances of this ControlFlowGraph. */
- private Hashtable instructionContexts = new Hashtable(); //keys: InstructionHandle, values: InstructionContextImpl
+ private Map<InstructionHandle, InstructionContext> instructionContexts = new HashMap<InstructionHandle, InstructionContext>(); //keys: InstructionHandle, values: InstructionContextImpl
/**
* A Control Flow Graph.
@@ -349,9 +347,9 @@ throw new AssertionViolatedException("DI
subroutines = new Subroutines(method_gen);
exceptionhandlers = new ExceptionHandlers(method_gen);
- InstructionHandle[] instructionhandles = method_gen.getInstructionList().getInstructionHandles();
- for (int i=0; i<instructionhandles.length; i++){
- instructionContexts.put(instructionhandles[i], new InstructionContextImpl(instructionhandles[i]));
+ final InstructionHandle[] instructionhandles = method_gen.getInstructionList().getInstructionHandles();
+ for (final InstructionHandle instructionhandle : instructionhandles){
+ instructionContexts.put(instructionhandle, new InstructionContextImpl(instructionhandle));
}
}
@@ -372,7 +370,7 @@ throw new AssertionViolatedException("DI
*/
public InstructionContext[] contextsOf(InstructionHandle[] insts){
InstructionContext[] ret = new InstructionContext[insts.length];
- for (int i=0; i<insts.length; i++){
+ for (int i = 0; i < insts.length; i++) {
ret[i] = contextOf(insts[i]);
}
return ret;
@@ -385,7 +383,7 @@ throw new AssertionViolatedException("DI
*/
public InstructionContext[] getInstructionContexts(){
InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()];
- return (InstructionContext[]) instructionContexts.values().toArray(ret);
+ return instructionContexts.values().toArray(ret);
}
/**
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandler.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandler.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandler.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandler.java Sat Jun 26 17:16:23 2010
@@ -25,8 +25,6 @@ import org.apache.bcel.generic.*;
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class ExceptionHandler{
/** The type of the exception to catch. NULL means ANY. */
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandlers.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandlers.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandlers.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExceptionHandlers.java Sat Jun 26 17:16:23 2010
@@ -17,37 +17,36 @@
package org.apache.commons.javaflow.bytecode.transformation.bcel.analyser;
import org.apache.bcel.generic.*;
+
+import java.util.HashMap;
import java.util.HashSet;
-import java.util.Hashtable;
+import java.util.Set;
/**
* This class allows easy access to ExceptionHandler objects.
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class ExceptionHandlers{
/**
* The ExceptionHandler instances.
* Key: InstructionHandle objects, Values: HashSet<ExceptionHandler> instances.
*/
- private Hashtable exceptionhandlers;
+ private HashMap<InstructionHandle, Set<ExceptionHandler>> exceptionhandlers;
/**
* Constructor. Creates a new ExceptionHandlers instance.
*/
public ExceptionHandlers(MethodGen mg){
- exceptionhandlers = new Hashtable();
+ exceptionhandlers = new HashMap<InstructionHandle, Set<ExceptionHandler>>();
CodeExceptionGen[] cegs = mg.getExceptionHandlers();
- for (int i=0; i<cegs.length; i++){
- ExceptionHandler eh = new ExceptionHandler(cegs[i].getCatchType(), cegs[i].getHandlerPC());
- for (InstructionHandle ih=cegs[i].getStartPC(); ih != cegs[i].getEndPC().getNext(); ih=ih.getNext()){
- HashSet hs;
- hs = (HashSet) exceptionhandlers.get(ih);
+ for (final CodeExceptionGen ceg : cegs) {
+ final ExceptionHandler eh = new ExceptionHandler(ceg.getCatchType(), ceg.getHandlerPC());
+ for (InstructionHandle ih = ceg.getStartPC(); ih != ceg.getEndPC().getNext(); ih = ih.getNext()) {
+ Set<ExceptionHandler> hs = exceptionhandlers.get(ih);
if (hs == null){
- hs = new HashSet();
+ hs = new HashSet<ExceptionHandler>();
exceptionhandlers.put(ih, hs);
}
hs.add(eh);
@@ -60,11 +59,11 @@ public class ExceptionHandlers{
* handlers that protect the instruction ih.
*/
public ExceptionHandler[] getExceptionHandlers(InstructionHandle ih){
- HashSet hs = (HashSet) exceptionhandlers.get(ih);
+ Set<ExceptionHandler> hs = exceptionhandlers.get(ih);
if (hs == null) return new ExceptionHandler[0];
- else{
+ else {
ExceptionHandler[] ret = new ExceptionHandler[hs.size()];
- return (ExceptionHandler[]) (hs.toArray(ret));
+ return hs.toArray(ret);
}
}
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionPath.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionPath.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionPath.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionPath.java Sat Jun 26 17:16:23 2010
@@ -12,7 +12,6 @@ import org.apache.bcel.generic.JsrInstru
* The sequence is represented in left-associative style; that is,
* a sequence of [a,b,c,d] is represented as prev=[a,b,c] and last=d.
*
- * @author Kohsuke Kawaguchi
*/
public final class ExecutionPath {
/**
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionVisitor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionVisitor.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionVisitor.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/ExecutionVisitor.java Sat Jun 26 17:16:23 2010
@@ -51,8 +51,6 @@ import org.apache.bcel.generic.*;
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
* @see #visitDSTORE(DSTORE o)
* @see org.apache.bcel.verifier.structurals.InstConstraintVisitor
*/
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Frame.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Frame.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Frame.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Frame.java Sat Jun 26 17:16:23 2010
@@ -28,8 +28,6 @@ import org.apache.bcel.verifier.exc.Asse
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class Frame{
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/InstructionContext.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/InstructionContext.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/InstructionContext.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/InstructionContext.java Sat Jun 26 17:16:23 2010
@@ -25,8 +25,6 @@ import org.apache.bcel.generic.Instructi
* to information like control flow successors and
* such.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public interface InstructionContext{
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/LocalVariables.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/LocalVariables.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/LocalVariables.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/LocalVariables.java Sat Jun 26 17:16:23 2010
@@ -27,8 +27,6 @@ import java.util.Arrays;
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class LocalVariables{
/** The Type[] containing the local variable slots. */
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/OperandStack.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/OperandStack.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/OperandStack.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/OperandStack.java Sat Jun 26 17:16:23 2010
@@ -27,13 +27,11 @@ import java.util.*;
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public class OperandStack{
/** We hold the stack information here. */
- private ArrayList stack = new ArrayList();
+ private ArrayList<Type> stack = new ArrayList<Type>();
/** The maximum number of stack slots this OperandStack instance may hold. */
private int maxStack;
@@ -60,7 +58,11 @@ public class OperandStack{
*/
protected Object clone(){
OperandStack newstack = new OperandStack(this.maxStack);
- newstack.stack = (ArrayList) this.stack.clone();
+
+ @SuppressWarnings("unchecked")
+ final ArrayList<Type> cloned = (ArrayList<Type>)stack.clone();
+
+ newstack.stack = cloned;
return newstack;
}
@@ -68,7 +70,7 @@ public class OperandStack{
* Clears the stack.
*/
public void clear(){
- stack = new ArrayList();
+ stack = new ArrayList<Type>();
}
/**
Modified: commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Subroutine.java
URL: http://svn.apache.org/viewvc/commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Subroutine.java?rev=958247&r1=958246&r2=958247&view=diff
==============================================================================
--- commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Subroutine.java (original)
+++ commons/sandbox/javaflow/trunk/src/main/java/org/apache/commons/javaflow/bytecode/transformation/bcel/analyser/Subroutine.java Sat Jun 26 17:16:23 2010
@@ -25,8 +25,6 @@ import org.apache.bcel.generic.*;
*
* WARNING! These classes are a fork of the bcel verifier.
*
- * @version $Id$
- * @author <A HREF="http://www.inf.fu-berlin.de/~ehaase"/>Enver Haase</A>
*/
public interface Subroutine{
/**