1 /*
2 * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 import jdk.incubator.code.CodeReflection;
25 import java.util.function.Consumer;
26 import java.util.function.Supplier;
27
28 /*
29 * @test
30 * @summary Smoke test for code reflection with lambda expressions.
31 * @modules jdk.incubator.code
32 * @build LambdaTest
33 * @build CodeReflectionTester
34 * @run main CodeReflectionTester LambdaTest
35 */
36
37 public class LambdaTest {
38
39 @CodeReflection
40 @IR("""
41 func @"test1" (%0 : java.type:"LambdaTest")java.type:"void" -> {
42 %1 : java.type:"java.util.function.Consumer<java.lang.String>" = lambda (%2 : java.type:"java.lang.String")java.type:"void" -> {
43 %3 : Var<java.type:"java.lang.String"> = var %2 @"s";
44 %4 : java.type:"java.io.PrintStream" = field.load @java.ref:"java.lang.System::out:java.io.PrintStream";
45 %5 : java.type:"java.lang.String" = var.load %3;
46 invoke %4 %5 @java.ref:"java.io.PrintStream::println(java.lang.String):void";
47 return;
48 };
49 %6 : Var<java.type:"java.util.function.Consumer<java.lang.String>"> = var %1 @"c";
50 %7 : java.type:"java.util.function.Consumer<java.lang.String>" = var.load %6;
51 %8 : java.type:"java.lang.String" = constant @"Hello World";
52 invoke %7 %8 @java.ref:"java.util.function.Consumer::accept(java.lang.Object):void";
53 return;
54 };
55 """)
56 void test1() {
57 Consumer<String> c = s -> {
58 System.out.println(s);
59 };
60 c.accept("Hello World");
61 }
62
63 @CodeReflection
64 @IR("""
65 func @"test2" (%0 : java.type:"LambdaTest")java.type:"void" -> {
66 %1 : java.type:"java.util.function.Supplier<java.lang.String>" = lambda ()java.type:"java.lang.String" -> {
67 %2 : java.type:"java.lang.String" = constant @"Hello World";
68 return %2;
69 };
70 %3 : Var<java.type:"java.util.function.Supplier<java.lang.String>"> = var %1 @"c";
71 %4 : java.type:"java.util.function.Supplier<java.lang.String>" = var.load %3;
72 %5 : java.type:"java.lang.String" = invoke %4 @java.ref:"java.util.function.Supplier::get():java.lang.Object";
73 %6 : Var<java.type:"java.lang.String"> = var %5 @"s";
74 return;
75 };
76 """)
77 void test2() {
78 Supplier<String> c = () -> {
79 return "Hello World";
80 };
81 String s = c.get();
82 }
83
84 @CodeReflection
85 @IR("""
86 func @"test3" (%0 : java.type:"LambdaTest")java.type:"void" -> {
87 %1 : java.type:"java.util.function.Supplier<java.lang.String>" = lambda ()java.type:"java.lang.String" -> {
88 %2 : java.type:"java.lang.String" = constant @"Hello World";
89 return %2;
90 };
91 %3 : Var<java.type:"java.util.function.Supplier<java.lang.String>"> = var %1 @"c";
92 return;
93 };
94 """)
95 void test3() {
96 Supplier<String> c = () -> "Hello World";
97 }
98
99 String s_f;
100
101 @CodeReflection
102 @IR("""
103 func @"test4" (%0 : java.type:"LambdaTest")java.type:"void" -> {
104 %1 : java.type:"java.util.function.Supplier<java.lang.String>" = lambda ()java.type:"java.lang.String" -> {
105 %2 : java.type:"java.lang.String" = field.load %0 @java.ref:"LambdaTest::s_f:java.lang.String";
106 return %2;
107 };
108 %3 : Var<java.type:"java.util.function.Supplier<java.lang.String>"> = var %1 @"c";
109 return;
110 };
111 """)
112 void test4() {
113 Supplier<String> c = () -> {
114 return s_f;
115 };
116 }
117
118 @CodeReflection
119 @IR("""
120 func @"test5" (%0 : java.type:"LambdaTest", %1 : java.type:"int", %2 : java.type:"int")java.type:"void" -> {
121 %3 : Var<java.type:"int"> = var %1 @"i";
122 %4 : Var<java.type:"int"> = var %2 @"j";
123 %5 : java.type:"int" = constant @3;
124 %6 : Var<java.type:"int"> = var %5 @"k";
125 %7 : java.type:"java.util.function.Supplier<java.lang.Integer>" = lambda ()java.type:"java.lang.Integer" -> {
126 %8 : java.type:"int" = constant @4;
127 %9 : Var<java.type:"int"> = var %8 @"l";
128 %10 : java.type:"java.util.function.Supplier<java.lang.Integer>" = lambda ()java.type:"java.lang.Integer" -> {
129 %11 : java.type:"int" = var.load %4;
130 %12 : java.type:"int" = var.load %6;
131 %13 : java.type:"int" = add %11 %12;
132 %14 : java.type:"int" = var.load %9;
133 %15 : java.type:"int" = add %13 %14;
134 %16 : Var<java.type:"int"> = var %15 @"r";
135 %17 : java.type:"int" = var.load %16;
136 %18 : java.type:"java.lang.Integer" = invoke %17 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
137 return %18;
138 };
139 %19 : Var<java.type:"java.util.function.Supplier<java.lang.Integer>"> = var %10 @"sInner";
140 %20 : java.type:"int" = var.load %3;
141 %21 : java.type:"java.util.function.Supplier<java.lang.Integer>" = var.load %19;
142 %22 : java.type:"java.lang.Integer" = invoke %21 @java.ref:"java.util.function.Supplier::get():java.lang.Object";
143 %23 : java.type:"int" = invoke %22 @java.ref:"java.lang.Integer::intValue():int";
144 %24 : java.type:"int" = add %20 %23;
145 %25 : Var<java.type:"int"> = var %24 @"r";
146 %26 : java.type:"int" = var.load %25;
147 %27 : java.type:"java.lang.Integer" = invoke %26 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
148 return %27;
149 };
150 %28 : Var<java.type:"java.util.function.Supplier<java.lang.Integer>"> = var %7 @"sOuter";
151 return;
152 };
153 """)
154 void test5(int i, int j) {
155 int k = 3;
156 Supplier<Integer> sOuter = () -> {
157 int l = 4;
158 Supplier<Integer> sInner = () -> {
159 int r = j + k + l;
160 return r;
161 };
162
163 int r = i + sInner.get();
164 return r;
165 };
166 }
167
168 int f;
169
170 @CodeReflection
171 @IR("""
172 func @"test6" (%0 : java.type:"LambdaTest")java.type:"void" -> {
173 %1 : java.type:"java.util.function.Supplier<java.lang.Integer>" = lambda ()java.type:"java.lang.Integer" -> {
174 %2 : java.type:"int" = field.load %0 @java.ref:"LambdaTest::f:int";
175 %3 : java.type:"java.lang.Integer" = invoke %2 @java.ref:"java.lang.Integer::valueOf(int):java.lang.Integer";
176 return %3;
177 };
178 %4 : Var<java.type:"java.util.function.Supplier<java.lang.Integer>"> = var %1 @"s";
179 return;
180 };
181 """)
182 void test6() {
183 Supplier<Integer> s = () -> f;
184 }
185 }