1 /*
  2  * Copyright (c) 2026, 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.classfile.ClassFile;
 25 import java.lang.invoke.MethodHandles;
 26 import jdk.incubator.code.Op;
 27 import jdk.incubator.code.Reflect;
 28 import jdk.incubator.code.dialect.core.CoreOp.FuncOp;
 29 import jdk.incubator.code.interpreter.Interpreter;
 30 import org.junit.jupiter.api.Assertions;
 31 import org.junit.jupiter.api.Test;
 32 
 33 /*
 34  * @test
 35  * @modules jdk.incubator.code
 36  * @run junit TestOpBuilderLimits
 37  * @run main Unreflect TestOpBuilderLimits
 38  * @run junit TestOpBuilderLimits
 39  */
 40 public class TestOpBuilderLimits {
 41 
 42     @Reflect
 43     static int bigModelBuilder(int i) {
 44         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 45         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 46         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 47         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 48         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 49         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 50         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 51         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 52         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 53         i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
 54         return i;
 55     }
 56 
 57     @Test
 58     public void testOpLimit() throws Exception {
 59         FuncOp fop = Op.ofMethod(TestOpBuilderLimits.class.getDeclaredMethod("bigModelBuilder", int.class)).orElseThrow();
 60         Assertions.assertEquals(bigModelBuilder(0), (int)Interpreter.invoke(MethodHandles.lookup(), fop, 0));
 61     }
 62 
 63     interface T<T0, T1, T2, T3, T4, T5, T6, T7> {}
 64     interface A {}
 65     interface B {}
 66 
 67     @Reflect
 68     static int manyTypes(int i) {
 69         T<A,A,A,A,A,A,A,A> t0; T<A,A,A,A,A,A,A,B> t1; T<A,A,A,A,A,A,B,A> t2; T<A,A,A,A,A,A,B,B> t3; T<A,A,A,A,A,B,A,A> t4;
 70         T<A,A,A,A,A,B,A,B> t5; T<A,A,A,A,A,B,B,A> t6; T<A,A,A,A,A,B,B,B> t7; T<A,A,A,A,B,A,A,A> t8; T<A,A,A,A,B,A,A,B> t9;
 71         T<A,A,A,A,B,A,B,A> t10; T<A,A,A,A,B,A,B,B> t11; T<A,A,A,A,B,B,A,A> t12; T<A,A,A,A,B,B,A,B> t13; T<A,A,A,A,B,B,B,A> t14;
 72         T<A,A,A,A,B,B,B,B> t15; T<A,A,A,B,A,A,A,A> t16; T<A,A,A,B,A,A,A,B> t17; T<A,A,A,B,A,A,B,A> t18; T<A,A,A,B,A,A,B,B> t19;
 73         T<A,A,A,B,A,B,A,A> t20; T<A,A,A,B,A,B,A,B> t21; T<A,A,A,B,A,B,B,A> t22; T<A,A,A,B,A,B,B,B> t23; T<A,A,A,B,B,A,A,A> t24;
 74         T<A,A,A,B,B,A,A,B> t25; T<A,A,A,B,B,A,B,A> t26; T<A,A,A,B,B,A,B,B> t27; T<A,A,A,B,B,B,A,A> t28; T<A,A,A,B,B,B,A,B> t29;
 75         T<A,A,A,B,B,B,B,A> t30; T<A,A,A,B,B,B,B,B> t31; T<A,A,B,A,A,A,A,A> t32; T<A,A,B,A,A,A,A,B> t33; T<A,A,B,A,A,A,B,A> t34;
 76         T<A,A,B,A,A,A,B,B> t35; T<A,A,B,A,A,B,A,A> t36; T<A,A,B,A,A,B,A,B> t37; T<A,A,B,A,A,B,B,A> t38; T<A,A,B,A,A,B,B,B> t39;
 77         T<A,A,B,A,B,A,A,A> t40; T<A,A,B,A,B,A,A,B> t41; T<A,A,B,A,B,A,B,A> t42; T<A,A,B,A,B,A,B,B> t43; T<A,A,B,A,B,B,A,A> t44;
 78         T<A,A,B,A,B,B,A,B> t45; T<A,A,B,A,B,B,B,A> t46; T<A,A,B,A,B,B,B,B> t47; T<A,A,B,B,A,A,A,A> t48; T<A,A,B,B,A,A,A,B> t49;
 79         T<A,A,B,B,A,A,B,A> t50; T<A,A,B,B,A,A,B,B> t51; T<A,A,B,B,A,B,A,A> t52; T<A,A,B,B,A,B,A,B> t53; T<A,A,B,B,A,B,B,A> t54;
 80         T<A,A,B,B,A,B,B,B> t55; T<A,A,B,B,B,A,A,A> t56; T<A,A,B,B,B,A,A,B> t57; T<A,A,B,B,B,A,B,A> t58; T<A,A,B,B,B,A,B,B> t59;
 81         T<A,A,B,B,B,B,A,A> t60; T<A,A,B,B,B,B,A,B> t61; T<A,A,B,B,B,B,B,A> t62; T<A,A,B,B,B,B,B,B> t63; T<A,B,A,A,A,A,A,A> t64;
 82         T<A,B,A,A,A,A,A,B> t65; T<A,B,A,A,A,A,B,A> t66; T<A,B,A,A,A,A,B,B> t67; T<A,B,A,A,A,B,A,A> t68; T<A,B,A,A,A,B,A,B> t69;
 83         T<A,B,A,A,A,B,B,A> t70; T<A,B,A,A,A,B,B,B> t71; T<A,B,A,A,B,A,A,A> t72; T<A,B,A,A,B,A,A,B> t73; T<A,B,A,A,B,A,B,A> t74;
 84         T<A,B,A,A,B,A,B,B> t75; T<A,B,A,A,B,B,A,A> t76; T<A,B,A,A,B,B,A,B> t77; T<A,B,A,A,B,B,B,A> t78; T<A,B,A,A,B,B,B,B> t79;
 85         T<A,B,A,B,A,A,A,A> t80; T<A,B,A,B,A,A,A,B> t81; T<A,B,A,B,A,A,B,A> t82; T<A,B,A,B,A,A,B,B> t83; T<A,B,A,B,A,B,A,A> t84;
 86         T<A,B,A,B,A,B,A,B> t85; T<A,B,A,B,A,B,B,A> t86; T<A,B,A,B,A,B,B,B> t87; T<A,B,A,B,B,A,A,A> t88; T<A,B,A,B,B,A,A,B> t89;
 87         T<A,B,A,B,B,A,B,A> t90; T<A,B,A,B,B,A,B,B> t91; T<A,B,A,B,B,B,A,A> t92; T<A,B,A,B,B,B,A,B> t93; T<A,B,A,B,B,B,B,A> t94;
 88         T<A,B,A,B,B,B,B,B> t95; T<A,B,B,A,A,A,A,A> t96; T<A,B,B,A,A,A,A,B> t97; T<A,B,B,A,A,A,B,A> t98; T<A,B,B,A,A,A,B,B> t99;
 89         T<A,B,B,A,A,B,A,A> t100; T<A,B,B,A,A,B,A,B> t101; T<A,B,B,A,A,B,B,A> t102; T<A,B,B,A,A,B,B,B> t103; T<A,B,B,A,B,A,A,A> t104;
 90         T<A,B,B,A,B,A,A,B> t105; T<A,B,B,A,B,A,B,A> t106; T<A,B,B,A,B,A,B,B> t107; T<A,B,B,A,B,B,A,A> t108; T<A,B,B,A,B,B,A,B> t109;
 91         T<A,B,B,A,B,B,B,A> t110; T<A,B,B,A,B,B,B,B> t111; T<A,B,B,B,A,A,A,A> t112; T<A,B,B,B,A,A,A,B> t113; T<A,B,B,B,A,A,B,A> t114;
 92         T<A,B,B,B,A,A,B,B> t115; T<A,B,B,B,A,B,A,A> t116; T<A,B,B,B,A,B,A,B> t117; T<A,B,B,B,A,B,B,A> t118; T<A,B,B,B,A,B,B,B> t119;
 93         T<A,B,B,B,B,A,A,A> t120; T<A,B,B,B,B,A,A,B> t121; T<A,B,B,B,B,A,B,A> t122; T<A,B,B,B,B,A,B,B> t123; T<A,B,B,B,B,B,A,A> t124;
 94         T<A,B,B,B,B,B,A,B> t125; T<A,B,B,B,B,B,B,A> t126; T<A,B,B,B,B,B,B,B> t127; T<B,A,A,A,A,A,A,A> t128; T<B,A,A,A,A,A,A,B> t129;
 95         T<B,A,A,A,A,A,B,A> t130; T<B,A,A,A,A,A,B,B> t131; T<B,A,A,A,A,B,A,A> t132; T<B,A,A,A,A,B,A,B> t133; T<B,A,A,A,A,B,B,A> t134;
 96         T<B,A,A,A,A,B,B,B> t135; T<B,A,A,A,B,A,A,A> t136; T<B,A,A,A,B,A,A,B> t137; T<B,A,A,A,B,A,B,A> t138; T<B,A,A,A,B,A,B,B> t139;
 97         T<B,A,A,A,B,B,A,A> t140; T<B,A,A,A,B,B,A,B> t141; T<B,A,A,A,B,B,B,A> t142; T<B,A,A,A,B,B,B,B> t143; T<B,A,A,B,A,A,A,A> t144;
 98         T<B,A,A,B,A,A,A,B> t145; T<B,A,A,B,A,A,B,A> t146; T<B,A,A,B,A,A,B,B> t147; T<B,A,A,B,A,B,A,A> t148; T<B,A,A,B,A,B,A,B> t149;
 99         T<B,A,A,B,A,B,B,A> t150; T<B,A,A,B,A,B,B,B> t151; T<B,A,A,B,B,A,A,A> t152; T<B,A,A,B,B,A,A,B> t153; T<B,A,A,B,B,A,B,A> t154;
100         T<B,A,A,B,B,A,B,B> t155; T<B,A,A,B,B,B,A,A> t156; T<B,A,A,B,B,B,A,B> t157; T<B,A,A,B,B,B,B,A> t158; T<B,A,A,B,B,B,B,B> t159;
101         T<B,A,B,A,A,A,A,A> t160; T<B,A,B,A,A,A,A,B> t161; T<B,A,B,A,A,A,B,A> t162; T<B,A,B,A,A,A,B,B> t163; T<B,A,B,A,A,B,A,A> t164;
102         T<B,A,B,A,A,B,A,B> t165; T<B,A,B,A,A,B,B,A> t166; T<B,A,B,A,A,B,B,B> t167; T<B,A,B,A,B,A,A,A> t168; T<B,A,B,A,B,A,A,B> t169;
103         T<B,A,B,A,B,A,B,A> t170; T<B,A,B,A,B,A,B,B> t171; T<B,A,B,A,B,B,A,A> t172; T<B,A,B,A,B,B,A,B> t173; T<B,A,B,A,B,B,B,A> t174;
104         T<B,A,B,A,B,B,B,B> t175; T<B,A,B,B,A,A,A,A> t176; T<B,A,B,B,A,A,A,B> t177; T<B,A,B,B,A,A,B,A> t178; T<B,A,B,B,A,A,B,B> t179;
105         T<B,A,B,B,A,B,A,A> t180; T<B,A,B,B,A,B,A,B> t181; T<B,A,B,B,A,B,B,A> t182; T<B,A,B,B,A,B,B,B> t183; T<B,A,B,B,B,A,A,A> t184;
106         T<B,A,B,B,B,A,A,B> t185; T<B,A,B,B,B,A,B,A> t186; T<B,A,B,B,B,A,B,B> t187; T<B,A,B,B,B,B,A,A> t188; T<B,A,B,B,B,B,A,B> t189;
107         T<B,A,B,B,B,B,B,A> t190; T<B,A,B,B,B,B,B,B> t191; T<B,B,A,A,A,A,A,A> t192; T<B,B,A,A,A,A,A,B> t193; T<B,B,A,A,A,A,B,A> t194;
108         T<B,B,A,A,A,A,B,B> t195; T<B,B,A,A,A,B,A,A> t196; T<B,B,A,A,A,B,A,B> t197; T<B,B,A,A,A,B,B,A> t198; T<B,B,A,A,A,B,B,B> t199;
109         T<B,B,A,A,B,A,A,A> t200; T<B,B,A,A,B,A,A,B> t201; T<B,B,A,A,B,A,B,A> t202; T<B,B,A,A,B,A,B,B> t203; T<B,B,A,A,B,B,A,A> t204;
110         T<B,B,A,A,B,B,A,B> t205; T<B,B,A,A,B,B,B,A> t206; T<B,B,A,A,B,B,B,B> t207; T<B,B,A,B,A,A,A,A> t208; T<B,B,A,B,A,A,A,B> t209;
111         T<B,B,A,B,A,A,B,A> t210; T<B,B,A,B,A,A,B,B> t211; T<B,B,A,B,A,B,A,A> t212; T<B,B,A,B,A,B,A,B> t213; T<B,B,A,B,A,B,B,A> t214;
112         T<B,B,A,B,A,B,B,B> t215; T<B,B,A,B,B,A,A,A> t216; T<B,B,A,B,B,A,A,B> t217; T<B,B,A,B,B,A,B,A> t218; T<B,B,A,B,B,A,B,B> t219;
113         T<B,B,A,B,B,B,A,A> t220; T<B,B,A,B,B,B,A,B> t221; T<B,B,A,B,B,B,B,A> t222; T<B,B,A,B,B,B,B,B> t223; T<B,B,B,A,A,A,A,A> t224;
114         T<B,B,B,A,A,A,A,B> t225; T<B,B,B,A,A,A,B,A> t226; T<B,B,B,A,A,A,B,B> t227; T<B,B,B,A,A,B,A,A> t228; T<B,B,B,A,A,B,A,B> t229;
115         T<B,B,B,A,A,B,B,A> t230; T<B,B,B,A,A,B,B,B> t231; T<B,B,B,A,B,A,A,A> t232; T<B,B,B,A,B,A,A,B> t233; T<B,B,B,A,B,A,B,A> t234;
116         T<B,B,B,A,B,A,B,B> t235; T<B,B,B,A,B,B,A,A> t236; T<B,B,B,A,B,B,A,B> t237; T<B,B,B,A,B,B,B,A> t238; T<B,B,B,A,B,B,B,B> t239;
117         T<B,B,B,B,A,A,A,A> t240; T<B,B,B,B,A,A,A,B> t241; T<B,B,B,B,A,A,B,A> t242; T<B,B,B,B,A,A,B,B> t243; T<B,B,B,B,A,B,A,A> t244;
118         T<B,B,B,B,A,B,A,B> t245; T<B,B,B,B,A,B,B,A> t246; T<B,B,B,B,A,B,B,B> t247; T<B,B,B,B,B,A,A,A> t248; T<B,B,B,B,B,A,A,B> t249;
119         T<B,B,B,B,B,A,B,A> t250; T<B,B,B,B,B,A,B,B> t251; T<B,B,B,B,B,B,A,A> t252; T<B,B,B,B,B,B,A,B> t253; T<B,B,B,B,B,B,B,A> t254;
120         T<B,B,B,B,B,B,B,B> t255;
121         return i;
122     }
123 
124     @Test
125     public void testTypeLimit() throws Exception {
126         FuncOp fop = Op.ofMethod(TestOpBuilderLimits.class.getDeclaredMethod("manyTypes", int.class)).orElseThrow();
127         Assertions.assertEquals(manyTypes(42), (int)Interpreter.invoke(MethodHandles.lookup(), fop, 42));
128     }
129 
130     @Test
131     public void testLimitsExceeded() throws Exception {
132         var methods = ClassFile.of().parse(TestOpBuilderLimits.class.getResourceAsStream("TestOpBuilderLimits$$CM.class").readAllBytes()).methods();
133         Assertions.assertTrue(methods.stream().anyMatch(m -> m.methodName().equalsString("lambda$0")), "ops limit exceeded");
134         Assertions.assertTrue(methods.stream().anyMatch(m -> m.methodName().equalsString("$exterType1")), "types limit exceeded");
135     }
136 }