http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SerialVersionUIDAdder.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SerialVersionUIDAdder.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SerialVersionUIDAdder.java index b8030df..1f9b7cb 100644 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SerialVersionUIDAdder.java +++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SerialVersionUIDAdder.java @@ -170,7 +170,7 @@ public class SerialVersionUIDAdder extends ClassVisitor { * If a subclass calls this constructor. */ public SerialVersionUIDAdder(final ClassVisitor cv) { - this(Opcodes.ASM5, cv); + this(Opcodes.ASM6, cv); if (getClass() != SerialVersionUIDAdder.class) { throw new IllegalStateException(); } @@ -181,7 +181,7 @@ public class SerialVersionUIDAdder extends ClassVisitor { * * @param api * the ASM API version implemented by this visitor. Must be one - * of {@link Opcodes#ASM4} or {@link Opcodes#ASM5}. + * of {@link Opcodes#ASM4}, {@link Opcodes#ASM5} or {@link Opcodes#ASM6}. * @param cv * a {@link ClassVisitor} to which this visitor will delegate * calls. @@ -205,7 +205,7 @@ public class SerialVersionUIDAdder extends ClassVisitor { public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) { - computeSVUID = (access & Opcodes.ACC_INTERFACE) == 0; + computeSVUID = (access & Opcodes.ACC_ENUM) == 0; if (computeSVUID) { this.name = name; @@ -367,6 +367,11 @@ public class SerialVersionUIDAdder extends ClassVisitor { /* * 2. The class modifiers written as a 32-bit integer. */ + int access = this.access; + if ((access & Opcodes.ACC_INTERFACE) != 0) { + access = (svuidMethods.size() > 0) ? (access | Opcodes.ACC_ABSTRACT) + : (access & ~Opcodes.ACC_ABSTRACT); + } dos.writeInt(access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT));
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SignatureRemapper.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SignatureRemapper.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SignatureRemapper.java new file mode 100644 index 0000000..b16e028 --- /dev/null +++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/SignatureRemapper.java @@ -0,0 +1,159 @@ +/*** + * ASM: a very small and fast Java bytecode manipulation framework + * Copyright (c) 2000-2011 INRIA, France Telecom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.apache.tapestry5.internal.plastic.asm.commons; + +import java.util.Stack; + +import org.apache.tapestry5.internal.plastic.asm.Opcodes; +import org.apache.tapestry5.internal.plastic.asm.signature.SignatureVisitor; + +/** + * A {@link SignatureVisitor} adapter for type mapping. + * + * @author Eugene Kuleshov + */ +public class SignatureRemapper extends SignatureVisitor { + + private final SignatureVisitor v; + + private final Remapper remapper; + + private Stack<String> classNames = new Stack<String>(); + + public SignatureRemapper(final SignatureVisitor v, final Remapper remapper) { + this(Opcodes.ASM6, v, remapper); + } + + protected SignatureRemapper(final int api, final SignatureVisitor v, + final Remapper remapper) { + super(api); + this.v = v; + this.remapper = remapper; + } + + @Override + public void visitClassType(String name) { + classNames.push(name); + v.visitClassType(remapper.mapType(name)); + } + + @Override + public void visitInnerClassType(String name) { + String outerClassName = classNames.pop(); + String className = outerClassName + '$' + name; + classNames.push(className); + String remappedOuter = remapper.mapType(outerClassName) + '$'; + String remappedName = remapper.mapType(className); + int index = remappedName.startsWith(remappedOuter) ? remappedOuter + .length() : remappedName.lastIndexOf('$') + 1; + v.visitInnerClassType(remappedName.substring(index)); + } + + @Override + public void visitFormalTypeParameter(String name) { + v.visitFormalTypeParameter(name); + } + + @Override + public void visitTypeVariable(String name) { + v.visitTypeVariable(name); + } + + @Override + public SignatureVisitor visitArrayType() { + v.visitArrayType(); + return this; + } + + @Override + public void visitBaseType(char descriptor) { + v.visitBaseType(descriptor); + } + + @Override + public SignatureVisitor visitClassBound() { + v.visitClassBound(); + return this; + } + + @Override + public SignatureVisitor visitExceptionType() { + v.visitExceptionType(); + return this; + } + + @Override + public SignatureVisitor visitInterface() { + v.visitInterface(); + return this; + } + + @Override + public SignatureVisitor visitInterfaceBound() { + v.visitInterfaceBound(); + return this; + } + + @Override + public SignatureVisitor visitParameterType() { + v.visitParameterType(); + return this; + } + + @Override + public SignatureVisitor visitReturnType() { + v.visitReturnType(); + return this; + } + + @Override + public SignatureVisitor visitSuperclass() { + v.visitSuperclass(); + return this; + } + + @Override + public void visitTypeArgument() { + v.visitTypeArgument(); + } + + @Override + public SignatureVisitor visitTypeArgument(char wildcard) { + v.visitTypeArgument(wildcard); + return this; + } + + @Override + public void visitEnd() { + v.visitEnd(); + classNames.pop(); + } +} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/StaticInitMerger.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/StaticInitMerger.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/StaticInitMerger.java index 8291c66..2bb33e5 100644 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/StaticInitMerger.java +++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/StaticInitMerger.java @@ -49,7 +49,7 @@ public class StaticInitMerger extends ClassVisitor { private int counter; public StaticInitMerger(final String prefix, final ClassVisitor cv) { - this(Opcodes.ASM5, prefix, cv); + this(Opcodes.ASM6, prefix, cv); } protected StaticInitMerger(final int api, final String prefix, http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/TryCatchBlockSorter.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/TryCatchBlockSorter.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/TryCatchBlockSorter.java index 4b4641a..7b20b30 100644 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/TryCatchBlockSorter.java +++ b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/commons/TryCatchBlockSorter.java @@ -57,7 +57,7 @@ public class TryCatchBlockSorter extends MethodNode { public TryCatchBlockSorter(final MethodVisitor mv, final int access, final String name, final String desc, final String signature, final String[] exceptions) { - this(Opcodes.ASM5, mv, access, name, desc, signature, exceptions); + this(Opcodes.ASM6, mv, access, name, desc, signature, exceptions); } protected TryCatchBlockSorter(final int api, final MethodVisitor mv, http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/AnnotationConstantsCollector.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/AnnotationConstantsCollector.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/AnnotationConstantsCollector.java deleted file mode 100644 index 84aff49..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/AnnotationConstantsCollector.java +++ /dev/null @@ -1,147 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.Type; - -/** - * An {@link AnnotationVisitor} that collects the {@link Constant}s of the - * annotations it visits. - * - * @author Eric Bruneton - */ -public class AnnotationConstantsCollector extends AnnotationVisitor { - - private final ConstantPool cp; - - public AnnotationConstantsCollector(final AnnotationVisitor av, - final ConstantPool cp) { - super(Opcodes.ASM5, av); - this.cp = cp; - } - - @Override - public void visit(final String name, final Object value) { - if (name != null) { - cp.newUTF8(name); - } - if (value instanceof Byte) { - cp.newInteger(((Byte) value).byteValue()); - } else if (value instanceof Boolean) { - cp.newInteger(((Boolean) value).booleanValue() ? 1 : 0); - } else if (value instanceof Character) { - cp.newInteger(((Character) value).charValue()); - } else if (value instanceof Short) { - cp.newInteger(((Short) value).shortValue()); - } else if (value instanceof Type) { - cp.newUTF8(((Type) value).getDescriptor()); - } else if (value instanceof byte[]) { - byte[] v = (byte[]) value; - for (int i = 0; i < v.length; i++) { - cp.newInteger(v[i]); - } - } else if (value instanceof boolean[]) { - boolean[] v = (boolean[]) value; - for (int i = 0; i < v.length; i++) { - cp.newInteger(v[i] ? 1 : 0); - } - } else if (value instanceof short[]) { - short[] v = (short[]) value; - for (int i = 0; i < v.length; i++) { - cp.newInteger(v[i]); - } - } else if (value instanceof char[]) { - char[] v = (char[]) value; - for (int i = 0; i < v.length; i++) { - cp.newInteger(v[i]); - } - } else if (value instanceof int[]) { - int[] v = (int[]) value; - for (int i = 0; i < v.length; i++) { - cp.newInteger(v[i]); - } - } else if (value instanceof long[]) { - long[] v = (long[]) value; - for (int i = 0; i < v.length; i++) { - cp.newLong(v[i]); - } - } else if (value instanceof float[]) { - float[] v = (float[]) value; - for (int i = 0; i < v.length; i++) { - cp.newFloat(v[i]); - } - } else if (value instanceof double[]) { - double[] v = (double[]) value; - for (int i = 0; i < v.length; i++) { - cp.newDouble(v[i]); - } - } else { - cp.newConst(value); - } - av.visit(name, value); - } - - @Override - public void visitEnum(final String name, final String desc, - final String value) { - if (name != null) { - cp.newUTF8(name); - } - cp.newUTF8(desc); - cp.newUTF8(value); - av.visitEnum(name, desc, value); - } - - @Override - public AnnotationVisitor visitAnnotation(final String name, - final String desc) { - if (name != null) { - cp.newUTF8(name); - } - cp.newUTF8(desc); - return new AnnotationConstantsCollector(av.visitAnnotation(name, desc), - cp); - } - - @Override - public AnnotationVisitor visitArray(final String name) { - if (name != null) { - cp.newUTF8(name); - } - return new AnnotationConstantsCollector(av.visitArray(name), cp); - } - - @Override - public void visitEnd() { - av.visitEnd(); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassConstantsCollector.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassConstantsCollector.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassConstantsCollector.java deleted file mode 100644 index b907322..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassConstantsCollector.java +++ /dev/null @@ -1,198 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Attribute; -import org.apache.tapestry5.internal.plastic.asm.ClassVisitor; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.TypePath; - -/** - * A {@link ClassVisitor} that collects the {@link Constant}s of the classes it - * visits. - * - * @author Eric Bruneton - */ -public class ClassConstantsCollector extends ClassVisitor { - - private final ConstantPool cp; - - public ClassConstantsCollector(final ClassVisitor cv, final ConstantPool cp) { - super(Opcodes.ASM5, cv); - this.cp = cp; - } - - @Override - public void visit(final int version, final int access, final String name, - final String signature, final String superName, - final String[] interfaces) { - if ((access & Opcodes.ACC_DEPRECATED) != 0) { - cp.newUTF8("Deprecated"); - } - if ((access & Opcodes.ACC_SYNTHETIC) != 0) { - cp.newUTF8("Synthetic"); - } - cp.newClass(name); - if (signature != null) { - cp.newUTF8("Signature"); - cp.newUTF8(signature); - } - if (superName != null) { - cp.newClass(superName); - } - if (interfaces != null) { - for (int i = 0; i < interfaces.length; ++i) { - cp.newClass(interfaces[i]); - } - } - cv.visit(version, access, name, signature, superName, interfaces); - } - - @Override - public void visitSource(final String source, final String debug) { - if (source != null) { - cp.newUTF8("SourceFile"); - cp.newUTF8(source); - } - if (debug != null) { - cp.newUTF8("SourceDebugExtension"); - } - cv.visitSource(source, debug); - } - - @Override - public void visitOuterClass(final String owner, final String name, - final String desc) { - cp.newUTF8("EnclosingMethod"); - cp.newClass(owner); - if (name != null && desc != null) { - cp.newNameType(name, desc); - } - cv.visitOuterClass(owner, name, desc); - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleAnnotations"); - } - return new AnnotationConstantsCollector(cv.visitAnnotation(desc, - visible), cp); - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleTypeAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleTypeAnnotations"); - } - return new AnnotationConstantsCollector(cv.visitAnnotation(desc, - visible), cp); - } - - @Override - public void visitAttribute(final Attribute attr) { - // can do nothing - cv.visitAttribute(attr); - } - - @Override - public void visitInnerClass(final String name, final String outerName, - final String innerName, final int access) { - cp.newUTF8("InnerClasses"); - if (name != null) { - cp.newClass(name); - } - if (outerName != null) { - cp.newClass(outerName); - } - if (innerName != null) { - cp.newUTF8(innerName); - } - cv.visitInnerClass(name, outerName, innerName, access); - } - - @Override - public FieldVisitor visitField(final int access, final String name, - final String desc, final String signature, final Object value) { - if ((access & Opcodes.ACC_SYNTHETIC) != 0) { - cp.newUTF8("Synthetic"); - } - if ((access & Opcodes.ACC_DEPRECATED) != 0) { - cp.newUTF8("Deprecated"); - } - cp.newUTF8(name); - cp.newUTF8(desc); - if (signature != null) { - cp.newUTF8("Signature"); - cp.newUTF8(signature); - } - if (value != null) { - cp.newConst(value); - } - return new FieldConstantsCollector(cv.visitField(access, name, desc, - signature, value), cp); - } - - @Override - public MethodVisitor visitMethod(final int access, final String name, - final String desc, final String signature, final String[] exceptions) { - if ((access & Opcodes.ACC_SYNTHETIC) != 0) { - cp.newUTF8("Synthetic"); - } - if ((access & Opcodes.ACC_DEPRECATED) != 0) { - cp.newUTF8("Deprecated"); - } - cp.newUTF8(name); - cp.newUTF8(desc); - if (signature != null) { - cp.newUTF8("Signature"); - cp.newUTF8(signature); - } - if (exceptions != null) { - cp.newUTF8("Exceptions"); - for (int i = 0; i < exceptions.length; ++i) { - cp.newClass(exceptions[i]); - } - } - return new MethodConstantsCollector(cv.visitMethod(access, name, desc, - signature, exceptions), cp); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassOptimizer.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassOptimizer.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassOptimizer.java deleted file mode 100644 index f4a7a22..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ClassOptimizer.java +++ /dev/null @@ -1,260 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Attribute; -import org.apache.tapestry5.internal.plastic.asm.ClassVisitor; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.Label; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.TypePath; -import org.apache.tapestry5.internal.plastic.asm.commons.Remapper; -import org.apache.tapestry5.internal.plastic.asm.commons.RemappingClassAdapter; - -/** - * A {@link ClassVisitor} that renames fields and methods, and removes debug - * info. - * - * @author Eric Bruneton - * @author Eugene Kuleshov - */ -public class ClassOptimizer extends RemappingClassAdapter { - - private String pkgName; - String clsName; - - boolean isInterface = false; - boolean hasClinitMethod = false; - List<String> syntheticClassFields = new ArrayList<String>(); - - public ClassOptimizer(final ClassVisitor cv, final Remapper remapper) { - super(Opcodes.ASM5, cv, remapper); - } - - FieldVisitor syntheticFieldVisitor(final int access, final String name, - final String desc) { - return super.visitField(access, name, desc, null, null); - } - - // ------------------------------------------------------------------------ - // Overridden methods - // ------------------------------------------------------------------------ - - @Override - public void visit(final int version, final int access, final String name, - final String signature, final String superName, - final String[] interfaces) { - super.visit(Opcodes.V1_2, access, name, null, superName, interfaces); - int index = name.lastIndexOf('/'); - if (index > 0) { - pkgName = name.substring(0, index); - } else { - pkgName = ""; - } - clsName = name; - isInterface = (access & Opcodes.ACC_INTERFACE) != 0; - } - - @Override - public void visitSource(final String source, final String debug) { - // remove debug info - } - - @Override - public void visitOuterClass(final String owner, final String name, - final String desc) { - // remove debug info - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - // remove annotations - return null; - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - // remove annotations - return null; - } - - @Override - public void visitAttribute(final Attribute attr) { - // remove non standard attributes - } - - @Override - public void visitInnerClass(final String name, final String outerName, - final String innerName, final int access) { - // remove debug info - } - - @Override - public FieldVisitor visitField(final int access, final String name, - final String desc, final String signature, final Object value) { - String s = remapper.mapFieldName(className, name, desc); - if ("-".equals(s)) { - return null; - } - if ((access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED)) == 0) { - if ((access & Opcodes.ACC_FINAL) != 0 - && (access & Opcodes.ACC_STATIC) != 0 && desc.length() == 1) { - return null; - } - if ("org/objectweb/asm".equals(pkgName) && s.equals(name)) { - System.out.println("INFO: " + clsName + "." + s - + " could be renamed"); - } - super.visitField(access, name, desc, null, value); - } else { - if (!s.equals(name)) { - throw new RuntimeException("The public or protected field " - + className + '.' + name + " must not be renamed."); - } - super.visitField(access, name, desc, null, value); - } - return null; // remove debug info - } - - @Override - public MethodVisitor visitMethod(final int access, final String name, - final String desc, final String signature, final String[] exceptions) { - String s = remapper.mapMethodName(className, name, desc); - if ("-".equals(s)) { - return null; - } - if (name.equals("<clinit>") && !isInterface) { - hasClinitMethod = true; - MethodVisitor mv = super.visitMethod(access, name, desc, null, - exceptions); - return new MethodVisitor(Opcodes.ASM5, mv) { - @Override - public void visitCode() { - super.visitCode(); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, clsName, - "_clinit_", "()V", false); - } - }; - } - - if ((access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED)) == 0) { - if ("org/objectweb/asm".equals(pkgName) && !name.startsWith("<") - && s.equals(name)) { - System.out.println("INFO: " + clsName + "." + s - + " could be renamed"); - } - return super.visitMethod(access, name, desc, null, exceptions); - } else { - if (!s.equals(name)) { - throw new RuntimeException("The public or protected method " - + className + '.' + name + desc - + " must not be renamed."); - } - return super.visitMethod(access, name, desc, null, exceptions); - } - } - - @Override - protected MethodVisitor createRemappingMethodAdapter(int access, - String newDesc, MethodVisitor mv) { - return new MethodOptimizer(this, access, newDesc, mv, remapper); - } - - @Override - public void visitEnd() { - if (syntheticClassFields.isEmpty()) { - if (hasClinitMethod) { - MethodVisitor mv = cv.visitMethod(Opcodes.ACC_STATIC - | Opcodes.ACC_SYNTHETIC, "_clinit_", "()V", null, null); - mv.visitCode(); - mv.visitInsn(Opcodes.RETURN); - mv.visitMaxs(0, 0); - mv.visitEnd(); - } - } else { - MethodVisitor mv = cv.visitMethod(Opcodes.ACC_STATIC - | Opcodes.ACC_SYNTHETIC, "class$", - "(Ljava/lang/String;)Ljava/lang/Class;", null, null); - mv.visitCode(); - Label l0 = new Label(); - Label l1 = new Label(); - Label l2 = new Label(); - mv.visitTryCatchBlock(l0, l1, l2, - "java/lang/ClassNotFoundException"); - mv.visitLabel(l0); - mv.visitVarInsn(Opcodes.ALOAD, 0); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Class", - "forName", "(Ljava/lang/String;)Ljava/lang/Class;", false); - mv.visitLabel(l1); - mv.visitInsn(Opcodes.ARETURN); - mv.visitLabel(l2); - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "java/lang/ClassNotFoundException", "getMessage", - "()Ljava/lang/String;", false); - mv.visitVarInsn(Opcodes.ASTORE, 1); - mv.visitTypeInsn(Opcodes.NEW, "java/lang/NoClassDefFoundError"); - mv.visitInsn(Opcodes.DUP); - mv.visitVarInsn(Opcodes.ALOAD, 1); - mv.visitMethodInsn(Opcodes.INVOKESPECIAL, - "java/lang/NoClassDefFoundError", "<init>", - "(Ljava/lang/String;)V", false); - mv.visitInsn(Opcodes.ATHROW); - mv.visitMaxs(3, 2); - mv.visitEnd(); - - if (hasClinitMethod) { - mv = cv.visitMethod(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE, - "_clinit_", "()V", null, null); - } else { - mv = cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", - null, null); - } - for (String ldcName : syntheticClassFields) { - String fieldName = "class$" + ldcName.replace('/', '$'); - mv.visitLdcInsn(ldcName.replace('/', '.')); - mv.visitMethodInsn(Opcodes.INVOKESTATIC, clsName, "class$", - "(Ljava/lang/String;)Ljava/lang/Class;", false); - mv.visitFieldInsn(Opcodes.PUTSTATIC, clsName, fieldName, - "Ljava/lang/Class;"); - } - mv.visitInsn(Opcodes.RETURN); - mv.visitMaxs(1, 0); - mv.visitEnd(); - } - super.visitEnd(); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/Constant.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/Constant.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/Constant.java deleted file mode 100644 index d1f1e1b..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/Constant.java +++ /dev/null @@ -1,323 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import java.util.Arrays; - -import org.apache.tapestry5.internal.plastic.asm.ClassWriter; -import org.apache.tapestry5.internal.plastic.asm.Handle; - -/** - * A constant pool item. - * - * @author Eric Bruneton - */ -class Constant { - - /** - * Type of this constant pool item. A single class is used to represent all - * constant pool item types, in order to minimize the bytecode size of this - * package. The value of this field is I, J, F, D, S, s, C, T, G, M, N, y, - * t, [h..p] (for Constant Integer, Long, Float, Double, STR, UTF8, Class, - * NameType, Fieldref, Methodref, InterfaceMethodref, InvokeDynamic, - * MethodType and MethodHandle constant pool items respectively). - * - * The 9 variable of MethodHandle constants are stored between h and p. - */ - char type; - - /** - * Value of this item, for an integer item. - */ - int intVal; - - /** - * Value of this item, for a long item. - */ - long longVal; - - /** - * Value of this item, for a float item. - */ - float floatVal; - - /** - * Value of this item, for a double item. - */ - double doubleVal; - - /** - * First part of the value of this item, for items that do not hold a - * primitive value. - */ - String strVal1; - - /** - * Second part of the value of this item, for items that do not hold a - * primitive value. - */ - String strVal2; - - /** - * Third part of the value of this item, for items that do not hold a - * primitive value. - */ - Object objVal3; - - /** - * InvokeDynamic's constant values. - */ - Object[] objVals; - - /** - * The hash code value of this constant pool item. - */ - int hashCode; - - Constant() { - } - - Constant(final Constant i) { - type = i.type; - intVal = i.intVal; - longVal = i.longVal; - floatVal = i.floatVal; - doubleVal = i.doubleVal; - strVal1 = i.strVal1; - strVal2 = i.strVal2; - objVal3 = i.objVal3; - objVals = i.objVals; - hashCode = i.hashCode; - } - - /** - * Sets this item to an integer item. - * - * @param intVal - * the value of this item. - */ - void set(final int intVal) { - this.type = 'I'; - this.intVal = intVal; - this.hashCode = 0x7FFFFFFF & (type + intVal); - } - - /** - * Sets this item to a long item. - * - * @param longVal - * the value of this item. - */ - void set(final long longVal) { - this.type = 'J'; - this.longVal = longVal; - this.hashCode = 0x7FFFFFFF & (type + (int) longVal); - } - - /** - * Sets this item to a float item. - * - * @param floatVal - * the value of this item. - */ - void set(final float floatVal) { - this.type = 'F'; - this.floatVal = floatVal; - this.hashCode = 0x7FFFFFFF & (type + (int) floatVal); - } - - /** - * Sets this item to a double item. - * - * @param doubleVal - * the value of this item. - */ - void set(final double doubleVal) { - this.type = 'D'; - this.doubleVal = doubleVal; - this.hashCode = 0x7FFFFFFF & (type + (int) doubleVal); - } - - /** - * Sets this item to an item that do not hold a primitive value. - * - * @param type - * the type of this item. - * @param strVal1 - * first part of the value of this item. - * @param strVal2 - * second part of the value of this item. - * @param strVal3 - * third part of the value of this item. - */ - void set(final char type, final String strVal1, final String strVal2, - final String strVal3) { - this.type = type; - this.strVal1 = strVal1; - this.strVal2 = strVal2; - this.objVal3 = strVal3; - switch (type) { - case 's': - case 'S': - case 'C': - case 't': - hashCode = 0x7FFFFFFF & (type + strVal1.hashCode()); - return; - case 'T': - hashCode = 0x7FFFFFFF & (type + strVal1.hashCode() - * strVal2.hashCode()); - return; - // case 'G': - // case 'M': - // case 'N': - // case 'h' ... 'p': - default: - hashCode = 0x7FFFFFFF & (type + strVal1.hashCode() - * strVal2.hashCode() * strVal3.hashCode()); - } - } - - /** - * Set this item to an InvokeDynamic item. - * - * @param name - * invokedynamic's name. - * @param desc - * invokedynamic's descriptor. - * @param bsm - * bootstrap method. - * @param bsmArgs - * bootstrap method constant arguments. - */ - void set(final String name, final String desc, final Handle bsm, - final Object[] bsmArgs) { - this.type = 'y'; - this.strVal1 = name; - this.strVal2 = desc; - this.objVal3 = bsm; - this.objVals = bsmArgs; - - int hashCode = 'y' + name.hashCode() * desc.hashCode() * bsm.hashCode(); - for (int i = 0; i < bsmArgs.length; i++) { - hashCode *= bsmArgs[i].hashCode(); - } - this.hashCode = 0x7FFFFFFF & hashCode; - } - - void write(final ClassWriter cw) { - switch (type) { - case 'I': - cw.newConst(intVal); - break; - case 'J': - cw.newConst(longVal); - break; - case 'F': - cw.newConst(floatVal); - break; - case 'D': - cw.newConst(doubleVal); - break; - case 'S': - cw.newConst(strVal1); - break; - case 's': - cw.newUTF8(strVal1); - break; - case 'C': - cw.newClass(strVal1); - break; - case 'T': - cw.newNameType(strVal1, strVal2); - break; - case 'G': - cw.newField(strVal1, strVal2, (String) objVal3); - break; - case 'M': - cw.newMethod(strVal1, strVal2, (String) objVal3, false); - break; - case 'N': - cw.newMethod(strVal1, strVal2, (String) objVal3, true); - break; - case 'y': - cw.newInvokeDynamic(strVal1, strVal2, (Handle) objVal3, objVals); - break; - case 't': - cw.newMethodType(strVal1); - break; - default: // 'h' ... 'p': handle - cw.newHandle(type - 'h' + 1, strVal1, strVal2, (String) objVal3); - } - } - - @Override - public boolean equals(final Object o) { - if (!(o instanceof Constant)) { - return false; - } - Constant c = (Constant) o; - if (c.type == type) { - switch (type) { - case 'I': - return c.intVal == intVal; - case 'J': - return c.longVal == longVal; - case 'F': - return Float.compare(c.floatVal, floatVal) == 0; - case 'D': - return Double.compare(c.doubleVal, doubleVal) == 0; - case 's': - case 'S': - case 'C': - case 't': - return c.strVal1.equals(strVal1); - case 'T': - return c.strVal1.equals(strVal1) && c.strVal2.equals(strVal2); - case 'y': - return c.strVal1.equals(strVal1) && c.strVal2.equals(strVal2) - && c.objVal3.equals(objVal3) - && Arrays.equals(c.objVals, objVals); - // case 'G': - // case 'M': - // case 'N': - // case 'h' ... 'p': - default: - return c.strVal1.equals(strVal1) && c.strVal2.equals(strVal2) - && c.objVal3.equals(objVal3); - } - } - return false; - } - - @Override - public int hashCode() { - return hashCode; - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ConstantPool.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ConstantPool.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ConstantPool.java deleted file mode 100644 index 11df6bb..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/ConstantPool.java +++ /dev/null @@ -1,251 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import java.util.HashMap; - -import org.apache.tapestry5.internal.plastic.asm.Handle; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.Type; - -/** - * A constant pool. - * - * @author Eric Bruneton - */ -public class ConstantPool extends HashMap<Constant, Constant> { - - private static final long serialVersionUID = 1L; - - private final Constant key1 = new Constant(); - - private final Constant key2 = new Constant(); - - private final Constant key3 = new Constant(); - - private final Constant key4 = new Constant(); - - private final Constant key5 = new Constant(); - - public Constant newInteger(final int value) { - key1.set(value); - Constant result = get(key1); - if (result == null) { - result = new Constant(key1); - put(result); - } - return result; - } - - public Constant newFloat(final float value) { - key1.set(value); - Constant result = get(key1); - if (result == null) { - result = new Constant(key1); - put(result); - } - return result; - } - - public Constant newLong(final long value) { - key1.set(value); - Constant result = get(key1); - if (result == null) { - result = new Constant(key1); - put(result); - } - return result; - } - - public Constant newDouble(final double value) { - key1.set(value); - Constant result = get(key1); - if (result == null) { - result = new Constant(key1); - put(result); - } - return result; - } - - public Constant newUTF8(final String value) { - key1.set('s', value, null, null); - Constant result = get(key1); - if (result == null) { - result = new Constant(key1); - put(result); - } - return result; - } - - private Constant newString(final String value) { - key2.set('S', value, null, null); - Constant result = get(key2); - if (result == null) { - newUTF8(value); - result = new Constant(key2); - put(result); - } - return result; - } - - public Constant newClass(final String value) { - key2.set('C', value, null, null); - Constant result = get(key2); - if (result == null) { - newUTF8(value); - result = new Constant(key2); - put(result); - } - return result; - } - - public Constant newMethodType(final String methodDescriptor) { - key2.set('t', methodDescriptor, null, null); - Constant result = get(key2); - if (result == null) { - newUTF8(methodDescriptor); - result = new Constant(key2); - put(result); - } - return result; - } - - public Constant newHandle(final int tag, final String owner, - final String name, final String desc) { - key4.set((char) ('h' - 1 + tag), owner, name, desc); - Constant result = get(key4); - if (result == null) { - if (tag <= Opcodes.H_PUTSTATIC) { - newField(owner, name, desc); - } else { - newMethod(owner, name, desc, tag == Opcodes.H_INVOKEINTERFACE); - } - result = new Constant(key4); - put(result); - } - return result; - } - - public Constant newConst(final Object cst) { - if (cst instanceof Integer) { - int val = ((Integer) cst).intValue(); - return newInteger(val); - } else if (cst instanceof Float) { - float val = ((Float) cst).floatValue(); - return newFloat(val); - } else if (cst instanceof Long) { - long val = ((Long) cst).longValue(); - return newLong(val); - } else if (cst instanceof Double) { - double val = ((Double) cst).doubleValue(); - return newDouble(val); - } else if (cst instanceof String) { - return newString((String) cst); - } else if (cst instanceof Type) { - Type t = (Type) cst; - int s = t.getSort(); - if (s == Type.OBJECT) { - return newClass(t.getInternalName()); - } else if (s == Type.METHOD) { - return newMethodType(t.getDescriptor()); - } else { // s == primitive type or array - return newClass(t.getDescriptor()); - } - } else if (cst instanceof Handle) { - Handle h = (Handle) cst; - return newHandle(h.getTag(), h.getOwner(), h.getName(), h.getDesc()); - } else { - throw new IllegalArgumentException("value " + cst); - } - } - - public Constant newField(final String owner, final String name, - final String desc) { - key3.set('G', owner, name, desc); - Constant result = get(key3); - if (result == null) { - newClass(owner); - newNameType(name, desc); - result = new Constant(key3); - put(result); - } - return result; - } - - public Constant newMethod(final String owner, final String name, - final String desc, final boolean itf) { - key3.set(itf ? 'N' : 'M', owner, name, desc); - Constant result = get(key3); - if (result == null) { - newClass(owner); - newNameType(name, desc); - result = new Constant(key3); - put(result); - } - return result; - } - - public Constant newInvokeDynamic(String name, String desc, Handle bsm, - Object... bsmArgs) { - key5.set(name, desc, bsm, bsmArgs); - Constant result = get(key5); - if (result == null) { - newNameType(name, desc); - newHandle(bsm.getTag(), bsm.getOwner(), bsm.getName(), - bsm.getDesc()); - for (int i = 0; i < bsmArgs.length; i++) { - newConst(bsmArgs[i]); - } - result = new Constant(key5); - put(result); - } - return result; - } - - public Constant newNameType(final String name, final String desc) { - key2.set('T', name, desc, null); - Constant result = get(key2); - if (result == null) { - newUTF8(name); - newUTF8(desc); - result = new Constant(key2); - put(result); - } - return result; - } - - private Constant get(final Constant key) { - return get((Object) key); - } - - private void put(final Constant cst) { - put(cst, cst); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/FieldConstantsCollector.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/FieldConstantsCollector.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/FieldConstantsCollector.java deleted file mode 100644 index 63ca654..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/FieldConstantsCollector.java +++ /dev/null @@ -1,89 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Attribute; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.TypePath; - -/** - * A {@link FieldVisitor} that collects the {@link Constant}s of the fields it - * visits. - * - * @author Eric Bruneton - */ -public class FieldConstantsCollector extends FieldVisitor { - - private final ConstantPool cp; - - public FieldConstantsCollector(final FieldVisitor fv, final ConstantPool cp) { - super(Opcodes.ASM5, fv); - this.cp = cp; - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleAnnotations"); - } - return new AnnotationConstantsCollector(fv.visitAnnotation(desc, - visible), cp); - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleTypeAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleTypeAnnotations"); - } - return new AnnotationConstantsCollector(fv.visitAnnotation(desc, - visible), cp); - } - - @Override - public void visitAttribute(final Attribute attr) { - // can do nothing - fv.visitAttribute(attr); - } - - @Override - public void visitEnd() { - fv.visitEnd(); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/JarOptimizer.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/JarOptimizer.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/JarOptimizer.java deleted file mode 100644 index e7d93cf..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/JarOptimizer.java +++ /dev/null @@ -1,235 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.zip.GZIPInputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; -import java.util.zip.ZipOutputStream; - -import org.apache.tapestry5.internal.plastic.asm.ClassReader; -import org.apache.tapestry5.internal.plastic.asm.ClassVisitor; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; - -/** - * A Jar file optimizer. - * - * @author Eric Bruneton - */ -public class JarOptimizer { - - static final Set<String> API = new HashSet<String>(); - static final Map<String, String> HIERARCHY = new HashMap<String, String>(); - static boolean nodebug = false; - - public static void main(final String[] args) throws IOException { - File f = new File(args[0]); - InputStream is = new GZIPInputStream(new FileInputStream(f)); - BufferedReader lnr = new LineNumberReader(new InputStreamReader(is)); - while (true) { - String line = lnr.readLine(); - if (line != null) { - if (line.startsWith("class")) { - String c = line.substring(6, line.lastIndexOf(' ')); - String sc = line.substring(line.lastIndexOf(' ') + 1); - HIERARCHY.put(c, sc); - } else { - API.add(line); - } - } else { - break; - } - } - - int argIndex = 1; - if (args[argIndex].equals("-nodebug")) { - nodebug = true; - argIndex++; - } - - optimize(new File(args[argIndex])); - } - - static void optimize(final File f) throws IOException { - if (nodebug && f.getName().contains("debug")) { - return; - } - - if (f.isDirectory()) { - File[] files = f.listFiles(); - for (int i = 0; i < files.length; ++i) { - optimize(files[i]); - } - } else if (f.getName().endsWith(".jar")) { - File g = new File(f.getParentFile(), f.getName() + ".new"); - ZipFile zf = new ZipFile(f); - ZipOutputStream out = new ZipOutputStream(new FileOutputStream(g)); - Enumeration<? extends ZipEntry> e = zf.entries(); - byte[] buf = new byte[10000]; - while (e.hasMoreElements()) { - ZipEntry ze = e.nextElement(); - if (ze.isDirectory()) { - out.putNextEntry(ze); - continue; - } - out.putNextEntry(ze); - if (ze.getName().endsWith(".class")) { - ClassReader cr = new ClassReader(zf.getInputStream(ze)); - // cr.accept(new ClassDump(), 0); - cr.accept(new ClassVerifier(), 0); - } - InputStream is = zf.getInputStream(ze); - int n; - do { - n = is.read(buf, 0, buf.length); - if (n != -1) { - out.write(buf, 0, n); - } - } while (n != -1); - out.closeEntry(); - } - out.close(); - zf.close(); - if (!f.delete()) { - throw new IOException("Cannot delete file " + f); - } - if (!g.renameTo(f)) { - throw new IOException("Cannot rename file " + g); - } - } - } - - static class ClassDump extends ClassVisitor { - - String owner; - - public ClassDump() { - super(Opcodes.ASM5); - } - - @Override - public void visit(final int version, final int access, - final String name, final String signature, - final String superName, final String[] interfaces) { - owner = name; - if (owner.startsWith("java/")) { - System.out.println("class " + name + ' ' + superName); - } - } - - @Override - public FieldVisitor visitField(final int access, final String name, - final String desc, final String signature, final Object value) { - if (owner.startsWith("java/")) { - System.out.println(owner + ' ' + name); - } - return null; - } - - @Override - public MethodVisitor visitMethod(final int access, final String name, - final String desc, final String signature, - final String[] exceptions) { - if (owner.startsWith("java/")) { - System.out.println(owner + ' ' + name + desc); - } - return null; - } - } - - static class ClassVerifier extends ClassVisitor { - - String owner; - - String method; - - public ClassVerifier() { - super(Opcodes.ASM5); - } - - @Override - public void visit(final int version, final int access, - final String name, final String signature, - final String superName, final String[] interfaces) { - owner = name; - } - - @Override - public MethodVisitor visitMethod(final int access, final String name, - final String desc, final String signature, - final String[] exceptions) { - method = name + desc; - return new MethodVisitor(Opcodes.ASM5) { - @Override - public void visitFieldInsn(final int opcode, - final String owner, final String name, final String desc) { - check(owner, name); - } - - @Override - public void visitMethodInsn(final int opcode, - final String owner, final String name, - final String desc, final boolean itf) { - check(owner, name + desc); - } - }; - } - - void check(String owner, String member) { - if (owner.startsWith("java/")) { - String o = owner; - while (o != null) { - if (API.contains(o + ' ' + member)) { - return; - } - o = HIERARCHY.get(o); - } - System.out.println("WARNING: " + owner + ' ' + member - + " called in " + this.owner + ' ' + method - + " is not defined in JDK 1.3 API"); - } - } - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodConstantsCollector.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodConstantsCollector.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodConstantsCollector.java deleted file mode 100644 index 54b3519..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodConstantsCollector.java +++ /dev/null @@ -1,224 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Handle; -import org.apache.tapestry5.internal.plastic.asm.Label; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.TypePath; - -/** - * An {@link MethodVisitor} that collects the {@link Constant}s of the methods - * it visits. - * - * @author Eric Bruneton - */ -public class MethodConstantsCollector extends MethodVisitor { - - private final ConstantPool cp; - - public MethodConstantsCollector(final MethodVisitor mv, - final ConstantPool cp) { - super(Opcodes.ASM5, mv); - this.cp = cp; - } - - @Override - public void visitParameter(String name, int access) { - cp.newUTF8("MethodParameters"); - if (name != null) { - cp.newUTF8(name); - } - mv.visitParameter(name, access); - } - - @Override - public AnnotationVisitor visitAnnotationDefault() { - cp.newUTF8("AnnotationDefault"); - return new AnnotationConstantsCollector(mv.visitAnnotationDefault(), cp); - } - - @Override - public AnnotationVisitor visitAnnotation(final String desc, - final boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleAnnotations"); - } - return new AnnotationConstantsCollector(mv.visitAnnotation(desc, - visible), cp); - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleTypeAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleTypeAnnotations"); - } - return new AnnotationConstantsCollector(mv.visitAnnotation(desc, - visible), cp); - } - - @Override - public AnnotationVisitor visitParameterAnnotation(final int parameter, - final String desc, final boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleParameterAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleParameterAnnotations"); - } - return new AnnotationConstantsCollector(mv.visitParameterAnnotation( - parameter, desc, visible), cp); - } - - @Override - public void visitTypeInsn(final int opcode, final String type) { - cp.newClass(type); - mv.visitTypeInsn(opcode, type); - } - - @Override - public void visitFieldInsn(final int opcode, final String owner, - final String name, final String desc) { - cp.newField(owner, name, desc); - mv.visitFieldInsn(opcode, owner, name, desc); - } - - @Override - public void visitMethodInsn(final int opcode, final String owner, - final String name, final String desc, final boolean itf) { - cp.newMethod(owner, name, desc, itf); - mv.visitMethodInsn(opcode, owner, name, desc, itf); - } - - @Override - public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, - Object... bsmArgs) { - cp.newInvokeDynamic(name, desc, bsm, bsmArgs); - mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); - } - - @Override - public void visitLdcInsn(final Object cst) { - cp.newConst(cst); - mv.visitLdcInsn(cst); - } - - @Override - public void visitMultiANewArrayInsn(final String desc, final int dims) { - cp.newClass(desc); - mv.visitMultiANewArrayInsn(desc, dims); - } - - @Override - public AnnotationVisitor visitInsnAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleTypeAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleTypeAnnotations"); - } - return new AnnotationConstantsCollector(mv.visitInsnAnnotation(typeRef, - typePath, desc, visible), cp); - } - - @Override - public void visitTryCatchBlock(final Label start, final Label end, - final Label handler, final String type) { - if (type != null) { - cp.newClass(type); - } - mv.visitTryCatchBlock(start, end, handler, type); - } - - @Override - public AnnotationVisitor visitTryCatchAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleTypeAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleTypeAnnotations"); - } - return new AnnotationConstantsCollector(mv.visitTryCatchAnnotation( - typeRef, typePath, desc, visible), cp); - } - - @Override - public void visitLocalVariable(final String name, final String desc, - final String signature, final Label start, final Label end, - final int index) { - if (signature != null) { - cp.newUTF8("LocalVariableTypeTable"); - cp.newUTF8(name); - cp.newUTF8(signature); - } - cp.newUTF8("LocalVariableTable"); - cp.newUTF8(name); - cp.newUTF8(desc); - mv.visitLocalVariable(name, desc, signature, start, end, index); - } - - @Override - public AnnotationVisitor visitLocalVariableAnnotation(int typeRef, - TypePath typePath, Label[] start, Label[] end, int[] index, - String desc, boolean visible) { - cp.newUTF8(desc); - if (visible) { - cp.newUTF8("RuntimeVisibleTypeAnnotations"); - } else { - cp.newUTF8("RuntimeInvisibleTypeAnnotations"); - } - return new AnnotationConstantsCollector( - mv.visitLocalVariableAnnotation(typeRef, typePath, start, end, - index, desc, visible), cp); - } - - @Override - public void visitLineNumber(final int line, final Label start) { - cp.newUTF8("LineNumberTable"); - mv.visitLineNumber(line, start); - } - - @Override - public void visitMaxs(final int maxStack, final int maxLocals) { - cp.newUTF8("Code"); - mv.visitMaxs(maxStack, maxLocals); - } -} http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/74324b31/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodOptimizer.java ---------------------------------------------------------------------- diff --git a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodOptimizer.java b/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodOptimizer.java deleted file mode 100644 index 1e11e8f..0000000 --- a/plastic/src/external/java/org/apache/tapestry5/internal/plastic/asm/optimizer/MethodOptimizer.java +++ /dev/null @@ -1,178 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2011 INRIA, France Telecom - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ -package org.apache.tapestry5.internal.plastic.asm.optimizer; - -import java.util.HashMap; - -import org.apache.tapestry5.internal.plastic.asm.AnnotationVisitor; -import org.apache.tapestry5.internal.plastic.asm.Attribute; -import org.apache.tapestry5.internal.plastic.asm.FieldVisitor; -import org.apache.tapestry5.internal.plastic.asm.Label; -import org.apache.tapestry5.internal.plastic.asm.MethodVisitor; -import org.apache.tapestry5.internal.plastic.asm.Opcodes; -import org.apache.tapestry5.internal.plastic.asm.Type; -import org.apache.tapestry5.internal.plastic.asm.TypePath; -import org.apache.tapestry5.internal.plastic.asm.commons.Remapper; -import org.apache.tapestry5.internal.plastic.asm.commons.RemappingMethodAdapter; - -/** - * A {@link MethodVisitor} that renames fields and methods, and removes debug - * info. - * - * @author Eugene Kuleshov - */ -public class MethodOptimizer extends RemappingMethodAdapter implements Opcodes { - - private final ClassOptimizer classOptimizer; - - public MethodOptimizer(ClassOptimizer classOptimizer, int access, - String desc, MethodVisitor mv, Remapper remapper) { - super(Opcodes.ASM5, access, desc, mv, remapper); - this.classOptimizer = classOptimizer; - } - - // ------------------------------------------------------------------------ - // Overridden methods - // ------------------------------------------------------------------------ - - @Override - public void visitParameter(String name, int access) { - // remove parameter info - } - - @Override - public AnnotationVisitor visitAnnotationDefault() { - // remove annotations - return null; - } - - @Override - public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - // remove annotations - return null; - } - - @Override - public AnnotationVisitor visitTypeAnnotation(int typeRef, - TypePath typePath, String desc, boolean visible) { - return null; - } - - @Override - public AnnotationVisitor visitParameterAnnotation(final int parameter, - final String desc, final boolean visible) { - // remove annotations - return null; - } - - @Override - public void visitLocalVariable(final String name, final String desc, - final String signature, final Label start, final Label end, - final int index) { - // remove debug info - } - - @Override - public void visitLineNumber(final int line, final Label start) { - // remove debug info - } - - @Override - public void visitFrame(int type, int local, Object[] local2, int stack, - Object[] stack2) { - // remove frame info - } - - @Override - public void visitAttribute(Attribute attr) { - // remove non standard attributes - } - - @Override - public void visitLdcInsn(Object cst) { - if (!(cst instanceof Type)) { - super.visitLdcInsn(cst); - return; - } - - // transform Foo.class for 1.2 compatibility - String ldcName = ((Type) cst).getInternalName(); - String fieldName = "class$" + ldcName.replace('/', '$'); - if (!classOptimizer.syntheticClassFields.contains(ldcName)) { - classOptimizer.syntheticClassFields.add(ldcName); - FieldVisitor fv = classOptimizer.syntheticFieldVisitor(ACC_STATIC - | ACC_SYNTHETIC, fieldName, "Ljava/lang/Class;"); - fv.visitEnd(); - } - - String clsName = classOptimizer.clsName; - mv.visitFieldInsn(GETSTATIC, clsName, fieldName, "Ljava/lang/Class;"); - } - - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - // rewrite boxing method call to use constructor to keep 1.3/1.4 compatibility - String[] constructorParams; - if (opcode == INVOKESTATIC && name.equals("valueOf") && - (constructorParams = BOXING_MAP.get(owner + desc)) != null) { - String type = constructorParams[0]; - String initDesc = constructorParams[1]; - super.visitTypeInsn(NEW, type); - super.visitInsn(DUP); - super.visitInsn((initDesc == "(J)V" || initDesc == "(D)V")? DUP2_X2: DUP2_X1); - super.visitInsn(POP2); - super.visitMethodInsn(INVOKESPECIAL, type, "<init>", initDesc, false); - return; - } - super.visitMethodInsn(opcode, owner, name, desc, itf); - } - - private static final HashMap<String, String[]> BOXING_MAP; - static { - String[][] boxingNames = { - // Boolean.valueOf is 1.4 and is used by the xml package, so no rewrite - { "java/lang/Byte", "(B)V" }, - { "java/lang/Short", "(S)V" }, - { "java/lang/Character", "(C)V" }, - { "java/lang/Integer", "(I)V" }, - { "java/lang/Long", "(J)V" }, - { "java/lang/Float", "(F)V" }, - { "java/lang/Double", "(D)V" }, - }; - HashMap<String, String[]> map = new HashMap<String, String[]>(); - for(String[] boxingName: boxingNames) { - String wrapper = boxingName[0]; - String desc = boxingName[1]; - String boxingMethod = wrapper + '(' + desc.charAt(1) + ")L" + wrapper + ';'; - map.put(boxingMethod, boxingName); - } - BOXING_MAP = map; - } -}