Skip to content

Commit 91cc3a5

Browse files
[GR-61366] [GR-66391] [GR-66317] Espresso: Bump support to JDK 26
PullRequest: graal/21178
2 parents d90ad08 + 055d1e7 commit 91cc3a5

File tree

11 files changed

+86
-32
lines changed

11 files changed

+86
-32
lines changed

espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/ClassfileParser.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ public final class ClassfileParser {
154154
public static final int JAVA_23_VERSION = 67;
155155
public static final int JAVA_24_VERSION = 68;
156156
public static final int JAVA_25_VERSION = 69;
157+
public static final int JAVA_26_VERSION = 70;
157158

158159
public static final int STRICTER_ACCESS_CTRL_CHECK_VERSION = JAVA_1_5_VERSION;
159160
public static final int STACKMAP_ATTRIBUTE_MAJOR_VERSION = JAVA_6_VERSION;

espresso-shared/src/com.oracle.truffle.espresso.classfile/src/com/oracle/truffle/espresso/classfile/JavaVersion.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ public boolean contains(JavaVersion version) {
7676

7777
public static final JavaVersion HOST_VERSION = forVersion(Runtime.version());
7878

79-
public static final int LATEST_SUPPORTED = 25;
80-
public static final int LATEST_SUPPORTED_CLASSFILE = ClassfileParser.JAVA_25_VERSION;
79+
public static final int LATEST_SUPPORTED = 26;
80+
public static final int LATEST_SUPPORTED_CLASSFILE = ClassfileParser.JAVA_26_VERSION;
8181

8282
private final int version;
8383

espresso/ci/ci_common/common.jsonnet

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ local benchmark_suites = ['dacapo', 'renaissance', 'scala-dacapo'];
124124

125125

126126
// precise targets and capabilities
127-
jdkLatest_gate_linux_amd64 : self.gate + self.linux_amd64_latest,
128127
jdk21_gate_linux_amd64 : self.gate + self.linux_amd64_21,
129128
jdk21_gate_linux_aarch64 : self.gate + self.linux_aarch64_21,
130129
jdk21_gate_darwin_amd64 : self.gate + self.darwin_amd64_21,
@@ -164,8 +163,10 @@ local benchmark_suites = ['dacapo', 'renaissance', 'scala-dacapo'];
164163
jdk21_on_demand_bench_linux : self.onDemandBench + self.linux_amd64_21 + self.x52,
165164
jdk21_on_demand_bench_darwin : self.onDemandBench + self.darwin_amd64_21,
166165
jdk21_on_demand_bench_windows : self.onDemandBench + self.windows_21,
166+
jdkLatest_gate_linux_amd64 : self.gate + self.linux_amd64_latest,
167+
jdkLatest_daily_linux_amd64 : self.daily + self.linux_amd64_latest,
167168
jdkLatest_weekly_linux_amd64 : self.weekly + self.linux_amd64_latest,
168-
169+
169170
// shared snippets
170171
eclipse: graal_common.deps.eclipse,
171172

espresso/src/com.oracle.truffle.espresso.mokapot/include/jvm.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,9 @@ JVM_SetCurrentThread(JNIEnv *env, jobject thisThread, jobject theThread);
406406
JNIEXPORT jint JNICALL // Removed in 11
407407
JVM_CountStackFrames(JNIEnv *env, jobject thread);
408408

409+
JNIEXPORT jobject JNICALL
410+
JVM_CreateThreadSnapshot(JNIEnv* env, jobject thread);
411+
409412
JNIEXPORT void JNICALL
410413
JVM_Interrupt(JNIEnv *env, jobject thread);
411414

espresso/src/com.oracle.truffle.espresso.mokapot/include/mokapot.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,8 @@ typedef uint64_t julong;
377377
V(JVM_VirtualThreadDisableSuspend) \
378378
V(JVM_VirtualThreadPinnedEvent) \
379379
V(JVM_TakeVirtualThreadListToUnblock) \
380-
V(JVM_IsStaticallyLinked) \
380+
V(JVM_IsStaticallyLinked) \
381+
V(JVM_CreateThreadSnapshot)
381382

382383
#ifdef __cplusplus
383384
extern "C" {
@@ -1015,6 +1016,8 @@ void (*JVM_VirtualThreadPinnedEvent)(JNIEnv* env, jclass clazz, jstring op);
10151016
jobject (*JVM_TakeVirtualThreadListToUnblock)(JNIEnv* env, jclass ignored);
10161017

10171018
jboolean(*JVM_IsStaticallyLinked)(void);
1019+
1020+
jobject(*JVM_CreateThreadSnapshot)(JNIEnv* env, jobject thread);
10181021
};
10191022

10201023
struct MokapotEnv_ {

espresso/src/com.oracle.truffle.espresso.mokapot/mapfile-vers

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ SUNWprivate_1.1 {
371371
JVM_VirtualThreadPinnedEvent;
372372
JVM_TakeVirtualThreadListToUnblock;
373373
JVM_IsStaticallyLinked;
374+
JVM_CreateThreadSnapshot;
374375

375376
# miscellaneous functions
376377
jio_fprintf;

espresso/src/com.oracle.truffle.espresso.mokapot/src/mokapot.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1748,6 +1748,11 @@ JNIEXPORT jboolean JNICALL JVM_PrintWarningAtDynamicAgentLoad(void) {
17481748
return JNI_FALSE;
17491749
}
17501750

1751+
JNIEXPORT jobject JNICALL JVM_CreateThreadSnapshot(JNIEnv* env, jobject thread) {
1752+
UNIMPLEMENTED(JVM_CreateThreadSnapshot);
1753+
return NULL;
1754+
}
1755+
17511756

17521757
// region Invocation API
17531758

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/jni/JniEnv.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ public void CallVoidMethodVarargs(@JavaType(Object.class) StaticObject receiver,
961961
@Pointer TruffleObject varargsPtr) {
962962
Method method = methodIds().getObject(methodId);
963963
assert !method.isStatic();
964-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
964+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
965965
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
966966
return getMeta().asObject(result);
967967
}
@@ -971,7 +971,7 @@ public boolean CallNonvirtualBooleanMethodVarargs(@JavaType(Object.class) Static
971971
@Pointer TruffleObject varargsPtr) {
972972
Method method = methodIds().getObject(methodId);
973973
assert !method.isStatic();
974-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
974+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
975975
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
976976
return getMeta().asBoolean(result, true);
977977
}
@@ -981,7 +981,7 @@ public char CallNonvirtualCharMethodVarargs(@JavaType(Object.class) StaticObject
981981
@Pointer TruffleObject varargsPtr) {
982982
Method method = methodIds().getObject(methodId);
983983
assert !method.isStatic();
984-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
984+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
985985
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
986986
return getMeta().asChar(result, true);
987987
}
@@ -991,7 +991,7 @@ public byte CallNonvirtualByteMethodVarargs(@JavaType(Object.class) StaticObject
991991
@Pointer TruffleObject varargsPtr) {
992992
Method method = methodIds().getObject(methodId);
993993
assert !method.isStatic();
994-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
994+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
995995
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
996996
return getMeta().asByte(result, true);
997997
}
@@ -1001,7 +1001,7 @@ public short CallNonvirtualShortMethodVarargs(@JavaType(Object.class) StaticObje
10011001
@Pointer TruffleObject varargsPtr) {
10021002
Method method = methodIds().getObject(methodId);
10031003
assert !method.isStatic();
1004-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1004+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10051005
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
10061006
return getMeta().asShort(result, true);
10071007
}
@@ -1011,7 +1011,7 @@ public int CallNonvirtualIntMethodVarargs(@JavaType(Object.class) StaticObject r
10111011
@Pointer TruffleObject varargsPtr) {
10121012
Method method = methodIds().getObject(methodId);
10131013
assert !method.isStatic();
1014-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1014+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10151015
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
10161016
return getMeta().asInt(result, true);
10171017
}
@@ -1021,7 +1021,7 @@ public float CallNonvirtualFloatMethodVarargs(@JavaType(Object.class) StaticObje
10211021
@Pointer TruffleObject varargsPtr) {
10221022
Method method = methodIds().getObject(methodId);
10231023
assert !method.isStatic();
1024-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1024+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10251025
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
10261026
return getMeta().asFloat(result, true);
10271027
}
@@ -1031,7 +1031,7 @@ public double CallNonvirtualDoubleMethodVarargs(@JavaType(Object.class) StaticOb
10311031
@Pointer TruffleObject varargsPtr) {
10321032
Method method = methodIds().getObject(methodId);
10331033
assert !method.isStatic();
1034-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1034+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10351035
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
10361036
return getMeta().asDouble(result, true);
10371037
}
@@ -1041,7 +1041,7 @@ public long CallNonvirtualLongMethodVarargs(@JavaType(Object.class) StaticObject
10411041
@Pointer TruffleObject varargsPtr) {
10421042
Method method = methodIds().getObject(methodId);
10431043
assert !method.isStatic();
1044-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1044+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10451045
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
10461046
return getMeta().asLong(result, true);
10471047
}
@@ -1051,7 +1051,7 @@ public void CallNonvirtualVoidMethodVarargs(@JavaType(Object.class) StaticObject
10511051
@Pointer TruffleObject varargsPtr) {
10521052
Method method = methodIds().getObject(methodId);
10531053
assert !method.isStatic();
1054-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1054+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10551055
Object result = method.invokeDirect(popVarArgs(varargsPtr, method.getParsedSignature(), receiver));
10561056
assert result instanceof StaticObject && StaticObject.isNull((StaticObject) result) : "void methods must return StaticObject.NULL";
10571057
}
@@ -1064,7 +1064,7 @@ public void CallNonvirtualVoidMethodVarargs(@JavaType(Object.class) StaticObject
10641064
public @JavaType(Object.class) StaticObject CallStaticObjectMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
10651065
Method method = methodIds().getObject(methodId);
10661066
assert method.isStatic();
1067-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1067+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10681068
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
10691069
return getMeta().asObject(result);
10701070
}
@@ -1073,7 +1073,7 @@ public void CallNonvirtualVoidMethodVarargs(@JavaType(Object.class) StaticObject
10731073
public boolean CallStaticBooleanMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
10741074
Method method = methodIds().getObject(methodId);
10751075
assert method.isStatic();
1076-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1076+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10771077
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
10781078
return getMeta().asBoolean(result, true);
10791079
}
@@ -1082,7 +1082,7 @@ public boolean CallStaticBooleanMethodVarargs(@JavaType(Class.class) StaticObjec
10821082
public char CallStaticCharMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
10831083
Method method = methodIds().getObject(methodId);
10841084
assert method.isStatic();
1085-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1085+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10861086
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
10871087
return getMeta().asChar(result, true);
10881088
}
@@ -1091,7 +1091,7 @@ public char CallStaticCharMethodVarargs(@JavaType(Class.class) StaticObject claz
10911091
public byte CallStaticByteMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
10921092
Method method = methodIds().getObject(methodId);
10931093
assert method.isStatic();
1094-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1094+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
10951095
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
10961096
return getMeta().asByte(result, true);
10971097
}
@@ -1100,7 +1100,7 @@ public byte CallStaticByteMethodVarargs(@JavaType(Class.class) StaticObject claz
11001100
public short CallStaticShortMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
11011101
Method method = methodIds().getObject(methodId);
11021102
assert method.isStatic();
1103-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1103+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
11041104
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
11051105
return getMeta().asShort(result, true);
11061106
}
@@ -1109,7 +1109,7 @@ public short CallStaticShortMethodVarargs(@JavaType(Class.class) StaticObject cl
11091109
public int CallStaticIntMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
11101110
Method method = methodIds().getObject(methodId);
11111111
assert method.isStatic();
1112-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1112+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
11131113
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
11141114
return getMeta().asInt(result, true);
11151115
}
@@ -1118,7 +1118,7 @@ public int CallStaticIntMethodVarargs(@JavaType(Class.class) StaticObject clazz,
11181118
public float CallStaticFloatMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
11191119
Method method = methodIds().getObject(methodId);
11201120
assert method.isStatic();
1121-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1121+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
11221122
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
11231123
return getMeta().asFloat(result, true);
11241124
}
@@ -1127,7 +1127,7 @@ public float CallStaticFloatMethodVarargs(@JavaType(Class.class) StaticObject cl
11271127
public double CallStaticDoubleMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
11281128
Method method = methodIds().getObject(methodId);
11291129
assert method.isStatic();
1130-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1130+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
11311131
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
11321132
return getMeta().asDouble(result, true);
11331133
}
@@ -1136,7 +1136,7 @@ public double CallStaticDoubleMethodVarargs(@JavaType(Class.class) StaticObject
11361136
public long CallStaticLongMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
11371137
Method method = methodIds().getObject(methodId);
11381138
assert method.isStatic();
1139-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1139+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
11401140
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
11411141
return getMeta().asLong(result, true);
11421142
}
@@ -1145,7 +1145,7 @@ public long CallStaticLongMethodVarargs(@JavaType(Class.class) StaticObject claz
11451145
public void CallStaticVoidMethodVarargs(@JavaType(Class.class) StaticObject clazz, @Handle(Method.class) long methodId, @Pointer TruffleObject varargsPtr) {
11461146
Method method = methodIds().getObject(methodId);
11471147
assert method.isStatic();
1148-
assert (clazz.getMirrorKlass(getMeta())) == method.getDeclaringKlass();
1148+
assert method.getDeclaringKlass().isAssignableFrom(clazz.getMirrorKlass(getMeta()));
11491149
Object result = method.invokeDirectStatic(popVarArgs(varargsPtr, method.getParsedSignature()));
11501150
assert result instanceof StaticObject && StaticObject.isNull((StaticObject) result) : "void methods must return StaticObject.NULL";
11511151
}

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/meta/Meta.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,11 +1040,14 @@ public Meta(EspressoContext context) {
10401040

10411041
java_time_LocalDate = knownKlass(Types.java_time_LocalDate);
10421042
java_time_LocalDate_year = java_time_LocalDate.requireDeclaredField(Names.year, Types._int);
1043-
assert java_time_LocalDate_year.getKind() == JavaKind.Int;
1044-
java_time_LocalDate_month = java_time_LocalDate.requireDeclaredField(Names.month, Types._short);
1045-
assert java_time_LocalDate_month.getKind() == JavaKind.Short;
1046-
java_time_LocalDate_day = java_time_LocalDate.requireDeclaredField(Names.day, Types._short);
1047-
assert java_time_LocalDate_day.getKind() == JavaKind.Short;
1043+
java_time_LocalDate_month = diff() //
1044+
.field(VERSION_24_OR_LOWER, Names.month, Types._short) //
1045+
.field(VERSION_25_OR_HIGHER, Names.month, Types._byte) //
1046+
.field(java_time_LocalDate);
1047+
java_time_LocalDate_day = diff() //
1048+
.field(VERSION_24_OR_LOWER, Names.day, Types._short) //
1049+
.field(VERSION_25_OR_HIGHER, Names.day, Types._byte) //
1050+
.field(java_time_LocalDate);
10481051
java_time_LocalDate_of = java_time_LocalDate.requireDeclaredMethod(Names.of, Signatures.LocalDate_int_int_int);
10491052

10501053
java_time_ZonedDateTime = knownKlass(Types.java_time_ZonedDateTime);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright (c) 2025, 2025, 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+
package com.oracle.truffle.espresso.substitutions.standard;
24+
25+
import com.oracle.truffle.espresso.substitutions.EspressoSubstitutions;
26+
import com.oracle.truffle.espresso.substitutions.Substitution;
27+
28+
@EspressoSubstitutions
29+
public final class Target_java_lang_VirtualThread {
30+
private Target_java_lang_VirtualThread() {
31+
}
32+
33+
@Substitution
34+
public static void unblockVirtualThreads() {
35+
// no-op: loom continuations are not supported
36+
}
37+
}

0 commit comments

Comments
 (0)