Author: kohsuke
Date: Wed Dec 28 09:32:48 2005
New Revision: 359570
URL: http://svn.apache.org/viewcvs?rev=359570&view=rev
Log:
implemented a minimum workaround to set BCEL Repository object for resolving
references correctly.
Still waiting for a response from Torsten about making more substantial changes.
Modified:
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
Modified:
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java?rev=359570&r1=359569&r2=359570&view=diff
==============================================================================
---
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
(original)
+++
jakarta/commons/sandbox/javaflow/trunk/src/java/org/apache/commons/javaflow/bytecode/transformation/bcel/BcelClassTransformer.java
Wed Dec 28 09:32:48 2005
@@ -27,6 +27,7 @@
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.ACONST_NULL;
+import org.apache.bcel.generic.ASTORE;
import org.apache.bcel.generic.BasicType;
import org.apache.bcel.generic.ClassGen;
import org.apache.bcel.generic.ConstantPoolGen;
@@ -50,7 +51,6 @@
import org.apache.bcel.generic.TABLESWITCH;
import org.apache.bcel.generic.TargetLostException;
import org.apache.bcel.generic.Type;
-import org.apache.bcel.generic.ASTORE;
import org.apache.bcel.verifier.exc.AssertionViolatedException;
import org.apache.commons.javaflow.bytecode.Continuable;
import org.apache.commons.javaflow.bytecode.StackRecorder;
@@ -96,6 +96,24 @@
private boolean currentMethodStatic = false;
public static boolean debug = false;
+ /**
+ * BCEL uses a repository object to load/store information related to
other classes,
+ * which are sometimes necessary to perform bytecode instrumentation.
+ * <p>
+ * Can be null, in which case the global BCEL repository is assumed to
work.
+ *
+ * <p>
+ * repository is a singleton instance in BCEL, so we have to be careful
when changing it.
+ * See BugZilla 38057. This is fundamentally broken.
+ */
+ private org.apache.bcel.util.Repository repository;
+
+ /**
+ * Since BCEL repository is a global resource, access needs to be
controlled among
+ * [EMAIL PROTECTED] BcelClassTransformer} instances.
+ */
+ private static final Object repositoryLock = new Object();
+
static {
try {
debug =
System.getProperty(BcelClassTransformer.class.getName()+".debug")!=null;
@@ -104,7 +122,30 @@
}
}
+ public BcelClassTransformer() {
+ }
+
+ public BcelClassTransformer(org.apache.bcel.util.Repository repository) {
+ this.repository = repository;
+ }
+
public byte[] transform(final byte[] original) {
+ if(repository==null) {
+ return doTransform(original);
+ } else {
+ synchronized(repositoryLock) {
+ org.apache.bcel.util.Repository old =
Repository.getRepository();
+ Repository.setRepository(repository);
+ try {
+ return doTransform(original);
+ } finally {
+ Repository.setRepository(old);
+ }
+ }
+ }
+ }
+
+ private byte[] doTransform(final byte[] original) {
final InputStream is = new ByteArrayInputStream(original);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]