From: <jbo...@li...> - 2006-04-30 11:17:40
|
Author: mar...@jb... Date: 2006-04-30 07:17:35 -0400 (Sun, 30 Apr 2006) New Revision: 4012 Removed: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/attrs/package.html labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/commons/package.html labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/package.html labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/tree/ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckAnnotationAdapter.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckClassAdapter.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckFieldAdapter.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckMethodAdapter.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/TraceAbstractVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/TraceAnnotationVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/TraceClassVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/TraceFieldVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/TraceMethodVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/TraceSignatureVisitor.java labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/package.html Log: -Started to remove unused ASM packages/classes Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/attrs/package.html =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/attrs/package.html 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/attrs/package.html 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,48 +0,0 @@ -<html> -<!-- - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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. ---> -<body> -Provides an implementation for optional class, field and method attributes. - -<p> - -By default ASM strips optional attributes, in order to keep them in -the bytecode that is being readed you should pass an array of required attribute -instances to {@link org.objectweb.asm.ClassReader#accept(org.objectweb.asm.ClassVisitor, org.objectweb.asm.Attribute[], boolean) ClassReader.accept()} method. -In order to add custom attributes to the manually constructed bytecode concrete -subclasses of the {@link org.objectweb.asm.Attribute Attribute} can be passed to -the visitAttribute methods of the -{@link org.objectweb.asm.ClassVisitor ClassVisitor}, -{@link org.objectweb.asm.FieldVisitor FieldVisitor} and -{@link org.objectweb.asm.MethodVisitor MethodVisitor} interfaces. - -@since ASM 1.4.1 -</body> -</html> Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/commons/package.html =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/commons/package.html 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/commons/package.html 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,33 +0,0 @@ -<html> -<!-- - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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. ---> -<body> -Provides some useful class and method adapters. -</body> \ No newline at end of file Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/package.html =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/package.html 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/package.html 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,87 +0,0 @@ -<html> -<!-- - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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. ---> -<body> -Provides a small and fast bytecode manipulation framework. - -<p> -The <a href="http://www.objectweb.org/asm">ASM</a> framework is organized -around the {@link org.objectweb.asm.ClassVisitor ClassVisitor}, -{@link org.objectweb.asm.FieldVisitor FieldVisitor} and -{@link org.objectweb.asm.MethodVisitor MethodVisitor} interfaces, which allow -one to visit the fields and methods of a class, including the bytecode -instructions of each method. - -<p> -In addition to these main interfaces, ASM provides a {@link -org.objectweb.asm.ClassReader ClassReader} class, that can parse an -existing class and make a given visitor visit it. ASM also provides -a {@link org.objectweb.asm.ClassWriter ClassWriter} class, which is -a visitor that generates Java class files. - -<p> -In order to generate a class from scratch, only the {@link -org.objectweb.asm.ClassWriter ClassWriter} class is necessary. Indeed, -in order to generate a class, one must just call its visit<i>XXX</i> -methods with the appropriate arguments to generate the desired fields -and methods. See the "helloworld" example in the ASM distribution for -more details about class generation. - -<p> -In order to modify existing classes, one must use a {@link -org.objectweb.asm.ClassReader ClassReader} class to analyze -the original class, a class modifier, and a {@link org.objectweb.asm.ClassWriter -ClassWriter} to construct the modified class. The class modifier -is just a {@link org.objectweb.asm.ClassVisitor ClassVisitor} -that delegates most of the work to another {@link org.objectweb.asm.ClassVisitor -ClassVisitor}, but that sometimes changes some parameter values, -or call additional methods, in order to implement the desired -modification process. In order to make it easier to implement such -class modifiers, ASM provides the {@link org.objectweb.asm.ClassAdapter -ClassAdapter} and {@link org.objectweb.asm.MethodAdapter MethodAdapter} -classes, which implement the {@link org.objectweb.asm.ClassVisitor ClassVisitor} -and {@link org.objectweb.asm.MethodVisitor MethodVisitor} interfaces by -delegating all work to other visitors. See the "adapt" example in the ASM -distribution for more details about class modification. - -<p> -The size of the core ASM library, <tt>asm.jar</tt>, is only 31KB, which is much -more smaller than -the size of the <a href="http://jakarta.apache.org/bcel">BCEL</a> library (350KB -without the class verifier), and than the size of the -<a href="http://serp.sourceforge.net">SERP</a> library (150KB). ASM is also -much more faster than these tools. Indeed the overhead of a load time class -transformation process is of the order of 60% with ASM, 700% or more with BCEL, -and 1100% or more with SERP (see the <tt>test/perf</tt> directory in the ASM -distribution)! - -@since ASM 1.3 -</body> -</html> Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckAnnotationAdapter.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckAnnotationAdapter.java 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckAnnotationAdapter.java 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,125 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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.drools.asm.util; - -import org.drools.asm.AnnotationVisitor; -import org.drools.asm.Type; - -/** - * An {@link AnnotationVisitor} that checks that its methods are properly used. - * - * @author Eric Bruneton - */ -public class CheckAnnotationAdapter implements AnnotationVisitor { - - private AnnotationVisitor av; - - private boolean named; - - private boolean end; - - public CheckAnnotationAdapter(final AnnotationVisitor av) { - this(av, true); - } - - CheckAnnotationAdapter( - final AnnotationVisitor av, - final boolean named) - { - this.av = av; - this.named = named; - } - - public void visit(final String name, final Object value) { - checkEnd(); - checkName(name); - if (!(value instanceof Byte || value instanceof Boolean - || value instanceof Character || value instanceof Short - || value instanceof Integer || value instanceof Long - || value instanceof Float || value instanceof Double - || value instanceof String || value instanceof Type - || value instanceof byte[] || value instanceof boolean[] - || value instanceof char[] || value instanceof short[] - || value instanceof int[] || value instanceof long[] - || value instanceof float[] || value instanceof double[])) - { - throw new IllegalArgumentException("Invalid annotation value"); - } - av.visit(name, value); - } - - public void visitEnum( - final String name, - final String desc, - final String value) - { - checkEnd(); - checkName(name); - CheckMethodAdapter.checkDesc(desc, false); - if (value == null) { - throw new IllegalArgumentException("Invalid enum value"); - } - av.visitEnum(name, desc, value); - } - - public AnnotationVisitor visitAnnotation( - final String name, - final String desc) - { - checkEnd(); - checkName(name); - CheckMethodAdapter.checkDesc(desc, false); - return new CheckAnnotationAdapter(av.visitAnnotation(name, desc)); - } - - public AnnotationVisitor visitArray(final String name) { - checkEnd(); - checkName(name); - return new CheckAnnotationAdapter(av.visitArray(name), false); - } - - public void visitEnd() { - checkEnd(); - end = true; - av.visitEnd(); - } - - private void checkEnd() { - if (end) { - throw new IllegalStateException("Cannot call a visit method after visitEnd has been called"); - } - } - - private void checkName(final String name) { - if (named && name == null) { - throw new IllegalArgumentException("Annotation value name must not be null"); - } - } -} Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckClassAdapter.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckClassAdapter.java 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckClassAdapter.java 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,416 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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.drools.asm.util; - -import java.io.FileInputStream; -import java.io.PrintWriter; -import java.util.List; - -import org.drools.asm.AnnotationVisitor; -import org.drools.asm.Attribute; -import org.drools.asm.ClassAdapter; -import org.drools.asm.ClassReader; -import org.drools.asm.ClassVisitor; -import org.drools.asm.FieldVisitor; -import org.drools.asm.MethodVisitor; -import org.drools.asm.Opcodes; -import org.drools.asm.Type; -import org.drools.asm.tree.AbstractInsnNode; -import org.drools.asm.tree.ClassNode; -import org.drools.asm.tree.MethodNode; -import org.drools.asm.tree.TryCatchBlockNode; -import org.drools.asm.tree.analysis.Analyzer; -import org.drools.asm.tree.analysis.Frame; -import org.drools.asm.tree.analysis.SimpleVerifier; - -/** - * A {@link ClassAdapter} that checks that its methods are properly used. More - * precisely this class adapter checks each method call individually, based - * <i>only</i> on its arguments, but does <i>not</i> check the <i>sequence</i> - * of method calls. For example, the invalid sequence - * <tt>visitField(ACC_PUBLIC, "i", "I", null)</tt> <tt>visitField(ACC_PUBLIC, - * "i", "D", null)</tt> - * will <i>not</i> be detected by this class adapter. - * - * @author Eric Bruneton - */ -public class CheckClassAdapter extends ClassAdapter { - - /** - * <tt>true</tt> if the visit method has been called. - */ - private boolean start; - - /** - * <tt>true</tt> if the visitSource method has been called. - */ - private boolean source; - - /** - * <tt>true</tt> if the visitOuterClass method has been called. - */ - private boolean outer; - - /** - * <tt>true</tt> if the visitEnd method has been called. - */ - private boolean end; - - /** - * Checks a given class. <p> Usage: CheckClassAdapter <fully qualified - * class name or class file name> - * - * @param args the command line arguments. - * - * @throws Exception if the class cannot be found, or if an IO exception - * occurs. - */ - public static void main(final String[] args) throws Exception { - if (args.length != 1) { - System.err.println("Verifies the given class."); - System.err.println("Usage: CheckClassAdapter " - + "<fully qualified class name or class file name>"); - return; - } - ClassReader cr; - if (args[0].endsWith(".class")) { - cr = new ClassReader(new FileInputStream(args[0])); - } else { - cr = new ClassReader(args[0]); - } - - verify(cr, false, new PrintWriter(System.err)); - } - - /** - * Checks a given class - * - * @param cr a <code>ClassReader</code> that contains bytecode for the analysis. - * @param dump true if bytecode should be printed out not only when errors are found. - * @param pw write where results going to be printed - */ - public static void verify(ClassReader cr, boolean dump, PrintWriter pw) { - ClassNode cn = new ClassNode(); - cr.accept(new CheckClassAdapter(cn), true); - - List methods = cn.methods; - for (int i = 0; i < methods.size(); ++i) { - MethodNode method = (MethodNode) methods.get(i); - if (method.instructions.size() > 0) { - Analyzer a = new Analyzer(new SimpleVerifier(Type.getType("L" - + cn.name + ";"), - Type.getType("L" + cn.superName + ";"), - (cn.access & Opcodes.ACC_INTERFACE) != 0)); - try { - a.analyze(cn.name, method); - if (!dump) { - continue; - } - } catch (Exception e) { - e.printStackTrace(); - } - Frame[] frames = a.getFrames(); - - TraceMethodVisitor mv = new TraceMethodVisitor(); - - pw.println(method.name + method.desc); - for (int j = 0; j < method.instructions.size(); ++j) { - ((AbstractInsnNode) method.instructions.get(j)).accept(mv); - - StringBuffer s = new StringBuffer(); - Frame f = frames[j]; - if (f == null) { - s.append('?'); - } else { - for (int k = 0; k < f.getLocals(); ++k) { - s.append(getShortName(f.getLocal(k).toString())) - .append(' '); - } - s.append(" : "); - for (int k = 0; k < f.getStackSize(); ++k) { - s.append(getShortName(f.getStack(k).toString())) - .append(' '); - } - } - while (s.length() < method.maxStack + method.maxLocals + 1) - { - s.append(' '); - } - pw.print(Integer.toString(j + 100000).substring(1)); - pw.print(" " + s + " : " + mv.buf); // mv.text.get(j)); - } - for (int j = 0; j < method.tryCatchBlocks.size(); ++j) { - ((TryCatchBlockNode) method.tryCatchBlocks.get(j)).accept(mv); - pw.print(" " + mv.buf); - } - pw.println(); - } - } - } - - private static String getShortName(String name) { - int n = name.lastIndexOf('/'); - int k = name.length(); - if(name.charAt(k-1)==';') k--; - return n==-1 ? name : name.substring(n+1, k); - } - - /** - * Constructs a new {@link CheckClassAdapter}. - * - * @param cv the class visitor to which this adapter must delegate calls. - */ - public CheckClassAdapter(final ClassVisitor cv) { - super(cv); - } - - // ------------------------------------------------------------------------ - // Implementation of the ClassVisitor interface - // ------------------------------------------------------------------------ - - public void visit( - final int version, - final int access, - final String name, - final String signature, - final String superName, - final String[] interfaces) - { - if (start) { - throw new IllegalStateException("visit must be called only once"); - } else { - start = true; - } - checkState(); - checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL - + Opcodes.ACC_SUPER + Opcodes.ACC_INTERFACE - + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC - + Opcodes.ACC_ANNOTATION + Opcodes.ACC_ENUM - + Opcodes.ACC_DEPRECATED); - CheckMethodAdapter.checkInternalName(name, "class name"); - if ("java/lang/Object".equals(name)) { - if (superName != null) { - throw new IllegalArgumentException("The super class name of the Object class must be 'null'"); - } - } else { - CheckMethodAdapter.checkInternalName(superName, "super class name"); - } - if (signature != null) { - // TODO - } - if ((access & Opcodes.ACC_INTERFACE) != 0) { - if (!"java/lang/Object".equals(superName)) { - throw new IllegalArgumentException("The super class name of interfaces must be 'java/lang/Object'"); - } - } - if (interfaces != null) { - for (int i = 0; i < interfaces.length; ++i) { - CheckMethodAdapter.checkInternalName(interfaces[i], - "interface name at index " + i); - } - } - cv.visit(version, access, name, signature, superName, interfaces); - } - - public void visitSource(final String file, final String debug) { - checkState(); - if (source) { - throw new IllegalStateException("visitSource can be called only once."); - } - source = true; - cv.visitSource(file, debug); - } - - public void visitOuterClass( - final String owner, - final String name, - final String desc) - { - checkState(); - if (outer) { - throw new IllegalStateException("visitSource can be called only once."); - } - outer = true; - if (owner == null) { - throw new IllegalArgumentException("Illegal outer class owner"); - } - if (desc != null) { - CheckMethodAdapter.checkMethodDesc(desc); - } - cv.visitOuterClass(owner, name, desc); - } - - public void visitInnerClass( - final String name, - final String outerName, - final String innerName, - final int access) - { - checkState(); - CheckMethodAdapter.checkInternalName(name, "class name"); - if (outerName != null) { - CheckMethodAdapter.checkInternalName(outerName, "outer class name"); - } - if (innerName != null) { - CheckMethodAdapter.checkIdentifier(innerName, "inner class name"); - } - checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE - + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC - + Opcodes.ACC_FINAL + Opcodes.ACC_INTERFACE - + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC - + Opcodes.ACC_ANNOTATION + Opcodes.ACC_ENUM); - cv.visitInnerClass(name, outerName, innerName, access); - } - - public FieldVisitor visitField( - final int access, - final String name, - final String desc, - final String signature, - final Object value) - { - checkState(); - checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE - + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC - + Opcodes.ACC_FINAL + Opcodes.ACC_VOLATILE - + Opcodes.ACC_TRANSIENT + Opcodes.ACC_SYNTHETIC - + Opcodes.ACC_ENUM + Opcodes.ACC_DEPRECATED); - CheckMethodAdapter.checkIdentifier(name, "field name"); - CheckMethodAdapter.checkDesc(desc, false); - if (signature != null) { - // TODO - } - if (value != null) { - CheckMethodAdapter.checkConstant(value); - } - FieldVisitor av = cv.visitField(access, name, desc, signature, value); - return new CheckFieldAdapter(av); - } - - public MethodVisitor visitMethod( - final int access, - final String name, - final String desc, - final String signature, - final String[] exceptions) - { - checkState(); - checkAccess(access, Opcodes.ACC_PUBLIC + Opcodes.ACC_PRIVATE - + Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC - + Opcodes.ACC_FINAL + Opcodes.ACC_SYNCHRONIZED - + Opcodes.ACC_BRIDGE + Opcodes.ACC_VARARGS + Opcodes.ACC_NATIVE - + Opcodes.ACC_ABSTRACT + Opcodes.ACC_STRICT - + Opcodes.ACC_SYNTHETIC + Opcodes.ACC_DEPRECATED); - CheckMethodAdapter.checkMethodIdentifier(name, "method name"); - CheckMethodAdapter.checkMethodDesc(desc); - if (signature != null) { - // TODO - } - if (exceptions != null) { - for (int i = 0; i < exceptions.length; ++i) { - CheckMethodAdapter.checkInternalName(exceptions[i], - "exception name at index " + i); - } - } - return new CheckMethodAdapter(cv.visitMethod(access, - name, - desc, - signature, - exceptions)); - } - - public AnnotationVisitor visitAnnotation( - final String desc, - final boolean visible) - { - checkState(); - CheckMethodAdapter.checkDesc(desc, false); - return new CheckAnnotationAdapter(cv.visitAnnotation(desc, visible)); - } - - public void visitAttribute(final Attribute attr) { - checkState(); - if (attr == null) { - throw new IllegalArgumentException("Invalid attribute (must not be null)"); - } - cv.visitAttribute(attr); - } - - public void visitEnd() { - checkState(); - end = true; - cv.visitEnd(); - } - - // ------------------------------------------------------------------------ - // Utility methods - // ------------------------------------------------------------------------ - - /** - * Checks that the visit method has been called and that visitEnd has not - * been called. - */ - private void checkState() { - if (!start) { - throw new IllegalStateException("Cannot visit member before visit has been called."); - } - if (end) { - throw new IllegalStateException("Cannot visit member after visitEnd has been called."); - } - } - - /** - * Checks that the given access flags do not contain invalid flags. This - * method also checks that mutually incompatible flags are not set - * simultaneously. - * - * @param access the access flags to be checked - * @param possibleAccess the valid access flags. - */ - static void checkAccess(final int access, final int possibleAccess) { - if ((access & ~possibleAccess) != 0) { - throw new IllegalArgumentException("Invalid access flags: " - + access); - } - int pub = ((access & Opcodes.ACC_PUBLIC) != 0 ? 1 : 0); - int pri = ((access & Opcodes.ACC_PRIVATE) != 0 ? 1 : 0); - int pro = ((access & Opcodes.ACC_PROTECTED) != 0 ? 1 : 0); - if (pub + pri + pro > 1) { - throw new IllegalArgumentException("public private and protected are mutually exclusive: " - + access); - } - int fin = ((access & Opcodes.ACC_FINAL) != 0 ? 1 : 0); - int abs = ((access & Opcodes.ACC_ABSTRACT) != 0 ? 1 : 0); - if (fin + abs > 1) { - throw new IllegalArgumentException("final and abstract are mutually exclusive: " - + access); - } - } -} Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckFieldAdapter.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckFieldAdapter.java 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckFieldAdapter.java 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,75 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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.drools.asm.util; - -import org.drools.asm.AnnotationVisitor; -import org.drools.asm.Attribute; -import org.drools.asm.FieldVisitor; - -/** - * A {@link FieldVisitor} that checks that its methods are properly used. - */ -public class CheckFieldAdapter implements FieldVisitor { - - private FieldVisitor fv; - - private boolean end; - - public CheckFieldAdapter(final FieldVisitor fv) { - this.fv = fv; - } - - public AnnotationVisitor visitAnnotation(final String desc, boolean visible) - { - checkEnd(); - CheckMethodAdapter.checkDesc(desc, false); - return new CheckAnnotationAdapter(fv.visitAnnotation(desc, visible)); - } - - public void visitAttribute(final Attribute attr) { - checkEnd(); - if (attr == null) { - throw new IllegalArgumentException("Invalid attribute (must not be null)"); - } - fv.visitAttribute(attr); - } - - public void visitEnd() { - checkEnd(); - end = true; - fv.visitEnd(); - } - - private void checkEnd() { - if (end) { - throw new IllegalStateException("Cannot call a visit method after visitEnd has been called"); - } - } -} Deleted: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckMethodAdapter.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckMethodAdapter.java 2006-04-30 11:06:25 UTC (rev 4011) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/asm/util/CheckMethodAdapter.java 2006-04-30 11:17:35 UTC (rev 4012) @@ -1,942 +0,0 @@ -/*** - * ASM: a very small and fast Java bytecode manipulation framework - * Copyright (c) 2000-2005 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.drools.asm.util; - -import org.drools.asm.AnnotationVisitor; -import org.drools.asm.Attribute; -import org.drools.asm.Label; -import org.drools.asm.MethodAdapter; -import org.drools.asm.MethodVisitor; -import org.drools.asm.Opcodes; -import org.drools.asm.Type; - -import java.util.HashMap; - -/** - * A {@link MethodAdapter} that checks that its methods are properly used. More - * precisely this code adapter checks each instruction individually (i.e., each - * visit method checks some preconditions based <i>only</i> on its arguments - - * such as the fact that the given opcode is correct for a given visit method), - * but does <i>not</i> check the <i>sequence</i> of instructions. For example, - * in a method whose signature is <tt>void m ()</tt>, the invalid instruction - * IRETURN, or the invalid sequence IADD L2I will <i>not</i> be detected by - * this code adapter. - * - * @author Eric Bruneton - */ -public class CheckMethodAdapter extends MethodAdapter { - - /** - * <tt>true</tt> if the visitCode method has been called. - */ - private boolean startCode; - - /** - * <tt>true</tt> if the visitMaxs method has been called. - */ - private boolean endCode; - - /** - * <tt>true</tt> if the visitEnd method has been called. - */ - private boolean endMethod; - - /** - * The already visited labels. This map associate Integer values to Label - * keys. - */ - private HashMap labels; - - /** - * Code of the visit method to be used for each opcode. - */ - private final static int[] TYPE; - - static { - String s = "BBBBBBBBBBBBBBBBCCIAADDDDDAAAAAAAAAAAAAAAAAAAABBBBBBBBDD" - + "DDDAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" - + "BBBBBBBBBBBBBBBBBBBJBBBBBBBBBBBBBBBBBBBBHHHHHHHHHHHHHHHHD" - + "KLBBBBBBFFFFGGGGAECEBBEEBBAMHHAA"; - TYPE = new int[s.length()]; - for (int i = 0; i < TYPE.length; ++i) { - TYPE[i] = (s.charAt(i) - 'A' - 1); - } - } - - // code to generate the above string - // public static void main (String[] args) { - // int[] TYPE = new int[] { - // 0, //NOP - // 0, //ACONST_NULL - // 0, //ICONST_M1 - // 0, //ICONST_0 - // 0, //ICONST_1 - // 0, //ICONST_2 - // 0, //ICONST_3 - // 0, //ICONST_4 - // 0, //ICONST_5 - // 0, //LCONST_0 - // 0, //LCONST_1 - // 0, //FCONST_0 - // 0, //FCONST_1 - // 0, //FCONST_2 - // 0, //DCONST_0 - // 0, //DCONST_1 - // 1, //BIPUSH - // 1, //SIPUSH - // 7, //LDC - // -1, //LDC_W - // -1, //LDC2_W - // 2, //ILOAD - // 2, //LLOAD - // 2, //FLOAD - // 2, //DLOAD - // 2, //ALOAD - // -1, //ILOAD_0 - // -1, //ILOAD_1 - // -1, //ILOAD_2 - // -1, //ILOAD_3 - // -1, //LLOAD_0 - // -1, //LLOAD_1 - // -1, //LLOAD_2 - // -1, //LLOAD_3 - // -1, //FLOAD_0 - // -1, //FLOAD_1 - // -1, //FLOAD_2 - // -1, //FLOAD_3 - // -1, //DLOAD_0 - // -1, //DLOAD_1 - // -1, //DLOAD_2 - // -1, //DLOAD_3 - // -1, //ALOAD_0 - // -1, //ALOAD_1 - // -1, //ALOAD_2 - // -1, //ALOAD_3 - // 0, //IALOAD - // 0, //LALOAD - // 0, //FALOAD - // 0, //DALOAD - // 0, //AALOAD - // 0, //BALOAD - // 0, //CALOAD - // 0, //SALOAD - // 2, //ISTORE - // 2, //LSTORE - // 2, //FSTORE - // 2, //DSTORE - // 2, //ASTORE - // -1, //ISTORE_0 - // -1, //ISTORE_1 - // -1, //ISTORE_2 - // -1, //ISTORE_3 - // -1, //LSTORE_0 - // -1, //LSTORE_1 - // -1, //LSTORE_2 - // -1, //LSTORE_3 - // -1, //FSTORE_0 - // -1, //FSTORE_1 - // -1, //FSTORE_2 - // -1, //FSTORE_3 - // -1, //DSTORE_0 - // -1, //DSTORE_1 - // -1, //DSTORE_2 - // -1, //DSTORE_3 - // -1, //ASTORE_0 - // -1, //ASTORE_1 - // -1, //ASTORE_2 - // -1, //ASTORE_3 - // 0, //IASTORE - // 0, //LASTORE - // 0, //FASTORE - // 0, //DASTORE - // 0, //AASTORE - // 0, //BASTORE - // 0, //CASTORE - // 0, //SASTORE - // 0, //POP - // 0, //POP2 - // 0, //DUP - // 0, //DUP_X1 - // 0, //DUP_X2 - // 0, //DUP2 - // 0, //DUP2_X1 - // 0, //DUP2_X2 - // 0, //SWAP - // 0, //IADD - // 0, //LADD - // 0, //FADD - // 0, //DADD - // 0, //ISUB - // 0, //LSUB - // 0, //FSUB - // 0, //DSUB - // 0, //IMUL - // 0, //LMUL - // 0, //FMUL - // 0, //DMUL - // 0, //IDIV - // 0, //LDIV - // 0, //FDIV - // 0, //DDIV - // 0, //IREM - // 0, //LREM - // 0, //FREM - // 0, //DREM - // 0, //INEG - // 0, //LNEG - // 0, //FNEG - // 0, //DNEG - // 0, //ISHL - // 0, //LSHL - // 0, //ISHR - // 0, //LSHR - // 0, //IUSHR - // 0, //LUSHR - // 0, //IAND - // 0, //LAND - // 0, //IOR - // 0, //LOR - // 0, //IXOR - // 0, //LXOR - // 8, //IINC - // 0, //I2L - // 0, //I2F - // 0, //I2D - // 0, //L2I - // 0, //L2F - // 0, //L2D - // 0, //F2I - // 0, //F2L - // 0, //F2D - // 0, //D2I - // 0, //D2L - // 0, //D2F - // 0, //I2B - // 0, //I2C - // 0, //I2S - // 0, //LCMP - // 0, //FCMPL - // 0, //FCMPG - // 0, //DCMPL - // 0, //DCMPG - // 6, //IFEQ - // 6, //IFNE - // 6, //IFLT - // 6, //IFGE - // 6, //IFGT - // 6, //IFLE - // 6, //IF_ICMPEQ - // 6, //IF_ICMPNE - // 6, //IF_ICMPLT - // 6, //IF_ICMPGE - // 6, //IF_ICMPGT - // 6, //IF_ICMPLE - // 6, //IF_ACMPEQ - // 6, //IF_ACMPNE - // 6, //GOTO - // 6, //JSR - // 2, //RET - // 9, //TABLESWITCH - // 10, //LOOKUPSWITCH - // 0, //IRETURN - // 0, //LRETURN - // 0, //FRETURN - // 0, //DRETURN - // 0, //ARETURN - // 0, //RETURN - // 4, //GETSTATIC - // 4, //PUTSTATIC - // 4, //GETFIELD - // 4, //PUTFIELD - // 5, //INVOKEVIRTUAL - // 5, //INVOKESPECIAL - // 5, //INVOKESTATIC - // 5, //INVOKEINTERFACE - // -1, //UNUSED - // 3, //NEW - // 1, //NEWARRAY - // 3, //ANEWARRAY - // 0, //ARRAYLENGTH - // 0, //ATHROW - // 3, //CHECKCAST - // 3, //INSTANCEOF - // 0, //MONITORENTER - // 0, //MONITOREXIT - // -1, //WIDE - // 11, //MULTIANEWARRAY - // 6, //IFNULL - // 6, //IFNONNULL - // -1, //GOTO_W - // -1 //JSR_W - // }; - // for (int i = 0; i < TYPE.length; ++i) { - // System.out.print((char)(TYPE[i] + 1 + 'A')); - // } - // System.out.println(); - // } - - /** - * Constructs a new {@link CheckMethodAdapter} object. - * - * @param cv the code visitor to which this adapter must delegate calls. - */ - public CheckMethodAdapter(final MethodVisitor cv) { - super(cv); - this.labels = new HashMap(); - } - - public AnnotationVisitor visitAnnotation( - final String desc, - final boolean visible) - { - checkEndMethod(); - checkDesc(desc, false); - return new CheckAnnotationAdapter(mv.visitAnnotation(desc, visible)); - } - - public AnnotationVisitor visitAnnotationDefault() { - checkEndMethod(); - return new CheckAnnotationAdapter(mv.visitAnnotationDefault(), false); - } - - public AnnotationVisitor visitParameterAnnotation( - final int parameter, - final String desc, - final boolean visible) - { - checkEndMethod(); - checkDesc(desc, false); - return new CheckAnnotationAdapter(mv.visitParameterAnnotation(parameter, - desc, - visible)); - } - - public void visitAttribute(final Attribute attr) { - checkEndMethod(); - if (attr == null) { - throw new IllegalArgumentException("Invalid attribute (must not be null)"); - } - mv.visitAttribute(attr); - } - - public void visitCode() { - startCode = true; - mv.visitCode(); - } - - public void visitInsn(final int opcode) { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 0); - mv.visitInsn(opcode); - } - - public void visitIntInsn(final int opcode, final int operand) { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 1); - switch (opcode) { - case Opcodes.BIPUSH: - checkSignedByte(operand, "Invalid operand"); - break; - case Opcodes.SIPUSH: - checkSignedShort(operand, "Invalid operand"); - break; - // case Constants.NEWARRAY: - default: - if (operand < Opcodes.T_BOOLEAN || operand > Opcodes.T_LONG) { - throw new IllegalArgumentException("Invalid operand (must be an array type code T_...): " - + operand); - } - } - mv.visitIntInsn(opcode, operand); - } - - public void visitVarInsn(final int opcode, final int var) { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 2); - checkUnsignedShort(var, "Invalid variable index"); - mv.visitVarInsn(opcode, var); - } - - public void visitTypeInsn(final int opcode, final String desc) { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 3); - if (desc != null && desc.length() > 0 && desc.charAt(0) == '[') { - checkDesc(desc, false); - } else { - checkInternalName(desc, "type"); - } - if (opcode == Opcodes.NEW && desc.charAt(0) == '[') { - throw new IllegalArgumentException("NEW cannot be used to create arrays: " - + desc); - } - mv.visitTypeInsn(opcode, desc); - } - - public void visitFieldInsn( - final int opcode, - final String owner, - final String name, - final String desc) - { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 4); - checkInternalName(owner, "owner"); - checkIdentifier(name, "name"); - checkDesc(desc, false); - mv.visitFieldInsn(opcode, owner, name, desc); - } - - public void visitMethodInsn( - final int opcode, - final String owner, - final String name, - final String desc) - { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 5); - checkMethodIdentifier(name, "name"); - if (!name.equals("clone")) { - // In JDK1.5, clone method can be called on array class descriptors - checkInternalName(owner, "owner"); - } - checkMethodDesc(desc); - mv.visitMethodInsn(opcode, owner, name, desc); - } - - public void visitJumpInsn(final int opcode, final Label label) { - checkStartCode(); - checkEndCode(); - checkOpcode(opcode, 6); - checkLabel(label, false, "label"); - mv.visitJumpInsn(opcode, label); - } - - public void visitLabel(final Label label) { - checkStartCode(); - checkEndCode(); - checkLabel(label, false, "label"); - if (labels.get(label) != null) { - throw new IllegalArgumentException("Already visited label"); - } else { - labels.put(label, new Integer(labels.size())); - } - mv.visitLabel(label); - } - - public void visitLdcInsn(final Object cst) { - checkStartCode(); - checkEndCode(); - if (!(cst instanceof Type)) { - checkConstant(cst); - } - mv.visitLdcInsn(cst); - } - - public void visitIincInsn(final int var, final int increment) { - checkStartCode(); - checkEndCode(); - checkUnsignedShort(var, "Invalid variable index"); - checkSignedShort(increment, "Invalid increment"); - mv.visitIincInsn(var, increment); - } - - public void visitTableSwitchInsn( - final int min, - final int max, - final Label dflt, - final Label labels[]) - { - checkStartCode(); - checkEndCode(); - if (max < min) { - throw new IllegalArgumentException("Max = " + max - + " must be greater than or equal to min = " + min); - } - checkLabel(dflt, false, "default label"); - if (labels == null || labels.length != max - min + 1) { - throw new IllegalArgumentException("There must be max - min + 1 labels"); - } - for (int i = 0; i < labels.length; ++i) { - checkLabel(labels[i], false, "label at index " + i); - } - mv.visitTableSwitchInsn(min, max, dflt, labels); - } - - public void visitLookupSwitchInsn( - final Label dflt, - final int keys[], - final Label labels[]) - { - checkEndCode(); - checkStartCode(); - checkLabel(dflt, false, "default label"); - if (keys == null || labels == null || keys.length != labels.length) { - throw new IllegalArgumentException("There must be the same number of keys and labels"); - } - for (int i = 0; i < labels.length; ++i) { - checkLabel(labels[i], false, "label at index " + i); - } - mv.visitLookupSwitchInsn(dflt, keys, labels); - } - - public void visitMultiANewArrayInsn(final String desc, final int dims) { - checkStartCode(); - checkEndCode(); - checkDesc(desc, false); - if (desc.charAt(0) != '[') { - throw new IllegalArgumentException("Invalid descriptor (must be an array type descriptor): " - + desc); - } - if (dims < 1) { - throw new IllegalArgumentException("Invalid dimensions (must be greater than 0): " - + dims); - } - if (dims > desc.lastIndexOf('[') + 1) { - throw new IllegalArgumentException("Invalid dimensions (must not be greater than dims(desc)): " - + dims); - } - mv.visitMultiANewArrayInsn(desc, dims); - } - - public void visitTryCatchBlock( - final Label start, - final Label end, - final Label handler, - final String type) - { - checkStartCode(); - checkEndCode(); - if (type != null) { - checkInternalName(type, "type"); - } - mv.visitTryCatchBlock(start, end, handler, type); - } - - public void visitLocalVariable( - final String name, - final String desc, - final String signature, - final Label start, - final Label end, - final int index) - { - checkStartCode(); - checkEndCode(); - checkIdentifier(name, "name"); - checkDesc(desc, false); - checkLabel(start, true, "start label"); - checkLabel(end, true, "end label"); - checkUnsignedShort(index, "Invalid variable index"); - int s = ((Integer) labels.get(start)).intValue(); - int e = ((Integer) labels.get(end)).intValue(); - if (e < s) { - throw new IllegalArgumentException("Invalid start and end labels (end must be greater than start)"); - } - mv.visitLocalVariable(name, desc, signature, start, end, index); - } - - public void visitLineNumber(final int line, final Label start) { - checkStartCode(); - checkEndCode(); - checkUnsignedShort(line, "Invalid line number"); - checkLabel(start, true, "start label"); - mv.visitLineNumber(line, start); - } - - public void visitMaxs(final int maxStack, final int maxLocals) { - checkStartCode(); - checkEndCode(); - endCode = true; - checkUnsignedShort(maxStack, "Invalid max stack"); - checkUnsignedShort(maxLocals, "Invalid max locals"); - mv.visitMaxs(maxStack, maxLocals); - } - - public void visitEnd() { - checkEndMethod(); - endMethod = true; - mv.visitEnd(); - } - - // ------------------------------------------------------------------------- - - /** - * Checks that the visitCode method has been called. - */ - void checkStartCode() { - if (!startCode) { - throw new IllegalStateException("Cannot visit instructions before visitCode has been called."); - } - } - - /** - * Checks that the visitMaxs method has not been called. - */ - void checkEndCode() { - if (endCode) { - throw new IllegalStateException("Cannot visit instructions after visitMaxs has been called."); - } - } - - /** - * Checks that the visitEnd method has not been called. - */ - void checkEndMethod() { - if (endMethod) { - throw new IllegalStateException("Cannot visit elements after visitEnd has been called."); - } - } - - /** - * Checks that the type of the given opcode is equal to the given type. - * - * @param opcode the opcode to be checked. - * @param type the expected opcode type. - */ - static void checkOpcode(final int opcode, final int type) { - if (opcode < 0 || opcode > 199 || TYPE[opcode] != type) { - throw new IllegalArgumentException("Invalid opcode: " + opcode); - } - } - - /** - * Checks that the given value is a signed byte. - * - * @param value the value to be checked. - * @param msg an message to be used in case of error. - */ - static void checkSignedByte(final int value, final String msg) { - if (value < Byte.MIN_VALUE || value > Byte.MAX_VALUE) { - throw new IllegalArgumentException(msg - + " (must be a signed byte): " + value); - } - } - - /** - * Checks that the given value is a signed short. - * - * @param value the value to be checked. - * @param msg an message to be used in case of error. - */ - static void checkSignedShort(final int value, final String msg) { - if (value < Short.MIN_VALUE || value > Short.MAX_VALUE) { - throw new IllegalArgumentException(msg - + " (must be a signed short): " + value); - } - } - - /** - * Checks that the given value is an unsigned short. - * - * @param value the value to be checked. - * @param msg an message to be used in case of error. - */ - static void checkUnsignedShort(final int value, final String msg) { - if (value < 0 || value > 65535) { - throw new IllegalArgumentException(msg - + " (must be an unsigned short): " + value); - } - } - - /** - * Checks that the given value is an {@link Integer}, a{@link Float}, a - * {@link Long}, a {@link Double} or a {@link String}. - * - * @param cst the value to be checked. - */ - static void checkConstant(final Object cst) { - if (!(cst instanceof Integer) && !(cst instanceof Float) - && !(cst instanceof Long) && !(cst instanceof Double) - && !(cst instanceof String)) - { - throw new IllegalArgumentException("Invalid constant: " + cst); - } - } - - /** - * Checks that the given string is a valid Java identifier. - * - * @param name the string to be checked. - * @param msg a message to be used in case of error. - */ - static void checkIdentifier(final String name, final String msg) { - checkIdentifier(name, 0, -1, msg); - } - - /** - * Checks that the given substring is a valid Java identifier. - * - * @param name the string to be checked. - * @param start index of the first character of the identifier (inclusive). - * @param end index of the last character of the identifier (exclusive). -1 - * is equivalent to <tt>name.length()</tt> if name is not - * <tt>null</tt>. - * @param msg a message to be used in case of error. - */ - static void checkIdentifier( - final String name, - final int start, - final int end, - final String msg) - { - if (name == null || (end == -1 ? name.length() <= start : end <= start)) - { - throw new IllegalArgumentException("Invalid " + msg - + " (must not be null or empty)"); - } - if (!Character.isJavaIdentifierStart(name.charAt(start))) { - throw new IllegalArgumentException("Invalid " + msg - + " (must be a valid Java identifier): " + name); - } - int max = (end == -1 ? name.length() : end); - for (int i = start + 1; i < max; ++i) { - if (!Character.isJavaIdentifierPart(name.charAt(i))) { - throw new IllegalArgumentException("Invalid " + msg - + " (must be a valid Java identifier): " + name); - } - } - } - - /** - * Checks that the given string is a valid Java identifier or is equal to - * '<init>' or '<clinit>'. - * - * @param name the string to be checked. - * @param msg a message to be used in case of error. - */ - static void checkMethodIdentifier(final String name, final String msg) { - if (name == null || name.length() == 0) { - throw new IllegalArgumentException("Invalid " + msg - + " (must not be null or empty)"); - } - if (name.equals("<init>") || name.equals("<clinit>")) { - return; - } - if (!Character.isJavaIdentifierStart(name.charAt(0))) { - throw new IllegalArgumentException("Invalid " - + msg - + " (must be a '<init>', '<clinit>' or a valid Java identifier): " - + name); - } - for (int i = 1; i < name.length(); ++i) { - if (!Character.isJavaIdentifierPart(name.charAt(i))) { - throw new IllegalArgumentException("Invalid " - + msg - + " (must be '<init>' or '<clinit>' or a valid Java ide... [truncated message content] |