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 java.lang.runtime.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 * @build LambdaTest 32 * @build CodeReflectionTester 33 * @run main CodeReflectionTester LambdaTest 34 */ 35 36 public class LambdaTest { 37 38 @CodeReflection 39 @IR(""" 40 func @"test1" (%0 : LambdaTest)void -> { 41 %1 : java.util.function.Consumer<java.lang.String> = lambda (%2 : java.lang.String)void -> { 42 %3 : Var<java.lang.String> = var %2 @"s"; 43 %4 : java.io.PrintStream = field.load @"java.lang.System::out()java.io.PrintStream"; 44 %5 : java.lang.String = var.load %3; 45 invoke %4 %5 @"java.io.PrintStream::println(java.lang.String)void"; 46 return; 47 }; 48 %6 : Var<java.util.function.Consumer<java.lang.String>> = var %1 @"c"; 49 %7 : java.util.function.Consumer<java.lang.String> = var.load %6; 50 %8 : java.lang.String = constant @"Hello World"; 51 invoke %7 %8 @"java.util.function.Consumer::accept(java.lang.Object)void"; 52 return; 53 }; 54 """) 55 void test1() { 56 Consumer<String> c = s -> { 57 System.out.println(s); 58 }; 59 c.accept("Hello World"); 60 } 61 62 @CodeReflection 63 @IR(""" 64 func @"test2" (%0 : LambdaTest)void -> { 65 %1 : java.util.function.Supplier<java.lang.String> = lambda ()java.lang.String -> { 66 %2 : java.lang.String = constant @"Hello World"; 67 return %2; 68 }; 69 %3 : Var<java.util.function.Supplier<java.lang.String>> = var %1 @"c"; 70 %4 : java.util.function.Supplier<java.lang.String> = var.load %3; 71 %5 : java.lang.String = invoke %4 @"java.util.function.Supplier::get()java.lang.Object"; 72 %6 : Var<java.lang.String> = var %5 @"s"; 73 return; 74 }; 75 """) 76 void test2() { 77 Supplier<String> c = () -> { 78 return "Hello World"; 79 }; 80 String s = c.get(); 81 } 82 83 @CodeReflection 84 @IR(""" 85 func @"test3" (%0 : LambdaTest)void -> { 86 %1 : java.util.function.Supplier<java.lang.String> = lambda ()java.lang.String -> { 87 %2 : java.lang.String = constant @"Hello World"; 88 return %2; 89 }; 90 %3 : Var<java.util.function.Supplier<java.lang.String>> = var %1 @"c"; 91 return; 92 }; 93 """) 94 void test3() { 95 Supplier<String> c = () -> "Hello World"; 96 } 97 98 String s_f; 99 100 @CodeReflection 101 @IR(""" 102 func @"test4" (%0 : LambdaTest)void -> { 103 %1 : java.util.function.Supplier<java.lang.String> = lambda ()java.lang.String -> { 104 %2 : java.lang.String = field.load %0 @"LambdaTest::s_f()java.lang.String"; 105 return %2; 106 }; 107 %3 : Var<java.util.function.Supplier<java.lang.String>> = var %1 @"c"; 108 return; 109 }; 110 """) 111 void test4() { 112 Supplier<String> c = () -> { 113 return s_f; 114 }; 115 } 116 117 @CodeReflection 118 @IR(""" 119 func @"test5" (%0 : LambdaTest, %1 : int, %2 : int)void -> { 120 %3 : Var<int> = var %1 @"i"; 121 %4 : Var<int> = var %2 @"j"; 122 %5 : int = constant @"3"; 123 %6 : Var<int> = var %5 @"k"; 124 %7 : java.util.function.Supplier<java.lang.Integer> = lambda ()java.lang.Integer -> { 125 %8 : int = constant @"4"; 126 %9 : Var<int> = var %8 @"l"; 127 %10 : java.util.function.Supplier<java.lang.Integer> = lambda ()java.lang.Integer -> { 128 %11 : int = var.load %4; 129 %12 : int = var.load %6; 130 %13 : int = add %11 %12; 131 %14 : int = var.load %9; 132 %15 : int = add %13 %14; 133 %16 : Var<int> = var %15 @"r"; 134 %17 : int = var.load %16; 135 %18 : java.lang.Integer = invoke %17 @"java.lang.Integer::valueOf(int)java.lang.Integer"; 136 return %18; 137 }; 138 %19 : Var<java.util.function.Supplier<java.lang.Integer>> = var %10 @"sInner"; 139 %20 : int = var.load %3; 140 %21 : java.util.function.Supplier<java.lang.Integer> = var.load %19; 141 %22 : java.lang.Integer = invoke %21 @"java.util.function.Supplier::get()java.lang.Object"; 142 %23 : int = invoke %22 @"java.lang.Integer::intValue()int"; 143 %24 : int = add %20 %23; 144 %25 : Var<int> = var %24 @"r"; 145 %26 : int = var.load %25; 146 %27 : java.lang.Integer = invoke %26 @"java.lang.Integer::valueOf(int)java.lang.Integer"; 147 return %27; 148 }; 149 %28 : Var<java.util.function.Supplier<java.lang.Integer>> = var %7 @"sOuter"; 150 return; 151 }; 152 """) 153 void test5(int i, int j) { 154 int k = 3; 155 Supplier<Integer> sOuter = () -> { 156 int l = 4; 157 Supplier<Integer> sInner = () -> { 158 int r = j + k + l; 159 return r; 160 }; 161 162 int r = i + sInner.get(); 163 return r; 164 }; 165 } 166 167 int f; 168 169 @CodeReflection 170 @IR(""" 171 func @"test6" (%0 : LambdaTest)void -> { 172 %1 : java.util.function.Supplier<java.lang.Integer> = lambda ()java.lang.Integer -> { 173 %2 : int = field.load %0 @"LambdaTest::f()int"; 174 %3 : java.lang.Integer = invoke %2 @"java.lang.Integer::valueOf(int)java.lang.Integer"; 175 return %3; 176 }; 177 %4 : Var<java.util.function.Supplier<java.lang.Integer>> = var %1 @"s"; 178 return; 179 }; 180 """) 181 void test6() { 182 Supplier<Integer> s = () -> f; 183 } 184 }