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 }