From 6177c87f6207f5c7fd8d759ee88017d74c1e9474 Mon Sep 17 00:00:00 2001 From: Michael Simacek Date: Mon, 18 May 2026 14:35:57 +0200 Subject: [PATCH 1/3] Always reraise UnsupportedPosixFeatureException as a python exception --- .../oracle/graal/python/test/SocketTests.java | 27 +-- .../modules/FaulthandlerModuleBuiltins.java | 5 +- .../builtins/modules/FcntlModuleBuiltins.java | 162 +++++++++--------- .../builtins/modules/PosixModuleBuiltins.java | 88 ++++++---- .../builtins/modules/PwdModuleBuiltins.java | 9 +- .../modules/ResourceModuleBuiltins.java | 4 +- .../modules/SelectModuleBuiltins.java | 6 +- .../modules/SignalModuleBuiltins.java | 18 +- .../modules/SocketModuleBuiltins.java | 14 +- .../modules/io/BufferedWriterNodes.java | 14 +- .../builtins/modules/io/FileIOBuiltins.java | 18 +- .../multiprocessing/SemLockBuiltins.java | 8 +- .../python/builtins/objects/mmap/PMMap.java | 14 +- .../objects/posix/DirEntryBuiltins.java | 6 +- .../objects/socket/SocketBuiltins.java | 18 +- .../builtins/objects/socket/SocketNodes.java | 10 +- .../builtins/objects/socket/SocketUtils.java | 13 +- .../objects/ssl/SSLOperationNode.java | 11 +- .../python/nodes/PConstructAndRaiseNode.java | 21 ++- .../python/runtime/EmulatedPosixSupport.java | 65 +++---- .../python/runtime/LoggingPosixSupport.java | 80 +++++++-- .../graal/python/runtime/NFIPosixSupport.java | 6 +- .../python/runtime/PosixSupportLibrary.java | 63 ++++--- .../python/runtime/PreInitPosixSupport.java | 19 +- 24 files changed, 397 insertions(+), 302 deletions(-) diff --git a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/SocketTests.java b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/SocketTests.java index 10e2de899c..24c5b8321f 100644 --- a/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/SocketTests.java +++ b/graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/SocketTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, 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 @@ -123,6 +123,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.Inet6SockAddr; import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidAddressException; import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidUnixSocketPathException; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.SelectResult; @@ -170,20 +171,20 @@ public void setUp() { } @Test - public void fillUniversalSockAddrInet4() { + public void fillUniversalSockAddrInet4() throws PosixException { Inet4SockAddr addr = new Inet4SockAddr(12345, INADDR_LOOPBACK.value); checkUsa(addr, createUsa(addr)); } @Test - public void fillUniversalSockAddrInet6() { + public void fillUniversalSockAddrInet6() throws PosixException { assumeTrue(isInet6Supported()); Inet6SockAddr addr = new Inet6SockAddr(12345, IN6ADDR_LOOPBACK, 12, 1); checkUsa(addr, createUsa(addr)); } @Test - public void fillUniversalSockAddrUnix() { + public void fillUniversalSockAddrUnix() throws PosixException { assumeTrue("native".equals(backendName)); byte[] path = new byte[]{65, 0}; UnixSockAddr addr = new UnixSockAddr(path); @@ -638,7 +639,7 @@ public void nonBlockingAccept() throws PosixException { lib.accept(posixSupport, srv.fd); fail("Expected accept() to fail with EWOULDBLOCK"); } catch (PosixException e) { - assertEquals(OSErrorEnum.EWOULDBLOCK.getNumber(), e.getErrorCode()); + assertTrue(e.hasErrno(OSErrorEnum.EWOULDBLOCK)); } cli.connect(srv.usa()); srv.accept(cli.address()); @@ -698,7 +699,7 @@ public void streamSelect() throws PosixException { } @Test - public void getnameinfo() throws GetAddrInfoException { + public void getnameinfo() throws PosixException, GetAddrInfoException { Object[] res = lib.getnameinfo(posixSupport, createUsa(new Inet6SockAddr(443, IN6ADDR_LOOPBACK, 0, 0)), NI_NUMERICSERV.value | NI_NUMERICHOST.value); assertThat(p2s(res[0]), anyOf(equalTo("::1"), equalTo("0:0:0:0:0:0:0:1%0"))); assertEquals("443", p2s(res[1])); @@ -712,7 +713,7 @@ public void getnameinfo() throws GetAddrInfoException { } @Test - public void getnameinfoUdp() throws GetAddrInfoException { + public void getnameinfoUdp() throws PosixException, GetAddrInfoException { assumeTrue(runsOnLinux()); Object[] res = lib.getnameinfo(posixSupport, createUsa(new Inet4SockAddr(512, INADDR_LOOPBACK.value)), NI_NUMERICHOST.value); assertEquals("exec", p2s(res[1])); @@ -774,7 +775,7 @@ public void getaddrinfoBadFlags() { } @Test - public void getaddrinfoServiceOnly() throws GetAddrInfoException { + public void getaddrinfoServiceOnly() throws PosixException, GetAddrInfoException { Object service = s2p("https"); AddrInfoCursor aic = lib.getaddrinfo(posixSupport, null, service, AF_UNSPEC.value, SOCK_STREAM.value, 0, 0); cleanup.add(() -> aicLib.release(aic)); @@ -795,7 +796,7 @@ public void getaddrinfoServiceOnly() throws GetAddrInfoException { } @Test - public void getaddrinfoPassive() throws GetAddrInfoException { + public void getaddrinfoPassive() throws PosixException, GetAddrInfoException { Object service = s2p("https"); AddrInfoCursor aic = lib.getaddrinfo(posixSupport, null, service, AF_INET.value, 0, IPPROTO_TCP.value, AI_PASSIVE.value); cleanup.add(() -> aicLib.release(aic)); @@ -811,7 +812,7 @@ public void getaddrinfoPassive() throws GetAddrInfoException { } @Test - public void getaddrinfoServerOnlyNoCanon() throws GetAddrInfoException { + public void getaddrinfoServerOnlyNoCanon() throws PosixException, GetAddrInfoException { Object node = s2p("localhost"); AddrInfoCursor aic = lib.getaddrinfo(posixSupport, node, null, AF_UNSPEC.value, SOCK_DGRAM.value, 0, 0); cleanup.add(() -> aicLib.release(aic)); @@ -831,7 +832,7 @@ public void getaddrinfoServerOnlyNoCanon() throws GetAddrInfoException { } @Test - public void getaddrinfo() throws GetAddrInfoException { + public void getaddrinfo() throws PosixException, GetAddrInfoException { Object node = s2p("localhost"); Object service = s2p("https"); AddrInfoCursor aic = lib.getaddrinfo(posixSupport, node, service, AF_INET.value, 0, IPPROTO_TCP.value, AI_CANONNAME.value); @@ -1066,7 +1067,7 @@ private String p2s(Object p) { } private static void expectErrno(ThrowingRunnable runnable, OSErrorEnum... expectedErrorCodes) { - PosixException exception = Assert.assertThrows(PosixException.class, runnable); + PosixErrnoException exception = Assert.assertThrows(PosixErrnoException.class, runnable); if (Stream.of(expectedErrorCodes).noneMatch(e -> exception.getErrorCode() == e.getNumber())) { String names = Stream.of(expectedErrorCodes).map(OSErrorEnum::name).collect(Collectors.joining(" or ")); fail("Expected PosixException with error code " + names + " but the actual error code was " + exception.getErrorCode() + " (" + exception + ")"); @@ -1086,7 +1087,7 @@ private int createSocket(int family, int type, int protocol) throws PosixExcepti return sockfd; } - private UniversalSockAddr createUsa(FamilySpecificSockAddr src) { + private UniversalSockAddr createUsa(FamilySpecificSockAddr src) throws PosixException { if (src instanceof Inet4SockAddr inet4SockAddr) { return lib.createUniversalSockAddrInet4(posixSupport, inet4SockAddr); } else if (src instanceof Inet6SockAddr inet6SockAddr) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java index 4dd8e5a978..c745dae321 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FaulthandlerModuleBuiltins.java @@ -75,15 +75,14 @@ import com.oracle.graal.python.nodes.function.PythonBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; -import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; -import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.ExceptionUtils; @@ -291,8 +290,6 @@ private static PNone raiseFatalSignal(VirtualFrame frame, PythonContext context, } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } return PNone.NONE; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java index 49940be0e3..549d41c089 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FcntlModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2026, 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 @@ -214,103 +214,99 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat @Cached SysModuleBuiltins.AuditNode auditNode) { auditNode.audit(inliningTarget, "fcnt.ioctl", fd, request, arg); - try { - int intArg = 0; - if (arg != PNone.NO_VALUE) { - Object buffer = null; - // Buffer argument - if (acquireLib.hasBuffer(arg)) { - boolean writable = false; + int intArg = 0; + if (arg != PNone.NO_VALUE) { + Object buffer = null; + // Buffer argument + if (acquireLib.hasBuffer(arg)) { + boolean writable = false; + try { + buffer = acquireLib.acquireWritable(arg, frame, callData); + writable = true; + } catch (PException e) { try { - buffer = acquireLib.acquireWritable(arg, frame, callData); - writable = true; - } catch (PException e) { - try { - buffer = acquireLib.acquireReadonly(arg, frame, callData); - } catch (PException e1) { - // ignore - } + buffer = acquireLib.acquireReadonly(arg, frame, callData); + } catch (PException e1) { + // ignore } - if (buffer != null) { - try { - int len = bufferLib.getBufferLength(buffer); - boolean writeBack = false; - boolean releaseGil = true; - byte[] ioctlArg = null; - if (writable && mutateArg) { - writeBack = true; - if (bufferLib.hasInternalByteArray(buffer)) { - byte[] internalArray = bufferLib.getInternalByteArray(buffer); - if (internalArray.length > len && internalArray[len] == 0) { - writeBack = false; - releaseGil = false; // Could resize concurrently - ioctlArg = internalArray; - } - } - } else { - if (len > IOCTL_BUFSZ) { - throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); + } + if (buffer != null) { + try { + int len = bufferLib.getBufferLength(buffer); + boolean writeBack = false; + boolean releaseGil = true; + byte[] ioctlArg = null; + if (writable && mutateArg) { + writeBack = true; + if (bufferLib.hasInternalByteArray(buffer)) { + byte[] internalArray = bufferLib.getInternalByteArray(buffer); + if (internalArray.length > len && internalArray[len] == 0) { + writeBack = false; + releaseGil = false; // Could resize concurrently + ioctlArg = internalArray; } } - if (ioctlArg == null) { - ioctlArg = new byte[len + 1]; - bufferLib.readIntoByteArray(buffer, 0, ioctlArg, 0, len); + } else { + if (len > IOCTL_BUFSZ) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); } - try { - int ret = callIoctlBytes(frame, inliningTarget, fd, request, ioctlArg, releaseGil, posixLib, gilNode, constructAndRaiseNode); - if (writable && mutateArg) { - return ret; - } else { - return PFactory.createBytes(context.getLanguage(inliningTarget), ioctlArg, len); - } - } finally { - if (writeBack) { - bufferLib.writeFromByteArray(buffer, 0, ioctlArg, 0, len); - } + } + if (ioctlArg == null) { + ioctlArg = new byte[len + 1]; + bufferLib.readIntoByteArray(buffer, 0, ioctlArg, 0, len); + } + try { + int ret = callIoctlBytes(frame, inliningTarget, fd, request, ioctlArg, releaseGil, posixLib, gilNode, constructAndRaiseNode); + if (writable && mutateArg) { + return ret; + } else { + return PFactory.createBytes(context.getLanguage(inliningTarget), ioctlArg, len); } } finally { - bufferLib.release(buffer, frame, callData); + if (writeBack) { + bufferLib.writeFromByteArray(buffer, 0, ioctlArg, 0, len); + } } + } finally { + bufferLib.release(buffer, frame, callData); } } - // string arg - TruffleString stringArg = null; - try { - stringArg = castToString.execute(inliningTarget, arg); - } catch (CannotCastException e) { - // ignore - } - if (stringArg != null) { - TruffleString.Encoding utf8 = TruffleString.Encoding.UTF_8; - stringArg = switchEncodingNode.execute(stringArg, utf8); - int len = stringArg.byteLength(utf8); - if (len > IOCTL_BUFSZ) { - throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); - } - byte[] ioctlArg = new byte[len + 1]; - copyToByteArrayNode.execute(stringArg, 0, ioctlArg, 0, len, utf8); - callIoctlBytes(frame, inliningTarget, fd, request, ioctlArg, true, posixLib, gilNode, constructAndRaiseNode); - return PFactory.createBytes(context.getLanguage(inliningTarget), ioctlArg, len); + } + // string arg + TruffleString stringArg = null; + try { + stringArg = castToString.execute(inliningTarget, arg); + } catch (CannotCastException e) { + // ignore + } + if (stringArg != null) { + TruffleString.Encoding utf8 = TruffleString.Encoding.UTF_8; + stringArg = switchEncodingNode.execute(stringArg, utf8); + int len = stringArg.byteLength(utf8); + if (len > IOCTL_BUFSZ) { + throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.IOCTL_STRING_ARG_TOO_LONG); } - - // int arg - intArg = asIntNode.execute(frame, inliningTarget, arg); - // fall through + byte[] ioctlArg = new byte[len + 1]; + copyToByteArrayNode.execute(stringArg, 0, ioctlArg, 0, len, utf8); + callIoctlBytes(frame, inliningTarget, fd, request, ioctlArg, true, posixLib, gilNode, constructAndRaiseNode); + return PFactory.createBytes(context.getLanguage(inliningTarget), ioctlArg, len); } - // default arg or int arg + // int arg + intArg = asIntNode.execute(frame, inliningTarget, arg); + // fall through + } + + // default arg or int arg + try { + gilNode.release(true); try { - gilNode.release(true); - try { - return posixLib.ioctlInt(getPosixSupport(), fd, request, intArg); - } finally { - gilNode.acquire(); - } - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); + return posixLib.ioctlInt(getPosixSupport(), fd, request, intArg); + } finally { + gilNode.acquire(); } - } catch (PosixSupportLibrary.UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java index b24290478b..46fa0cb39d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java @@ -121,9 +121,9 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.Buffer; import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; -import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; @@ -581,9 +581,15 @@ static long getUid(@Bind PythonContext context, @GenerateNodeFactory public abstract static class GetEUidNode extends PythonBuiltinNode { @Specialization - static long getUid(@Bind PythonContext context, - @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.geteuid(context.getPosixSupport()); + static long getUid(@Bind Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { + try { + return posixLib.geteuid(context.getPosixSupport()); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); + } } } @@ -601,9 +607,15 @@ static long getGid(@Bind PythonContext context, @GenerateNodeFactory public abstract static class GetEGidNode extends PythonBuiltinNode { @Specialization - static long getGid(@Bind PythonContext context, - @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.getegid(context.getPosixSupport()); + static long getGid(@Bind Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { + try { + return posixLib.getegid(context.getPosixSupport()); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); + } } } @@ -611,9 +623,15 @@ static long getGid(@Bind PythonContext context, @GenerateNodeFactory public abstract static class GetPpidNode extends PythonBuiltinNode { @Specialization - static long getPpid(@Bind PythonContext context, - @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.getppid(context.getPosixSupport()); + static long getPpid(@Bind Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { + try { + return posixLib.getppid(context.getPosixSupport()); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); + } } } @@ -714,9 +732,15 @@ static Object getPpid(VirtualFrame frame, @GenerateNodeFactory public abstract static class GetPgrpNode extends PythonBuiltinNode { @Specialization - static long getPpid(@Bind PythonContext context, - @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.getpgrp(context.getPosixSupport()); + static long getPpid(@Bind Node inliningTarget, + @Bind PythonContext context, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { + try { + return posixLib.getpgrp(context.getPosixSupport()); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); + } } } @@ -835,7 +859,7 @@ static int open(VirtualFrame frame, PosixPath path, int flags, int mode, int dir return posixLib.openat(context.getPosixSupport(), dirFd, path.value, fixedFlags, mode); } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { gil.acquire(); // need GIL to construct OSError @@ -931,9 +955,9 @@ public static PBytes read(int fd, int length, throw CompilerDirectives.shouldNotReachHere("Posix read() returned more bytes than requested"); } return PFactory.createBytes(PythonLanguage.get(inliningTarget), result.data, (int) result.length); - } catch (PosixException e) { + } catch (PosixErrnoException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw e; @@ -984,9 +1008,9 @@ public static long write(int fd, byte[] dataBytes, while (true) { try { return posixLib.write(posixSupport, fd, new Buffer(dataBytes, dataLen)); - } catch (PosixException e) { + } catch (PosixErrnoException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw e; @@ -1204,7 +1228,7 @@ static PNone ftruncate(VirtualFrame frame, int fd, long length, return PNone.NONE; } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -1283,7 +1307,7 @@ static PNone fsync(VirtualFrame frame, int fd, return PNone.NONE; } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -1482,7 +1506,7 @@ static PTuple doStatFd(VirtualFrame frame, int fd, return createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, out); } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -1832,7 +1856,7 @@ static PNone fchdir(VirtualFrame frame, int fd, return PNone.NONE; } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -2286,8 +2310,14 @@ protected ArgumentClinicProvider getArgumentClinic() { @Specialization static boolean access(PosixPath path, int mode, int dirFd, boolean effectiveIds, boolean followSymlinks, @Bind PythonContext context, - @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) { - return posixLib.faccessat(context.getPosixSupport(), dirFd, path.value, mode, effectiveIds, followSymlinks); + @Bind Node inliningTarget, + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { + try { + return posixLib.faccessat(context.getPosixSupport(), dirFd, path.value, mode, effectiveIds, followSymlinks); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); + } } } @@ -2344,7 +2374,7 @@ static PNone chmodFollow(VirtualFrame frame, PosixPath path, int mode, int dirFd posixLib.fchmodat(context.getPosixSupport(), dirFd, path.value, mode, followSymlinks); } catch (PosixException e) { // TODO CPython checks for ENOTSUP as well - if (e.getErrorCode() == OSErrorEnum.EOPNOTSUPP.getNumber() && !followSymlinks) { + if (e.hasErrno(OSErrorEnum.EOPNOTSUPP) && !followSymlinks) { if (dirFd != AT_FDCWD.value) { throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.CANNOT_USE_FD_AND_FOLLOW_SYMLINKS_TOGETHER, "chmod"); } else { @@ -2630,14 +2660,12 @@ static PTuple waitpid(VirtualFrame frame, long pid, int options, return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{result[0], result[1]}); } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { gil.acquire(); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } finally { @@ -2992,8 +3020,6 @@ static PNone kill(VirtualFrame frame, long pid, int signal, return PNone.NONE; } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } @@ -3021,8 +3047,6 @@ static PNone kill(VirtualFrame frame, long pid, int signal, return PNone.NONE; } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java index 3d72ed4ef0..b1f94c8e3e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PwdModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2026, 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 @@ -74,7 +74,6 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; -import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.exception.PException; import com.oracle.graal.python.runtime.object.PFactory; @@ -167,8 +166,6 @@ static Object doGetpwuid(VirtualFrame frame, Object uidObj, } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } if (pwd == null) { throw raiseUidNotFound(inliningTarget, raiseNode); @@ -216,8 +213,6 @@ static Object doGetpwname(VirtualFrame frame, TruffleString name, } } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } if (pwd == null) { throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.KeyError, ErrorMessages.GETPWNAM_NAME_NOT_FOUND, name); @@ -242,8 +237,6 @@ static Object doGetpall(VirtualFrame frame, entries = posixLib.getpwentries(context.getPosixSupport()); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } PythonLanguage language = context.getLanguage(inliningTarget); Object[] result = new Object[entries.length]; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java index 79c3ec20e1..59f59a6a52 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ResourceModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2026, 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 @@ -163,7 +163,7 @@ static PTuple getruusage(VirtualFrame frame, int who, try { rusage = posixLib.getrusage(posixSupport, who); } catch (PosixException e) { - if (e.getErrorCode() == OSErrorEnum.EINVAL.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINVAL)) { throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.RUSAGE_INVALID_WHO); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java index 1691cfe355..abdb923349 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SelectModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, 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 @@ -155,13 +155,13 @@ static PTuple doGeneric(VirtualFrame frame, Object rlist, Object wlist, Object x } finally { gil.acquire(); } - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } catch (ChannelNotSelectableException e) { // GraalPython hack: if one of the channels is not selectable (can happen only in // the emulated mode), we just return everything. notSelectableBranch.enter(inliningTarget); return PFactory.createTuple(language, new Object[]{rlist, wlist, xlist}); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } return PFactory.createTuple(language, new PList[]{ toList(result.getReadFds(), readFDs, language), diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java index 2beb5300c5..8b5690aa9b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SignalModuleBuiltins.java @@ -58,8 +58,8 @@ import com.oracle.graal.python.annotations.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; -import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.PythonBuiltinClassType; +import com.oracle.graal.python.builtins.PythonBuiltins; import com.oracle.graal.python.builtins.objects.PNone; import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.module.PythonModule; @@ -82,9 +82,9 @@ import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode; import com.oracle.graal.python.runtime.AsyncHandler; import com.oracle.graal.python.runtime.PosixSupportLibrary; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; -import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.runtime.exception.PException; @@ -298,8 +298,6 @@ static int alarm(VirtualFrame frame, int seconds, return posixLib.alarm(context.getPosixSupport(), seconds); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } @@ -472,8 +470,6 @@ static PNone doInt(VirtualFrame frame, int signum, posixLib.raise(context.getPosixSupport(), signum); } catch (PosixException e) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } return PNone.NONE; } @@ -508,8 +504,6 @@ static Object doIt(VirtualFrame frame, int which, Object seconds, Object interva return createResultTuple(language, posixLib.setitimer(context.getPosixSupport(), which, delay, intervalTimeval)); } catch (PosixException e) { throw raiseItimerError(frame, inliningTarget, e, constructAndRaiseNode); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } @@ -530,7 +524,11 @@ private static double toSeconds(Timeval timeval) { } private static PException raiseItimerError(VirtualFrame frame, Node inliningTarget, PosixException e, PConstructAndRaiseNode.Lazy constructAndRaiseNode) { - throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, PythonBuiltinClassType.SignalItimerError, new Object[]{e.getErrorCode(), e.getMessageAsTruffleString()}); + if (e instanceof PosixErrnoException errnoException) { + throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, PythonBuiltinClassType.SignalItimerError, + new Object[]{errnoException.getErrorCode(), errnoException.getMessageAsTruffleString()}); + } + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -555,8 +553,6 @@ static Object doIt(VirtualFrame frame, int which, return SetitimerNode.createResultTuple(language, posixLib.getitimer(context.getPosixSupport(), which)); } catch (PosixException e) { throw SetitimerNode.raiseItimerError(frame, inliningTarget, e, constructAndRaiseNode); - } catch (UnsupportedPosixFeatureException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java index 1001fccd42..bc8e0d3a94 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SocketModuleBuiltins.java @@ -308,6 +308,8 @@ static Object doGeneric(VirtualFrame frame, Object ip, } catch (GetAddrInfoException e) { // TODO convert error code from gaierror to herror throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, SocketHError, new Object[]{1, e.getMessageAsTruffleString()}); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -413,6 +415,7 @@ static Object getServByName(TruffleString serviceName, Object protocolNameObj, @Cached TruffleString.ToJavaStringNode toJavaStringNode, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached PRaiseNode raiseNode) { TruffleString protocolName; if (noneProtocol.profile(inliningTarget, PGuards.isNoValue(protocolNameObj))) { @@ -450,6 +453,8 @@ static Object getServByName(TruffleString serviceName, Object protocolNameObj, } } catch (GetAddrInfoException e) { throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); } } @@ -475,6 +480,7 @@ Object getServByPort(int port, Object protocolNameObj, @Cached TruffleString.EqualNode equalNode, @Cached SysModuleBuiltins.AuditNode auditNode, @Cached GilNode gil, + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, @Cached PRaiseNode raiseNode) { TruffleString protocolName; if (nonProtocol.profile(inliningTarget, PGuards.isNoValue(protocolNameObj))) { @@ -510,6 +516,8 @@ Object getServByPort(int port, Object protocolNameObj, } } catch (GetAddrInfoException e) { throw raiseNode.raise(inliningTarget, OSError, ErrorMessages.SERVICE_PROTO_NOT_FOUND); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); } } @@ -612,6 +620,8 @@ static Object getNameInfo(VirtualFrame frame, PTuple sockaddr, int flags, return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{host, service}); } catch (GetAddrInfoException e) { throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, SocketGAIError, new Object[]{e.getErrorCode(), e.getMessageAsTruffleString()}); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -686,6 +696,8 @@ static Object getAddrInfo(VirtualFrame frame, Object hostObject, Object portObje } } catch (GetAddrInfoException e) { throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, SocketGAIError, new Object[]{e.getErrorCode(), e.getMessageAsTruffleString()}); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } try { SequenceStorage storage = new ObjectSequenceStorage(5); @@ -737,7 +749,7 @@ static Object close(VirtualFrame frame, Object fdObj, } } catch (PosixException e) { // CPython ignores ECONNRESET on close - if (e.getErrorCode() != OSErrorEnum.ECONNRESET.getNumber()) { + if (!e.hasErrno(OSErrorEnum.ECONNRESET)) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java index 76944609fa..9176176bc7 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterNodes.java @@ -46,10 +46,10 @@ import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.isValidWriteBuffer; import static com.oracle.graal.python.builtins.modules.io.BufferedIOUtil.rawOffset; import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE; +import static com.oracle.graal.python.nodes.ErrorMessages.FILE_NOT_OPEN_FOR_S; +import static com.oracle.graal.python.nodes.ErrorMessages.IO_CLOSED; import static com.oracle.graal.python.nodes.ErrorMessages.IO_S_INVALID_LENGTH; import static com.oracle.graal.python.nodes.ErrorMessages.WRITE_COULD_NOT_COMPLETE_WITHOUT_BLOCKING; -import static com.oracle.graal.python.nodes.ErrorMessages.IO_CLOSED; -import static com.oracle.graal.python.nodes.ErrorMessages.FILE_NOT_OPEN_FOR_S; import static com.oracle.graal.python.runtime.exception.PythonErrorType.IOUnsupportedOperation; import static com.oracle.graal.python.runtime.exception.PythonErrorType.OSError; import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError; @@ -57,18 +57,19 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins; import com.oracle.graal.python.builtins.objects.PNone; -import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.bytes.PBytes; import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes; import com.oracle.graal.python.builtins.objects.exception.ExceptionNodes; +import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.builtins.objects.tuple.PTuple; import com.oracle.graal.python.lib.PyNumberAsSizeNode; import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs; -import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PConstructAndRaiseNode; +import com.oracle.graal.python.nodes.PNodeWithContext; import com.oracle.graal.python.nodes.PRaiseNode; import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile; +import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PosixSupportLibrary; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PythonContext; @@ -81,10 +82,9 @@ import com.oracle.truffle.api.dsl.GenerateInline; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.frame.VirtualFrame; -import com.oracle.truffle.api.profiles.InlinedBranchProfile; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; -import com.oracle.graal.python.runtime.GilNode; +import com.oracle.truffle.api.profiles.InlinedBranchProfile; public class BufferedWriterNodes { @@ -254,7 +254,7 @@ static int bufferedwriterRawWriteFileIO(VirtualFrame frame, Node inliningTarget, n = Math.toIntExact(PosixModuleBuiltins.WriteNode.write(fileIO.getFD(), buf, len, inliningTarget, posixLib, context.getPosixSupport(), errorProfile, gil)); } catch (PosixException e) { - if (e.getErrorCode() == OSErrorEnum.EAGAIN.getNumber()) { + if (e.hasErrno(OSErrorEnum.EAGAIN)) { return -2; } throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java index 0371ba1b45..14813470e3 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/FileIOBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, 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 @@ -271,7 +271,7 @@ private static int open(VirtualFrame frame, TruffleString name, int flags, int m } } catch (PosixException e) { errorProfile.enter(inliningTarget); - if (e.getErrorCode() == OSErrorEnum.EINTR.getNumber()) { + if (e.hasErrno(OSErrorEnum.EINTR)) { PythonContext.triggerAsyncActions(inliningTarget); } else { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, name); @@ -431,7 +431,7 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object * Tolerate fstat() errors other than EBADF. See Issue #25717, where an * anonymous file on a Virtual Box shared folder filesystem would raise ENOENT. */ - if (e.getErrorCode() == OSErrorEnum.EBADF.getNumber()) { + if (e.hasErrno(OSErrorEnum.EBADF)) { errorCleanup(frame, self, fdIsOwn, posixClose); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -456,7 +456,7 @@ static void doInit(VirtualFrame frame, Node inliningTarget, PFileIO self, Object if (self.getSeekable() < 0) { self.setSeekable(0); } - if (e.getErrorCode() != OSErrorEnum.ESPIPE.getNumber()) { + if (!e.hasErrno(OSErrorEnum.ESPIPE)) { errorCleanup(frame, self, fdIsOwn, posixClose); throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } @@ -548,7 +548,7 @@ static Object read(VirtualFrame frame, PFileIO self, int size, try { return PosixModuleBuiltins.ReadNode.read(self.getFD(), size, inliningTarget, posixLib, context.getPosixSupport(), readErrorProfile, gil); } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber()) { + if (e.hasErrno(EAGAIN)) { readErrorProfile2.enter(inliningTarget); return PNone.NONE; } @@ -614,7 +614,7 @@ static Object readall(VirtualFrame frame, PFileIO self, return b; } } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber()) { + if (e.hasErrno(EAGAIN)) { return PNone.NONE; } throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -646,7 +646,7 @@ static Object readall(VirtualFrame frame, PFileIO self, break; } } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber()) { + if (e.hasErrno(EAGAIN)) { if (bytesRead > 0) { break; } @@ -695,7 +695,7 @@ static Object readinto(VirtualFrame frame, PFileIO self, Object buffer, bufferLib.readIntoBuffer(data, 0, buffer, 0, n, bufferLib); return n; } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber()) { + if (e.hasErrno(EAGAIN)) { return PNone.NONE; } throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); @@ -751,7 +751,7 @@ static Object write(VirtualFrame frame, PFileIO self, Object buffer, return PosixModuleBuiltins.WriteNode.write(self.getFD(), bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), inliningTarget, posixLib, context.getPosixSupport(), errorProfile, gil); } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber()) { + if (e.hasErrno(EAGAIN)) { return PNone.NONE; } throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java index bd125c05a5..974672c697 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/SemLockBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2026, 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 @@ -50,10 +50,10 @@ import java.util.List; import com.oracle.graal.python.annotations.ArgumentClinic; +import com.oracle.graal.python.annotations.Builtin; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; import com.oracle.graal.python.annotations.Slot.SlotSignature; -import com.oracle.graal.python.annotations.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.Python3Core; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -364,11 +364,11 @@ int get(VirtualFrame frame, PSemLock self, sval = 0; } return sval; - } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } catch (UnsupportedPosixFeatureException e) { // Not available on Darwin throw raiseNode.raise(inliningTarget, NotImplementedError); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mmap/PMMap.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mmap/PMMap.java index 8f089e14a3..6d95332953 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mmap/PMMap.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/mmap/PMMap.java @@ -41,7 +41,6 @@ package com.oracle.graal.python.builtins.objects.mmap; import static com.oracle.graal.python.runtime.nativeaccess.NativeMemory.NULLPTR; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary; import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary; @@ -62,7 +61,6 @@ import com.oracle.truffle.api.library.ExportMessage; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.object.Shape; -import com.oracle.truffle.api.strings.TruffleString; @ExportLibrary(PythonBufferAcquireLibrary.class) @ExportLibrary(PythonBufferAccessLibrary.class) @@ -141,13 +139,11 @@ int getBufferLength( byte readByte(int byteOffset, @Bind Node inliningTarget, @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Shared("raiseNode") @Cached PConstructAndRaiseNode.Lazy raiseNode, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { + @Shared("raiseNode") @Cached PConstructAndRaiseNode.Lazy raiseNode) { try { return posixLib.mmapReadByte(PythonContext.get(raiseNode).getPosixSupport(), getPosixSupportHandle(), byteOffset); } catch (PosixException e) { - // TODO(fa) how to handle? - throw raiseNode.get(inliningTarget).raiseOSError(null, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); + throw raiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); } } @@ -155,13 +151,11 @@ byte readByte(int byteOffset, void writeByte(int byteOffset, byte value, @Bind Node inliningTarget, @Shared @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, - @Shared("raiseNode") @Cached PConstructAndRaiseNode.Lazy raiseNode, - @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode) { + @Shared("raiseNode") @Cached PConstructAndRaiseNode.Lazy raiseNode) { try { posixLib.mmapWriteByte(PythonContext.get(raiseNode).getPosixSupport(), getPosixSupportHandle(), byteOffset, value); } catch (PosixException e) { - // TODO(fa) how to handle? - throw raiseNode.get(inliningTarget).raiseOSError(null, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); + throw raiseNode.get(inliningTarget).raiseOSErrorFromPosixException(null, e); } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java index b55ab28824..1560852b83 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/posix/DirEntryBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, 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 @@ -58,9 +58,9 @@ import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.ArgumentClinic; import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion; +import com.oracle.graal.python.annotations.Builtin; import com.oracle.graal.python.annotations.Slot; import com.oracle.graal.python.annotations.Slot.SlotKind; -import com.oracle.graal.python.annotations.Builtin; import com.oracle.graal.python.builtins.CoreFunctions; import com.oracle.graal.python.builtins.PythonBuiltinClassType; import com.oracle.graal.python.builtins.PythonBuiltins; @@ -283,7 +283,7 @@ static PTuple uncachedLStatWithSymlink(VirtualFrame frame, PDirEntry self, boole long[] rawStat = posixLib.fstatat(context.getPosixSupport(), dirFd, posixPath.value, followSymlinks); res = PosixModuleBuiltins.createStatResult(inliningTarget, context.getLanguage(inliningTarget), positiveLongProfile, rawStat); } catch (PosixException e) { - if (catchNoent && e.getErrorCode() == OSErrorEnum.ENOENT.getNumber()) { + if (catchNoent && e.hasErrno(OSErrorEnum.ENOENT)) { return null; } throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e, posixPath.originalObject); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java index d0fe8220c8..8549653c93 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, 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 @@ -97,6 +97,7 @@ import com.oracle.graal.python.runtime.PosixConstants; import com.oracle.graal.python.runtime.PosixSupport; import com.oracle.graal.python.runtime.PosixSupportLibrary; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddr; @@ -237,7 +238,7 @@ static Object init(VirtualFrame frame, PSocket self, int familyIn, int typeIn, i family = addrLib.getFamily(addr); } } catch (PosixException e) { - if (family == -1 || e.getErrorCode() == EBADF.getNumber() || e.getErrorCode() == ENOTSOCK.getNumber()) { + if (family == -1 || e.hasErrno(EBADF) || e.hasErrno(ENOTSOCK)) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -391,7 +392,7 @@ static Object close(VirtualFrame frame, PSocket socket, } } catch (PosixException e) { // CPython ignores ECONNRESET on close - if (e.getErrorCode() != OSErrorEnum.ECONNRESET.getNumber()) { + if (!e.hasErrno(OSErrorEnum.ECONNRESET)) { throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -436,11 +437,11 @@ static void doConnect(Frame frame, Node inliningTarget, PConstructAndRaiseNode.L } } catch (PosixException e) { boolean waitConnect; - if (e.getErrorCode() == EINTR.getNumber()) { + if (e.hasErrno(EINTR)) { PythonContext.triggerAsyncActions(constructAndRaiseNode); waitConnect = self.getTimeoutNs() != 0 && isSelectable(self); } else { - waitConnect = self.getTimeoutNs() > 0 && e.getErrorCode() == EINPROGRESS.getNumber() && isSelectable(self); + waitConnect = self.getTimeoutNs() > 0 && e.hasErrno(EINPROGRESS) && isSelectable(self); } if (waitConnect) { SocketUtils.callSocketFunctionWithRetry(frame, inliningTarget, constructAndRaiseNode, posixLib, posixSupport, gil, self, @@ -449,7 +450,7 @@ static void doConnect(Frame frame, Node inliningTarget, PConstructAndRaiseNode.L p.getsockopt(s, self.getFd(), SOL_SOCKET.value, SO_ERROR.value, tmp, tmp.length); int err = PythonUtils.ARRAY_ACCESSOR.getInt(tmp, 0); if (err != 0 && err != EISCONN.getNumber()) { - throw new PosixException(err, p.strerror(s, err)); + throw new PosixErrnoException(err, p.strerror(s, err)); } return null; }, @@ -481,7 +482,10 @@ static Object connectEx(VirtualFrame frame, PSocket self, Object address, try { ConnectNode.doConnect(frame, inliningTarget, constructAndRaiseNode, posixLib, context.getPosixSupport(), gil, self, connectAddr); } catch (PosixException e) { - return e.getErrorCode(); + if (e instanceof PosixErrnoException errnoException) { + return errnoException.getErrorCode(); + } + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } return 0; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java index 09ba8816d8..58440770ce 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, 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 @@ -343,6 +343,8 @@ static UniversalSockAddr setipaddr(VirtualFrame frame, byte[] name, int family, } } catch (GetAddrInfoException e) { throw constructAndRaiseNode.get(inliningTarget).executeWithArgsOnly(frame, SocketGAIError, new Object[]{e.getErrorCode(), e.getMessage()}); + } catch (PosixException e) { + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -395,7 +397,6 @@ static Object makeSockAddr(VirtualFrame frame, Node inliningTarget, UniversalSoc @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @CachedLibrary("addr") UniversalSockAddrLibrary addrLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached TruffleString.FromJavaStringNode fromJavaStringNode, @Cached TruffleString.FromByteArrayNode fromByteArrayNode, @Cached TruffleString.SwitchEncodingNode switchEncodingNode, @Cached PRaiseNode raiseNode) { @@ -428,7 +429,7 @@ static Object makeSockAddr(VirtualFrame frame, Node inliningTarget, UniversalSoc throw raiseNode.raise(inliningTarget, NotImplementedError, toTruffleStringUncached("makesockaddr: unknown address family")); } } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } @@ -456,7 +457,6 @@ static Object makeAddr(VirtualFrame frame, Node inliningTarget, UniversalSockAdd @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @CachedLibrary("addr") UniversalSockAddrLibrary addrLib, @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached TruffleString.FromJavaStringNode fromJavaStringNode, @Cached PRaiseNode raiseNode) { try { PythonContext context = PythonContext.get(inliningTarget); @@ -473,7 +473,7 @@ static Object makeAddr(VirtualFrame frame, Node inliningTarget, UniversalSockAdd throw raiseNode.raise(inliningTarget, NotImplementedError, toTruffleStringUncached("makesockaddr: unknown address family")); } } catch (PosixException e) { - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketUtils.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketUtils.java index 5db99d3457..399bffaf39 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketUtils.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, 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 @@ -49,6 +49,7 @@ import com.oracle.graal.python.nodes.PConstructAndRaiseNode; import com.oracle.graal.python.runtime.GilNode; import com.oracle.graal.python.runtime.PosixSupportLibrary; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; import com.oracle.graal.python.runtime.PythonContext; @@ -107,8 +108,8 @@ public static T callSocketFunctionWithRetry(Frame frame, Node inliningTarget } finally { gil.acquire(); } - } catch (PosixException e) { - if (e.getErrorCode() == EINTR.getNumber()) { + } catch (PosixErrnoException e) { + if (e.hasErrno(EINTR)) { PythonContext.triggerAsyncActions(constructAndRaiseNode); continue; } @@ -124,12 +125,12 @@ public static T callSocketFunctionWithRetry(Frame frame, Node inliningTarget } finally { gil.acquire(); } - } catch (PosixException e) { - if (e.getErrorCode() == EINTR.getNumber()) { + } catch (PosixErrnoException e) { + if (e.hasErrno(EINTR)) { PythonContext.triggerAsyncActions(constructAndRaiseNode); continue; } - if (timeoutHelper != null && (e.getErrorCode() == EWOULDBLOCK.getNumber() || e.getErrorCode() == EAGAIN.getNumber())) { + if (timeoutHelper != null && (e.hasErrno(EWOULDBLOCK) || e.hasErrno(EAGAIN))) { /* * False positive: sock_func() failed with EWOULDBLOCK or EAGAIN. For * example, select() could indicate a socket is ready for reading, but the diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java index e871e14fac..82bd4f07c2 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ssl/SSLOperationNode.java @@ -43,7 +43,6 @@ import static com.oracle.graal.python.builtins.PythonBuiltinClassType.MemoryError; import static com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.EAGAIN; import static com.oracle.graal.python.builtins.objects.exception.OSErrorEnum.EWOULDBLOCK; -import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING; import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached; import java.nio.ByteBuffer; @@ -76,7 +75,6 @@ import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.library.CachedLibrary; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.strings.TruffleString; /** * This class implements equivalents of OpenSSL transport functions ({@code SSL_read} etc) on top of @@ -176,7 +174,6 @@ static void doSocket(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, @CachedLibrary(limit = "1") PosixSupportLibrary posixLib, @Cached(inline = false) GilNode gil, @Shared @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode, - @Cached TruffleString.FromJavaStringNode fromJavaStringNode, @Shared @Cached PRaiseNode raiseNode) { assert socket.getSocket() != null; prepare(socket); @@ -237,13 +234,13 @@ static void doSocket(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, } networkInboundBIO.advanceWritePosition(recvlen); } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber() || e.getErrorCode() == EWOULDBLOCK.getNumber()) { + if (e.hasErrno(EAGAIN) || e.hasErrno(EWOULDBLOCK)) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSLErrorCode.ERROR_WANT_READ, ErrorMessages.SSL_WANT_READ); } if (socket.hasSavedException()) { throw socket.getAndClearSavedException(); } - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } break; case WANTS_WRITE: @@ -257,13 +254,13 @@ static void doSocket(VirtualFrame frame, Node inliningTarget, PSSLSocket socket, true, false, timeoutHelper); networkOutboundBIO.advanceReadPosition(writtenBytes); } catch (PosixException e) { - if (e.getErrorCode() == EAGAIN.getNumber() || e.getErrorCode() == EWOULDBLOCK.getNumber()) { + if (e.hasErrno(EAGAIN) || e.hasErrno(EWOULDBLOCK)) { throw constructAndRaiseNode.get(inliningTarget).raiseSSLError(frame, SSLErrorCode.ERROR_WANT_WRITE, ErrorMessages.SSL_WANT_WRITE); } if (socket.hasSavedException()) { throw socket.getAndClearSavedException(); } - throw constructAndRaiseNode.get(inliningTarget).raiseOSError(frame, e.getErrorCode(), fromJavaStringNode.execute(e.getMessage(), TS_ENCODING)); + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); } break; } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java index 6a0c120956..566c350ed5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PConstructAndRaiseNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2026, 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 @@ -55,6 +55,7 @@ import com.oracle.graal.python.builtins.objects.ssl.SSLErrorCode; import com.oracle.graal.python.nodes.PConstructAndRaiseNodeGen.LazyNodeGen; import com.oracle.graal.python.nodes.call.CallNode; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.graal.python.runtime.PythonContext; @@ -231,15 +232,27 @@ public final PException raiseOSError(VirtualFrame frame, int errno, TruffleStrin } public final PException raiseOSErrorFromPosixException(VirtualFrame frame, PosixException e) { - return raiseOSErrorInternal(frame, createOsErrorArgs(e.getErrorCode(), e.getMessageAsTruffleString())); + if (e instanceof PosixErrnoException errnoException) { + return raiseOSErrorInternal(frame, createOsErrorArgs(errnoException.getErrorCode(), errnoException.getMessageAsTruffleString())); + } + assert e instanceof UnsupportedPosixFeatureException; + return raiseOSErrorUnsupported(frame, (UnsupportedPosixFeatureException) e); } public final PException raiseOSErrorFromPosixException(VirtualFrame frame, PosixException e, Object filename1) { - return raiseOSErrorInternal(frame, createOsErrorArgs(e.getErrorCode(), e.getMessageAsTruffleString(), filename1)); + if (e instanceof PosixErrnoException errnoException) { + return raiseOSErrorInternal(frame, createOsErrorArgs(errnoException.getErrorCode(), errnoException.getMessageAsTruffleString(), filename1)); + } + assert e instanceof UnsupportedPosixFeatureException; + return raiseOSErrorUnsupported(frame, (UnsupportedPosixFeatureException) e); } public final PException raiseOSErrorFromPosixException(VirtualFrame frame, PosixException e, Object filename1, Object filename2) { - return raiseOSErrorInternal(frame, createOsErrorArgs(e.getErrorCode(), e.getMessageAsTruffleString(), filename1, filename2)); + if (e instanceof PosixErrnoException errnoException) { + return raiseOSErrorInternal(frame, createOsErrorArgs(errnoException.getErrorCode(), errnoException.getMessageAsTruffleString(), filename1, filename2)); + } + assert e instanceof UnsupportedPosixFeatureException; + return raiseOSErrorUnsupported(frame, (UnsupportedPosixFeatureException) e); } public final PException raiseOSErrorUnsupported(VirtualFrame frame, UnsupportedPosixFeatureException e) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java index cabf987a60..7f006ebbe4 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/EmulatedPosixSupport.java @@ -237,6 +237,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.Inet6SockAddr; import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidAddressException; import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; @@ -1004,7 +1005,7 @@ public void setBlocking(int fd, boolean blocking, // Already blocking return; } - throw new PosixException(OSErrorEnum.EPERM.getNumber(), toTruffleStringUncached("Emulated posix support does not support non-blocking mode for regular files.")); + throw new PosixErrnoException(OSErrorEnum.EPERM.getNumber(), toTruffleStringUncached("Emulated posix support does not support non-blocking mode for regular files.")); } } catch (PosixException e) { throw e; @@ -1145,10 +1146,10 @@ public long[] statvfs(Object path) throws PosixException { return new long[]{bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax, fsid}; } catch (NoSuchFileException e) { - throw new PosixException(OSErrorEnum.ENOENT.getNumber(), ErrorMessages.NO_SUCH_FILE_OR_DIR); + throw new PosixErrnoException(OSErrorEnum.ENOENT.getNumber(), ErrorMessages.NO_SUCH_FILE_OR_DIR); } catch (UnsupportedOperationException | IOException | SecurityException e) { TruffleString message = PythonUtils.toTruffleStringUncached(e.getMessage()); - throw new PosixException(OSErrorEnum.EPERM.getNumber(), message); + throw new PosixErrnoException(OSErrorEnum.EPERM.getNumber(), message); } } @@ -1158,7 +1159,7 @@ public long[] fstatvfs(int fd) throws PosixException { String path = getFilePath(fd); if (path == null) { - throw new PosixException(OSErrorEnum.EBADF.getNumber(), ErrorMessages.BAD_FILE_DESCRIPTOR); + throw new PosixErrnoException(OSErrorEnum.EBADF.getNumber(), ErrorMessages.BAD_FILE_DESCRIPTOR); } return statvfs(path); @@ -1893,7 +1894,7 @@ public boolean faccessat(int dirFd, Object path, int mode, boolean effectiveIds, @Shared("defaultDirProfile") @Cached InlinedConditionProfile defaultDirFdPofile, @Shared("eq") @Cached TruffleString.EqualNode eqNode, @Shared("js2ts") @Cached TruffleString.FromJavaStringNode fromJavaStringNode, - @Shared("ts2js") @Cached TruffleString.ToJavaStringNode toJavaStringNode) { + @Shared("ts2js") @Cached TruffleString.ToJavaStringNode toJavaStringNode) throws UnsupportedPosixFeatureException { if (effectiveIds) { errBranch.enter(inliningTarget); throw createUnsupportedFeature("faccess with effective user IDs"); @@ -1973,12 +1974,12 @@ public void fchmod(int fd, int mode, } @ExportMessage - public void fchownat(int dirFd, Object path, long owner, long group, boolean followSymlinks) { + public void fchownat(int dirFd, Object path, long owner, long group, boolean followSymlinks) throws PosixException { throw createUnsupportedFeature("fchownat"); } @ExportMessage - public void fchown(int fd, long owner, long group) { + public void fchown(int fd, long owner, long group) throws PosixException { throw createUnsupportedFeature("fchown"); } @@ -2024,7 +2025,7 @@ public void kill(long pid, int signal, @ExportMessage @SuppressWarnings("static-method") - public void raise(int signal) { + public void raise(int signal) throws PosixException { throw createUnsupportedFeature("raise"); } @@ -2156,13 +2157,13 @@ int getRemainingSeconds() { @ExportMessage @SuppressWarnings("static-method") - public void signalSelf(int signal) { + public void signalSelf(int signal) throws PosixException { throw createUnsupportedFeature("signalSelf"); } @ExportMessage @SuppressWarnings("static-method") - public long killpg(long pgid, int signal) { + public long killpg(long pgid, int signal) throws PosixException { throw createUnsupportedFeature("killpg"); } @@ -2269,7 +2270,7 @@ public long getuid() { @ExportMessage @SuppressWarnings("static-method") @TruffleBoundary - public long geteuid() { + public long geteuid() throws UnsupportedPosixFeatureException { throw createUnsupportedFeature("geteuid"); } @@ -2292,49 +2293,49 @@ public long getgid() { @ExportMessage @SuppressWarnings("static-method") @TruffleBoundary - public long getegid() { + public long getegid() throws UnsupportedPosixFeatureException { throw createUnsupportedFeature("getegid"); } @ExportMessage @SuppressWarnings("static-method") - public long getppid() { + public long getppid() throws UnsupportedPosixFeatureException { throw createUnsupportedFeature("getppid"); } @ExportMessage @SuppressWarnings("static-method") - public long getpgid(long pid) { + public long getpgid(long pid) throws PosixException { throw createUnsupportedFeature("getpgid"); } @ExportMessage @SuppressWarnings("static-method") - public void setpgid(long pid, long pgid) { + public void setpgid(long pid, long pgid) throws PosixException { throw createUnsupportedFeature("setpgid"); } @ExportMessage @SuppressWarnings("static-method") - public long getpgrp() { + public long getpgrp() throws UnsupportedPosixFeatureException { throw createUnsupportedFeature("getpgrp"); } @ExportMessage @SuppressWarnings("static-method") - public long getsid(long pid) { + public long getsid(long pid) throws PosixException { throw createUnsupportedFeature("getsid"); } @ExportMessage @SuppressWarnings("static-method") - public long setsid() { + public long setsid() throws PosixException { throw createUnsupportedFeature("getsid"); } @ExportMessage @TruffleBoundary - public long[] getgroups() { + public long[] getgroups() throws PosixException { if (!PythonImageBuildOptions.WITHOUT_PLATFORM_ACCESS) { switch (PythonLanguage.getPythonOS()) { case PLATFORM_LINUX, PLATFORM_DARWIN -> { @@ -2412,7 +2413,7 @@ public RusageResult getrusage(int who) throws PosixException { @ExportMessage @SuppressWarnings("static-method") - public OpenPtyResult openpty() { + public OpenPtyResult openpty() throws PosixException { throw createUnsupportedFeature("openpty"); } @@ -2858,7 +2859,7 @@ final MMapHandle mmap(long length, int prot, int flags, int fd, long offset, } @TruffleBoundary - private static Set mmapProtToOptions(int prot) { + private static Set mmapProtToOptions(int prot) throws PosixException { HashSet options = new HashSet<>(); if ((prot & PROT_READ.value) != 0) { options.add(StandardOpenOption.READ); @@ -3001,7 +3002,7 @@ public void mmapUnmap(Object mmap, @SuppressWarnings("unused") long length, @ExportMessage @SuppressWarnings("static-method") - public long mmapGetPointer(@SuppressWarnings("unused") Object mmap) { + public long mmapGetPointer(@SuppressWarnings("unused") Object mmap) throws UnsupportedPosixFeatureException { throw createUnsupportedFeature("obtaining mmap pointer"); } @@ -3115,7 +3116,7 @@ public PwdResult getpwuid(long uid) throws PosixException { @ExportMessage @TruffleBoundary @SuppressWarnings("static-method") - public PwdResult getpwnam(Object name) { + public PwdResult getpwnam(Object name) throws PosixException { if (!PythonImageBuildOptions.WITHOUT_PLATFORM_ACCESS) { switch (PythonLanguage.getPythonOS()) { case PLATFORM_LINUX: @@ -3141,7 +3142,7 @@ public boolean hasGetpwentries() { @ExportMessage @SuppressWarnings("static-method") - public PwdResult[] getpwentries() { + public PwdResult[] getpwentries() throws PosixException { throw createUnsupportedFeature("getpwent"); } @@ -3152,13 +3153,13 @@ private static PwdResult createPwdResult(UnixSystem unix) { @ExportMessage @SuppressWarnings("unused") - public int ioctlBytes(int fd, long request, byte[] arg) { + public int ioctlBytes(int fd, long request, byte[] arg) throws PosixException { throw createUnsupportedFeature("ioctl"); } @ExportMessage @SuppressWarnings("unused") - public int ioctlInt(int fd, long request, int arg) { + public int ioctlInt(int fd, long request, int arg) throws PosixException { throw createUnsupportedFeature("ioctl"); } @@ -3598,7 +3599,7 @@ public Object gethostname() throws PosixException { @ExportMessage @SuppressWarnings("static-method") @TruffleBoundary - public Object[] getnameinfo(UniversalSockAddr addr, int flags) throws GetAddrInfoException { + public Object[] getnameinfo(UniversalSockAddr addr, int flags) throws UnsupportedPosixFeatureException, GetAddrInfoException { if (PythonImageBuildOptions.WITHOUT_JAVA_INET || withoutIOSocket) { throw new UnsupportedPosixFeatureException("getnameinfo was excluded"); } @@ -3649,7 +3650,7 @@ private String searchServicesForPort(TruffleLanguage.Env env, int port, String p @ExportMessage @SuppressWarnings("static-method") @TruffleBoundary - public AddrInfoCursor getaddrinfo(Object node, Object service, int family, int sockType, int protocol, int flags) throws GetAddrInfoException { + public AddrInfoCursor getaddrinfo(Object node, Object service, int family, int sockType, int protocol, int flags) throws UnsupportedPosixFeatureException, GetAddrInfoException { if (PythonImageBuildOptions.WITHOUT_JAVA_INET || withoutIOSocket) { throw new UnsupportedPosixFeatureException("getaddrinfo was excluded"); } @@ -3841,7 +3842,7 @@ UniversalSockAddr createUniversalSockAddrInet6(Inet6SockAddr src) { } @ExportMessage - UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src) { + UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src) throws UnsupportedPosixFeatureException { throw createUnsupportedFeature("AF_UNIX"); } @@ -4611,7 +4612,7 @@ private static GetAddrInfoException gaiError(int err) throws GetAddrInfoExceptio } static PosixException posixException(OSErrorEnum osError) throws PosixException { - throw new PosixException(osError.getNumber(), osError.getMessage()); + throw new PosixErrnoException(osError.getNumber(), osError.getMessage()); } private static PosixException posixException(Exception e, TruffleString.EqualNode eqNode) throws PosixException { @@ -4619,11 +4620,11 @@ private static PosixException posixException(Exception e, TruffleString.EqualNod throw (PosixException) e; } ErrorAndMessagePair pair = OSErrorEnum.fromException(e, eqNode); - throw new PosixException(pair.oserror.getNumber(), pair.message); + throw new PosixErrnoException(pair.oserror.getNumber(), pair.message); } private static PosixException posixException(ErrorAndMessagePair pair) throws PosixException { - throw new PosixException(pair.oserror.getNumber(), pair.message); + throw new PosixErrnoException(pair.oserror.getNumber(), pair.message); } @TruffleBoundary diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java index 64b64b8512..6fa7def90c 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/LoggingPosixSupport.java @@ -55,6 +55,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidAddressException; import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidUnixSocketPathException; import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; @@ -63,6 +64,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddr; import com.oracle.graal.python.runtime.PosixSupportLibrary.UnixSockAddr; +import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.Truffle; @@ -681,9 +683,13 @@ final void renameat(int oldDirFd, Object oldPath, int newDirFd, Object newPath, @ExportMessage final boolean faccessat(int dirFd, Object path, int mode, boolean effectiveIds, boolean followSymlinks, - @CachedLibrary("this.delegate") PosixSupportLibrary lib) { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException { logEnter("faccessAt", "%d, %s, 0%o, %b, %b", dirFd, path, mode, effectiveIds, followSymlinks); - return logExit("faccessAt", "%b", lib.faccessat(delegate, dirFd, path, mode, effectiveIds, followSymlinks)); + try { + return logExit("faccessAt", "%b", lib.faccessat(delegate, dirFd, path, mode, effectiveIds, followSymlinks)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("faccessAt", e); + } } @ExportMessage @@ -927,9 +933,13 @@ final long getuid( @ExportMessage final long geteuid( - @CachedLibrary("this.delegate") PosixSupportLibrary lib) { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException { logEnter("geteuid", ""); - return logExit("geteuid", "%d", lib.geteuid(delegate)); + try { + return logExit("geteuid", "%d", lib.geteuid(delegate)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("geteuid", e); + } } @ExportMessage @@ -941,16 +951,24 @@ final long getgid( @ExportMessage final long getegid( - @CachedLibrary("this.delegate") PosixSupportLibrary lib) { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException { logEnter("getegid", ""); - return logExit("getegid", "%d", lib.getegid(delegate)); + try { + return logExit("getegid", "%d", lib.getegid(delegate)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("getegid", e); + } } @ExportMessage final long getppid( - @CachedLibrary("this.delegate") PosixSupportLibrary lib) { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException { logEnter("getppid", ""); - return logExit("getppid", "%d", lib.getppid(delegate)); + try { + return logExit("getppid", "%d", lib.getppid(delegate)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("getppid", e); + } } @ExportMessage @@ -977,9 +995,13 @@ final void setpgid(long pid, long pgid, @ExportMessage final long getpgrp( - @CachedLibrary("this.delegate") PosixSupportLibrary lib) { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException { logEnter("getpgrp", ""); - return logExit("getpgrp", "%d", lib.getpgrp(delegate)); + try { + return logExit("getpgrp", "%d", lib.getpgrp(delegate)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("getpgrp", e); + } } @ExportMessage @@ -1117,9 +1139,13 @@ public void mmapFlush(Object mmap, long offset, long length, @ExportMessage public long mmapGetPointer(Object mmap, - @CachedLibrary("this.delegate") PosixSupportLibrary lib) { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException { logEnter("mmapGetPointer", "%s", mmap); - return lib.mmapGetPointer(delegate, mmap); + try { + return lib.mmapGetPointer(delegate, mmap); + } catch (UnsupportedPosixFeatureException e) { + throw logException("mmapGetPointer", e); + } } @ExportMessage @@ -1427,10 +1453,12 @@ final Object gethostname(@CachedLibrary("this.delegate") PosixSupportLibrary lib @ExportMessage final Object[] getnameinfo(UniversalSockAddr addr, int flags, - @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws GetAddrInfoException { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException, GetAddrInfoException { logEnter("getnameinfo", "%s, %d", addr, flags); try { return logExit("getnameinfo", "%s", lib.getnameinfo(delegate, addr, flags)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("getnameinfo", e); } catch (GetAddrInfoException e) { throw logException("getnameinfo", e); } @@ -1438,10 +1466,12 @@ final Object[] getnameinfo(UniversalSockAddr addr, int flags, @ExportMessage final AddrInfoCursor getaddrinfo(Object node, Object service, int family, int sockType, int protocol, int flags, - @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws GetAddrInfoException { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException, GetAddrInfoException { logEnter("getaddrinfo", "%s, %s, %d, %d, %d, %d", node, service, family, sockType, protocol, flags); try { return logExit("getaddrinfo", "%s", lib.getaddrinfo(delegate, node, service, family, sockType, protocol, flags)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("getaddrinfo", e); } catch (GetAddrInfoException e) { throw logException("getaddrinfo", e); } @@ -1562,10 +1592,12 @@ final UniversalSockAddr createUniversalSockAddrInet6(Inet6SockAddr src, @ExportMessage final UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src, - @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws InvalidUnixSocketPathException { + @CachedLibrary("this.delegate") PosixSupportLibrary lib) throws UnsupportedPosixFeatureException, InvalidUnixSocketPathException { logEnter("createUniversalSockAddrUnix", "%s", src); try { return logExit("createUniversalSockAddrUnix", "%s", lib.createUniversalSockAddrUnix(delegate, src)); + } catch (UnsupportedPosixFeatureException e) { + throw logException("createUniversalSockAddrUnix", e); } catch (InvalidUnixSocketPathException e) { throw logException("createUniversalSockAddrUnix", e); } @@ -1625,10 +1657,22 @@ private static T logExit(String msg, String argFmt, T retVal) { return logExit(DEFAULT_LEVEL, msg, argFmt, retVal); } + @TruffleBoundary + private static UnsupportedPosixFeatureException logException(Level level, String msg, UnsupportedPosixFeatureException e) throws UnsupportedPosixFeatureException { + if (LOGGER.isLoggable(level)) { + LOGGER.log(level, msg + String.format(" -> throw unsupported, msg=%s", fixLogArg(e.getMessage()))); + } + throw e; + } + @TruffleBoundary private static PosixException logException(Level level, String msg, PosixException e) throws PosixException { if (LOGGER.isLoggable(level)) { - LOGGER.log(level, msg + String.format(" -> throw errno=%d, msg=%s", fixLogArgs(e.getErrorCode(), e.getMessage()))); + if (e instanceof PosixErrnoException errnoException) { + LOGGER.log(level, msg + String.format(" -> throw errno=%d, msg=%s", fixLogArgs(errnoException.getErrorCode(), errnoException.getMessage()))); + } else { + LOGGER.log(level, msg + String.format(" -> throw unsupported, msg=%s", fixLogArg(e.getMessage()))); + } } throw e; } @@ -1661,6 +1705,10 @@ private static PosixException logException(String msg, PosixException e) throws throw logException(DEFAULT_LEVEL, msg, e); } + private static UnsupportedPosixFeatureException logException(String msg, UnsupportedPosixFeatureException e) throws UnsupportedPosixFeatureException { + throw logException(DEFAULT_LEVEL, msg, e); + } + private static GetAddrInfoException logException(String msg, GetAddrInfoException e) throws GetAddrInfoException { throw logException(DEFAULT_LEVEL, msg, e); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java index b8113d1d53..a15d44f747 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/NFIPosixSupport.java @@ -90,6 +90,7 @@ import java.util.logging.Level; import org.graalvm.nativeimage.ImageInfo; + import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.annotations.PythonOS; import com.oracle.graal.python.builtins.PythonBuiltinClassType; @@ -107,6 +108,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidAddressException; import com.oracle.graal.python.runtime.PosixSupportLibrary.InvalidUnixSocketPathException; import com.oracle.graal.python.runtime.PosixSupportLibrary.OpenPtyResult; +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixErrnoException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; import com.oracle.graal.python.runtime.PosixSupportLibrary.PwdResult; import com.oracle.graal.python.runtime.PosixSupportLibrary.RecvfromResult; @@ -2602,7 +2604,7 @@ private static TruffleString extractZeroTerminatedString(byte[] buffer, long lon } private static PosixException outOfMemoryPosixError() throws PosixException { - throw new PosixException(OSErrorEnum.ENOMEM.getNumber(), OSErrorEnum.ENOMEM.getMessage()); + throw new PosixErrnoException(OSErrorEnum.ENOMEM.getNumber(), OSErrorEnum.ENOMEM.getMessage()); } private int sysConfPwdSizeMax = -1; @@ -2723,7 +2725,7 @@ private PosixException getErrnoAndThrowPosixException(InvokeNativeFunction invok @TruffleBoundary private PosixException newPosixException(InvokeNativeFunction invokeNode, int errno) throws PosixException { - throw new PosixException(errno, strerror(errno, invokeNode, TruffleString.FromByteArrayNode.getUncached(), TruffleString.SwitchEncodingNode.getUncached())); + throw new PosixErrnoException(errno, strerror(errno, invokeNode, TruffleString.FromByteArrayNode.getUncached(), TruffleString.SwitchEncodingNode.getUncached())); } private Object wrap(long[] value) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java index b5e92d39d7..baa1a22992 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java @@ -54,6 +54,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; +import com.oracle.graal.python.builtins.objects.exception.OSErrorEnum; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.CompilerAsserts; import com.oracle.truffle.api.CompilerDirectives; @@ -246,7 +247,7 @@ public abstract class PosixSupportLibrary extends Library { public abstract void renameat(Object receiver, int oldDirFd, Object oldPath, int newDirFd, Object newPath) throws PosixException; - public abstract boolean faccessat(Object receiver, int dirFd, Object path, int mode, boolean effectiveIds, boolean followSymlinks); + public abstract boolean faccessat(Object receiver, int dirFd, Object path, int mode, boolean effectiveIds, boolean followSymlinks) throws UnsupportedPosixFeatureException; public abstract void fchmodat(Object receiver, int dirFd, Object path, int mode, boolean followSymlinks) throws PosixException; @@ -292,19 +293,19 @@ public abstract class PosixSupportLibrary extends Library { public abstract long getuid(Object receiver); - public abstract long geteuid(Object receiver); + public abstract long geteuid(Object receiver) throws UnsupportedPosixFeatureException; public abstract long getgid(Object receiver); - public abstract long getegid(Object receiver); + public abstract long getegid(Object receiver) throws UnsupportedPosixFeatureException; - public abstract long getppid(Object receiver); + public abstract long getppid(Object receiver) throws UnsupportedPosixFeatureException; public abstract long getpgid(Object receiver, long pid) throws PosixException; public abstract void setpgid(Object receiver, long pid, long pgid) throws PosixException; - public abstract long getpgrp(Object receiver); + public abstract long getpgrp(Object receiver) throws UnsupportedPosixFeatureException; public abstract long getsid(Object receiver, long pid) throws PosixException; @@ -376,7 +377,7 @@ public abstract int forkExec(Object receiver, Object[] executables, Object[] arg public abstract void mmapUnmap(Object receiver, Object mmap, long length) throws PosixException; - public abstract long mmapGetPointer(Object receiver, Object mmap); + public abstract long mmapGetPointer(Object receiver, Object mmap) throws UnsupportedPosixFeatureException; public abstract long semOpen(Object receiver, Object name, int openFlags, int mode, int value) throws PosixException; @@ -809,7 +810,7 @@ public String toString() { * getnameinfo uses its own error codes and gai_strerror instead of the usual errno * and strerror) */ - public abstract Object[] getnameinfo(Object receiver, UniversalSockAddr addr, int flags) throws GetAddrInfoException; + public abstract Object[] getnameinfo(Object receiver, UniversalSockAddr addr, int flags) throws UnsupportedPosixFeatureException, GetAddrInfoException; /** * Corresponds to POSIX {@code getaddrinfo(3)}, except it always passes a non-null value for the @@ -832,7 +833,8 @@ public String toString() { * getaddrinfo uses its own error codes and gai_strerror instead of the usual errno * and strerror) */ - public abstract AddrInfoCursor getaddrinfo(Object receiver, Object node, Object service, int family, int sockType, int protocol, int flags) throws GetAddrInfoException; + public abstract AddrInfoCursor getaddrinfo(Object receiver, Object node, Object service, int family, int sockType, int protocol, int flags) + throws UnsupportedPosixFeatureException, GetAddrInfoException; /** * Represents one or more addrinfos returned by {@code getaddrinfo()}. @@ -957,7 +959,7 @@ public final Throwable fillInStackTrace() { public abstract UniversalSockAddr createUniversalSockAddrInet6(Object receiver, Inet6SockAddr src); - public abstract UniversalSockAddr createUniversalSockAddrUnix(Object receiver, UnixSockAddr src) throws InvalidUnixSocketPathException; + public abstract UniversalSockAddr createUniversalSockAddrUnix(Object receiver, UnixSockAddr src) throws UnsupportedPosixFeatureException, InvalidUnixSocketPathException; /** * Provides messages for manipulating {@link UniversalSockAddr}. @@ -1012,19 +1014,44 @@ public static UniversalSockAddrLibrary getUncached() { } } + /** + * Base class for exceptions that originate in the POSIX support layer. + */ + public abstract static class PosixException extends Exception { + + private static final long serialVersionUID = 8700515065120346760L; + + protected PosixException() { + } + + protected PosixException(String message) { + super(message); + } + + public final boolean hasErrno(OSErrorEnum errno) { + return this instanceof PosixErrnoException errnoException && errnoException.getErrorCode() == errno.getNumber(); + } + + @SuppressWarnings("sync-override") + @Override + public Throwable fillInStackTrace() { + return this; + } + } + /** * Exception that indicates POSIX level error associated with numeric code. If the message is * known, it may be included in the exception, otherwise it can be queried using * {@link #strerror(Object, int)}. */ - public static final class PosixException extends Exception { + public static final class PosixErrnoException extends PosixException { private static final long serialVersionUID = -115762483478883093L; private final int errorCode; private final transient TruffleString msg; - public PosixException(int errorCode, TruffleString message) { + public PosixErrnoException(int errorCode, TruffleString message) { this.errorCode = errorCode; msg = message; } @@ -1041,12 +1068,6 @@ public String getMessage() { public int getErrorCode() { return errorCode; } - - @SuppressWarnings("sync-override") - @Override - public Throwable fillInStackTrace() { - return this; - } } /** @@ -1093,19 +1114,13 @@ public final Throwable fillInStackTrace() { * certain feature is supported or not, but even then this exception may be thrown for other * features. */ - public static class UnsupportedPosixFeatureException extends RuntimeException { + public static class UnsupportedPosixFeatureException extends PosixException { private static final long serialVersionUID = 1846254827094902593L; public UnsupportedPosixFeatureException(String message) { super(message); } - - @Override - @SuppressWarnings("sync-override") - public final Throwable fillInStackTrace() { - return this; - } } /** diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java index fd9eb2073d..026f45771d 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PreInitPosixSupport.java @@ -62,6 +62,7 @@ import com.oracle.graal.python.runtime.PosixSupportLibrary.Timeval; import com.oracle.graal.python.runtime.PosixSupportLibrary.UniversalSockAddr; import com.oracle.graal.python.runtime.PosixSupportLibrary.UnixSockAddr; +import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.TruffleLanguage.Env; import com.oracle.truffle.api.library.CachedLibrary; @@ -548,7 +549,7 @@ final void renameat(int oldDirFd, Object oldPath, int newDirFd, Object newPath, @ExportMessage final boolean faccessat(int dirFd, Object path, int mode, boolean effectiveIds, boolean followSymlinks, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException { checkNotInPreInitialization(); return nativeLib.faccessat(nativePosixSupport, dirFd, path, mode, effectiveIds, followSymlinks); } @@ -707,7 +708,7 @@ final long getuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary } @ExportMessage - final long geteuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + final long geteuid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException { checkNotInPreInitialization(); return nativeLib.geteuid(nativePosixSupport); } @@ -719,13 +720,13 @@ final long getgid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary } @ExportMessage - final long getegid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + final long getegid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException { checkNotInPreInitialization(); return nativeLib.getegid(nativePosixSupport); } @ExportMessage - final long getppid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + final long getppid(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException { checkNotInPreInitialization(); return nativeLib.getppid(nativePosixSupport); } @@ -745,7 +746,7 @@ final void setpgid(long pid, long pgid, } @ExportMessage - final long getpgrp(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + final long getpgrp(@CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException { checkNotInPreInitialization(); return nativeLib.getpgrp(nativePosixSupport); } @@ -879,7 +880,7 @@ final void mmapUnmap(Object mmap, long length, @ExportMessage @SuppressWarnings("static-method") final long mmapGetPointer(Object mmap, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) { + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException { checkNotInPreInitialization(); return nativeLib.mmapGetPointer(nativePosixSupport, mmap); } @@ -1064,14 +1065,14 @@ final Object gethostname(@CachedLibrary("this.nativePosixSupport") PosixSupportL @ExportMessage final Object[] getnameinfo(UniversalSockAddr addr, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws GetAddrInfoException { + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException, GetAddrInfoException { checkNotInPreInitialization(); return nativeLib.getnameinfo(nativePosixSupport, addr, flags); } @ExportMessage final AddrInfoCursor getaddrinfo(Object node, Object service, int family, int sockType, int protocol, int flags, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws GetAddrInfoException { + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException, GetAddrInfoException { checkNotInPreInitialization(); return nativeLib.getaddrinfo(nativePosixSupport, node, service, family, sockType, protocol, flags); } @@ -1155,7 +1156,7 @@ final UniversalSockAddr createUniversalSockAddrInet6(Inet6SockAddr src, @ExportMessage final UniversalSockAddr createUniversalSockAddrUnix(UnixSockAddr src, - @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws InvalidUnixSocketPathException { + @CachedLibrary("this.nativePosixSupport") PosixSupportLibrary nativeLib) throws UnsupportedPosixFeatureException, InvalidUnixSocketPathException { checkNotInPreInitialization(); return nativeLib.createUniversalSockAddrUnix(nativePosixSupport, src); } From 11e7ae5d6c00424e21d0bab471bc4583d02fc969 Mon Sep 17 00:00:00 2001 From: Michael Simacek Date: Mon, 18 May 2026 14:40:22 +0200 Subject: [PATCH 2/3] Add bench-results.json to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c338413add..44f1e95c52 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,4 @@ compile_commands.json .codex opencode.json pyrightconfig.json +bench-results.json From 5ee0ccd7de9612fe79e8fd58302c8bf135e29c19 Mon Sep 17 00:00:00 2001 From: Michael Simacek Date: Mon, 18 May 2026 16:24:02 +0200 Subject: [PATCH 3/3] Deal with versioned standalones in downstream tests --- .github/actions/downstream-test/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/downstream-test/action.yml b/.github/actions/downstream-test/action.yml index 89254a74cd..2d99a711b3 100644 --- a/.github/actions/downstream-test/action.yml +++ b/.github/actions/downstream-test/action.yml @@ -62,7 +62,7 @@ runs: if: ${{ inputs.platform == 'macos' }} shell: bash run: | - tarball="$(curl -sH "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/graalvm/graalvm-ce-dev-builds/releases/latest" | jq -r --arg artifact "graalpy-community-dev-${{ inputs.platform }}-${{ inputs.arch }}.tar.gz" '.assets[] | select(.name == $artifact) | .browser_download_url')" + tarball="$(curl -sH "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/graalvm/graalvm-ce-dev-builds/releases/latest" | jq -r --arg platform "${{ inputs.platform }}" --arg arch "${{ inputs.arch }}" 'first(.assets[] | select(.name | test("^graalpy[0-9.]+-community-dev-\($platform)-\($arch)\\.(tar\\.gz|zip)$")) | .browser_download_url)')" curl -sfL "$tarball" | tar xz - name: Get GraalPy build artifact