--- /dev/null 2016-12-31 18:50:47.837000228 -0500 +++ new/test/runtime/constantPool/ConstPackageACC.java 2017-02-27 08:38:49.667338575 -0500 @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.internal.org.objectweb.asm.*; + +/* + * @test + * @summary Test that the JVM throws NCDFE for class file version 53 when a + * CONSTANT_Package type is in the constant pool and ACC_MODULE is + * set in the access_flags. + * @bug 8175383 + * @library /test/lib + * @modules java.base/jdk.internal.org.objectweb.asm + * @compile -XDignore.symbol.file ConstPackageACC.java + * @run main ConstPackageACC + */ + +public class ConstPackageACC { + + static final String CLASS_NAME = "FooPkgACC"; + + public static void main(String[] args) throws Exception { + ClassWriter cw = new ClassWriter(0); + int ACC_MODULE = 0x8000; + cw.visit(Opcodes.V1_9, + Opcodes.ACC_INTERFACE + Opcodes.ACC_ABSTRACT + Opcodes.ACC_SYNTHETIC + ACC_MODULE, + CLASS_NAME, + null, + "java/lang/Object", + null); + + cw.visitAttribute(new TestAttribute("jdk.fooPkgACC")); + + cw.visitEnd(); + byte[] bytes = cw.toByteArray(); + + + ClassLoader loader = new ClassLoader(ConstPackageACC.class.getClassLoader()) { + @Override + protected Class findClass(String cn)throws ClassNotFoundException { + if (cn.equals(CLASS_NAME)) { + try { + Class superClass = super.defineClass(cn, bytes, 0, bytes.length); + throw new RuntimeException("Expected NoClassDefFoundError not thrown"); + } catch (java.lang.NoClassDefFoundError e) { + if (!e.getMessage().contains( + "is not a class because access_flag ACC_MODULE is set")) { + throw new RuntimeException("Wrong NoClassDefFoundError exception: " + e.getMessage()); + } + } + } else { + throw new ClassNotFoundException(cn); + } + return null; + } + }; + + Class clazz = loader.loadClass(CLASS_NAME); + } + + /** + * ConstPackageACCAttr attribute. + * + *
 {@code
+     *
+     * MainClass_attribute {
+     *   // index to CONSTANT_utf8_info structure in constant pool representing
+     *   // the string "ConstPackageACCAttr"
+     *   u2 attribute_name_index;
+     *   u4 attribute_length;
+     *
+     *   // index to CONSTANT_Package_info structure
+     *   u2 package_name_index
+     * }
+     *
+     * } 
+ */ + public static class TestAttribute extends Attribute { + private final String packageName; + + public TestAttribute(String packageName) { + super("ConstPackageACCAttr"); + this.packageName = packageName; + } + + public TestAttribute() { + this(null); + } + + @Override + protected Attribute read(ClassReader cr, + int off, + int len, + char[] buf, + int codeOff, + Label[] labels) + { + String mn = cr.readPackage(off, buf); + off += 2; + return new TestAttribute(mn); + } + + @Override + protected ByteVector write(ClassWriter cw, + byte[] code, + int len, + int maxStack, + int maxLocals) + { + ByteVector attr = new ByteVector(); + attr.putShort(cw.newPackage(packageName)); + return attr; + } + } +}