Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8337158: Modeling and lowering of switch statement #211

Closed
wants to merge 28 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
07a2f3e
Model switch statement
mabbay Aug 6, 2024
a10c8e9
Add default label when generating switch code model if enhanced switc…
mabbay Aug 8, 2024
d96e292
Lower switch statement
mabbay Aug 8, 2024
193e06d
Test switch statement model
mabbay Aug 9, 2024
ff5f5ed
Test switch statement model
mabbay Aug 9, 2024
d998905
Test switch statement model
mabbay Aug 12, 2024
288bfb1
rewrite test cases to return a result, to check its behaviour through…
mabbay Aug 12, 2024
0e98314
Test switch statement model
mabbay Aug 12, 2024
1db7b4d
Test switch statement model when case is pattern
mabbay Aug 13, 2024
ea945b0
Runtime test of switch statement
mabbay Aug 14, 2024
b9cc325
Runtime test of switch statement
mabbay Aug 14, 2024
2bba4d4
Revert unnecessary changes
mabbay Aug 16, 2024
28367d2
Merge branch 'code-reflection' into 8337158
mabbay Aug 16, 2024
d788513
Revert changes lost during merge
mabbay Aug 16, 2024
5d6bd43
Runtime tests of switch statement
mabbay Aug 16, 2024
be050a2
Add a test case of switch statement model
mabbay Aug 16, 2024
5af32cc
Simplify logic of when to add a default case to the switch statement …
mabbay Aug 18, 2024
02c1b3d
Remove outdated comments
mabbay Aug 19, 2024
cc085ca
Refactor
mabbay Aug 19, 2024
90698d0
Add a comment about the concat of a string with a primitive value
mabbay Aug 19, 2024
a800fd8
Update the expected model due to the change in modeling of string concat
mabbay Aug 19, 2024
c3c7028
Runtime tests of switch statement
mabbay Aug 19, 2024
136d9ad
Runtime tests of switch statement
mabbay Aug 19, 2024
19d73c2
Refactor
mabbay Aug 19, 2024
abce9b3
Runtime tests of switch statement
mabbay Aug 19, 2024
0d13a6e
Always have the case default as last bodies
mabbay Aug 19, 2024
28fba34
Correct the arguments passed in a switch expression test
mabbay Aug 19, 2024
63d71d1
Remove outdated comment
mabbay Aug 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
241 changes: 241 additions & 0 deletions test/langtools/tools/javac/reflect/SwitchStatementTest.java
Original file line number Diff line number Diff line change
@@ -948,4 +948,245 @@ static String caseConstantConv2(Byte a) {
}
return r;
}

@IR("""
func @"nonEnhancedSwStatNoDefault" (%0 : int)java.lang.String -> {
%1 : Var<int> = var %0 @"a";
%2 : java.lang.String = constant @"";
%3 : Var<java.lang.String> = var %2 @"r";
%4 : int = var.load %1;
java.switch.statement %4
(%5 : int)boolean -> {
%6 : int = constant @"1";
%7 : boolean = eq %5 %6;
yield %7;
}
()void -> {
%8 : java.lang.String = var.load %3;
%9 : java.lang.String = constant @"1";
%10 : java.lang.String = add %8 %9;
var.store %3 %10;
yield;
}
(%11 : int)boolean -> {
%12 : int = constant @"2";
%13 : boolean = eq %11 %12;
yield %13;
}
()void -> {
%14 : java.lang.String = var.load %3;
%15 : int = constant @"2";
%16 : java.lang.Integer = invoke %15 @"java.lang.Integer::valueOf(int)java.lang.Integer";
%17 : java.lang.String = add %14 %16;
var.store %3 %17;
yield;
};
%18 : java.lang.String = var.load %3;
return %18;
};
""")
@CodeReflection
static String nonEnhancedSwStatNoDefault(int a) {
String r = "";
switch (a) {
case 1 -> r += "1";
case 2 -> r += 2;
}
return r;
}

enum E {A, B}
@IR("""
func @"enhancedSwStatNoDefault1" (%0 : SwitchStatementTest$E)java.lang.String -> {
%1 : Var<SwitchStatementTest$E> = var %0 @"e";
%2 : java.lang.String = constant @"";
%3 : Var<java.lang.String> = var %2 @"r";
%4 : SwitchStatementTest$E = var.load %1;
java.switch.statement %4
(%5 : SwitchStatementTest$E)boolean -> {
%6 : SwitchStatementTest$E = field.load @"SwitchStatementTest$E::A()SwitchStatementTest$E";
%7 : boolean = invoke %5 %6 @"java.util.Objects::equals(java.lang.Object, java.lang.Object)boolean";
yield %7;
}
()void -> {
%8 : java.lang.String = var.load %3;
%9 : SwitchStatementTest$E = field.load @"SwitchStatementTest$E::A()SwitchStatementTest$E";
%10 : java.lang.String = cast %9 @"java.lang.String";
%11 : java.lang.String = add %8 %10;
var.store %3 %11;
yield;
}
(%12 : SwitchStatementTest$E)boolean -> {
%13 : SwitchStatementTest$E = field.load @"SwitchStatementTest$E::B()SwitchStatementTest$E";
%14 : boolean = invoke %12 %13 @"java.util.Objects::equals(java.lang.Object, java.lang.Object)boolean";
yield %14;
}
()void -> {
%15 : java.lang.String = var.load %3;
%16 : SwitchStatementTest$E = field.load @"SwitchStatementTest$E::B()SwitchStatementTest$E";
%17 : java.lang.String = cast %16 @"java.lang.String";
%18 : java.lang.String = add %15 %17;
var.store %3 %18;
yield;
}
(%19 : SwitchStatementTest$E)boolean -> {
%20 : java.lang.Object = constant @null;
%21 : boolean = invoke %19 %20 @"java.util.Objects::equals(java.lang.Object, java.lang.Object)boolean";
yield %21;
}
()void -> {
%22 : java.lang.String = var.load %3;
%23 : java.lang.String = constant @"null";
%24 : java.lang.String = add %22 %23;
var.store %3 %24;
yield;
}
()void -> {
yield;
}
()void -> {
%25 : java.lang.MatchException = new @"func<java.lang.MatchException>";
throw %25;
};
%26 : java.lang.String = var.load %3;
return %26;
};
""")
@CodeReflection
static String enhancedSwStatNoDefault1(E e) {
String r = "";
switch (e) {
case A -> r += E.A;
case B -> r += E.B;
case null -> r += "null";
}
return r;
}

sealed interface I permits K, J {}
record K() implements I {}
static final class J implements I {}
@IR("""
func @"enhancedSwStatNoDefault2" (%0 : SwitchStatementTest$I)java.lang.String -> {
%1 : Var<SwitchStatementTest$I> = var %0 @"i";
%2 : java.lang.String = constant @"";
%3 : Var<java.lang.String> = var %2 @"r";
%4 : SwitchStatementTest$I = var.load %1;
%5 : SwitchStatementTest$K = constant @null;
%6 : Var<SwitchStatementTest$K> = var %5 @"k";
%7 : SwitchStatementTest$J = constant @null;
%8 : Var<SwitchStatementTest$J> = var %7 @"j";
java.switch.statement %4
(%9 : SwitchStatementTest$I)boolean -> {
%10 : boolean = pattern.match %9
()java.lang.reflect.code.ExtendedOp$Pattern$Binding<SwitchStatementTest$K> -> {
%11 : java.lang.reflect.code.ExtendedOp$Pattern$Binding<SwitchStatementTest$K> = pattern.binding @"k";
yield %11;
}
(%12 : SwitchStatementTest$K)void -> {
var.store %6 %12;
yield;
};
yield %10;
}
()void -> {
%13 : java.lang.String = var.load %3;
%14 : java.lang.String = constant @"K";
%15 : java.lang.String = add %13 %14;
var.store %3 %15;
yield;
}
(%16 : SwitchStatementTest$I)boolean -> {
%17 : boolean = pattern.match %16
()java.lang.reflect.code.ExtendedOp$Pattern$Binding<SwitchStatementTest$J> -> {
%18 : java.lang.reflect.code.ExtendedOp$Pattern$Binding<SwitchStatementTest$J> = pattern.binding @"j";
yield %18;
}
(%19 : SwitchStatementTest$J)void -> {
var.store %8 %19;
yield;
};
yield %17;
}
()void -> {
%20 : java.lang.String = var.load %3;
%21 : java.lang.String = constant @"J";
%22 : java.lang.String = add %20 %21;
var.store %3 %22;
yield;
}
()void -> {
yield;
}
()void -> {
%23 : java.lang.MatchException = new @"func<java.lang.MatchException>";
throw %23;
};
%24 : java.lang.String = var.load %3;
return %24;
};
""")
@CodeReflection
static String enhancedSwStatNoDefault2(I i) {
String r = "";
switch (i) {
case K k -> r += "K";
case J j -> r += "J";
}
return r;
}

@IR("""
func @"enhancedSwStatUnconditionalPattern" (%0 : java.lang.String)java.lang.String -> {
%1 : Var<java.lang.String> = var %0 @"s";
%2 : java.lang.String = constant @"";
%3 : Var<java.lang.String> = var %2 @"r";
%4 : java.lang.String = var.load %1;
%5 : java.lang.Object = constant @null;
%6 : Var<java.lang.Object> = var %5 @"o";
java.switch.statement %4
(%7 : java.lang.String)boolean -> {
%8 : java.lang.String = constant @"A";
%9 : boolean = invoke %7 %8 @"java.util.Objects::equals(java.lang.Object, java.lang.Object)boolean";
yield %9;
}
()void -> {
%10 : java.lang.String = var.load %3;
%11 : java.lang.String = constant @"A";
%12 : java.lang.String = add %10 %11;
var.store %3 %12;
yield;
}
(%13 : java.lang.String)boolean -> {
%14 : boolean = pattern.match %13
()java.lang.reflect.code.ExtendedOp$Pattern$Binding<java.lang.Object> -> {
%15 : java.lang.reflect.code.ExtendedOp$Pattern$Binding<java.lang.Object> = pattern.binding @"o";
yield %15;
}
(%16 : java.lang.Object)void -> {
var.store %6 %16;
yield;
};
yield %14;
}
()void -> {
%17 : java.lang.String = var.load %3;
%18 : java.lang.String = constant @"obj";
%19 : java.lang.String = add %17 %18;
var.store %3 %19;
yield;
};
%20 : java.lang.String = var.load %3;
return %20;
};
""")
@CodeReflection
static String enhancedSwStatUnconditionalPattern(String s) {
String r = "";
switch (s) {
case "A" -> r += "A";
case Object o -> r += "obj";
}
return r;
}
}