- update to more recent JDT to pickup Nestmates fix - bcel updated for NestMembers/NestHost attributes - testcases for nestmatestags/V1_9_2_RC2
@@ -651,8 +651,12 @@ public interface Constants { | |||
public static final byte ATTR_MODULE = 23; | |||
public static final byte ATTR_MODULE_PACKAGES = 24; | |||
public static final byte ATTR_MODULE_MAIN_CLASS = 25; | |||
public static final short KNOWN_ATTRIBUTES = 26; | |||
// J11: | |||
public static final byte ATTR_NEST_HOST = 26; | |||
public static final byte ATTR_NEST_MEMBERS = 27; | |||
public static final short KNOWN_ATTRIBUTES = 28; | |||
public static final String[] ATTRIBUTE_NAMES = { | |||
"SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", | |||
@@ -660,7 +664,7 @@ public interface Constants { | |||
"RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", | |||
"RuntimeInvisibleParameterAnnotations", "LocalVariableTypeTable", "EnclosingMethod", | |||
"AnnotationDefault","BootstrapMethods", "RuntimeVisibleTypeAnnotations", "RuntimeInvisibleTypeAnnotations", | |||
"MethodParameters", "Module", "ModulePackages", "ModuleMainClass" | |||
"MethodParameters", "Module", "ModulePackages", "ModuleMainClass", "NestHost", "NestMembers" | |||
}; | |||
/** |
@@ -173,6 +173,10 @@ public abstract class Attribute implements Cloneable, Node, Serializable { | |||
return new ModulePackages(idx, len, file, cpool); | |||
case Constants.ATTR_MODULE_MAIN_CLASS: | |||
return new ModuleMainClass(idx, len, file, cpool); | |||
case Constants.ATTR_NEST_HOST: | |||
return new NestHost(idx, len, file, cpool); | |||
case Constants.ATTR_NEST_MEMBERS: | |||
return new NestMembers(idx, len, file, cpool); | |||
default: | |||
throw new IllegalStateException(); | |||
} | |||
@@ -203,6 +207,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { | |||
return Constants.ATTRIBUTE_NAMES[tag]; | |||
} | |||
@Override | |||
public abstract void accept(ClassVisitor v); | |||
} |
@@ -173,4 +173,8 @@ public interface ClassVisitor { | |||
public void visitModule(Module module); | |||
public void visitModulePackages(ModulePackages modulePackage); | |||
public void visitModuleMainClass(ModuleMainClass moduleMainClass); | |||
// J11: | |||
public void visitNestHost(NestHost nestHost); | |||
public void visitNestMembers(NestMembers nestMembers); | |||
} |
@@ -0,0 +1,118 @@ | |||
package org.aspectj.apache.bcel.classfile; | |||
/* ==================================================================== | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution, | |||
* if any, must include the following acknowledgment: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowledgment may appear in the software itself, | |||
* if and wherever such third-party acknowledgments normally appear. | |||
* | |||
* 4. The names "Apache" and "Apache Software Foundation" and | |||
* "Apache BCEL" must not be used to endorse or promote products | |||
* derived from this software without prior written permission. For | |||
* written permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache", | |||
* "Apache BCEL", nor may "Apache" appear in their name, without | |||
* prior written permission of the Apache Software Foundation. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR | |||
* ITS 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. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
import java.io.DataInputStream; | |||
import java.io.DataOutputStream; | |||
import java.io.IOException; | |||
import org.aspectj.apache.bcel.Constants; | |||
/** | |||
* https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.7.28 | |||
* | |||
* @see Attribute | |||
*/ | |||
public final class NestHost extends Attribute { | |||
private int hostClassIndex; | |||
public NestHost(NestHost c) { | |||
this(c.getNameIndex(), c.getLength(), c.getHostClassIndex(), c.getConstantPool()); | |||
} | |||
public NestHost(int nameIndex, int length, int hostClassIndex, ConstantPool cp) { | |||
super(Constants.ATTR_NEST_MEMBERS, nameIndex, length, cp); | |||
this.hostClassIndex = hostClassIndex; | |||
} | |||
NestHost(int nameIndex, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { | |||
this(nameIndex, length, 0, constant_pool); | |||
hostClassIndex = file.readUnsignedShort(); | |||
} | |||
@Override | |||
public void accept(ClassVisitor v) { | |||
v.visitNestHost(this); | |||
} | |||
@Override | |||
public final void dump(DataOutputStream file) throws IOException { | |||
super.dump(file); | |||
file.writeShort(hostClassIndex); | |||
} | |||
public final int getHostClassIndex() { | |||
return hostClassIndex; | |||
} | |||
public final void setHostClassIndex(int hostClassIndex) { | |||
this.hostClassIndex = hostClassIndex; | |||
} | |||
public final String getHostClassName() { | |||
ConstantClass constantClass = (ConstantClass)cpool.getConstant(hostClassIndex,Constants.CONSTANT_Class); | |||
return constantClass.getClassname(cpool); | |||
} | |||
@Override | |||
public final String toString() { | |||
StringBuffer buf = new StringBuffer(); | |||
buf.append("NestHost("); | |||
ConstantClass constantClass = (ConstantClass)cpool.getConstant(hostClassIndex,Constants.CONSTANT_Class); | |||
buf.append(constantClass.getClassname(cpool)); | |||
buf.append(")"); | |||
return buf.toString(); | |||
} | |||
} |
@@ -0,0 +1,131 @@ | |||
package org.aspectj.apache.bcel.classfile; | |||
/* ==================================================================== | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2001 The Apache Software Foundation. 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. The end-user documentation included with the redistribution, | |||
* if any, must include the following acknowledgment: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowledgment may appear in the software itself, | |||
* if and wherever such third-party acknowledgments normally appear. | |||
* | |||
* 4. The names "Apache" and "Apache Software Foundation" and | |||
* "Apache BCEL" must not be used to endorse or promote products | |||
* derived from this software without prior written permission. For | |||
* written permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache", | |||
* "Apache BCEL", nor may "Apache" appear in their name, without | |||
* prior written permission of the Apache Software Foundation. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR | |||
* ITS 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. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
import java.io.DataInputStream; | |||
import java.io.DataOutputStream; | |||
import java.io.IOException; | |||
import org.aspectj.apache.bcel.Constants; | |||
/** | |||
* https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.7.29 | |||
* | |||
* @see Attribute | |||
*/ | |||
public final class NestMembers extends Attribute { | |||
private int numberOfClasses; | |||
private int[] classes; // CONSTANT_Class_info references | |||
public NestMembers(NestMembers c) { | |||
this(c.getNameIndex(), c.getLength(), c.getClasses(), c.getConstantPool()); | |||
} | |||
public NestMembers(int nameIndex, int length, int[] classes, ConstantPool cp) { | |||
super(Constants.ATTR_NEST_MEMBERS, nameIndex, length, cp); | |||
setClasses(classes); | |||
} | |||
NestMembers(int nameIndex, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { | |||
this(nameIndex, length, (int[]) null, constant_pool); | |||
numberOfClasses = file.readUnsignedShort(); | |||
classes = new int[numberOfClasses]; | |||
for (int i = 0; i < numberOfClasses; i++) { | |||
classes[i] = file.readUnsignedShort(); | |||
} | |||
} | |||
@Override | |||
public void accept(ClassVisitor v) { | |||
v.visitNestMembers(this); | |||
} | |||
@Override | |||
public final void dump(DataOutputStream file) throws IOException { | |||
super.dump(file); | |||
file.writeShort(numberOfClasses); | |||
for (int i = 0; i < numberOfClasses; i++) { | |||
file.writeShort(classes[i]); | |||
} | |||
} | |||
public final int[] getClasses() { | |||
return classes; | |||
} | |||
public final void setClasses(int[] inner_classes) { | |||
this.classes = inner_classes; | |||
numberOfClasses = (inner_classes == null) ? 0 : inner_classes.length; | |||
} | |||
public final String[] getClassesNames() { | |||
String[] result = new String[numberOfClasses]; | |||
for (int i = 0; i < numberOfClasses; i++) { | |||
ConstantClass constantClass = (ConstantClass)cpool.getConstant(classes[i],Constants.CONSTANT_Class); | |||
result[i] = constantClass.getClassname(cpool); | |||
} | |||
return result; | |||
} | |||
@Override | |||
public final String toString() { | |||
StringBuffer buf = new StringBuffer(); | |||
for (int i = 0; i < numberOfClasses; i++) { | |||
ConstantClass constantClass = (ConstantClass)cpool.getConstant(classes[i],Constants.CONSTANT_Class); | |||
buf.append(constantClass.getClassname(cpool)).append(" "); | |||
} | |||
return "NestMembers("+buf.toString().trim()+")"; | |||
} | |||
} |
@@ -59,6 +59,7 @@ import org.aspectj.apache.bcel.classfile.AnnotationDefault; | |||
import org.aspectj.apache.bcel.classfile.Attribute; | |||
import org.aspectj.apache.bcel.classfile.AttributeUtils; | |||
import org.aspectj.apache.bcel.classfile.BootstrapMethods; | |||
import org.aspectj.apache.bcel.classfile.ClassVisitor; | |||
import org.aspectj.apache.bcel.classfile.Code; | |||
import org.aspectj.apache.bcel.classfile.CodeException; | |||
import org.aspectj.apache.bcel.classfile.Constant; | |||
@@ -98,13 +99,14 @@ import org.aspectj.apache.bcel.classfile.MethodParameters; | |||
import org.aspectj.apache.bcel.classfile.Module; | |||
import org.aspectj.apache.bcel.classfile.ModuleMainClass; | |||
import org.aspectj.apache.bcel.classfile.ModulePackages; | |||
import org.aspectj.apache.bcel.classfile.NestHost; | |||
import org.aspectj.apache.bcel.classfile.NestMembers; | |||
import org.aspectj.apache.bcel.classfile.Signature; | |||
import org.aspectj.apache.bcel.classfile.SourceFile; | |||
import org.aspectj.apache.bcel.classfile.StackMap; | |||
import org.aspectj.apache.bcel.classfile.StackMapEntry; | |||
import org.aspectj.apache.bcel.classfile.Synthetic; | |||
import org.aspectj.apache.bcel.classfile.Unknown; | |||
import org.aspectj.apache.bcel.classfile.ClassVisitor; | |||
import org.aspectj.apache.bcel.classfile.annotation.RuntimeInvisAnnos; | |||
import org.aspectj.apache.bcel.classfile.annotation.RuntimeInvisParamAnnos; | |||
import org.aspectj.apache.bcel.classfile.annotation.RuntimeInvisTypeAnnos; | |||
@@ -171,6 +173,7 @@ public class DescendingVisitor implements ClassVisitor { | |||
clazz.accept(this); | |||
} | |||
@Override | |||
public void visitJavaClass(JavaClass clazz) { | |||
stack.push(clazz); | |||
clazz.accept(visitor); | |||
@@ -189,6 +192,7 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitField(Field field) { | |||
stack.push(field); | |||
field.accept(visitor); | |||
@@ -197,12 +201,14 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantValue(ConstantValue cv) { | |||
stack.push(cv); | |||
cv.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitMethod(Method method) { | |||
stack.push(method); | |||
method.accept(visitor); | |||
@@ -210,12 +216,14 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitExceptionTable(ExceptionTable table) { | |||
stack.push(table); | |||
table.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitCode(Code code) { | |||
stack.push(code); | |||
code.accept(visitor); | |||
@@ -230,12 +238,14 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitCodeException(CodeException ce) { | |||
stack.push(ce); | |||
ce.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitLineNumberTable(LineNumberTable table) { | |||
stack.push(table); | |||
table.accept(visitor); | |||
@@ -246,12 +256,14 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitLineNumber(LineNumber number) { | |||
stack.push(number); | |||
number.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitLocalVariableTable(LocalVariableTable table) { | |||
stack.push(table); | |||
table.accept(visitor); | |||
@@ -262,6 +274,7 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitStackMap(StackMap table) { | |||
stack.push(table); | |||
table.accept(visitor); | |||
@@ -273,18 +286,21 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitStackMapEntry(StackMapEntry var) { | |||
stack.push(var); | |||
var.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitLocalVariable(LocalVariable var) { | |||
stack.push(var); | |||
var.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantPool(ConstantPool cp) { | |||
stack.push(cp); | |||
cp.accept(visitor); | |||
@@ -298,104 +314,123 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantClass(ConstantClass constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantDouble(ConstantDouble constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantFieldref(ConstantFieldref constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantFloat(ConstantFloat constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantInteger(ConstantInteger constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantLong(ConstantLong constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantMethodref(ConstantMethodref constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantMethodHandle(ConstantMethodHandle constant) { | |||
throw new IllegalStateException("nyi"); | |||
} | |||
@Override | |||
public void visitConstantMethodType(ConstantMethodType obj) { | |||
throw new IllegalStateException("nyi"); | |||
} | |||
@Override | |||
public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) { | |||
throw new IllegalStateException("nyi"); | |||
} | |||
@Override | |||
public void visitConstantDynamic(ConstantDynamic obj) { | |||
throw new IllegalStateException("nyi"); | |||
} | |||
@Override | |||
public void visitBootstrapMethods(BootstrapMethods obj) { | |||
throw new IllegalStateException("nyi"); | |||
} | |||
@Override | |||
public void visitConstantNameAndType(ConstantNameAndType constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantString(ConstantString constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantModule(ConstantModule constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantPackage(ConstantPackage constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitConstantUtf8(ConstantUtf8 constant) { | |||
stack.push(constant); | |||
constant.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitInnerClasses(InnerClasses ic) { | |||
stack.push(ic); | |||
ic.accept(visitor); | |||
@@ -406,18 +441,21 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitInnerClass(InnerClass inner) { | |||
stack.push(inner); | |||
inner.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitDeprecated(Deprecated attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitSignature(Signature attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
@@ -425,60 +463,70 @@ public class DescendingVisitor implements ClassVisitor { | |||
} | |||
// J5SUPPORT: | |||
@Override | |||
public void visitEnclosingMethod(EnclosingMethod attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitRuntimeVisibleAnnotations(RuntimeVisAnnos attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitRuntimeInvisibleAnnotations(RuntimeInvisAnnos attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitRuntimeVisibleParameterAnnotations(RuntimeVisParamAnnos attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisParamAnnos attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitRuntimeVisibleTypeAnnotations(RuntimeVisTypeAnnos attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitMethodParameters(MethodParameters attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisTypeAnnos attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitAnnotationDefault(AnnotationDefault attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitLocalVariableTypeTable(LocalVariableTypeTable table) { | |||
stack.push(table); | |||
table.accept(visitor); | |||
@@ -489,39 +537,59 @@ public class DescendingVisitor implements ClassVisitor { | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitSourceFile(SourceFile attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitSynthetic(Synthetic attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitUnknown(Unknown attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitModule(Module attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitModulePackages(ModulePackages attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitModuleMainClass(ModuleMainClass attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitNestHost(NestHost attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
@Override | |||
public void visitNestMembers(NestMembers attribute) { | |||
stack.push(attribute); | |||
attribute.accept(visitor); | |||
stack.pop(); | |||
} | |||
} |
@@ -55,6 +55,7 @@ package org.aspectj.apache.bcel.verifier; | |||
import org.aspectj.apache.bcel.classfile.AnnotationDefault; | |||
import org.aspectj.apache.bcel.classfile.BootstrapMethods; | |||
import org.aspectj.apache.bcel.classfile.ClassVisitor; | |||
import org.aspectj.apache.bcel.classfile.Code; | |||
import org.aspectj.apache.bcel.classfile.CodeException; | |||
import org.aspectj.apache.bcel.classfile.ConstantClass; | |||
@@ -93,13 +94,14 @@ import org.aspectj.apache.bcel.classfile.MethodParameters; | |||
import org.aspectj.apache.bcel.classfile.Module; | |||
import org.aspectj.apache.bcel.classfile.ModuleMainClass; | |||
import org.aspectj.apache.bcel.classfile.ModulePackages; | |||
import org.aspectj.apache.bcel.classfile.NestHost; | |||
import org.aspectj.apache.bcel.classfile.NestMembers; | |||
import org.aspectj.apache.bcel.classfile.Signature; | |||
import org.aspectj.apache.bcel.classfile.SourceFile; | |||
import org.aspectj.apache.bcel.classfile.StackMap; | |||
import org.aspectj.apache.bcel.classfile.StackMapEntry; | |||
import org.aspectj.apache.bcel.classfile.Synthetic; | |||
import org.aspectj.apache.bcel.classfile.Unknown; | |||
import org.aspectj.apache.bcel.classfile.ClassVisitor; | |||
import org.aspectj.apache.bcel.classfile.annotation.RuntimeInvisAnnos; | |||
import org.aspectj.apache.bcel.classfile.annotation.RuntimeInvisParamAnnos; | |||
import org.aspectj.apache.bcel.classfile.annotation.RuntimeInvisTypeAnnos; | |||
@@ -120,64 +122,118 @@ import org.aspectj.apache.bcel.classfile.annotation.RuntimeVisTypeAnnos; | |||
public class EmptyClassVisitor implements ClassVisitor { | |||
protected EmptyClassVisitor() { } | |||
public void visitCode(Code obj) {} | |||
public void visitCodeException(CodeException obj) {} | |||
public void visitConstantClass(ConstantClass obj) {} | |||
public void visitConstantDouble(ConstantDouble obj) {} | |||
public void visitConstantFieldref(ConstantFieldref obj) {} | |||
public void visitConstantFloat(ConstantFloat obj) {} | |||
public void visitConstantInteger(ConstantInteger obj) {} | |||
public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {} | |||
public void visitConstantLong(ConstantLong obj) {} | |||
public void visitConstantMethodref(ConstantMethodref obj) {} | |||
public void visitConstantMethodHandle(ConstantMethodHandle obj) {} | |||
public void visitConstantMethodType(ConstantMethodType obj) {} | |||
public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) {} | |||
public void visitConstantNameAndType(ConstantNameAndType obj) {} | |||
public void visitConstantPool(ConstantPool obj) {} | |||
public void visitConstantString(ConstantString obj) {} | |||
public void visitConstantModule(ConstantModule obj) {} | |||
public void visitConstantPackage(ConstantPackage obj) {} | |||
public void visitConstantUtf8(ConstantUtf8 obj) {} | |||
public void visitConstantValue(ConstantValue obj) {} | |||
public void visitDeprecated(Deprecated obj) {} | |||
public void visitExceptionTable(ExceptionTable obj) {} | |||
public void visitField(Field obj) {} | |||
public void visitInnerClass(InnerClass obj) {} | |||
public void visitInnerClasses(InnerClasses obj) {} | |||
public void visitJavaClass(JavaClass obj) {} | |||
public void visitLineNumber(LineNumber obj) {} | |||
public void visitBootstrapMethods(BootstrapMethods obj) {} | |||
public void visitLineNumberTable(LineNumberTable obj) {} | |||
public void visitLocalVariable(LocalVariable obj) {} | |||
public void visitLocalVariableTable(LocalVariableTable obj) {} | |||
public void visitMethod(Method obj) {} | |||
public void visitSignature(Signature obj) {} | |||
public void visitSourceFile(SourceFile obj) {} | |||
public void visitSynthetic(Synthetic obj) {} | |||
public void visitUnknown(Unknown obj) {} | |||
public void visitStackMap(StackMap obj) {} | |||
public void visitStackMapEntry(StackMapEntry obj) {} | |||
@Override | |||
public void visitCode(Code obj) {} | |||
@Override | |||
public void visitCodeException(CodeException obj) {} | |||
@Override | |||
public void visitConstantClass(ConstantClass obj) {} | |||
@Override | |||
public void visitConstantDouble(ConstantDouble obj) {} | |||
@Override | |||
public void visitConstantFieldref(ConstantFieldref obj) {} | |||
@Override | |||
public void visitConstantFloat(ConstantFloat obj) {} | |||
@Override | |||
public void visitConstantInteger(ConstantInteger obj) {} | |||
@Override | |||
public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {} | |||
@Override | |||
public void visitConstantLong(ConstantLong obj) {} | |||
@Override | |||
public void visitConstantMethodref(ConstantMethodref obj) {} | |||
@Override | |||
public void visitConstantMethodHandle(ConstantMethodHandle obj) {} | |||
@Override | |||
public void visitConstantMethodType(ConstantMethodType obj) {} | |||
@Override | |||
public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) {} | |||
@Override | |||
public void visitConstantNameAndType(ConstantNameAndType obj) {} | |||
@Override | |||
public void visitConstantPool(ConstantPool obj) {} | |||
@Override | |||
public void visitConstantString(ConstantString obj) {} | |||
@Override | |||
public void visitConstantModule(ConstantModule obj) {} | |||
@Override | |||
public void visitConstantPackage(ConstantPackage obj) {} | |||
@Override | |||
public void visitConstantUtf8(ConstantUtf8 obj) {} | |||
@Override | |||
public void visitConstantValue(ConstantValue obj) {} | |||
@Override | |||
public void visitDeprecated(Deprecated obj) {} | |||
@Override | |||
public void visitExceptionTable(ExceptionTable obj) {} | |||
@Override | |||
public void visitField(Field obj) {} | |||
@Override | |||
public void visitInnerClass(InnerClass obj) {} | |||
@Override | |||
public void visitInnerClasses(InnerClasses obj) {} | |||
@Override | |||
public void visitJavaClass(JavaClass obj) {} | |||
@Override | |||
public void visitLineNumber(LineNumber obj) {} | |||
@Override | |||
public void visitBootstrapMethods(BootstrapMethods obj) {} | |||
@Override | |||
public void visitLineNumberTable(LineNumberTable obj) {} | |||
@Override | |||
public void visitLocalVariable(LocalVariable obj) {} | |||
@Override | |||
public void visitLocalVariableTable(LocalVariableTable obj) {} | |||
@Override | |||
public void visitMethod(Method obj) {} | |||
@Override | |||
public void visitSignature(Signature obj) {} | |||
@Override | |||
public void visitSourceFile(SourceFile obj) {} | |||
@Override | |||
public void visitSynthetic(Synthetic obj) {} | |||
@Override | |||
public void visitUnknown(Unknown obj) {} | |||
@Override | |||
public void visitStackMap(StackMap obj) {} | |||
@Override | |||
public void visitStackMapEntry(StackMapEntry obj) {} | |||
// J5: | |||
public void visitEnclosingMethod(EnclosingMethod obj) {} | |||
public void visitRuntimeVisibleAnnotations(RuntimeVisAnnos attribute) {} | |||
public void visitRuntimeInvisibleAnnotations(RuntimeInvisAnnos attribute) {} | |||
public void visitRuntimeVisibleParameterAnnotations(RuntimeVisParamAnnos attribute) {} | |||
public void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisParamAnnos attribute) {} | |||
public void visitAnnotationDefault(AnnotationDefault attribute) {} | |||
public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) {} | |||
@Override | |||
public void visitEnclosingMethod(EnclosingMethod obj) {} | |||
@Override | |||
public void visitRuntimeVisibleAnnotations(RuntimeVisAnnos attribute) {} | |||
@Override | |||
public void visitRuntimeInvisibleAnnotations(RuntimeInvisAnnos attribute) {} | |||
@Override | |||
public void visitRuntimeVisibleParameterAnnotations(RuntimeVisParamAnnos attribute) {} | |||
@Override | |||
public void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisParamAnnos attribute) {} | |||
@Override | |||
public void visitAnnotationDefault(AnnotationDefault attribute) {} | |||
@Override | |||
public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) {} | |||
// J8: | |||
public void visitRuntimeVisibleTypeAnnotations(RuntimeVisTypeAnnos attribute) {} | |||
public void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisTypeAnnos attribute) {} | |||
public void visitMethodParameters(MethodParameters attribute) {} | |||
@Override | |||
public void visitRuntimeVisibleTypeAnnotations(RuntimeVisTypeAnnos attribute) {} | |||
@Override | |||
public void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisTypeAnnos attribute) {} | |||
@Override | |||
public void visitMethodParameters(MethodParameters attribute) {} | |||
// J9: | |||
public void visitModule(Module attribute) {} | |||
public void visitModulePackages(ModulePackages attribute) {} | |||
public void visitModuleMainClass(ModuleMainClass attribute) {} | |||
@Override | |||
public void visitModule(Module attribute) {} | |||
@Override | |||
public void visitModulePackages(ModulePackages attribute) {} | |||
@Override | |||
public void visitModuleMainClass(ModuleMainClass attribute) {} | |||
public void visitConstantDynamic(ConstantDynamic obj) {} | |||
// J11: | |||
@Override public void visitConstantDynamic(ConstantDynamic attribute) {} | |||
@Override public void visitNestHost(NestHost attribute) { } | |||
@Override public void visitNestMembers(NestMembers attribute) { } | |||
} |
@@ -4,8 +4,8 @@ | |||
<taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"/> | |||
<target name="package" description="Jarjar asm-NNN.jar and prefix package name with aj"> | |||
<jarjar destfile="asm-6.2.1.renamed.jar"> | |||
<zipfileset src="asm-6.2.1.jar" excludes="module-info.class"/> | |||
<jarjar destfile="asm-7.0-beta.renamed.jar"> | |||
<zipfileset src="asm-7.0-beta.jar" excludes="module-info.class"/> | |||
<rule pattern="org.objectweb.asm.**" result="aj.org.objectweb.asm.@1"/> | |||
</jarjar> | |||
</target> |
@@ -91,7 +91,7 @@ public class AjcTestCase extends TestCase { | |||
+ File.separator | |||
+ "bcel-verifier.jar" | |||
+ File.pathSeparator + ".." + File.separator + "lib" + File.separator + "asm" + File.separator + "asm-6.2.1.renamed.jar" | |||
+ File.pathSeparator + ".." + File.separator + "lib" + File.separator + "asm" + File.separator + "asm-7.0-beta.renamed.jar" | |||
// When the build machine executes the tests, it is using code built into jars rather than code build into | |||
// bin directories. This means for the necessary types to be found we have to put these jars on the classpath: |
@@ -1,5 +1,5 @@ | |||
public aspect MyAspect { | |||
pointcut all(): execution(@javax.annotation.Resource * *(..)); | |||
pointcut all(): execution(@Resource * *(..)); | |||
before(): all() { |
@@ -1,5 +1,5 @@ | |||
public class MyClass { | |||
@javax.annotation.Resource | |||
@Resource | |||
public void method() { | |||
} | |||
} |
@@ -0,0 +1,4 @@ | |||
import java.lang.annotation.*; | |||
@Retention(RetentionPolicy.RUNTIME) | |||
public @interface Resource {} |
@@ -0,0 +1,9 @@ | |||
public class Outer { | |||
private int i = 0; | |||
public class Inner { | |||
public int i() { | |||
return i; | |||
} | |||
} | |||
} |
@@ -0,0 +1,21 @@ | |||
public class Outer2 { | |||
private int i = 0; | |||
public static void main(String []argv) { | |||
Outer2 o2 = new Outer2(); | |||
Inner2 i2 = o2.new Inner2(); | |||
System.out.println(i2.i()); | |||
} | |||
public class Inner2 { | |||
public int i() { | |||
return i; | |||
} | |||
} | |||
} | |||
aspect X { | |||
before(): execution(* Outer2.main(..)) { System.out.println("Before main()");} | |||
before(): execution(* Outer2.Inner2.i(..)) { System.out.println("Before i()");} | |||
} |
@@ -12,6 +12,9 @@ package org.aspectj.systemtest.ajc192; | |||
import java.io.File; | |||
import org.aspectj.apache.bcel.classfile.JavaClass; | |||
import org.aspectj.apache.bcel.classfile.NestHost; | |||
import org.aspectj.apache.bcel.classfile.NestMembers; | |||
import org.aspectj.testing.XMLBasedAjcTestCase; | |||
import junit.framework.Test; | |||
@@ -21,6 +24,29 @@ import junit.framework.Test; | |||
*/ | |||
public class Ajc192Tests extends XMLBasedAjcTestCase { | |||
public void testNestmates() throws Exception { | |||
runTest("nestmates"); | |||
JavaClass outer = getClassFrom(ajc.getSandboxDirectory(), "Outer"); | |||
JavaClass inner = getClassFrom(ajc.getSandboxDirectory(), "Outer$Inner"); | |||
NestMembers nestMembers = (NestMembers) getAttributeStartsWith(outer.getAttributes(),"NestMembers"); | |||
assertEquals(1,nestMembers.getClasses().length); | |||
assertEquals("Outer$Inner",nestMembers.getClassesNames()[0]); | |||
NestHost nestHost = (NestHost) getAttributeStartsWith(inner.getAttributes(),"NestHost"); | |||
assertEquals("Outer",nestHost.getHostClassName()); | |||
} | |||
// Verifying not destroyed on weaving | |||
public void testNestmates2() throws Exception { | |||
runTest("nestmates 2"); | |||
JavaClass outer = getClassFrom(ajc.getSandboxDirectory(), "Outer2"); | |||
JavaClass inner = getClassFrom(ajc.getSandboxDirectory(), "Outer2$Inner2"); | |||
NestMembers nestMembers = (NestMembers) getAttributeStartsWith(outer.getAttributes(),"NestMembers"); | |||
assertEquals(1,nestMembers.getClasses().length); | |||
assertEquals("Outer2$Inner2",nestMembers.getClassesNames()[0]); | |||
NestHost nestHost = (NestHost) getAttributeStartsWith(inner.getAttributes(),"NestHost"); | |||
assertEquals("Outer2",nestHost.getHostClassName()); | |||
} | |||
public void testCflowFinal() { | |||
runTest("no final on cflow elements"); | |||
} |
@@ -2,6 +2,23 @@ | |||
<suite> | |||
<ajc-test dir="bugs192/nestmates" title="nestmates"> | |||
<compile files="Outer.java" options="-11"> | |||
</compile> | |||
</ajc-test> | |||
<ajc-test dir="bugs192/nestmates" title="nestmates 2"> | |||
<compile files="Outer2.java" options="-11"> | |||
</compile> | |||
<run class="Outer2"> | |||
<stdout> | |||
<line text="Before main()"/> | |||
<line text="Before i"/> | |||
<line text="0"/> | |||
</stdout></run> | |||
</ajc-test> | |||
<ajc-test dir="bugs192/537825" title="no final on cflow elements"> | |||
<compile files="Code.java" options="-9"> | |||
</compile> |
@@ -54,7 +54,7 @@ public class StackMapAdder { | |||
private static class AspectJClassVisitor extends ClassVisitor { | |||
public AspectJClassVisitor(ClassVisitor classwriter) { | |||
super(Opcodes.ASM5, classwriter); | |||
super(Opcodes.ASM7, classwriter); | |||
} | |||
@Override | |||
@@ -67,7 +67,7 @@ public class StackMapAdder { | |||
// created by a ClassWriter (see top level class comment) | |||
static class AJMethodVisitor extends MethodVisitor { | |||
public AJMethodVisitor(MethodVisitor mv) { | |||
super(Opcodes.ASM5,mv); | |||
super(Opcodes.ASM7,mv); | |||
} | |||
} | |||