mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-21 07:45:11 +00:00
8050993: There is no record for condition in ternary operator in LineNumberTable
Make sure there is an entry in the LineNumberTable for the condition of the ternary operator Co-authored-by: Andrey Nazarov <andrey.x.nazarov@oracle.com> Reviewed-by: jjg
This commit is contained in:
parent
2f5a588d25
commit
8ca267abe3
@ -1649,6 +1649,7 @@ public class Gen extends JCTree.Visitor {
|
||||
|
||||
public void visitConditional(JCConditional tree) {
|
||||
Chain thenExit = null;
|
||||
code.statBegin(tree.cond.pos);
|
||||
CondItem c = genCond(tree.cond, CRT_FLOW_CONTROLLER);
|
||||
Chain elseChain = c.jumpFalse();
|
||||
if (!c.isFalse()) {
|
||||
|
||||
@ -191,7 +191,7 @@ public class LineNumberTestBase extends TestBase {
|
||||
CONDITION("int res = \n" +
|
||||
"testField == 2 ?\n" +
|
||||
"10\n" +
|
||||
":9;", 1, 3, 4), // see issue https://bugs.openjdk.java.net/browse/JDK-8050993
|
||||
":9;", 2, 3, 4),
|
||||
TRY("try{\n" +
|
||||
" --testField;\n" +
|
||||
"}\n" +
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8050993
|
||||
* @summary Verify that the condition in the conditional lexpression gets a LineNumberTable entry
|
||||
* @modules jdk.jdeps/com.sun.tools.classfile
|
||||
* @compile -g T8050993.java
|
||||
* @run main T8050993
|
||||
*/
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.sun.tools.classfile.*;
|
||||
|
||||
public class T8050993 {
|
||||
public static void main(String[] args) throws IOException, ConstantPoolException {
|
||||
ClassFile someTestIn = ClassFile.read(T8050993.class.getResourceAsStream("T8050993.class"));
|
||||
Set<Integer> expectedLineNumbers = new HashSet<>(Arrays.asList(48, 49, 46, 47));
|
||||
for (Method m : someTestIn.methods) {
|
||||
if ("method".equals(m.getName(someTestIn.constant_pool))) {
|
||||
Code_attribute code_attribute = (Code_attribute) m.attributes.get(Attribute.Code);
|
||||
for (Attribute at : code_attribute.attributes) {
|
||||
if (Attribute.LineNumberTable.equals(at.getName(someTestIn.constant_pool))) {
|
||||
LineNumberTable_attribute att = (LineNumberTable_attribute) at;
|
||||
Set<Integer> actualLinesNumbers = Arrays.stream(att.line_number_table)
|
||||
.map(e -> e.line_number)
|
||||
.collect(Collectors.toSet());
|
||||
if (!Objects.equals(expectedLineNumbers, actualLinesNumbers)) {
|
||||
throw new AssertionError("Expected LineNumber entries not found;" +
|
||||
"actual=" + actualLinesNumbers + ";" +
|
||||
"expected=" + expectedLineNumbers);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static int field;
|
||||
|
||||
public static String method() {
|
||||
String s =
|
||||
field % 2 == 0 ?
|
||||
"true" + field :
|
||||
"false" + field;
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user