diff options
author | Andy Clement <aclement@pivotal.io> | 2018-10-01 16:10:02 -0700 |
---|---|---|
committer | Andy Clement <aclement@pivotal.io> | 2018-10-01 16:10:02 -0700 |
commit | 749b9cb3ca8e4680fca4252b0d782b7154eccb75 (patch) | |
tree | c2abf1231aac79a08469c92b319b4882991bf3b7 | |
parent | f6d9aaaf05eca3aaf06d3a769a83f302b0501dca (diff) | |
download | aspectj-749b9cb3ca8e4680fca4252b0d782b7154eccb75.tar.gz aspectj-749b9cb3ca8e4680fca4252b0d782b7154eccb75.zip |
More fixes for 1.9.2V1_9_2_RC2
- update to more recent JDT to pickup Nestmates fix
- bcel updated for NestMembers/NestHost attributes
- testcases for nestmates
31 files changed, 527 insertions, 64 deletions
diff --git a/bcel-builder/src/org/aspectj/apache/bcel/Constants.java b/bcel-builder/src/org/aspectj/apache/bcel/Constants.java index 9ef04f4ff..c75496527 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/Constants.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/Constants.java @@ -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" }; /** diff --git a/bcel-builder/src/org/aspectj/apache/bcel/classfile/Attribute.java b/bcel-builder/src/org/aspectj/apache/bcel/classfile/Attribute.java index edc8d22c9..daeb59a38 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/classfile/Attribute.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/classfile/Attribute.java @@ -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); } diff --git a/bcel-builder/src/org/aspectj/apache/bcel/classfile/ClassVisitor.java b/bcel-builder/src/org/aspectj/apache/bcel/classfile/ClassVisitor.java index 654cd8146..5c60f818f 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/classfile/ClassVisitor.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/classfile/ClassVisitor.java @@ -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); } diff --git a/bcel-builder/src/org/aspectj/apache/bcel/classfile/NestHost.java b/bcel-builder/src/org/aspectj/apache/bcel/classfile/NestHost.java new file mode 100644 index 000000000..52d312659 --- /dev/null +++ b/bcel-builder/src/org/aspectj/apache/bcel/classfile/NestHost.java @@ -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(); + } +} diff --git a/bcel-builder/src/org/aspectj/apache/bcel/classfile/NestMembers.java b/bcel-builder/src/org/aspectj/apache/bcel/classfile/NestMembers.java new file mode 100644 index 000000000..9d273966f --- /dev/null +++ b/bcel-builder/src/org/aspectj/apache/bcel/classfile/NestMembers.java @@ -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()+")"; + } +} diff --git a/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/DescendingVisitor.java b/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/DescendingVisitor.java index 6dc3eae46..3335f1ea8 100644 --- a/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/DescendingVisitor.java +++ b/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/DescendingVisitor.java @@ -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(); + } } diff --git a/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/EmptyClassVisitor.java b/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/EmptyClassVisitor.java index aca992fbf..1ca901650 100644 --- a/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/EmptyClassVisitor.java +++ b/bcel-builder/verifier-src/org/aspectj/apache/bcel/verifier/EmptyClassVisitor.java @@ -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) { } } diff --git a/lib/asm/asm-6.2.1.renamed.jar b/lib/asm/asm-6.2.1.renamed.jar Binary files differdeleted file mode 100644 index 3fc0688f6..000000000 --- a/lib/asm/asm-6.2.1.renamed.jar +++ /dev/null diff --git a/lib/asm/asm-7.0-beta.20181001.jar b/lib/asm/asm-7.0-beta.20181001.jar Binary files differnew file mode 100644 index 000000000..f5d937f45 --- /dev/null +++ b/lib/asm/asm-7.0-beta.20181001.jar diff --git a/lib/asm/asm-7.0-beta.renamed.jar b/lib/asm/asm-7.0-beta.renamed.jar Binary files differnew file mode 100644 index 000000000..cf9a107c1 --- /dev/null +++ b/lib/asm/asm-7.0-beta.renamed.jar diff --git a/lib/asm/build.xml b/lib/asm/build.xml index 2cd8eeba9..009345711 100644 --- a/lib/asm/build.xml +++ b/lib/asm/build.xml @@ -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> diff --git a/lib/bcel/bcel-src.zip b/lib/bcel/bcel-src.zip Binary files differindex 810c8a6fb..a6f847d75 100644 --- a/lib/bcel/bcel-src.zip +++ b/lib/bcel/bcel-src.zip diff --git a/lib/bcel/bcel-verifier-src.zip b/lib/bcel/bcel-verifier-src.zip Binary files differindex 93d200f67..916e947d0 100644 --- a/lib/bcel/bcel-verifier-src.zip +++ b/lib/bcel/bcel-verifier-src.zip diff --git a/lib/bcel/bcel-verifier.jar b/lib/bcel/bcel-verifier.jar Binary files differindex 2c3ef4bab..41471b198 100644 --- a/lib/bcel/bcel-verifier.jar +++ b/lib/bcel/bcel-verifier.jar diff --git a/lib/bcel/bcel.jar b/lib/bcel/bcel.jar Binary files differindex e4899e2c7..d5cbf14eb 100644 --- a/lib/bcel/bcel.jar +++ b/lib/bcel/bcel.jar diff --git a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java index 988b8a284..1384358a3 100644 --- a/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java +++ b/org.aspectj.ajdt.core/testsrc/org/aspectj/tools/ajc/AjcTestCase.java @@ -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: diff --git a/org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip b/org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip Binary files differindex 12e606286..0e70dcd20 100644 --- a/org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip +++ b/org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip diff --git a/org.eclipse.jdt.core/jdtcore-for-aspectj.jar b/org.eclipse.jdt.core/jdtcore-for-aspectj.jar Binary files differindex 019e8b3a9..3d73f19d9 100644 --- a/org.eclipse.jdt.core/jdtcore-for-aspectj.jar +++ b/org.eclipse.jdt.core/jdtcore-for-aspectj.jar diff --git a/tests/bugs180/415957/MyAspect.aj b/tests/bugs180/415957/MyAspect.aj index 673463a55..9d900ff2c 100644 --- a/tests/bugs180/415957/MyAspect.aj +++ b/tests/bugs180/415957/MyAspect.aj @@ -1,5 +1,5 @@ public aspect MyAspect { - pointcut all(): execution(@javax.annotation.Resource * *(..)); + pointcut all(): execution(@Resource * *(..)); before(): all() { diff --git a/tests/bugs180/415957/MyClass.java b/tests/bugs180/415957/MyClass.java index 7b596ffd0..b6ea71267 100644 --- a/tests/bugs180/415957/MyClass.java +++ b/tests/bugs180/415957/MyClass.java @@ -1,5 +1,5 @@ public class MyClass { - @javax.annotation.Resource + @Resource public void method() { } } diff --git a/tests/bugs180/415957/Resource.java b/tests/bugs180/415957/Resource.java new file mode 100644 index 000000000..e9ae957ac --- /dev/null +++ b/tests/bugs180/415957/Resource.java @@ -0,0 +1,4 @@ +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Resource {} diff --git a/tests/bugs192/535156/DemoApp.class b/tests/bugs192/535156/DemoApp.class Binary files differnew file mode 100644 index 000000000..0a2a5f3ae --- /dev/null +++ b/tests/bugs192/535156/DemoApp.class diff --git a/tests/bugs192/535156/X.class b/tests/bugs192/535156/X.class Binary files differnew file mode 100644 index 000000000..fce34aedc --- /dev/null +++ b/tests/bugs192/535156/X.class diff --git a/tests/bugs192/nestmates/Outer.java b/tests/bugs192/nestmates/Outer.java new file mode 100644 index 000000000..42a102c68 --- /dev/null +++ b/tests/bugs192/nestmates/Outer.java @@ -0,0 +1,9 @@ +public class Outer { + private int i = 0; + + public class Inner { + public int i() { + return i; + } + } +} diff --git a/tests/bugs192/nestmates/Outer2$Inner2.class b/tests/bugs192/nestmates/Outer2$Inner2.class Binary files differnew file mode 100644 index 000000000..cccfb99d3 --- /dev/null +++ b/tests/bugs192/nestmates/Outer2$Inner2.class diff --git a/tests/bugs192/nestmates/Outer2.class b/tests/bugs192/nestmates/Outer2.class Binary files differnew file mode 100644 index 000000000..15192992d --- /dev/null +++ b/tests/bugs192/nestmates/Outer2.class diff --git a/tests/bugs192/nestmates/Outer2.java b/tests/bugs192/nestmates/Outer2.java new file mode 100644 index 000000000..de5dc10f6 --- /dev/null +++ b/tests/bugs192/nestmates/Outer2.java @@ -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()");} +} diff --git a/tests/bugs192/nestmates/X.class b/tests/bugs192/nestmates/X.class Binary files differnew file mode 100644 index 000000000..a8887a54c --- /dev/null +++ b/tests/bugs192/nestmates/X.class diff --git a/tests/src/org/aspectj/systemtest/ajc192/Ajc192Tests.java b/tests/src/org/aspectj/systemtest/ajc192/Ajc192Tests.java index 66bae0c9d..84e0f9d39 100644 --- a/tests/src/org/aspectj/systemtest/ajc192/Ajc192Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc192/Ajc192Tests.java @@ -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"); } diff --git a/tests/src/org/aspectj/systemtest/ajc192/ajc192.xml b/tests/src/org/aspectj/systemtest/ajc192/ajc192.xml index 5eb7fcbbb..eb846e7cf 100644 --- a/tests/src/org/aspectj/systemtest/ajc192/ajc192.xml +++ b/tests/src/org/aspectj/systemtest/ajc192/ajc192.xml @@ -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> diff --git a/weaver/src/org/aspectj/weaver/bcel/asm/StackMapAdder.java b/weaver/src/org/aspectj/weaver/bcel/asm/StackMapAdder.java index d7932c82d..dd3965b61 100644 --- a/weaver/src/org/aspectj/weaver/bcel/asm/StackMapAdder.java +++ b/weaver/src/org/aspectj/weaver/bcel/asm/StackMapAdder.java @@ -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); } } |