< prev index next >

test/jdk/java/lang/invoke/DefineClassTest.java

Print this page
rev 58875 : 8238195: Lookup::defineClass should link the class to match the specification
Reviewed-by: alanb, chegar

*** 1,7 **** /* ! * 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. --- 1,7 ---- /* ! * Copyright (c) 2017, 2020, 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.
*** 235,244 **** --- 235,249 ---- @Test(expectedExceptions = { NullPointerException.class }) public void testNull() throws Exception { lookup().defineClass(null); } + @Test(expectedExceptions = { NoClassDefFoundError.class }) + public void testLinking() throws Exception { + lookup().defineClass(generateNonLinkableClass(THIS_PACKAGE + ".NonLinkableClass")); + } + /** * Generates a class file with the given class name */ byte[] generateClass(String className) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS
*** 334,343 **** --- 339,373 ---- cw.visitEnd(); return cw.toByteArray(); } + /** + * Generates a non-linkable class file with the given class name + */ + byte[] generateNonLinkableClass(String className) { + ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS + + ClassWriter.COMPUTE_FRAMES); + cw.visit(V14, + ACC_PUBLIC + ACC_SUPER, + className.replace(".", "/"), + null, + "MissingSuperClass", + null); + + // <init> + MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "MissingSuperClass", "<init>", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(0, 0); + mv.visitEnd(); + + cw.visitEnd(); + return cw.toByteArray(); + } + private int nextNumber() { return ++nextNumber; } private int nextNumber;
< prev index next >