1 /* 2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* 27 * @test 28 * @bug 8061778 29 * @summary Wrong LineNumberTable for default constructors 30 * @modules jdk.jdeps/com.sun.tools.classfile 31 */ 32 33 import com.sun.tools.classfile.ClassFile; 34 import com.sun.tools.classfile.ConstantPoolException; 35 import com.sun.tools.classfile.Method; 36 import com.sun.tools.classfile.Attribute; 37 import com.sun.tools.classfile.Code_attribute; 38 import com.sun.tools.classfile.LineNumberTable_attribute; 39 import com.sun.tools.classfile.LineNumberTable_attribute.Entry; 40 41 import java.io.IOException; 42 43 public class NestedLineNumberTest { 44 45 public static void main(String[] args) throws Exception { 46 Entry[] lines = findEntries(); 47 if (lines == null || lines.length != 1) { 48 int found = lines == null ? 0 : lines.length; 49 error(String.format("LineNumberTable contains wrong number of entries - expected %d, found %d", 1, found)); 50 } 51 52 int line = lines[0].line_number; 53 if (line != 79) { 54 error(String.format("LineNumberTable contains wrong line number - expected %d, found %d", 79, line)); 55 } 56 } 57 58 static Entry[] findEntries() throws IOException, ConstantPoolException { 59 ClassFile self = ClassFile.read(NestedLineNumberTest.Test.class.getResourceAsStream("NestedLineNumberTest$Test.class")); 60 for (Method m : self.methods) { 61 if ("<init>".equals(m.getName(self.constant_pool))) { 62 Code_attribute code_attribute = (Code_attribute)m.attributes.get(Attribute.Code); 63 for (Attribute at : code_attribute.attributes) { 64 if (Attribute.LineNumberTable.equals(at.getName(self.constant_pool))) { 65 return ((LineNumberTable_attribute)at).line_number_table; 66 } 67 } 68 } 69 } 70 return null; 71 } 72 73 static void error(String msg) { 74 throw new AssertionError(msg); 75 } 76 77 // The default constructor in this class should get only one LineNumberTable entry, 78 // pointing to the first line of the declaration of class Test. 79 static class Test { 80 static class Empty { } 81 } 82 }