On Sat, Jan 28, 2012 at 12:08 AM, David Jencks <[email protected]>wrote:
> I doubt you meant to commit EmptyVisitor? > > EmptyVisitor is a convenient class. I don't see the bad thing about it. I also don't think it's a good idea to copy the ASM4 constant. Why not > just use it from asm Opcodes directly? Copying it makes it look like it > might have a different meaning. > > I defined a variable and refered to it instead. In the future, we might need to change the value. Instead of going around to change everywhere. We can just change one instance instead. > david jencks > On Jan 27, 2012, at 10:58 AM, [email protected] wrote: > > > Author: ejiang > > Date: Fri Jan 27 18:58:20 2012 > > New Revision: 1236823 > > > > URL: http://svn.apache.org/viewvc?rev=1236823&view=rev > > Log: > > ARIES-817: Upgrade to ASM4 > > > > Added: > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java > > Modified: > > aries/trunk/proxy/proxy-impl/pom.xml > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java > > > > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java > > > > aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties > > > > aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java > > > > Modified: aries/trunk/proxy/proxy-impl/pom.xml > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/pom.xml?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- aries/trunk/proxy/proxy-impl/pom.xml (original) > > +++ aries/trunk/proxy/proxy-impl/pom.xml Fri Jan 27 18:58:20 2012 > > @@ -70,10 +70,10 @@ > > > > <dependencies> > > <dependency> > > - <groupId>asm</groupId> > > + <groupId>org.ow2.asm</groupId> > > <artifactId>asm-all</artifactId> > > <optional>true</optional> > > - <version>3.2</version> > > + <version>4.0</version> > > </dependency> > > <dependency> > > <groupId>org.slf4j</groupId> > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java > Fri Jan 27 18:58:20 2012 > > @@ -21,7 +21,6 @@ package org.apache.aries.proxy.impl.comm > > import java.io.IOException; > > import java.io.InputStream; > > import java.io.Serializable; > > -import java.lang.reflect.Modifier; > > import java.math.BigDecimal; > > import java.util.ArrayList; > > import java.util.Arrays; > > @@ -29,9 +28,9 @@ import java.util.HashMap; > > import java.util.HashSet; > > import java.util.List; > > import java.util.Map; > > -import java.util.Map.Entry; > > import java.util.Set; > > import java.util.UUID; > > +import java.util.Map.Entry; > > import java.util.concurrent.Callable; > > > > import org.apache.aries.proxy.InvocationListener; > > @@ -39,7 +38,6 @@ import org.apache.aries.proxy.UnableToPr > > import org.apache.aries.proxy.impl.NLS; > > import org.apache.aries.proxy.impl.gen.Constants; > > import org.apache.aries.proxy.weaving.WovenProxy; > > -import org.objectweb.asm.ClassAdapter; > > import org.objectweb.asm.ClassReader; > > import org.objectweb.asm.ClassVisitor; > > import org.objectweb.asm.FieldVisitor; > > @@ -63,7 +61,7 @@ import org.slf4j.LoggerFactory; > > * used to weave classes being loaded by the framework, and > InterfaceCombiningClassAdapter > > * which is used to dynamically create objects that implement multiple > interfaces > > */ > > -public abstract class AbstractWovenProxyAdapter extends ClassAdapter > implements Opcodes { > > +public abstract class AbstractWovenProxyAdapter extends ClassVisitor > implements Opcodes { > > private static final Logger LOGGER = LoggerFactory > > .getLogger(AbstractWovenProxyAdapter.class); > > > > @@ -200,7 +198,7 @@ public abstract class AbstractWovenProxy > > */ > > public AbstractWovenProxyAdapter(ClassVisitor writer, String className, > > ClassLoader loader) { > > - super(writer); > > + super(Constants.ASM4, writer); > > typeBeingWoven = Type.getType("L" + className.replace('.', '/') + > ";"); > > this.loader = loader; > > } > > @@ -345,7 +343,7 @@ public abstract class AbstractWovenProxy > > //to write our init code to static_init_UUID instead > > staticInitMethod = new Method("static_init_" + UU_ID, > Type.VOID_TYPE, NO_ARGS); > > staticInitMethodFlags = staticInitMethodFlags | ACC_FINAL; > > - methodVisitorToReturn = new AdviceAdapter(cv.visitMethod(access, > name, desc, signature, > > + methodVisitorToReturn = new AdviceAdapter(Constants.ASM4, > cv.visitMethod(access, name, desc, signature, > > exceptions), access, name, desc){ > > @Override > > protected void onMethodEnter() > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java > Fri Jan 27 18:58:20 2012 > > @@ -18,14 +18,17 @@ > > */ > > package org.apache.aries.proxy.impl.common; > > > > -import org.objectweb.asm.ClassAdapter; > > +import org.apache.aries.proxy.impl.gen.Constants; > > +import org.apache.aries.proxy.impl.weaving.EmptyVisitor; > > + > > +import org.objectweb.asm.ClassVisitor; > > import org.objectweb.asm.MethodVisitor; > > import org.objectweb.asm.Type; > > -import org.objectweb.asm.commons.EmptyVisitor; > > + > > > > import static org.objectweb.asm.Opcodes.ACC_PRIVATE; > > > > -public class ConstructorFinder extends ClassAdapter > > +public class ConstructorFinder extends ClassVisitor > > { > > > > private boolean hasNoArgsConstructor = false; > > @@ -37,7 +40,7 @@ public class ConstructorFinder extends C > > > > public ConstructorFinder() > > { > > - super(new EmptyVisitor()); > > + super(Constants.ASM4, new EmptyVisitor(Constants.ASM4)); > > } > > > > @Override > > > > Added: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java?rev=1236823&view=auto > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java > (added) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java > Fri Jan 27 18:58:20 2012 > > @@ -0,0 +1,57 @@ > > +/* > > + * 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.aries.proxy.impl.common; > > + > > +import org.apache.aries.proxy.impl.gen.Constants; > > +import org.objectweb.asm.ClassVisitor; > > +import org.objectweb.asm.ClassWriter; > > +import org.objectweb.asm.MethodVisitor; > > +import org.objectweb.asm.commons.JSRInlinerAdapter; > > +/** > > + * We need to override ASM's default behaviour in {@link > #getCommonSuperClass(String, String)} > > + * so that it doesn't load classes (which it was doing on the wrong > {@link ClassLoader} > > + * anyway...) > > + */ > > +public final class OSGiFriendlyClassVisitor extends ClassVisitor { > > + > > + > > + private final boolean inlineJSR; > > + > > + public OSGiFriendlyClassVisitor(ClassVisitor cv, int arg1) { > > + > > + super(Constants.ASM4, cv); > > + > > + inlineJSR = arg1 == ClassWriter.COMPUTE_FRAMES; > > + } > > + > > + > > + > > + > > + @Override > > + public MethodVisitor visitMethod(int arg0, String arg1, String arg2, > > + String arg3, String[] arg4) { > > + MethodVisitor mv = cv.visitMethod(arg0, arg1, arg2, arg3, arg4); > > + > > + if(inlineJSR) > > + mv = new JSRInlinerAdapter(mv, arg0, arg1, arg2, arg3, arg4); > > + > > + return mv; > > + } > > + > > +} > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java > Fri Jan 27 18:58:20 2012 > > @@ -27,8 +27,6 @@ import org.apache.aries.proxy.UnableToPr > > import org.apache.aries.proxy.impl.NLS; > > import org.objectweb.asm.ClassReader; > > import org.objectweb.asm.ClassWriter; > > -import org.objectweb.asm.MethodVisitor; > > -import org.objectweb.asm.commons.JSRInlinerAdapter; > > /** > > * We need to override ASM's default behaviour in {@link > #getCommonSuperClass(String, String)} > > * so that it doesn't load classes (which it was doing on the wrong > {@link ClassLoader} > > @@ -40,18 +38,22 @@ public final class OSGiFriendlyClassWrit > > private final ClassLoader loader; > > private String currentClassInternalName; > > private String currentSuperClassInternalName; > > - private final boolean inlineJSR; > > + > > > > - public OSGiFriendlyClassWriter(ClassReader arg0, int arg1, > ClassLoader loader) { > > + public OSGiFriendlyClassWriter(ClassReader arg0, int arg1, > ClassLoader loader, String currentClassInternalName, String > currentSuperClassInternalName) { > > super(arg0, arg1); > > - inlineJSR = arg1 == COMPUTE_FRAMES; > > + > > this.loader = loader; > > + this.currentClassInternalName = currentClassInternalName; > > + this.currentSuperClassInternalName = currentSuperClassInternalName; > > } > > > > - public OSGiFriendlyClassWriter(int arg0, ClassLoader loader) { > > + public OSGiFriendlyClassWriter(int arg0, ClassLoader loader, String > currentClassInternalName, String currentSuperClassInternalName) { > > super(arg0); > > - inlineJSR = arg0 == COMPUTE_FRAMES; > > + > > this.loader = loader; > > + this.currentClassInternalName = currentClassInternalName; > > + this.currentSuperClassInternalName = currentSuperClassInternalName; > > } > > > > /** > > @@ -133,23 +135,6 @@ public final class OSGiFriendlyClassWrit > > /** > > * We need access to the super's name and our class name > > */ > > - @Override > > - public final void visit(int arg0, int arg1, String arg2, String arg3, > String arg4, > > - String[] arg5) { > > - currentClassInternalName = arg2; > > - currentSuperClassInternalName = arg4; > > - super.visit(arg0, arg1, arg2, arg3, arg4, arg5); > > - } > > - > > - @Override > > - public MethodVisitor visitMethod(int arg0, String arg1, String arg2, > > - String arg3, String[] arg4) { > > - MethodVisitor mv = super.visitMethod(arg0, arg1, arg2, arg3, arg4); > > - > > - if(inlineJSR) > > - mv = new JSRInlinerAdapter(mv, arg0, arg1, arg2, arg3, arg4); > > - > > - return mv; > > - } > > + > > > > } > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java > Fri Jan 27 18:58:20 2012 > > @@ -18,9 +18,12 @@ > > */ > > package org.apache.aries.proxy.impl.gen; > > > > +import org.objectweb.asm.Opcodes; > > + > > public interface Constants > > { > > final static String LOG_ENTRY = "Method entry: {}, args {}"; > > final static String LOG_EXIT = "Method exit: {}, returning {}"; > > final static String LOG_EXCEPTION = "Caught exception"; > > + final static int ASM4 = Opcodes.ASM4; > > } > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java > Fri Jan 27 18:58:20 2012 > > @@ -23,7 +23,6 @@ import java.lang.reflect.InvocationHandl > > > > import org.objectweb.asm.AnnotationVisitor; > > import org.objectweb.asm.Attribute; > > -import org.objectweb.asm.ClassAdapter; > > import org.objectweb.asm.ClassReader; > > import org.objectweb.asm.ClassVisitor; > > import org.objectweb.asm.FieldVisitor; > > @@ -35,7 +34,7 @@ import org.objectweb.asm.commons.Method; > > import org.slf4j.Logger; > > import org.slf4j.LoggerFactory; > > > > -public class ProxySubclassAdapter extends ClassAdapter implements > Opcodes > > +public class ProxySubclassAdapter extends ClassVisitor implements > Opcodes > > { > > > > private static final Type STRING_TYPE = Type.getType(String.class); > > @@ -62,7 +61,7 @@ public class ProxySubclassAdapter extend > > public ProxySubclassAdapter(ClassVisitor writer, String newClassName, > ClassLoader loader) > > { > > // call the superclass constructor > > - super(writer); > > + super(Constants.ASM4, writer); > > // the writer is now the cv in the superclass of ClassAdapter > > > > LOGGER.debug(Constants.LOG_ENTRY, "ProxySubclassAdapter", new > Object[] { this, writer, > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java > Fri Jan 27 18:58:20 2012 > > @@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory; > > * > > * > > */ > > -public class ProxySubclassHierarchyAdapter implements ClassVisitor, > Opcodes > > +public class ProxySubclassHierarchyAdapter extends ClassVisitor > implements Opcodes > > { > > > > private ProxySubclassAdapter adapter = null; > > @@ -47,6 +47,7 @@ public class ProxySubclassHierarchyAdapt > > > > ProxySubclassHierarchyAdapter(ProxySubclassAdapter adapter, > Collection<String> methodsToImplement) > > { > > + super(Constants.ASM4); > > LOGGER.debug(Constants.LOG_ENTRY, "ProxySubclassHeirarchyAdapter", > new Object[] { > > this, adapter, methodsToImplement }); > > > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java > Fri Jan 27 18:58:20 2012 > > @@ -26,13 +26,17 @@ import java.util.List; > > > > import org.apache.aries.proxy.UnableToProxyException; > > import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter; > > +import org.apache.aries.proxy.impl.common.OSGiFriendlyClassVisitor; > > import org.apache.aries.proxy.impl.common.OSGiFriendlyClassWriter; > > +import org.apache.aries.proxy.impl.gen.Constants; > > +import org.apache.aries.proxy.impl.weaving.EmptyVisitor; > > import org.apache.aries.proxy.weaving.WovenProxy; > > +import org.objectweb.asm.ClassVisitor; > > import org.objectweb.asm.ClassWriter; > > import org.objectweb.asm.MethodVisitor; > > import org.objectweb.asm.Opcodes; > > import org.objectweb.asm.Type; > > -import org.objectweb.asm.commons.EmptyVisitor; > > + > > import org.objectweb.asm.commons.Method; > > > > /** > > @@ -60,8 +64,10 @@ final class InterfaceCombiningClassAdapt > > */ > > InterfaceCombiningClassAdapter(String className, > > ClassLoader loader, Class<? extends WovenProxy> superclass, > Collection<Class<?>> interfaces) { > > - writer = new OSGiFriendlyClassWriter(ClassWriter.COMPUTE_FRAMES, > loader); > > - adapter = new InterfaceUsingWovenProxyAdapter(writer, className, > loader); > > + super(Constants.ASM4); > > + writer = new OSGiFriendlyClassWriter(ClassWriter.COMPUTE_FRAMES, > loader, className, (superclass!=null)? superclass.getName(): null); > > + ClassVisitor cv = new OSGiFriendlyClassVisitor(writer, > ClassWriter.COMPUTE_FRAMES); > > + adapter = new InterfaceUsingWovenProxyAdapter(cv, className, > loader); > > > > this.interfaces = interfaces; > > this.superclass = superclass; > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java > Fri Jan 27 18:58:20 2012 > > @@ -23,7 +23,6 @@ import java.lang.reflect.Constructor; > > import java.util.Arrays; > > import java.util.Collection; > > import java.util.Comparator; > > -import java.util.LinkedHashSet; > > import java.util.Map; > > import java.util.SortedSet; > > import java.util.TreeSet; > > @@ -32,9 +31,10 @@ import java.util.concurrent.Callable; > > > > import org.apache.aries.proxy.InvocationListener; > > import org.apache.aries.proxy.UnableToProxyException; > > +import org.apache.aries.proxy.impl.gen.Constants; > > +import org.apache.aries.proxy.impl.weaving.EmptyVisitor; > > import org.apache.aries.proxy.weaving.WovenProxy; > > import org.objectweb.asm.Opcodes; > > -import org.objectweb.asm.commons.EmptyVisitor; > > import org.osgi.framework.Bundle; > > > > /** > > @@ -45,6 +45,12 @@ import org.osgi.framework.Bundle; > > */ > > public final class InterfaceProxyGenerator extends EmptyVisitor > implements Opcodes { > > > > + public InterfaceProxyGenerator() > > + { > > + super(Constants.ASM4); > > + > > + } > > + > > private static final Map<Bundle, WeakReference<ProxyClassLoader>> > cache = > > new WeakHashMap<Bundle, > WeakReference<ProxyClassLoader>>(128); > > > > > > Added: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java?rev=1236823&view=auto > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java > (added) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java > Fri Jan 27 18:58:20 2012 > > @@ -0,0 +1,32 @@ > > +/* > > + * @start_prolog@ > > + * > ============================================================================ > > + * IBM Confidential OCO Source Materials > > + * > > + * 5724-J08, 5724-I63, 5724-H88, 5724-H89, 5655-N02, 5733-W70 Copyright > IBM Corp. 2010 > > + * > > + * The source code for this program is not published or otherwise > divested > > + * of its trade secrets, irrespective of what has been deposited with > the > > + * U.S. Copyright Office. > > + * > ============================================================================ > > + * @end_prolog@ > > + * > > + * Change activity: > > + * > > + * Issue Date Name Description > > + * ----------- ----------- -------- > ------------------------------------ > > + */ > > +package org.apache.aries.proxy.impl.weaving; > > + > > +import org.objectweb.asm.ClassVisitor; > > + > > +public class EmptyVisitor extends ClassVisitor > > +{ > > + > > + public EmptyVisitor(int asmVersion) > > + { > > + super(asmVersion); > > + > > + } > > + > > +} > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java > Fri Jan 27 18:58:20 2012 > > @@ -26,6 +26,7 @@ import org.apache.aries.proxy.UnableToPr > > import org.apache.aries.proxy.impl.NLS; > > import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter; > > import org.apache.aries.proxy.impl.common.TypeMethod; > > +import org.apache.aries.proxy.impl.gen.Constants; > > import org.objectweb.asm.AnnotationVisitor; > > import org.objectweb.asm.Attribute; > > import org.objectweb.asm.ClassReader; > > @@ -33,7 +34,7 @@ import org.objectweb.asm.ClassVisitor; > > import org.objectweb.asm.MethodVisitor; > > import org.objectweb.asm.Opcodes; > > import org.objectweb.asm.Type; > > -import org.objectweb.asm.commons.EmptyVisitor; > > + > > import org.objectweb.asm.commons.Method; > > > > /** > > @@ -65,6 +66,7 @@ final class MethodCopyingClassAdapter ex > > public MethodCopyingClassAdapter(ClassVisitor cv, Class<?> superToCopy, > > Type overridingClassType, Set<Method> knownMethods, > > Map<String, TypeMethod> transformedMethods) { > > + super(Constants.ASM4); > > this.cv = cv; > > this.superToCopy = superToCopy; > > this.overridingClassType = overridingClassType; > > @@ -132,7 +134,7 @@ final class MethodCopyingClassAdapter ex > > * the body with a call to the super-types implementation. The > original annotations > > * attributes etc are all copied. > > */ > > - private static final class CopyingMethodAdapter extends EmptyVisitor { > > + private static final class CopyingMethodAdapter extends MethodVisitor > { > > /** The visitor to delegate to */ > > private final MethodVisitor mv; > > /** The type that declares this method (not the one that will > override it) */ > > @@ -142,11 +144,13 @@ final class MethodCopyingClassAdapter ex > > > > public CopyingMethodAdapter(MethodVisitor mv, Type superType, > > Method currentTransformMethod) { > > + super(Constants.ASM4); > > this.mv = mv; > > this.superType = superType; > > this.currentTransformMethod = currentTransformMethod; > > } > > > > + //TODO might not work for attributes > > @Override > > public final AnnotationVisitor visitAnnotation(String arg0, boolean > arg1) { > > return mv.visitAnnotation(arg0, arg1); > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java > Fri Jan 27 18:58:20 2012 > > @@ -18,10 +18,17 @@ > > */ > > package org.apache.aries.proxy.impl.weaving; > > > > +import java.io.IOException; > > + > > +import org.apache.aries.proxy.impl.gen.Constants; > > import org.objectweb.asm.commons.SerialVersionUIDAdder; > > +import org.slf4j.Logger; > > +import org.slf4j.LoggerFactory; > > > > class SyntheticSerialVerUIDAdder extends SerialVersionUIDAdder { > > > > + private static Logger LOGGER = > LoggerFactory.getLogger(SyntheticSerialVerUIDAdder.class); > > + > > private WovenProxyAdapter wpa; > > > > public SyntheticSerialVerUIDAdder(WovenProxyAdapter cv) { > > @@ -31,7 +38,26 @@ class SyntheticSerialVerUIDAdder extends > > > > @Override > > public void visitEnd() { > > - wpa.setSVUIDGenerated(!!!hasSVUID); > > + > > + wpa.setSVUIDGenerated(!!!isHasSVUID()); > > super.visitEnd(); > > } > > + > > + private boolean isHasSVUID() { > > + try { > > + if (computeSVUID() == 0 ) { > > + // This means the class has a serial id already > > + return true; > > + } else { > > + return false; > > + } > > + } catch (IOException ioe) { > > + > > + LOGGER.debug(Constants.LOG_ENTRY, "cannot.compute.serial.id", > new Object[] { ioe }); > > + > > + } finally { > > + return false; > > + } > > + > > + } > > } > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java > Fri Jan 27 18:58:20 2012 > > @@ -23,6 +23,7 @@ import static org.objectweb.asm.Opcodes. > > import static org.objectweb.asm.Opcodes.ACC_INTERFACE; > > > > import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter; > > +import org.apache.aries.proxy.impl.common.OSGiFriendlyClassVisitor; > > import org.apache.aries.proxy.impl.common.OSGiFriendlyClassWriter; > > import org.objectweb.asm.ClassReader; > > import org.objectweb.asm.ClassVisitor; > > @@ -41,12 +42,13 @@ public final class WovenProxyGenerator > > > > //If we are Java 1.6 + compiled then we need to compute stack > frames, otherwise > > //maxs are fine (and faster) > > - ClassWriter cWriter = new OSGiFriendlyClassWriter(cReader, > AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? > > - ClassWriter.COMPUTE_FRAMES : ClassWriter.COMPUTE_MAXS, > loader); > > - > > + int computeVal = AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? > > + ClassWriter.COMPUTE_FRAMES : ClassWriter.COMPUTE_MAXS; > > + ClassWriter cWriter = new OSGiFriendlyClassWriter(cReader, > computeVal, loader, cReader.getClassName(), cReader.getSuperName()); > > + ClassVisitor cv = new OSGiFriendlyClassVisitor(cWriter, computeVal > ); > > //Wrap our outer layer to add the original SerialVersionUID if it > was previously being defaulted > > ClassVisitor weavingAdapter = new SyntheticSerialVerUIDAdder( > > - new WovenProxyAdapter(cWriter, > className, loader)); > > + new WovenProxyAdapter(cv, className, > loader)); > > > > // If we are Java 1.6 + then we need to skip frames as they will be > recomputed > > cReader.accept(weavingAdapter, > AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? ClassReader.SKIP_FRAMES : 0); > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java > Fri Jan 27 18:58:20 2012 > > @@ -22,7 +22,9 @@ package org.apache.aries.proxy.synthesiz > > import java.io.FileInputStream; > > import java.io.FileOutputStream; > > > > +import org.apache.aries.proxy.impl.gen.Constants; > > import org.objectweb.asm.ClassReader; > > +import org.objectweb.asm.ClassVisitor; > > import org.objectweb.asm.ClassWriter; > > import org.objectweb.asm.Opcodes; > > > > @@ -46,6 +48,7 @@ public class Synthesizer > > for (String arg : args) { > > FileInputStream classInStream = null; > > ClassWriter writer = null; > > + > > try { > > //read in the class > > classInStream = new FileInputStream(arg); > > @@ -55,18 +58,11 @@ public class Synthesizer > > //we just need to override the visit method so we can add > > //the synthetic modifier, otherwise we use the methods in > > //a standard writer > > - writer = new ClassWriter(reader, 0) { > > - @Override > > - public void visit(int version, int access, String name, > String signature, > > - String superName, String[] interfaces) > > - { > > - super.visit(version, access | Opcodes.ACC_SYNTHETIC, name, > signature, superName, > > - interfaces); > > - } > > - }; > > + writer = new ClassWriter(reader, 0) ; > > + ClassVisitor cv = new CustomClassVisitor((ClassVisitor)writer); > > //call accept on the reader to start the visits > > //using the writer we created as the visitor > > - reader.accept(writer, 0); > > + reader.accept(cv, 0); > > } finally { > > //close the InputStream if it is hanging around > > if (classInStream != null) classInStream.close(); > > @@ -82,4 +78,22 @@ public class Synthesizer > > } > > } > > } > > + > > + public static class CustomClassVisitor extends ClassVisitor > > + { > > + > > + public CustomClassVisitor( ClassVisitor cv) > > + { > > + super(Constants.ASM4, cv); > > + > > + } > > + @Override > > + public void visit(int version, int access, String name, String > signature, > > + String superName, String[] interfaces) > > + { > > + cv.visit(version, access | Opcodes.ACC_SYNTHETIC, name, > signature, superName, > > + interfaces); > > + } > > + > > + } > > } > > > > Modified: > aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties > Fri Jan 27 18:58:20 2012 > > @@ -47,3 +47,4 @@ no.common.superclass=The class {0} and { > > cannot.weave=The class {0} cannot be woven, it may not be possible for > the runtime to proxy this class. > > # {0} The class that could not be woven. > > fatal.weaving.failure=There was a serious error trying to weave the > class {0}. See the associated exception for more information. > > +cannot.compute.serial.id=An internal error occurred while computing > serial id. {0} > > > > Modified: > aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java > > URL: > http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java?rev=1236823&r1=1236822&r2=1236823&view=diff > > > ============================================================================== > > --- > aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java > (original) > > +++ > aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java > Fri Jan 27 18:58:20 2012 > > @@ -53,7 +53,7 @@ public class InterfaceProxyingTest { > > > > private Object list = new Callable<Object>() { > > > > - @Override > > + > > public Object call() throws Exception { > > return null; > > } > > @@ -127,7 +127,7 @@ public class InterfaceProxyingTest { > > > > tc.setReturn(new Callable<Object>() { > > > > - @Override > > + > > public Object call() throws Exception { > > throw new RuntimeException(); > > } > > @@ -145,7 +145,7 @@ public class InterfaceProxyingTest { > > > > tc.setReturn(new Callable<Object>() { > > > > - @Override > > + > > public Object call() throws Exception { > > try { > > throw new RuntimeException(); > > > > > > -- Thanks Emily ================= Emily Jiang [email protected]
