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 26 /* 27 * @test 28 * @summary Smoke test for code reflection with super qualified expressions. 29 * @modules jdk.incubator.code 30 * @build SuperTest 31 * @build CodeReflectionTester 32 * @run main CodeReflectionTester SuperTest 33 */ 34 35 public class SuperTest extends SuperClass implements SuperInterface { 36 static int sf; 37 int f; 38 39 @Override 40 public void get() {} 41 static void sget() {} 42 43 @CodeReflection 44 @IR(""" 45 func @"superClassFieldAccess" (%0 : SuperTest)void -> { 46 %1 : int = field.load %0 @"SuperClass::f()int"; 47 %2 : Var<int> = var %1 @"i"; 48 %3 : int = constant @"1"; 49 field.store %0 %3 @"SuperClass::f()int"; 50 %4 : int = field.load %0 @"SuperClass::f()int"; 51 var.store %2 %4; 52 %5 : int = constant @"1"; 53 field.store %0 %5 @"SuperClass::f()int"; 54 %6 : int = field.load @"SuperClass::sf()int"; 55 var.store %2 %6; 56 %7 : int = constant @"1"; 57 field.store %7 @"SuperClass::sf()int"; 58 %8 : int = field.load @"SuperClass::sf()int"; 59 var.store %2 %8; 60 %9 : int = constant @"1"; 61 field.store %9 @"SuperClass::sf()int"; 62 return; 63 }; 64 """) 65 public void superClassFieldAccess() { 66 int i = super.f; 67 super.f = 1; 68 i = SuperTest.super.f; 69 SuperTest.super.f = 1; 70 71 i = super.sf; 72 super.sf = 1; 73 i = SuperTest.super.sf; 74 SuperTest.super.sf = 1; 75 } 76 77 @CodeReflection 78 @IR(""" 79 func @"superClassMethodInvocation" (%0 : SuperTest)void -> { 80 invoke %0 @invoke.kind="SUPER" @"SuperClass::get()void"; 81 invoke %0 @invoke.kind="SUPER" @"SuperClass::get()void"; 82 invoke @"SuperClass::sget()void"; 83 invoke @"SuperClass::sget()void"; 84 return; 85 }; 86 """) 87 public void superClassMethodInvocation() { 88 super.get(); 89 SuperTest.super.get(); 90 91 super.sget(); 92 SuperTest.super.sget(); 93 } 94 95 @CodeReflection 96 @IR(""" 97 func @"superInterfaceMethodInvocation" (%0 : SuperTest)void -> { 98 invoke %0 @invoke.kind="SUPER" @"SuperInterface::get()void"; 99 return; 100 }; 101 """) 102 public void superInterfaceMethodInvocation() { 103 SuperInterface.super.get(); 104 } 105 } 106 107 class SuperClass { 108 static int sf; 109 int f; 110 111 void get() {} 112 static void sget() {} 113 } 114 115 interface SuperInterface { 116 default void get() {} 117 }