langtools/test/tools/javac/linenumbers/NullCheckLineNumberTest.java
changeset 45316 170696ddb377
equal deleted inserted replaced
45315:8e00390dfbb4 45316:170696ddb377
       
     1 /*
       
     2  * @test /nodynamiccopyright/
       
     3  * @bug 8172880
       
     4  * @summary  Wrong LineNumberTable for synthetic null checks
       
     5  * @modules jdk.jdeps/com.sun.tools.classfile
       
     6  */
       
     7 
       
     8 import com.sun.tools.classfile.ClassFile;
       
     9 import com.sun.tools.classfile.ConstantPoolException;
       
    10 import com.sun.tools.classfile.Method;
       
    11 import com.sun.tools.classfile.Attribute;
       
    12 import com.sun.tools.classfile.Code_attribute;
       
    13 import com.sun.tools.classfile.LineNumberTable_attribute;
       
    14 
       
    15 import java.io.IOException;
       
    16 import java.util.AbstractMap.SimpleEntry;
       
    17 import java.util.Arrays;
       
    18 import java.util.List;
       
    19 import java.util.Map.Entry;
       
    20 import java.util.Objects;
       
    21 import java.util.stream.Collectors;
       
    22 import java.util.stream.Stream;
       
    23 
       
    24 public class NullCheckLineNumberTest {
       
    25 
       
    26     //test data:
       
    27     static class Test {
       
    28 
       
    29         public Test() {
       
    30             String a = "", b = null;
       
    31 
       
    32             Stream.of("x")
       
    33                   .filter(a::equals)
       
    34                   .filter(b::equals)
       
    35                   .count();
       
    36         }
       
    37 
       
    38     }
       
    39 
       
    40     public static void main(String[] args) throws Exception {
       
    41         List<Entry> actualEntries = findEntries();
       
    42         List<Entry> expectedEntries = List.of(
       
    43                 new SimpleEntry<>(29, 0),
       
    44                 new SimpleEntry<>(30, 4),
       
    45                 new SimpleEntry<>(32, 9),
       
    46                 new SimpleEntry<>(33, 16),
       
    47                 new SimpleEntry<>(34, 32),
       
    48                 new SimpleEntry<>(35, 46),
       
    49                 new SimpleEntry<>(36, 52)
       
    50         );
       
    51         if (!Objects.equals(actualEntries, expectedEntries)) {
       
    52             error(String.format("Unexpected LineNumberTable: %s", actualEntries.toString()));
       
    53         }
       
    54 
       
    55         try {
       
    56             new Test();
       
    57         } catch (NullPointerException npe) {
       
    58             if (Arrays.stream(npe.getStackTrace())
       
    59                       .noneMatch(se -> se.getFileName().contains("NullCheckLineNumberTest") &&
       
    60                                        se.getLineNumber() == 34)) {
       
    61                 throw new AssertionError("Should go through line 34!");
       
    62             }
       
    63         }
       
    64     }
       
    65 
       
    66     static List<Entry> findEntries() throws IOException, ConstantPoolException {
       
    67         ClassFile self = ClassFile.read(NullCheckLineNumberTest.Test.class.getResourceAsStream("NullCheckLineNumberTest$Test.class"));
       
    68         for (Method m : self.methods) {
       
    69             if ("<init>".equals(m.getName(self.constant_pool))) {
       
    70                 Code_attribute code_attribute = (Code_attribute)m.attributes.get(Attribute.Code);
       
    71                 for (Attribute at : code_attribute.attributes) {
       
    72                     if (Attribute.LineNumberTable.equals(at.getName(self.constant_pool))) {
       
    73                         return Arrays.stream(((LineNumberTable_attribute)at).line_number_table)
       
    74                                      .map(e -> new SimpleEntry<> (e.line_number, e.start_pc))
       
    75                                      .collect(Collectors.toList());
       
    76                     }
       
    77                 }
       
    78             }
       
    79         }
       
    80         return null;
       
    81     }
       
    82 
       
    83     static void error(String msg) {
       
    84         throw new AssertionError(msg);
       
    85     }
       
    86 
       
    87 }