Record Pattern with swich has something wrong
Brian Goetz
brian.goetz at oracle.com
Wed Mar 22 18:22:55 UTC 2023
Thanks for the bug report! We'll look into it.
On 3/22/2023 2:13 PM, kishida naoki wrote:
> On running Nested Record+Switch code, java command throws error.
> condition is:
> switch has 2 case clauses. 1 case + default has no problem.
> The `Type` places 2nd position. `Product(Type type, String name)`
> has no problem.
> sealed does not affect.
>
> The code is below.
>
> ```
> public class PatternSample {
> sealed interface Type {
> record Bulk(int price) implements Type {}
> record Packed(int price) implements Type {}
> }
>
> record Product(String name, Type type) {}
>
> public static void main(String[] args) {
> Product item = new Product("meat", new Type.Bulk(250));
>
> int total = switch(item) {
> case Product(var n, Type.Packed(int price))
> -> price;
> case Product(var n, Type.Bulk(int price))
> -> price * 2;
> };
> System.out.println(total);
> }
> }
> ```
>
> The error is below.
>
> ```
> >java --enable-preview PatternSample
> Error: Unable to initialize main class PatternSample
> Caused by: java.lang.VerifyError: Bad local variable type
> Exception Details:
> Location:
> PatternSample.main([Ljava/lang/String;)V @155: iload
> Reason:
> Type top (current frame, locals[6]) is not assignable to integer
> Current Frame:
> bci: @155
> flags: { }
> locals: { '[Ljava/lang/String;', 'PatternSample$Product', top,
> 'PatternSample$Product', integer, 'PatternSample$Product', top, top,
> top, 'java/lang/String', integer }
> stack: { }
> Bytecode:
> 0000000: bb00 0759 1209 bb00 0b59 1100 fab7 000d
> 0000010: b700 104c 2b59 b800 1357 4e03 3604 2d15
> 0000020: 04ba 0019 0000 ab00 0000 007c 0000 0001
> 0000030: 0000 0000 0000 0012 2d3a 0519 05b6 001d
> 0000040: 3a09 0336 0a19 0915 0aba 0021 0000 ab00
> 0000050: 0000 004d 0000 0002 ffff ffff 0000 004d
> 0000060: 0000 0000 0000 001a 1909 3a06 1905 b600
> 0000070: 223a 0b19 0bc1 0026 9900 1819 0bc0 0026
> 0000080: 3a07 1907 b600 2836 0b15 0b36 08a7 0009
> 0000090: 0436 0aa7 ffb2 1508 a700 0b15 0605 68a7
> 00000a0: 0004 083d b200 2c1c b600 32a7 0011 4ebb
> 00000b0: 0039 592d b600 3b2d b700 3ebf b1
> Exception Handler Table:
> bci [61, 64] => handler: 174
> bci [110, 113] => handler: 174
> bci [132, 135] => handler: 174
> Stackmap Table:
> full_frame(@30,{Object[#72],Object[#7],Top,Object[#7],Integer},{})
> same_frame(@56)
> full_frame(@69,{Object[#72],Object[#7],Top,Object[#7],Integer,Object[#7],Top,Top,Top,Object[#74],Integer},{})
> same_frame(@104)
> full_frame(@144,{Object[#72],Object[#7],Top,Object[#7],Integer,Object[#7],Object[#74],Top,Top,Object[#74],Integer},{})
> full_frame(@150,{Object[#72],Object[#7],Top,Object[#7],Integer,Object[#7],Object[#74],Object[#38],Integer,Object[#74],Integer},{})
> full_frame(@155,{Object[#72],Object[#7],Top,Object[#7],Integer,Object[#7],Top,Top,Top,Object[#74],Integer},{})
> full_frame(@162,{Object[#72],Object[#7],Top,Object[#7],Integer},{})
> full_frame(@163,{Object[#72],Object[#7]},{Integer})
> full_frame(@174,{Object[#72]},{Object[#55]})
> append_frame(@188,Object[#7],Integer)
> ```
>
> --
> Naoki Kishida
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20230322/75219793/attachment-0001.htm>
More information about the amber-dev
mailing list