From d275ae40a4263a3958d141815af41ca8f57b0d70 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Thu, 20 Feb 2025 18:32:21 +0100 Subject: [PATCH 1/2] Rewrite createLanguages() without Stream for simplicity and clearer stacktraces --- .../com/oracle/truffle/polyglot/LanguageCache.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/LanguageCache.java b/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/LanguageCache.java index 62b2e1cb4878..c42244215118 100644 --- a/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/LanguageCache.java +++ b/truffle/src/com.oracle.truffle.polyglot/src/com/oracle/truffle/polyglot/LanguageCache.java @@ -62,8 +62,6 @@ import java.util.Set; import java.util.TreeSet; import java.util.function.Supplier; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; import org.graalvm.home.HomeFinder; import org.graalvm.polyglot.SandboxPolicy; @@ -273,7 +271,12 @@ private static synchronized Map createLanguages(List supplier.accepts(p.getClass())).forEach((p) -> loadLanguageImpl(p, caches, optionalResources)); + + for (TruffleLanguageProvider provider : ServiceLoader.load(TruffleLanguageProvider.class, loader)) { + if (supplier.accepts(provider.getClass())) { + loadLanguageImpl(provider, caches, optionalResources); + } + } } Map idToCache = new LinkedHashMap<>(); @@ -299,10 +302,6 @@ private static synchronized Map createLanguages(List loadProviders(ClassLoader loader) { - return StreamSupport.stream(ServiceLoader.load(TruffleLanguageProvider.class, loader).spliterator(), false); - } - private static boolean hasSameCodeSource(LanguageCache first, LanguageCache second) { return first.provider.getClass() == second.provider.getClass(); } From f8aa58b6eaa1cbca828ff497e6ab95fcc0a58666 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Fri, 21 Feb 2025 13:39:27 +0100 Subject: [PATCH 2/2] [GR-59770] Make PanamaNFILanguage load cleanly on JDK 21 * PanamaNFILanguageProvider must be compiled as 17+ to avoid breaking ServiceLoader. * ServiceLoader has no way to ignore UnsupportedClassVersionError errors, it breaks the ServiceLoader iterator. * Remove @SuppressWarnings("preview") since on JDK 22 it is not a preview anymore. --- truffle/mx.truffle/suite.py | 25 ++++- .../nfi/backend/panama/ArgumentNode.java | 0 .../backend/panama/ClosureArgumentNode.java | 0 .../nfi/backend/panama/ErrorContext.java | 32 +++---- .../backend/panama/FunctionExecuteNode.java | 2 - .../truffle/nfi/backend/panama/NFIError.java | 0 .../nfi/backend/panama/NativePointer.java | 0 .../nfi/backend/panama/NativeString.java | 0 .../nfi/backend/panama/PanamaAccessor.java | 68 +++++++++++++ .../nfi/backend/panama/PanamaClosure.java | 10 +- .../nfi/backend/panama/PanamaLibrary.java | 9 +- .../nfi/backend/panama/PanamaNFIBackend.java | 2 +- .../nfi/backend/panama/PanamaNFIContext.java | 14 +-- .../nfi/backend/panama/PanamaSignature.java | 28 ++---- .../nfi/backend/panama/PanamaSymbol.java | 4 +- .../nfi/backend/panama/PanamaType.java | 3 +- .../backend/panama/AbstractErrorContext.java | 51 ++++++++++ .../panama/AbstractPanamaNFIContext.java | 53 +++++++++++ .../nfi/backend/panama/PanamaAccessor.java | 70 ++++++++++++++ .../nfi/backend/panama/PanamaNFILanguage.java | 95 ++++++++++--------- .../com/oracle/truffle/nfi/NFIContext.java | 8 +- 21 files changed, 358 insertions(+), 116 deletions(-) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/ArgumentNode.java (100%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/ClosureArgumentNode.java (100%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java (83%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java (98%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/NFIError.java (100%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/NativePointer.java (100%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/NativeString.java (100%) create mode 100644 truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java (98%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java (94%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java (99%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java (88%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java (93%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java (95%) rename truffle/src/{com.oracle.truffle.nfi.backend.panama => com.oracle.truffle.nfi.backend.panama.jdk22}/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java (98%) create mode 100644 truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractErrorContext.java create mode 100644 truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractPanamaNFIContext.java create mode 100644 truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java diff --git a/truffle/mx.truffle/suite.py b/truffle/mx.truffle/suite.py index e077b6399fb7..c2633056999c 100644 --- a/truffle/mx.truffle/suite.py +++ b/truffle/mx.truffle/suite.py @@ -949,6 +949,8 @@ "graalCompilerSourceEdition": "ignore", }, + # PanamaNFILanguage itself must be 17+ so that PanamaNFILanguageProvider can be loaded without + # breaking the ServiceLoader which unfortunately cannot ignore newer class files (GR-59770) "com.oracle.truffle.nfi.backend.panama" : { "subDir" : "src", "sourceDirs" : ["src"], @@ -956,9 +958,23 @@ "com.oracle.truffle.nfi.backend.spi", ], "checkstyle" : "com.oracle.truffle.api", - # GR-51699 + "javaCompliance" : "17+", + "annotationProcessors" : ["TRUFFLE_DSL_PROCESSOR"], + "workingSets" : "Truffle", + "graalCompilerSourceEdition": "ignore", + }, + + "com.oracle.truffle.nfi.backend.panama.jdk22" : { + "overlayTarget" : "com.oracle.truffle.nfi.backend.panama", + "multiReleaseJarVersion" : "22", + "subDir" : "src", + "sourceDirs" : ["src"], + "dependencies" : [ + "com.oracle.truffle.nfi.backend.panama", + ], + "checkstyle" : "com.oracle.truffle.api", "javaCompliance" : "22+", - "forceJavac": True, + "forceJavac": True, # GR-51699 "annotationProcessors" : ["TRUFFLE_DSL_PROCESSOR"], "workingSets" : "Truffle", # disable SpotBugs and Jacoco as long as JDK 22 is unsupported [GR-49566] @@ -1906,9 +1922,8 @@ ], }, "subDir" : "src", - "javaCompliance" : "22+", - # GR-51699 - "forceJavac": True, + "javaCompliance" : "17+", + "forceJavac": True, # GR-51699 "dependencies" : [ "com.oracle.truffle.nfi.backend.panama", ], diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ArgumentNode.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ArgumentNode.java similarity index 100% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ArgumentNode.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ArgumentNode.java diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ClosureArgumentNode.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ClosureArgumentNode.java similarity index 100% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ClosureArgumentNode.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ClosureArgumentNode.java diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java similarity index 83% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java index 34147df51e2d..d8fb7f28cde0 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/ErrorContext.java @@ -48,22 +48,18 @@ import com.oracle.truffle.api.InternalResource.OS; -public class ErrorContext { - private static final String ERRNO_LOCATION; +public class ErrorContext extends AbstractErrorContext { - static { - ERRNO_LOCATION = switch (OS.getCurrent()) { - case DARWIN -> "__error"; - case LINUX -> "__errno_location"; - case WINDOWS -> "_errno"; - }; - } + private static final String ERRNO_LOCATION = switch (OS.getCurrent()) { + case DARWIN -> "__error"; + case LINUX -> "__errno_location"; + case WINDOWS -> "_errno"; + }; - @SuppressWarnings("preview") private MemorySegment errnoLocation; - final PanamaNFIContext ctx; + private MemorySegment errnoLocation; - @SuppressWarnings({"preview", "restricted"}) - MemorySegment lookupErrnoLocation() { + @SuppressWarnings("restricted") + private MemorySegment lookupErrnoLocation() { try { Linker linker = Linker.nativeLinker(); FunctionDescriptor desc = FunctionDescriptor.of(ValueLayout.JAVA_LONG); @@ -79,8 +75,9 @@ MemorySegment lookupErrnoLocation() { } } + @Override void initialize() { - if (this.errnoLocation == null) { + if (errnoLocation == null) { errnoLocation = lookupErrnoLocation(); } } @@ -90,17 +87,14 @@ private MemorySegment getErrnoLocation() { return errnoLocation; } - @SuppressWarnings("preview") + @Override int getNativeErrno() { return getErrnoLocation().get(ValueLayout.JAVA_INT, 0); } - @SuppressWarnings("preview") + @Override void setNativeErrno(int newErrno) { getErrnoLocation().set(ValueLayout.JAVA_INT, 0, newErrno); } - ErrorContext(PanamaNFIContext ctx, Thread thread) { - this.ctx = ctx; - } } diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java similarity index 98% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java index 6567c2d1147e..3121f6752bbd 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/FunctionExecuteNode.java @@ -123,7 +123,6 @@ abstract static class SignatureExecuteNode extends RootNode { @Override public abstract Object execute(VirtualFrame frame); - @SuppressWarnings("preview") MemorySegment getAddress(VirtualFrame frame) { return MemorySegment.ofAddress((long) frame.getArguments()[0]); } @@ -140,7 +139,6 @@ PanamaSignature getSig(VirtualFrame frame) { @ExplodeLoop public Object doGeneric(VirtualFrame frame) { Object[] args = getArgs(frame); - @SuppressWarnings("preview") MemorySegment address = getAddress(frame); PanamaSignature signature = getSig(frame); diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/NFIError.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/NFIError.java similarity index 100% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/NFIError.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/NFIError.java diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/NativePointer.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/NativePointer.java similarity index 100% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/NativePointer.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/NativePointer.java diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/NativeString.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/NativeString.java similarity index 100% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/NativeString.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/NativeString.java diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java new file mode 100644 index 000000000000..a2d708129d98 --- /dev/null +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.truffle.nfi.backend.panama; + +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.nfi.backend.spi.NFIBackend; + +public abstract class PanamaAccessor { + + private PanamaAccessor() { + // No instances. + } + + static boolean isSupported() { + return true; + } + + static NFIBackend createNFIBackend(PanamaNFILanguage language) { + return new PanamaNFIBackend(language); + } + + static AbstractPanamaNFIContext createPanamaNFIContext(PanamaNFILanguage language, Env env) { + return new PanamaNFIContext(language, env); + } + + static AbstractErrorContext createErrorContext() { + return new ErrorContext(); + } + +} diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java similarity index 98% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java index 95bed65a51e5..d9c6e1a2928c 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaClosure.java @@ -72,9 +72,9 @@ @ExportLibrary(InteropLibrary.class) final class PanamaClosure implements TruffleObject { - @SuppressWarnings("preview") final MemorySegment symbol; + final MemorySegment symbol; - PanamaClosure(@SuppressWarnings("preview") MemorySegment symbol) { + PanamaClosure(MemorySegment symbol) { this.symbol = symbol; } @@ -239,7 +239,7 @@ public Object execute(VirtualFrame frame) { // to avoid the JVM clobbering it PanamaNFILanguage language = PanamaNFILanguage.get(this); NFIState nfiState = language.getNFIState(); - ErrorContext ctx = language.errorContext.get(); + ErrorContext ctx = (ErrorContext) language.errorContext.get(); nfiState.setNFIErrno(ctx.getNativeErrno()); try { Object ret = callClosure.execute(frame); @@ -290,7 +290,7 @@ public Object execute(VirtualFrame frame) { // to avoid the JVM clobbering it PanamaNFILanguage language = PanamaNFILanguage.get(this); NFIState nfiState = language.getNFIState(); - ErrorContext ctx = language.errorContext.get(); + ErrorContext ctx = (ErrorContext) language.errorContext.get(); nfiState.setNFIErrno(ctx.getNativeErrno()); try { callClosure.execute(frame); @@ -337,7 +337,7 @@ public Object execute(VirtualFrame frame) { // to avoid the JVM clobbering it PanamaNFILanguage language = PanamaNFILanguage.get(this); NFIState nfiState = language.getNFIState(); - ErrorContext ctx = language.errorContext.get(); + ErrorContext ctx = (ErrorContext) language.errorContext.get(); nfiState.setNFIErrno(ctx.getNativeErrno()); try { Object ret = callClosure.execute(frame); diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java similarity index 94% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java index a6996c2addad..1505450e0981 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaLibrary.java @@ -63,20 +63,19 @@ final class PanamaLibrary implements TruffleObject { private static final EmptyKeysArray KEYS = new EmptyKeysArray(); - private final @SuppressWarnings("preview") SymbolLookup library; + private final SymbolLookup library; static PanamaLibrary createDefault() { - @SuppressWarnings("preview") SymbolLookup lookup = Linker.nativeLinker().defaultLookup(); return new PanamaLibrary(lookup); } - static PanamaLibrary create(@SuppressWarnings("preview") SymbolLookup library) { + static PanamaLibrary create(SymbolLookup library) { assert library != null; return new PanamaLibrary(library); } - private PanamaLibrary(@SuppressWarnings("preview") SymbolLookup library) { + private PanamaLibrary(SymbolLookup library) { this.library = library; } @@ -99,7 +98,6 @@ boolean isMemberReadable(@SuppressWarnings("unused") String member) { } @TruffleBoundary - @SuppressWarnings("preview") Optional doLookup(String name) { return library.find(name); } @@ -108,7 +106,6 @@ Optional doLookup(String name) { Object readMember(String symbol, @Bind Node node, @Cached InlinedBranchProfile exception) throws UnknownIdentifierException { - @SuppressWarnings("preview") Optional ret = doLookup(symbol); if (ret.isEmpty()) { exception.enter(node); diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java similarity index 99% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java index 1a3354c953ae..c77fc62a3d0c 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIBackend.java @@ -110,7 +110,7 @@ protected LoadLibraryNode(PanamaNFILanguage language, String name) { } @TruffleBoundary - @SuppressWarnings({"preview", "restricted"}) + @SuppressWarnings("restricted") private SymbolLookup doLoad() { PanamaNFIContext ctx = PanamaNFIContext.get(this); try { diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java similarity index 88% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java index 0bbc426f27e9..ec3dbed61f59 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaNFIContext.java @@ -40,6 +40,7 @@ */ package com.oracle.truffle.nfi.backend.panama; +import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleLanguage.ContextReference; @@ -48,10 +49,10 @@ import java.lang.foreign.Arena; -class PanamaNFIContext { +final class PanamaNFIContext extends AbstractPanamaNFIContext { final PanamaNFILanguage language; - @SuppressWarnings("preview") Arena arena; + Arena arena; @CompilationFinal Env env; PanamaNFIContext(PanamaNFILanguage language, Env env) { @@ -59,22 +60,23 @@ class PanamaNFIContext { this.env = env; } - @SuppressWarnings("preview") + @Override void initialize() { arena = Arena.ofShared(); } + @Override void patchEnv(Env env) { this.env = env; } + @Override void dispose() { if (arena != null) { arena.close(); } } - @SuppressWarnings("preview") Arena getContextArena() { return arena; } @@ -85,9 +87,9 @@ PanamaType lookupEnvType() { return null; } - private static final ContextReference REFERENCE = ContextReference.create(PanamaNFILanguage.class); + private static final ContextReference REFERENCE = ContextReference.create(PanamaNFILanguage.class); static PanamaNFIContext get(Node node) { - return REFERENCE.get(node); + return CompilerDirectives.castExact(REFERENCE.get(node), PanamaNFIContext.class); } } diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java similarity index 93% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java index 06f54b098905..7f9103867dee 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaSignature.java @@ -84,13 +84,13 @@ public static PanamaSignature create(PanamaNFIContext context, CachedSignatureIn return new PanamaSignature(info.functionDescriptor, upcallType, info); } - private final @SuppressWarnings("preview") FunctionDescriptor functionDescriptor; + private final FunctionDescriptor functionDescriptor; final CachedSignatureInfo signatureInfo; private final MethodType upcallType; - PanamaSignature(@SuppressWarnings("preview") FunctionDescriptor functionDescriptor, MethodType upcallType, CachedSignatureInfo signatureInfo) { + PanamaSignature(FunctionDescriptor functionDescriptor, MethodType upcallType, CachedSignatureInfo signatureInfo) { this.functionDescriptor = functionDescriptor; this.upcallType = upcallType; @@ -148,10 +148,9 @@ MethodType getUpcallMethodType() { } @TruffleBoundary - @SuppressWarnings({"preview", "restricted"}) + @SuppressWarnings("restricted") MemorySegment bind(MethodHandle cachedHandle, Object receiver, Node location) { MethodHandle bound = cachedHandle.bindTo(receiver); - @SuppressWarnings("preview") Arena arena = PanamaNFIContext.get(null).getContextArena(); try { return Linker.nativeLinker().upcallStub(bound, functionDescriptor, arena); @@ -175,7 +174,6 @@ static PanamaClosure doCachedExecutable(PanamaSignature signature, Object execut // the NFI frontend is taking care of that already MethodHandle cachedHandle = cachedClosureInfo.handle.asType(signature.getUpcallMethodType()); - @SuppressWarnings("preview") MemorySegment ret = signature.bind(cachedHandle, cachedExecutable, node); return new PanamaClosure(ret); @@ -188,7 +186,6 @@ static PanamaClosure doCachedSignature(PanamaSignature signature, Object executa @Cached("create(cachedSignatureInfo)") PolymorphicClosureInfo cachedClosureInfo) { assert signature.signatureInfo == cachedSignatureInfo; MethodHandle cachedHandle = cachedClosureInfo.handle.asType(signature.getUpcallMethodType()); - @SuppressWarnings("preview") MemorySegment ret = signature.bind(cachedHandle, executable, node); return new PanamaClosure(ret); } @@ -199,7 +196,6 @@ static PanamaClosure createClosure(PanamaSignature signature, Object executable, @Bind Node node) { PolymorphicClosureInfo cachedClosureInfo = PolymorphicClosureInfo.create(signature.signatureInfo); MethodHandle cachedHandle = cachedClosureInfo.handle.asType(signature.getUpcallMethodType()); - @SuppressWarnings("preview") MemorySegment ret = signature.bind(cachedHandle, executable, node); return new PanamaClosure(ret); } @@ -298,14 +294,12 @@ public static CachedSignatureInfo prepareSignatureInfo(PanamaType retType, ArgsS argTypes[i] = curState.lastArg; curState = curState.prev; } - @SuppressWarnings("preview") FunctionDescriptor descriptor = createDescriptor(argTypes, retType); MethodHandle downcallHandle = createDowncallHandle(descriptor, location); return new CachedSignatureInfo(PanamaNFILanguage.get(null), retType, argTypes, descriptor, downcallHandle); } - private static @SuppressWarnings("preview") FunctionDescriptor createDescriptor(PanamaType[] argTypes, PanamaType retType) { - @SuppressWarnings("preview") + private static FunctionDescriptor createDescriptor(PanamaType[] argTypes, PanamaType retType) { FunctionDescriptor descriptor = FunctionDescriptor.ofVoid(); if (retType.nativeLayout == null) { descriptor = descriptor.dropReturnLayout(); @@ -318,10 +312,10 @@ public static CachedSignatureInfo prepareSignatureInfo(PanamaType retType, ArgsS return descriptor; } - static MethodHandle createDowncallHandle(@SuppressWarnings("preview") FunctionDescriptor descriptor, Node location) { + static MethodHandle createDowncallHandle(FunctionDescriptor descriptor, Node location) { int parameterCount = descriptor.argumentLayouts().size(); try { - @SuppressWarnings({"preview", "restricted"}) + @SuppressWarnings("restricted") MethodHandle handle = Linker.nativeLinker().downcallHandle(descriptor).asSpreader(Object[].class, parameterCount).asType( MethodType.methodType(Object.class, new Class[]{MemorySegment.class, Object[].class})); return handle; @@ -353,12 +347,11 @@ ArgsState addArg(PanamaType type) { static final class CachedSignatureInfo { final PanamaType retType; final PanamaType[] argTypes; - final @SuppressWarnings("preview") FunctionDescriptor functionDescriptor; + final FunctionDescriptor functionDescriptor; final CallTarget callTarget; final MethodHandle downcallHandle; - CachedSignatureInfo(PanamaNFILanguage language, PanamaType retType, PanamaType[] argTypes, @SuppressWarnings("preview") FunctionDescriptor functionDescriptor, - MethodHandle downcallHandle) { + CachedSignatureInfo(PanamaNFILanguage language, PanamaType retType, PanamaType[] argTypes, FunctionDescriptor functionDescriptor, MethodHandle downcallHandle) { this.retType = retType; this.argTypes = argTypes; this.functionDescriptor = functionDescriptor; @@ -374,13 +367,13 @@ PanamaType getRetType() { return retType; } - Object execute(PanamaSignature signature, Object[] args, @SuppressWarnings("preview") MemorySegment segment, Node node) { + Object execute(PanamaSignature signature, Object[] args, MemorySegment segment, Node node) { assert signature.signatureInfo == this; CompilerAsserts.partialEvaluationConstant(retType); PanamaNFILanguage language = PanamaNFILanguage.get(node); NFIState nfiState = language.getNFIState(); - ErrorContext ctx = language.errorContext.get(); + ErrorContext ctx = (ErrorContext) language.errorContext.get(); try { // We need to set and capture native errno as close as possible to the native call // to avoid the JVM clobbering it @@ -391,7 +384,6 @@ Object execute(PanamaSignature signature, Object[] args, @SuppressWarnings("prev if (result == null) { return NativePointer.NULL; } else if (retType.type == NativeSimpleType.STRING) { - @SuppressWarnings("preview") long pointer = ((MemorySegment) result).address(); return new NativeString(pointer); } else if (retType.type == NativeSimpleType.POINTER) { diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java similarity index 95% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java index 25f4e547df07..f65c2c9ed9e5 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaSymbol.java @@ -50,9 +50,9 @@ @ExportLibrary(InteropLibrary.class) final class PanamaSymbol implements TruffleObject { - @SuppressWarnings("preview") final MemorySegment symbol; + final MemorySegment symbol; - PanamaSymbol(@SuppressWarnings("preview") MemorySegment symbol) { + PanamaSymbol(MemorySegment symbol) { this.symbol = symbol; } diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java similarity index 98% rename from truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java rename to truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java index f967f8105e0d..49d242a9d5ac 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama.jdk22/src/com/oracle/truffle/nfi/backend/panama/PanamaType.java @@ -51,12 +51,11 @@ class PanamaType { - @SuppressWarnings("preview") final MemoryLayout nativeLayout; + final MemoryLayout nativeLayout; final Class javaType; final Class javaRetType; final NativeSimpleType type; - @SuppressWarnings("preview") PanamaType(NativeSimpleType type) throws UnsupportedOperationException { this.type = type; switch (type) { diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractErrorContext.java b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractErrorContext.java new file mode 100644 index 000000000000..da21c9617f38 --- /dev/null +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractErrorContext.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.truffle.nfi.backend.panama; + +public abstract class AbstractErrorContext { + + abstract void initialize(); + + abstract int getNativeErrno(); + + abstract void setNativeErrno(int newErrno); + +} diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractPanamaNFIContext.java b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractPanamaNFIContext.java new file mode 100644 index 000000000000..87f222d27bb1 --- /dev/null +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/AbstractPanamaNFIContext.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.truffle.nfi.backend.panama; + +import com.oracle.truffle.api.TruffleLanguage.Env; + +public abstract class AbstractPanamaNFIContext { + + abstract void initialize(); + + abstract void patchEnv(Env env); + + abstract void dispose(); + +} diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java new file mode 100644 index 000000000000..235c70f6a859 --- /dev/null +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaAccessor.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * The Universal Permissive License (UPL), Version 1.0 + * + * Subject to the condition set forth below, permission is hereby granted to any + * person obtaining a copy of this software, associated documentation and/or + * data (collectively the "Software"), free of charge and under any and all + * copyright rights in the Software, and any and all patent rights owned or + * freely licensable by each licensor hereunder covering either (i) the + * unmodified Software as contributed to or provided by such licensor, or (ii) + * the Larger Works (as defined below), to deal in both + * + * (a) the Software, and + * + * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if + * one is included with the Software each a "Larger Work" to which the Software + * is contributed by such licensors), + * + * without restriction, including without limitation the rights to copy, create + * derivative works of, display, perform, and distribute the Software and make, + * use, sell, offer for sale, import, export, have made, and have sold the + * Software and the Larger Work(s), and to sublicense the foregoing rights on + * either these or other terms. + * + * This license is subject to the following condition: + * + * The above copyright notice and either this complete permission notice or at a + * minimum a reference to the UPL must be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.oracle.truffle.nfi.backend.panama; + +import com.oracle.truffle.api.TruffleLanguage.Env; +import com.oracle.truffle.nfi.backend.spi.NFIBackend; + +public abstract class PanamaAccessor { + + private PanamaAccessor() { + // No instances. + } + + static boolean isSupported() { + return false; + } + + @SuppressWarnings("unused") + static NFIBackend createNFIBackend(PanamaNFILanguage language) { + throw new UnsupportedOperationException(); + } + + @SuppressWarnings("unused") + static AbstractPanamaNFIContext createPanamaNFIContext(PanamaNFILanguage language, Env env) { + throw new UnsupportedOperationException(); + } + + static AbstractErrorContext createErrorContext() { + throw new UnsupportedOperationException(); + } + +} diff --git a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFILanguage.java b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFILanguage.java index 01d909be8cda..cf7dbf422bc7 100644 --- a/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFILanguage.java +++ b/truffle/src/com.oracle.truffle.nfi.backend.panama/src/com/oracle/truffle/nfi/backend/panama/PanamaNFILanguage.java @@ -56,15 +56,15 @@ import com.oracle.truffle.nfi.backend.spi.NFIState; @TruffleLanguage.Registration(id = "internal/nfi-panama", name = "nfi-panama", version = "0.1", characterMimeTypes = PanamaNFILanguage.MIME_TYPE, internal = true, services = NFIBackendFactory.class, contextPolicy = ContextPolicy.SHARED) -public class PanamaNFILanguage extends TruffleLanguage { +public class PanamaNFILanguage extends TruffleLanguage { public static final String MIME_TYPE = "trufflenfi/panama"; - @CompilationFinal private PanamaNFIBackend backend; + @CompilationFinal private NFIBackend backend; private final Assumption singleContextAssumption = Truffle.getRuntime().createAssumption("panama backend single context"); - public final ContextThreadLocal errorContext = createErrorContext(); + public final ContextThreadLocal errorContext = createErrorContext(); @CompilationFinal private ContextThreadLocal state; @@ -83,7 +83,7 @@ protected void initializeMultipleContexts() { } @Override - protected PanamaNFIContext createContext(Env env) { + protected AbstractPanamaNFIContext createContext(Env env) { env.registerService(new NFIBackendFactory() { @Override @@ -93,72 +93,73 @@ public String getBackendId() { @Override public NFIBackend createBackend(ContextThreadLocal newState) { - if (backend == null) { - /* - * Make sure there is exactly one backend instance per engine. That way we can - * use identity equality on the backend object for caching decisions. - */ - backend = new PanamaNFIBackend(PanamaNFILanguage.this); - state = newState; + if (PanamaAccessor.isSupported()) { + if (backend == null) { + /* + * Make sure there is exactly one backend instance per engine. That way we + * can use identity equality on the backend object for caching decisions. + */ + backend = PanamaAccessor.createNFIBackend(PanamaNFILanguage.this); + state = newState; + } + return backend; + } else { + return null; } - return backend; } }); - try { - return new PanamaNFIContext(this, env); - } catch (UnsupportedClassVersionError e) { - /* - * We're missing the --enable-preview flag. Fail gracefully here, this is only a problem - * if we're actually being used. - */ + + if (PanamaAccessor.isSupported()) { + return PanamaAccessor.createPanamaNFIContext(this, env); + } else { + // JDK < 22, Panama is not available. Fail gracefully here to give a proper + // NFIParserException later. return null; } } - public final ContextThreadLocal createErrorContext() { - try { - return locals.createContextThreadLocal(ErrorContext::new); - } catch (UnsupportedClassVersionError e) { - /* - * We're missing the --enable-preview flag. Fail gracefully here, this is only a problem - * if we're actually being used. - */ + public final ContextThreadLocal createErrorContext() { + if (PanamaAccessor.isSupported()) { + return locals.createContextThreadLocal((ctx, thread) -> PanamaAccessor.createErrorContext()); + } else { + // JDK < 22, Panama is not available. Fail gracefully here to give a proper + // NFIParserException later. return null; } } @Override - protected void initializeContext(PanamaNFIContext context) throws Exception { - context.initialize(); - errorContext.get().initialize(); + protected void initializeContext(AbstractPanamaNFIContext context) throws Exception { + if (PanamaAccessor.isSupported()) { + context.initialize(); + errorContext.get().initialize(); + } } @Override - protected void initializeThread(PanamaNFIContext context, Thread thread) { - ErrorContext ctx = errorContext.get(context.env.getContext(), thread); - assert thread == Thread.currentThread(); - // we need to get the thread-local errno pointer - // this is only possible on the correct thread - ctx.initialize(); + protected void initializeThread(AbstractPanamaNFIContext context, Thread thread) { + if (PanamaAccessor.isSupported()) { + assert thread == Thread.currentThread(); + // we need to get the thread-local errno pointer + // this is only possible on the correct thread + errorContext.get().initialize(); + } } @Override - protected boolean patchContext(PanamaNFIContext context, Env newEnv) { - context.patchEnv(newEnv); - context.initialize(); + protected boolean patchContext(AbstractPanamaNFIContext context, Env newEnv) { + if (PanamaAccessor.isSupported()) { + context.patchEnv(newEnv); + context.initialize(); + } return true; } @Override - protected void disposeContext(PanamaNFIContext context) { - if (context == null) { - /* - * This means we hit the UnsupportedClassVersionError before in createContext. Since - * initializeContext was never called, we're fine here, just ignore this. - */ - return; + protected void disposeContext(AbstractPanamaNFIContext context) { + if (PanamaAccessor.isSupported()) { + context.dispose(); } - context.dispose(); } @Override diff --git a/truffle/src/com.oracle.truffle.nfi/src/com/oracle/truffle/nfi/NFIContext.java b/truffle/src/com.oracle.truffle.nfi/src/com/oracle/truffle/nfi/NFIContext.java index 637f3222487e..6af67fa81d9c 100644 --- a/truffle/src/com.oracle.truffle.nfi/src/com/oracle/truffle/nfi/NFIContext.java +++ b/truffle/src/com.oracle.truffle.nfi/src/com/oracle/truffle/nfi/NFIContext.java @@ -96,9 +96,11 @@ API getAPI(String backendId, Node node) { env.initializeLanguage(language); NFIBackend backend = backendFactory.createBackend(NFILanguage.get(null).nfiState); - API api = new API(backendId, backend); - apiCache.put(backendFactory.getBackendId(), api); - return api; + if (backend != null) { + API api = new API(backendId, backend); + apiCache.put(backendFactory.getBackendId(), api); + return api; + } } } } finally {