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]

Reply via email to