Switch statement containing pattern case label element gets in the loop during execution
Jan Lahoda
jan.lahoda at oracle.com
Thu Jun 24 07:04:19 UTC 2021
Thanks for the report, Ilyas!
I've filled:
https://bugs.openjdk.java.net/browse/JDK-8269141
Thanks,
Jan
On 22. 06. 21 10:37, Ilyas Selimov wrote:
> Hello!
>
> I tried to execute the code using OpenJDK 17 (build 17-ea+27-2476):
>
> public static void main(String[] args) {
> test(1);
> }
>
> static void test(Integer i) {
> switch (i) {
> case Integer o && o != null:
> System.out.println("s1");
> default:
> System.out.println("def");
> }
> }
>
> and got the next output:
> s1
> def
> s1
> def
> ...
>
> As a result the switch statement gets in the loop.
> Looking at the bytecode of the method It seems the issue is related to
> the latest goto instruction:
>
> static void test(java.lang.Integer);
> Code:
> 0: aload_0
> 1: dup
> 2: invokestatic #19 // Method
> java/util/Objects.requireNonNull:
> 5: pop
> 6: astore_1
> 7: iconst_0
> 8: istore_2
> 9: aload_1
> 10: iload_2
> 11: invokedynamic #25, 0 // InvokeDynamic
> #0:typeSwitch:(Ljava/lang/Object;I)I
> 16: lookupswitch { // 1
> 0: 36
> default: 55
> }
> 36: aload_1
> 37: astore_3
> 38: aload_3
> 39: ifnonnull 47
> 42: iconst_1
> 43: istore_2
> 44: goto 9
> 47: getstatic #29 // Field
> java/lang/System.out:Ljava/io/PrintStream;
> 50: ldc #35 // String s1
> 52: invokevirtual #37 // Method
> java/io/PrintStream.println:(Ljava/lang/String;)V
> 55: getstatic #29 // Field
> java/lang/System.out:Ljava/io/PrintStream;
> 58: ldc #43 // String def
> 60: invokevirtual #37 // Method
> java/io/PrintStream.println:(Ljava/lang/String;)V
> 63: goto 9
>
> Could somebody take a look?
>
> Thanks,
> Ilyas
More information about the compiler-dev
mailing list