diff --git a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py
index 200a1b92ee..89f59def6a 100644
--- a/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py
+++ b/graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py
@@ -515,6 +515,13 @@ def test_memoryview_acquire_release(self):
)
obj = TestType()
assert obj.get_bufcount() == 0
+ assert bytes(obj) == bytes([123, 124, 125, 126])
+ assert obj.get_bufcount() == 0
+ assert struct.unpack("4B", obj) == (123, 124, 125, 126)
+ assert obj.get_bufcount() == 0
+ with self.assertRaises(struct.error):
+ struct.unpack("B", obj)
+ assert obj.get_bufcount() == 0
mv1 = memoryview(obj)
assert mv1[3] == 126
assert obj.get_bufcount() == 1
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java
index 561fa5222b..014e71baa9 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java
@@ -62,9 +62,11 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.str.PString;
+import com.oracle.graal.python.lib.PyBufferRelease;
+import com.oracle.graal.python.lib.PyObjectCheckBuffer;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
@@ -75,8 +77,6 @@
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
-import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -107,13 +107,11 @@ protected List extends NodeFactory extends PythonBuiltinBaseNode>> getNodeFa
}
abstract static class AsciiBufferConverter extends ArgumentCastNode {
- @Specialization(guards = "acquireLib.hasBuffer(value)", limit = "getCallSiteInlineCacheMaxDepth()")
+ @Specialization(guards = "checkBufferNode.execute(value)", limit = "1")
static Object doObject(VirtualFrame frame, Object value,
- @Bind Node inliningTarget,
- @Bind PythonContext context,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("value") PythonBufferAcquireLibrary acquireLib) {
- return acquireLib.acquireReadonly(value, frame, context, context.getLanguage(inliningTarget), callData);
+ @Cached PyObjectCheckBuffer checkBufferNode,
+ @Cached PyObjectGetBuffer getBuffer) {
+ return getBuffer.executeReadonly(frame, value);
}
@ExportLibrary(PythonBufferAccessLibrary.class)
@@ -193,14 +191,14 @@ public static AsciiBufferConverter create() {
abstract static class A2bBase64Node extends PythonBinaryClinicBuiltinNode {
@Specialization(limit = "3")
PBytes doConvert(VirtualFrame frame, Object buffer, boolean strictMode,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
- @Bind PythonLanguage language) {
+ @Bind PythonLanguage language,
+ @Cached PyBufferRelease releaseBuffer) {
try {
ByteSequenceStorage storage = b64decode(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), strictMode);
return PFactory.createBytes(language, storage);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -278,14 +276,14 @@ protected ArgumentClinicProvider getArgumentClinic() {
abstract static class A2bHexNode extends PythonUnaryClinicBuiltinNode {
@Specialization(limit = "3")
PBytes a2b(VirtualFrame frame, Object buffer,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
- @Bind PythonLanguage language) {
+ @Bind PythonLanguage language,
+ @Cached PyBufferRelease releaseBuffer) {
try {
byte[] bytes = a2b(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer));
return PFactory.createBytes(language, bytes);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -342,13 +340,13 @@ private PBytes b2a(byte[] data, int lenght, boolean newline, PythonLanguage lang
@Specialization(limit = "3")
PBytes b2aBuffer(VirtualFrame frame, Object buffer, boolean newline,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
- @Bind PythonLanguage language) {
+ @Bind PythonLanguage language,
+ @Cached PyBufferRelease releaseBuffer) {
try {
return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), newline, language);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -369,10 +367,10 @@ abstract static class B2aHexNode extends PythonTernaryClinicBuiltinNode {
@Specialization(limit = "3")
static PBytes b2a(VirtualFrame frame, Object buffer, Object sep, int bytesPerSep,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
@Bind PythonLanguage language,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
if (sep != PNone.NO_VALUE || bytesPerSep != 1) {
// TODO implement sep and bytes_per_sep
throw raiseNode.raise(inliningTarget, NotImplementedError);
@@ -380,7 +378,7 @@ static PBytes b2a(VirtualFrame frame, Object buffer, Object sep, int bytesPerSep
try {
return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), language);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -410,12 +408,12 @@ abstract static class Crc32Node extends PythonBinaryClinicBuiltinNode {
@Specialization(limit = "3")
static long b2a(VirtualFrame frame, Object buffer, long crc,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
+ @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
+ @Cached PyBufferRelease releaseBuffer) {
try {
return crc32(inliningTarget, (int) crc, bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -434,12 +432,12 @@ abstract static class CrcHqxNode extends PythonBinaryClinicBuiltinNode {
@Specialization(limit = "3")
static long b2a(VirtualFrame frame, Object buffer, long crc,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
+ @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
+ @Cached PyBufferRelease releaseBuffer) {
try {
return crcHqx(inliningTarget, (int) crc, bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java
index 2eaeb899fc..7abf14f62a 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java
@@ -128,7 +128,6 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.PNotImplemented;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
@@ -171,6 +170,7 @@
import com.oracle.graal.python.compiler.ParserCallbacksImpl;
import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler;
import com.oracle.graal.python.lib.IteratorExhausted;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyBytesCheckNode;
import com.oracle.graal.python.lib.PyCallableCheckNode;
import com.oracle.graal.python.lib.PyEvalGetGlobals;
@@ -192,6 +192,7 @@
import com.oracle.graal.python.lib.PyObjectFormat;
import com.oracle.graal.python.lib.PyObjectGetAIter;
import com.oracle.graal.python.lib.PyObjectGetAttrO;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetIter;
import com.oracle.graal.python.lib.PyObjectGetMethod;
import com.oracle.graal.python.lib.PyObjectHashNode;
@@ -269,7 +270,6 @@
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.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.PythonOptions;
import com.oracle.graal.python.runtime.exception.PException;
@@ -1067,7 +1067,7 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m
@Specialization(limit = "3")
@SuppressWarnings("truffle-static-method")
Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleString mode, int flags, boolean dontInherit, int optimize, int featureVersion,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Bind PythonContext context,
@Bind Node inliningTarget,
@@ -1103,7 +1103,7 @@ Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleStri
RootCallTarget rootCallTarget = context.getLanguage(inliningTarget).compileModule(context, mod, source, false, optimize, null, null, flags);
return wrapRootCallTarget(rootCallTarget, filename);
}
- TruffleString source = sourceAsString(frame, inliningTarget, wSource, filename, interopLib, acquireLib, bufferLib, switchEncodingNode, raiseNode);
+ TruffleString source = sourceAsString(frame, inliningTarget, wSource, filename, interopLib, getBuffer, bufferLib, switchEncodingNode, raiseNode);
checkSource(source);
return compile(source, filename, mode, flags, dontInherit, optimize, featureVersion);
} finally {
@@ -1167,7 +1167,7 @@ private InputType getParserInputType(TruffleString mode, int flags) {
}
// modeled after _Py_SourceAsString
- TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object source, TruffleString filename, InteropLibrary interopLib, PythonBufferAcquireLibrary acquireLib,
+ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object source, TruffleString filename, InteropLibrary interopLib, PyObjectGetBuffer getBuffer,
PythonBufferAccessLibrary bufferLib, TruffleString.SwitchEncodingNode switchEncodingNode, PRaiseNode raiseNode) {
if (interopLib.isString(source)) {
try {
@@ -1180,7 +1180,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou
// buffers, since that's fast for us anyway
Object buffer;
try {
- buffer = acquireLib.acquireReadonly(source, frame, InteropCallData.getUncached());
+ buffer = getBuffer.executeReadonly(frame, source);
} catch (PException e) {
throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S, "compile()", 1, "string, bytes or AST object");
}
@@ -1189,7 +1189,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou
int bytesLen = bufferLib.getBufferLength(source);
return doDecodeSource(getContext(), source, filename, bytes, bytesLen);
} finally {
- bufferLib.release(buffer, frame, InteropCallData.getUncached());
+ PyBufferRelease.getUncached().execute(frame, buffer);
}
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java
index 188e65f357..31e8006815 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/CodecsModuleBuiltins.java
@@ -98,7 +98,6 @@
import com.oracle.graal.python.builtins.modules.codecs.ErrorHandlersFactory.CallDecodingErrorHandlerNodeGen;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.ByteArrayBuffer;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
@@ -106,7 +105,9 @@
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetInternalByteArrayNode;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyCallableCheckNode;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectSizeNode;
import com.oracle.graal.python.lib.PyObjectTypeCheck;
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -128,7 +129,6 @@
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext;
import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.object.PFactory;
@@ -241,7 +241,8 @@ byte[] encode(VirtualFrame frame, Object self, TruffleString encoding, TruffleSt
@Cached TruffleString.ToJavaStringNode toJavaStringNode,
@Cached TruffleString.EqualNode equalNode,
@Cached ErrorHandlers.CallEncodingErrorHandlerNode errorHandler,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyBufferRelease releaseBuffer,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Cached CastToJavaStringNode castToJavaStringNode,
@Cached PRaiseNode raiseNode,
@@ -258,7 +259,8 @@ byte[] encode(VirtualFrame frame, Object self, TruffleString encoding, TruffleSt
return ret;
}
}
- return slowPath(frame, encoding, errors, inliningTarget, toJavaStringNode, equalNode, errorHandler, acquireLib, bufferLib, castToJavaStringNode, raiseNode, input, charsetWrapper);
+ return slowPath(frame, encoding, errors, inliningTarget, toJavaStringNode, equalNode, errorHandler, getBuffer, releaseBuffer, bufferLib, castToJavaStringNode, raiseNode, input,
+ charsetWrapper);
}
private static byte[] fastPath(TruffleString input,
@@ -295,7 +297,8 @@ private byte[] slowPath(VirtualFrame frame, TruffleString encoding, TruffleStrin
TruffleString.ToJavaStringNode toJavaStringNode,
TruffleString.EqualNode equalNode,
ErrorHandlers.CallEncodingErrorHandlerNode errorHandler,
- PythonBufferAcquireLibrary acquireLib,
+ PyObjectGetBuffer getBuffer,
+ PyBufferRelease releaseBuffer,
PythonBufferAccessLibrary bufferLib,
CastToJavaStringNode castToJavaStringNode,
PRaiseNode raiseNode,
@@ -317,11 +320,11 @@ private byte[] slowPath(VirtualFrame frame, TruffleString encoding, TruffleStrin
String replacementStr = castToJavaStringNode.execute(result.replacement);
encoder.replace(replacementStr, charset);
} else {
- Object buffer = acquireLib.acquireReadonly(result.replacement);
+ Object buffer = getBuffer.executeReadonly(frame, result.replacement);
try {
encoder.replace(bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
} finally {
- bufferLib.release(buffer);
+ releaseBuffer.execute(frame, buffer);
}
}
}
@@ -384,8 +387,7 @@ protected ArgumentClinicProvider getArgumentClinic() {
static Object decode(VirtualFrame frame, Object input, TruffleString encoding, TruffleString errors, boolean finalData,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Cached TruffleString.FromByteArrayNode fromByteArrayNode,
@Cached TruffleString.IsValidNode isValidNode,
@@ -393,8 +395,9 @@ static Object decode(VirtualFrame frame, Object input, TruffleString encoding, T
@Cached InlinedConditionProfile fastPathProfile,
@Cached(inline = true) CharsetLookupNode charsetLookupNode,
@Cached("createFor($node)") BoundaryCallData boundaryCallData,
- @Cached PRaiseNode raiseNode) {
- Object buffer = acquireLib.acquireReadonly(input, frame, callData);
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
+ Object buffer = getBuffer.executeReadonly(frame, input);
try {
int len = bufferLib.getBufferLength(buffer);
byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer);
@@ -451,7 +454,7 @@ static Object decode(VirtualFrame frame, Object input, TruffleString encoding, T
BoundaryCallContext.exit(frame, boundaryCallData, savedState);
}
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -472,7 +475,7 @@ public static Object[] decodeSlowPath(Object input, TruffleString encoding, Truf
ErrorHandlers.DecodingErrorHandlerResult result = CallDecodingErrorHandlerNodeGen.getUncached().execute(null, null, handlerCache, errors, encoding, input,
pos, pos + decoder.getErrorLength(), decoder.getErrorReason());
if (result.newSrcObj != input) {
- buffer = PythonBufferAcquireLibrary.getUncached().acquireReadonly(result.newSrcObj);
+ buffer = PyObjectGetBuffer.getUncached().executeReadonly(null, result.newSrcObj);
releaseBuffer = true;
bufferLib = PythonBufferAccessLibrary.getFactory().getUncached(buffer);
decoder.setNewInput(bufferLib.getInternalOrCopiedByteArray(result.newSrcObj), 0, bufferLib.getBufferLength(result.newSrcObj), result.newPos);
@@ -487,7 +490,7 @@ public static Object[] decodeSlowPath(Object input, TruffleString encoding, Truf
return new Object[]{decoder.getString(), decoder.getInputPosition()};
} finally {
if (releaseBuffer) {
- bufferLib.release(buffer);
+ PyBufferRelease.getUncached().execute(null, buffer);
}
}
}
@@ -514,13 +517,13 @@ Object decodeByteArray(byte[] bytes, TruffleString errors,
@Specialization(limit = "3")
Object decode(VirtualFrame frame, Object buffer, TruffleString errors,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
+ @CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
+ @Cached PyBufferRelease releaseBuffer) {
try {
int len = bufferLib.getBufferLength(buffer);
return decodeBytes(bufferLib.getInternalOrCopiedByteArray(buffer), len, errors, language);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -1316,20 +1319,20 @@ protected ArgumentClinicProvider getArgumentClinic() {
return CodecsModuleBuiltinsClinicProviders.CharmapDecodeNodeClinicProviderGen.INSTANCE;
}
- @Specialization(limit = "3")
+ @Specialization
Object doIt(VirtualFrame frame, Object data, TruffleString errors, Object mapping,
@Bind Node inliningTarget,
@Bind PythonContext context,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("data") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached PyUnicodeDecodeCharmapNode pyUnicodeDecodeCharmapNode) {
- Object dataBuffer = bufferAcquireLib.acquireReadonly(data, frame, context, context.getLanguage(inliningTarget), callData);
+ @Cached PyUnicodeDecodeCharmapNode pyUnicodeDecodeCharmapNode,
+ @Cached PyBufferRelease releaseBuffer) {
+ Object dataBuffer = getBuffer.executeReadonly(frame, data);
int len;
try {
len = bufferLib.getBufferLength(dataBuffer);
} finally {
- bufferLib.release(dataBuffer, frame, callData);
+ releaseBuffer.execute(frame, dataBuffer);
}
TruffleString result = len == 0 ? T_EMPTY_STRING : pyUnicodeDecodeCharmapNode.execute(frame, data, errors, mapping);
return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{result, len});
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 efd562580e..5aa3c42ac8 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
@@ -64,9 +64,11 @@
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.FileDescriptorConversionNode;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyLongAsIntNode;
import com.oracle.graal.python.lib.PyLongAsLongNode;
+import com.oracle.graal.python.lib.PyObjectCheckBuffer;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
import com.oracle.graal.python.nodes.PRaiseNode;
@@ -77,7 +79,6 @@
import com.oracle.graal.python.nodes.util.CannotCastException;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
import com.oracle.graal.python.runtime.GilNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PosixConstants;
import com.oracle.graal.python.runtime.PosixConstants.IntConstant;
import com.oracle.graal.python.runtime.PosixSupport.PosixException;
@@ -203,9 +204,9 @@ abstract static class IoctlNode extends PythonClinicBuiltinNode {
Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutateArg,
@Bind Node inliningTarget,
@Bind PythonContext context,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectCheckBuffer checkBufferNode,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached("createFor($node)") InteropCallData callData,
@Cached PyLongAsIntNode asIntNode,
@Cached CastToTruffleStringNode castToString,
@Cached TruffleString.SwitchEncodingNode switchEncodingNode,
@@ -213,21 +214,22 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat
@Cached GilNode gilNode,
@Cached PRaiseNode raiseNode,
@Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
- @Cached SysModuleBuiltins.AuditNode auditNode) {
+ @Cached SysModuleBuiltins.AuditNode auditNode,
+ @Cached PyBufferRelease releaseBuffer) {
auditNode.audit(frame, inliningTarget, T_FCNT_IOCTL, fd, request, arg);
int intArg = 0;
if (arg != PNone.NO_VALUE) {
Object buffer = null;
// Buffer argument
- if (acquireLib.hasBuffer(arg)) {
+ if (checkBufferNode.execute(arg)) {
boolean writable = false;
try {
- buffer = acquireLib.acquireWritable(arg, frame, callData);
+ buffer = getBuffer.executeWritable(frame, arg);
writable = true;
} catch (PException e) {
try {
- buffer = acquireLib.acquireReadonly(arg, frame, callData);
+ buffer = getBuffer.executeReadonly(frame, arg);
} catch (PException e1) {
// ignore
}
@@ -270,7 +272,7 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat
}
}
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java
index d691dc79f4..6ce986ae58 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java
@@ -93,6 +93,7 @@
import com.oracle.graal.python.builtins.objects.module.PythonModule;
import com.oracle.graal.python.builtins.objects.object.PythonObject;
import com.oracle.graal.python.builtins.objects.str.StringNodes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyMemoryViewFromObject;
import com.oracle.graal.python.lib.PyObjectGetAttr;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
@@ -452,7 +453,8 @@ protected ArgumentClinicProvider getArgumentClinic() {
static Object run(TruffleString name, Object dataObj,
@Bind Node inliningTarget,
@Bind PythonContext context,
- @Cached PConstructAndRaiseNode.Lazy raiseNode) {
+ @Cached PConstructAndRaiseNode.Lazy raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
FrozenInfo info;
if (dataObj != PNone.NONE) {
byte[] bytes;
@@ -462,7 +464,7 @@ static Object run(TruffleString name, Object dataObj,
bytes = bufferLib.getInternalOrCopiedByteArray(dataObj);
size = bufferLib.getBufferLength(dataObj);
} finally {
- bufferLib.release(dataObj);
+ releaseBuffer.execute(null, dataObj);
}
if (size == 0) {
/* Does not contain executable code. */
@@ -727,14 +729,15 @@ private static void raiseFrozenError(Node inliningTarget, PConstructAndRaiseNode
@GenerateNodeFactory
public abstract static class SourceHashNode extends PythonBinaryClinicBuiltinNode {
@Specialization(limit = "2")
- static PBytes run(long magicNumber, Object sourceBuffer,
+ static PBytes run(VirtualFrame frame, long magicNumber, Object sourceBuffer,
@CachedLibrary("sourceBuffer") PythonBufferAccessLibrary bufferLib,
- @Bind PythonLanguage language) {
+ @Bind PythonLanguage language,
+ @Cached PyBufferRelease releaseBuffer) {
try {
byte[] hash = hashSource(magicNumber, bufferLib.getInternalOrCopiedByteArray(sourceBuffer), bufferLib.getBufferLength(sourceBuffer));
return PFactory.createBytes(language, hash);
} finally {
- bufferLib.release(sourceBuffer);
+ releaseBuffer.execute(frame, sourceBuffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java
index ae410da54a..d9975c0a94 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/JavaModuleBuiltins.java
@@ -56,11 +56,12 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
import com.oracle.graal.python.lib.PyObjectGetAttr;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.call.CallNode;
@@ -72,7 +73,6 @@
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
import com.oracle.graal.python.runtime.GilNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PythonErrorType;
import com.oracle.graal.python.runtime.interop.InteropByteArray;
@@ -285,16 +285,16 @@ static Object doBytesByteStorage(PBytesLike object) {
return new PUnsignedBytesWrapper(object);
}
- @Specialization(guards = "!isBytes(object)", limit = "3")
+ @Specialization(guards = "!isBytes(object)")
static Object doBuffer(VirtualFrame frame, Object object,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("object") PythonBufferAcquireLibrary acquireLib,
- @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib) {
- Object buffer = acquireLib.acquireReadonly(object, frame, callData);
+ @Cached PyObjectGetBuffer getBuffer,
+ @CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib,
+ @Cached PyBufferRelease releaseBuffer) {
+ Object buffer = getBuffer.executeReadonly(frame, object);
try {
return new InteropByteArray(bufferLib.getCopiedByteArray(object));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java
index 14b8795283..31b88126bd 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java
@@ -75,7 +75,6 @@
import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltinsClinicProviders.DumpsNodeClinicProviderGen;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
import com.oracle.graal.python.builtins.objects.code.PCode;
import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage;
@@ -100,6 +99,7 @@
import com.oracle.graal.python.builtins.objects.str.PString;
import com.oracle.graal.python.builtins.objects.str.StringNodes.IsInternedStringNode;
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyComplexCheckExactNode;
import com.oracle.graal.python.lib.PyDictCheckExactNode;
import com.oracle.graal.python.lib.PyFloatCheckExactNode;
@@ -108,6 +108,8 @@
import com.oracle.graal.python.lib.PyLongCheckExactNode;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
+import com.oracle.graal.python.lib.PyObjectCheckBuffer;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PySetCheckExactNode;
import com.oracle.graal.python.lib.PyTupleCheckExactNode;
import com.oracle.graal.python.lib.PyUnicodeCheckExactNode;
@@ -125,7 +127,6 @@
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext;
import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.PythonOptions;
import com.oracle.graal.python.runtime.object.PFactory;
@@ -257,11 +258,11 @@ static Object doit(VirtualFrame frame, Object file, boolean allowCode,
@Bind Node inliningTarget,
@Bind PythonContext context,
@Cached("createCallReadNode()") LookupAndCallBinaryNode callNode,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferLib,
+ @Cached PyObjectCheckBuffer checkBufferNode,
@Cached PRaiseNode raiseNode) {
PythonLanguage language = context.getLanguage(inliningTarget);
Object buffer = callNode.executeObject(frame, file, 0);
- if (!bufferLib.hasBuffer(buffer)) {
+ if (!checkBufferNode.execute(buffer)) {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.READ_RETURNED_NOT_BYTES, buffer);
}
try {
@@ -284,9 +285,9 @@ abstract static class LoadsNode extends PythonBinaryClinicBuiltinNode {
static Object doit(VirtualFrame frame, Object buffer, boolean allowCode,
@Bind Node inliningTarget,
@Bind PythonContext context,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
PythonLanguage language = context.getLanguage(inliningTarget);
try {
byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer);
@@ -301,7 +302,7 @@ static Object doit(VirtualFrame frame, Object buffer, boolean allowCode,
} catch (Marshal.MarshalError me) {
throw raiseNode.raise(inliningTarget, me.type, me.message, me.arguments);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -978,17 +979,16 @@ private void writeComplexObject(Object v, int flag) {
writeByte(TYPE_DSL_SOURCE | flag);
writeSource(s);
} else {
- PythonBufferAcquireLibrary acquireLib = PythonBufferAcquireLibrary.getFactory().getUncached(v);
- if (acquireLib.hasBuffer(v)) {
+ if (PyObjectCheckBuffer.executeUncached(v)) {
writeByte(TYPE_STRING | flag);
- Object buf = acquireLib.acquireReadonly(v);
+ Object buf = PyObjectGetBuffer.getUncached().executeReadonly(null, v);
PythonBufferAccessLibrary accessLib = PythonBufferAccessLibrary.getFactory().getUncached(buf);
try {
int len = accessLib.getBufferLength(buf);
writeSize(len);
out.write(accessLib.getInternalOrCopiedByteArray(buf), 0, len);
} finally {
- accessLib.release(buf);
+ PyBufferRelease.getUncached().execute(null, buf);
}
} else {
writeByte(TYPE_UNKNOWN);
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java
index 935eaf2fa2..2ff09ca324 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/OperatorModuleBuiltins.java
@@ -51,9 +51,9 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.function.PKeyword;
import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes.GetLength;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyNumberAbsoluteNode;
import com.oracle.graal.python.lib.PyNumberAddNode;
import com.oracle.graal.python.lib.PyNumberAndNode;
@@ -85,7 +85,9 @@
import com.oracle.graal.python.lib.PyNumberSubtractNode;
import com.oracle.graal.python.lib.PyNumberTrueDivideNode;
import com.oracle.graal.python.lib.PyNumberXorNode;
+import com.oracle.graal.python.lib.PyObjectCheckBuffer;
import com.oracle.graal.python.lib.PyObjectDelItem;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetItem;
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
import com.oracle.graal.python.lib.PyObjectRichCompare;
@@ -108,8 +110,6 @@
import com.oracle.graal.python.nodes.object.IsNode;
import com.oracle.graal.python.nodes.util.CannotCastException;
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
-import com.oracle.graal.python.runtime.ExecutionContext.InteropCallContext;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Bind;
import com.oracle.truffle.api.dsl.Cached;
@@ -666,31 +666,30 @@ abstract static class CompareDigestNode extends PythonBinaryBuiltinNode {
@Specialization
static boolean compare(VirtualFrame frame, Object left, Object right,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@Cached CastToJavaStringNode cast,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Cached PyObjectCheckBuffer checkBufferNode,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
String leftString = cast.execute(left);
String rightString = cast.execute(right);
return tscmp(leftString, rightString);
} catch (CannotCastException e) {
- if (!bufferAcquireLib.hasBuffer(left) || !bufferAcquireLib.hasBuffer(right)) {
+ if (!checkBufferNode.execute(left) || !checkBufferNode.execute(right)) {
throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_OR_COMBINATION_OF_TYPES, left, right);
}
- Object savedState = InteropCallContext.enter(frame, inliningTarget, callData);
- Object leftBuffer = bufferAcquireLib.acquireReadonly(left);
+ Object leftBuffer = getBuffer.executeReadonly(frame, left);
try {
- Object rightBuffer = bufferAcquireLib.acquireReadonly(right);
+ Object rightBuffer = getBuffer.executeReadonly(frame, right);
try {
return tscmp(bufferLib.getCopiedByteArray(leftBuffer), bufferLib.getCopiedByteArray(rightBuffer));
} finally {
- bufferLib.release(rightBuffer);
+ releaseBuffer.execute(frame, rightBuffer);
}
} finally {
- bufferLib.release(leftBuffer);
- InteropCallContext.exit(frame, inliningTarget, callData, savedState);
+ releaseBuffer.execute(frame, leftBuffer);
}
}
}
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 844cd7cdd1..8b15d52df6 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
@@ -84,6 +84,7 @@
import com.oracle.graal.python.builtins.objects.posix.PScandirIterator;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
import com.oracle.graal.python.builtins.objects.tuple.StructSequence;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyIndexCheckNode;
import com.oracle.graal.python.lib.PyLongAsIntNode;
import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode;
@@ -122,7 +123,6 @@
import com.oracle.graal.python.nodes.util.PosixSupportNodes;
import com.oracle.graal.python.nodes.util.PosixSupportNodes.DecodeFilesystemStringNode;
import com.oracle.graal.python.runtime.GilNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PosixConstants;
import com.oracle.graal.python.runtime.PosixConstants.IntConstant;
import com.oracle.graal.python.runtime.PosixSupport;
@@ -1008,18 +1008,18 @@ protected ArgumentClinicProvider getArgumentClinic() {
@Specialization(limit = "3")
static long doWrite(VirtualFrame frame, int fd, Object dataBuffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("dataBuffer") PythonBufferAccessLibrary bufferLib,
@Bind PythonContext context,
@Cached InlinedBranchProfile errorProfile,
@Cached GilNode gil,
- @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
+ @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
return write(fd, bufferLib.getInternalOrCopiedByteArray(dataBuffer), bufferLib.getBufferLength(dataBuffer), inliningTarget, context.getPosixSupport(), errorProfile, gil);
} catch (PosixException e) {
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
} finally {
- bufferLib.release(dataBuffer, frame, callData);
+ releaseBuffer.execute(frame, dataBuffer);
}
}
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 1d1c13f7fc..1a46b7f817 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
@@ -77,7 +77,6 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
@@ -87,8 +86,10 @@
import com.oracle.graal.python.builtins.objects.socket.SocketNodes;
import com.oracle.graal.python.builtins.objects.socket.SocketNodes.IdnaFromStringOrBytesConverterNode;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyLongAsIntNode;
import com.oracle.graal.python.lib.PyLongAsLongNode;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyTupleCheckNode;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
@@ -107,7 +108,6 @@
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
import com.oracle.graal.python.nodes.util.PosixSupportNodes;
import com.oracle.graal.python.runtime.GilNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PosixConstants;
import com.oracle.graal.python.runtime.PosixSupport;
import com.oracle.graal.python.runtime.PosixSupport.AddrInfoCursor;
@@ -835,16 +835,16 @@ protected ArgumentClinicProvider getArgumentClinic() {
@Builtin(name = "inet_ntoa", minNumOfPositionalArgs = 1)
@GenerateNodeFactory
abstract static class InetNtoANode extends PythonUnaryBuiltinNode {
- @Specialization(limit = "3")
+ @Specialization
static TruffleString doGeneric(VirtualFrame frame, Object addr,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("addr") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib,
@Bind PythonContext context,
@Cached PosixSupportNodes.GetCStringAsStringNode getCStringAsStringNode,
- @Cached PRaiseNode raiseNode) {
- Object buffer = bufferAcquireLib.acquireReadonly(addr, frame, callData);
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
+ Object buffer = getBuffer.executeReadonly(frame, addr);
try {
byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer);
int len = bufferLib.getBufferLength(buffer);
@@ -855,7 +855,7 @@ static TruffleString doGeneric(VirtualFrame frame, Object addr,
Object result = posixSupport.inet_ntoa(ByteArraySupport.bigEndian().getInt(bytes, 0));
return getCStringAsStringNode.execute(inliningTarget, posixSupport, result);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
@@ -893,17 +893,17 @@ protected ArgumentClinicProvider getArgumentClinic() {
@ArgumentClinic(name = "family", conversion = ArgumentClinic.ClinicConversion.Int)
@GenerateNodeFactory
abstract static class InetNtoPNode extends PythonBinaryClinicBuiltinNode {
- @Specialization(limit = "3")
+ @Specialization
static TruffleString doGeneric(VirtualFrame frame, int family, Object obj,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("obj") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "1") PythonBufferAccessLibrary bufferLib,
@Bind PythonContext context,
@Cached PosixSupportNodes.GetCStringAsStringNode getCStringAsStringNode,
@Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
- @Cached PRaiseNode raiseNode) {
- Object buffer = bufferAcquireLib.acquireReadonly(obj, frame, callData);
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
+ Object buffer = getBuffer.executeReadonly(frame, obj);
try {
byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer);
int len = bufferLib.getBufferLength(buffer);
@@ -926,7 +926,7 @@ static TruffleString doGeneric(VirtualFrame frame, int family, Object obj,
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
}
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java
index ab1295864d..dd482bc39f 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ast/Obj2SstBase.java
@@ -59,7 +59,6 @@
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
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.complex.PComplex;
@@ -70,6 +69,7 @@
import com.oracle.graal.python.builtins.objects.str.PString;
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
import com.oracle.graal.python.lib.IteratorExhausted;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyBytesCheckExactNode;
import com.oracle.graal.python.lib.PyComplexCheckExactNode;
import com.oracle.graal.python.lib.PyEnterRecursiveCallNode;
@@ -78,6 +78,7 @@
import com.oracle.graal.python.lib.PyIterNextNode;
import com.oracle.graal.python.lib.PyLongAsIntNode;
import com.oracle.graal.python.lib.PyLongCheckNode;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetIter;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
@@ -94,8 +95,8 @@
import com.oracle.graal.python.runtime.PythonContext.PythonThreadState;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
-import com.oracle.truffle.api.nodes.Node;
import com.oracle.graal.python.util.PythonUtils;
+import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.strings.TruffleString;
abstract class Obj2SstBase {
@@ -230,13 +231,12 @@ Object obj2string(Object obj) {
return null;
}
if (PyBytesCheckExactNode.executeUncached(obj)) {
- PythonBufferAcquireLibrary acquireLib = PythonBufferAcquireLibrary.getUncached();
PythonBufferAccessLibrary accessLib = PythonBufferAccessLibrary.getUncached();
- Object buf = acquireLib.acquireReadonly(obj);
+ Object buf = PyObjectGetBuffer.getUncached().executeReadonly(null, obj);
try {
return accessLib.getCopiedByteArray(buf);
} finally {
- accessLib.release(buf);
+ PyBufferRelease.getUncached().execute(null, buf);
}
}
if (PyUnicodeCheckExactNode.executeUncached(obj)) {
@@ -301,12 +301,12 @@ ConstantValue obj2ConstantValue(Object obj) {
return ConstantValue.ofCodePoints(PythonUtils.truffleStringToCodePoints(ps.getValueUncached()));
}
if (obj instanceof PBytes && PyBytesCheckExactNode.executeUncached(obj)) {
- Object buf = PythonBufferAcquireLibrary.getUncached().acquireReadonly(obj);
+ Object buf = PyObjectGetBuffer.getUncached().executeReadonly(null, obj);
PythonBufferAccessLibrary accessLib = PythonBufferAccessLibrary.getFactory().getUncached(buf);
try {
return ConstantValue.ofBytes(accessLib.getCopiedByteArray(buf));
} finally {
- accessLib.release(buf);
+ PyBufferRelease.getUncached().execute(null, buf);
}
}
boolean isTuple = PyTupleCheckExactNode.executeUncached(obj);
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java
index 584f6c5fb3..210d3d4efb 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/CharmapNodes.java
@@ -64,14 +64,15 @@
import com.oracle.graal.python.builtins.modules.codecs.ErrorHandlers.RaiseEncodeException;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem;
import com.oracle.graal.python.builtins.objects.dict.PDict;
import com.oracle.graal.python.builtins.objects.ints.PInt;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyBytesCheckNode;
import com.oracle.graal.python.lib.PyLongAsLongNode;
import com.oracle.graal.python.lib.PyLongCheckNode;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetItem;
import com.oracle.graal.python.lib.PyUnicodeCheckExactNode;
import com.oracle.graal.python.lib.PyUnicodeCheckNode;
@@ -80,8 +81,6 @@
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
-import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.util.ByteArrayBuilder;
@@ -362,31 +361,27 @@ public abstract static class PyUnicodeDecodeCharmapNode extends PNodeWithContext
public abstract TruffleString execute(VirtualFrame frame, Object data, TruffleString errors, Object mapping);
- @Specialization(limit = "3")
+ @Specialization
static TruffleString decodeLatin1(VirtualFrame frame, Object data, @SuppressWarnings("unused") TruffleString errors, @SuppressWarnings("unused") PNone mapping,
- @Bind Node inliningTarget,
- @Bind PythonContext context,
- @Shared @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("data") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Shared @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") @Shared PythonBufferAccessLibrary bufferLib,
@Cached TruffleString.FromByteArrayWithCompactionUTF32Node fromByteArrayNode,
- @Cached TruffleString.SwitchEncodingNode switchEncodingNode) {
+ @Shared @Cached PyBufferRelease releaseBuffer) {
// equivalent of PyUnicode_DecodeLatin1
- Object dataBuffer = bufferAcquireLib.acquireReadonly(data, frame, context, context.getLanguage(inliningTarget), callData);
+ Object dataBuffer = getBuffer.executeReadonly(frame, data);
try {
int len = bufferLib.getBufferLength(dataBuffer);
byte[] src = bufferLib.getInternalOrCopiedByteArray(dataBuffer);
return fromByteArrayNode.execute(src, 0, len, TruffleString.CompactionLevel.S1, true);
} finally {
- bufferLib.release(dataBuffer, frame, callData);
+ releaseBuffer.execute(frame, dataBuffer);
}
}
@Specialization(limit = "3", guards = "isBuiltinString.execute(inliningTarget, mappingObj)")
static TruffleString decodeStringMapping(VirtualFrame frame, Object data, TruffleString errors, Object mappingObj,
@Bind Node inliningTarget,
- @Shared @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("data") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Shared @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") @Shared PythonBufferAccessLibrary bufferLib,
@SuppressWarnings("unused") @Cached @Exclusive PyUnicodeCheckExactNode isBuiltinString,
@Cached @Exclusive CastToTruffleStringNode castToTruffleStringNode,
@@ -395,10 +390,9 @@ static TruffleString decodeStringMapping(VirtualFrame frame, Object data, Truffl
@Cached @Shared TruffleStringBuilder.AppendCodePointNode appendCodePointNode,
@Cached @Shared TruffleStringBuilder.AppendStringNode appendStringNode,
@Cached @Shared TruffleStringBuilder.ToStringNode toStringNode,
- @Cached @Exclusive CallDecodingErrorHandlerNode callErrorHandlerNode) {
+ @Cached @Exclusive CallDecodingErrorHandlerNode callErrorHandlerNode,
+ @Shared @Cached PyBufferRelease releaseBuffer) {
// equivalent of charmap_decode_string
- PythonContext context = PythonContext.get(inliningTarget);
- PythonLanguage language = context.getLanguage(inliningTarget);
ErrorHandlerCache cache = new ErrorHandlerCache();
Object srcObj = data;
@@ -409,7 +403,7 @@ static TruffleString decodeStringMapping(VirtualFrame frame, Object data, Truffl
int errorStartPos;
int srcLen;
do {
- Object srcBuf = bufferAcquireLib.acquireReadonly(srcObj, frame, context, language, callData);
+ Object srcBuf = getBuffer.executeReadonly(frame, srcObj);
try {
srcLen = bufferLib.getBufferLength(srcBuf);
byte[] src = bufferLib.getInternalOrCopiedByteArray(srcBuf);
@@ -428,7 +422,7 @@ static TruffleString decodeStringMapping(VirtualFrame frame, Object data, Truffl
appendCodePointNode.execute(tsb, cp, 1, true);
}
} finally {
- bufferLib.release(srcBuf, frame, context, language, callData);
+ releaseBuffer.execute(frame, srcBuf);
}
if (errorStartPos != -1) {
DecodingErrorHandlerResult result = callErrorHandlerNode.execute(frame, inliningTarget, cache, errors, T_CHARMAP, srcObj, errorStartPos, errorStartPos + 1,
@@ -444,8 +438,7 @@ static TruffleString decodeStringMapping(VirtualFrame frame, Object data, Truffl
@Specialization(limit = "3", guards = {"!isBuiltinString.execute(inliningTarget, mappingObj)", "!isPNone(mappingObj)"})
static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, TruffleString errors, Object mappingObj,
@Bind Node inliningTarget,
- @Shared @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("data") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Shared @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") @Shared PythonBufferAccessLibrary bufferLib,
@SuppressWarnings("unused") @Cached @Exclusive PyUnicodeCheckExactNode isBuiltinString,
@Cached PyObjectGetItem pyObjectGetItemNode,
@@ -463,10 +456,9 @@ static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, Truff
@Cached InlinedConditionProfile longValuesProfile,
@Cached InlinedConditionProfile strValuesProfile,
@Cached InlinedConditionProfile errProfile,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Shared @Cached PyBufferRelease releaseBuffer) {
// equivalent of charmap_decode_mapping
- PythonContext context = PythonContext.get(inliningTarget);
- PythonLanguage language = context.getLanguage(inliningTarget);
ErrorHandlerCache cache = new ErrorHandlerCache();
Object srcObj = data;
@@ -475,7 +467,7 @@ static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, Truff
int errorStartPos;
int srcLen;
do {
- Object srcBuf = bufferAcquireLib.acquireReadonly(srcObj, frame, context, language, callData);
+ Object srcBuf = getBuffer.executeReadonly(frame, srcObj);
try {
srcLen = bufferLib.getBufferLength(srcBuf);
byte[] src = bufferLib.getInternalOrCopiedByteArray(srcBuf);
@@ -522,7 +514,7 @@ static TruffleString decodeGenericMapping(VirtualFrame frame, Object data, Truff
}
}
} finally {
- bufferLib.release(srcBuf, frame, context, language, callData);
+ releaseBuffer.execute(frame, srcBuf);
}
if (errProfile.profile(inliningTarget, errorStartPos != -1)) {
DecodingErrorHandlerResult result = callErrorHandlerNode.execute(frame, inliningTarget, cache, errors, T_CHARMAP, srcObj, errorStartPos, errorStartPos + 1,
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java
index f8c85b8a89..386fc00565 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/codecs/ErrorHandlers.java
@@ -66,7 +66,6 @@
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
import com.oracle.graal.python.builtins.modules.codecs.CodecsRegistry.PyCodecLookupErrorNode;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
@@ -81,8 +80,10 @@
import com.oracle.graal.python.builtins.objects.exception.UnicodeEncodeErrorBuiltins.PyUnicodeEncodeOrTranslateErrorGetObjectNode;
import com.oracle.graal.python.builtins.objects.exception.UnicodeEncodeErrorBuiltins.PyUnicodeEncodeOrTranslateErrorGetStartNode;
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked0Node;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyBytesCheckNode;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectSizeNode;
import com.oracle.graal.python.lib.PyObjectTypeCheck;
import com.oracle.graal.python.lib.PyTupleCheckNode;
@@ -93,7 +94,6 @@
import com.oracle.graal.python.nodes.builtins.TupleNodes.GetTupleStorage;
import com.oracle.graal.python.nodes.call.CallNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
@@ -404,14 +404,14 @@ abstract static class BackslashReplaceErrorHandlerNode extends ErrorHandlerBaseN
static Object doDecodeException(VirtualFrame frame, PBaseException exception,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
@SuppressWarnings("unused") @Cached @Exclusive PyObjectTypeCheck pyObjectTypeCheck,
@Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode,
@Cached PyUnicodeDecodeErrorGetStartNode getStartNode,
@Cached PyUnicodeDecodeErrorGetEndNode getEndNode,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib,
- @Cached @Shared TruffleString.FromByteArrayWithCompactionUTF32Node fromByteArrayNode) {
+ @Cached @Shared TruffleString.FromByteArrayWithCompactionUTF32Node fromByteArrayNode,
+ @Cached PyBufferRelease releaseBuffer) {
int start = getStartNode.execute(inliningTarget, exception);
int end = getEndNode.execute(inliningTarget, exception);
Object object = getObjectNode.execute(inliningTarget, exception);
@@ -420,7 +420,7 @@ static Object doDecodeException(VirtualFrame frame, PBaseException exception,
}
byte[] replacement = new byte[4 * (end - start)];
int pos = 0;
- Object srcBuf = acquireLib.acquireReadonly(object, frame, callData);
+ Object srcBuf = getBuffer.executeReadonly(frame, object);
try {
byte[] src = accessLib.getInternalOrCopiedByteArray(srcBuf);
for (int i = start; i < end; i++) {
@@ -428,7 +428,7 @@ static Object doDecodeException(VirtualFrame frame, PBaseException exception,
}
LoopNode.reportLoopCount(inliningTarget, (int) Math.min(Integer.MAX_VALUE, Math.max(0L, (long) end - start)));
} finally {
- accessLib.release(srcBuf, frame, callData);
+ releaseBuffer.execute(frame, srcBuf);
}
TruffleString resultAscii = fromByteArrayNode.execute(replacement, 0, replacement.length, TruffleString.CompactionLevel.S1, false);
return PFactory.createTuple(language, new Object[]{resultAscii, end});
@@ -578,17 +578,17 @@ static Object doEncode(PBaseException exception,
static Object doDecode(VirtualFrame frame, PBaseException exception,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
@SuppressWarnings("unused") @Exclusive @Cached PyObjectTypeCheck pyObjectTypeCheck,
@Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode,
@Cached PyUnicodeDecodeErrorGetStartNode getStartNode,
@Cached PyUnicodeDecodeErrorGetEndNode getEndNode,
@Cached PyUnicodeDecodeErrorGetEncodingNode getEncodingNode,
@Exclusive @Cached GetStandardEncodingNode getStandardEncodingNode,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib,
@Cached TruffleString.FromCodePointNode fromCodePointNode,
- @Exclusive @Cached PRaiseNode raiseNode) {
+ @Exclusive @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
int start = getStartNode.execute(inliningTarget, exception);
getEndNode.execute(inliningTarget, exception); // called for side effects only
Object object = getObjectNode.execute(inliningTarget, exception);
@@ -597,7 +597,7 @@ static Object doDecode(VirtualFrame frame, PBaseException exception,
if (encoding == StandardEncoding.UNKNOWN) {
throw raiseNode.raiseExceptionObject(inliningTarget, exception);
}
- Object srcBuf = acquireLib.acquireReadonly(object, frame, callData);
+ Object srcBuf = getBuffer.executeReadonly(frame, object);
try {
int cp = 0;
int srcLen = accessLib.getBufferLength(srcBuf);
@@ -609,7 +609,7 @@ static Object doDecode(VirtualFrame frame, PBaseException exception,
}
return PFactory.createTuple(language, new Object[]{fromCodePointNode.execute(cp, TS_ENCODING, true), start + encoding.byteLength});
} finally {
- accessLib.release(srcBuf, frame, callData);
+ releaseBuffer.execute(frame, srcBuf);
}
}
@@ -707,20 +707,20 @@ static Object doEncode(PBaseException exception,
static Object doDecode(VirtualFrame frame, PBaseException exception,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
@SuppressWarnings("unused") @Exclusive @Cached PyObjectTypeCheck pyObjectTypeCheck,
@Cached PyUnicodeDecodeErrorGetObjectNode getObjectNode,
@Cached PyUnicodeDecodeErrorGetStartNode getStartNode,
@Cached PyUnicodeDecodeErrorGetEndNode getEndNode,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary accessLib,
@Cached TruffleStringBuilder.AppendCodePointNode appendCodePointNode,
@Cached TruffleStringBuilder.ToStringNode toStringNode,
- @Exclusive @Cached PRaiseNode raiseNode) {
+ @Exclusive @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
int start = getStartNode.execute(inliningTarget, exception);
int end = getEndNode.execute(inliningTarget, exception);
Object object = getObjectNode.execute(inliningTarget, exception);
- Object srcBuf = acquireLib.acquireReadonly(object, frame, callData);
+ Object srcBuf = getBuffer.executeReadonly(frame, object);
TruffleStringBuilderUTF32 tsb = TruffleStringBuilder.createUTF32();
try {
byte[] src = accessLib.getInternalOrCopiedByteArray(srcBuf);
@@ -738,7 +738,7 @@ static Object doDecode(VirtualFrame frame, PBaseException exception,
}
return PFactory.createTuple(language, new Object[]{toStringNode.execute(tsb), start + consumed});
} finally {
- accessLib.release(srcBuf, frame, callData);
+ releaseBuffer.execute(frame, srcBuf);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java
index e219178296..3235bb8bb4 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/DigestObjectBuiltins.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2022, 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
@@ -53,13 +53,13 @@
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.util.PythonUtils;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -133,16 +133,16 @@ protected ArgumentClinicProvider getArgumentClinic() {
@Specialization(limit = "3")
static PNone update(VirtualFrame frame, DigestObject self, Object buffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
if (self.wasReset()) {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.ValueError, ErrorMessages.UPDATING_FINALIZED_DIGEST_IS_NOT_SUPPORTED);
}
try {
self.update(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
return PNone.NONE;
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java
index 9145cf4318..4179ab4043 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java
@@ -65,7 +65,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
@@ -80,11 +79,13 @@
import com.oracle.graal.python.builtins.modules.hashlib.HashlibModuleBuiltinsClinicProviders.Pbkdf2HmacNodeClinicProviderGen;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.common.EconomicMapStorage;
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyLongAsLongNode;
+import com.oracle.graal.python.lib.PyObjectCheckBuffer;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PGuards;
import com.oracle.graal.python.nodes.PRaiseNode;
@@ -98,7 +99,6 @@
import com.oracle.graal.python.nodes.statement.AbstractImportNode;
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.crypto.BouncyCastleSupportProvider;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -220,23 +220,24 @@ static Object cmpStrings(Object a, Object b,
@Specialization(guards = {"!isString(a) || !isString(b)"})
static boolean cmpBuffers(VirtualFrame frame, Object a, Object b,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectCheckBuffer checkBufferNode,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "1") PythonBufferAccessLibrary accessLib,
- @Exclusive @Cached PRaiseNode raiseNode) {
- if (acquireLib.hasBuffer(a) && acquireLib.hasBuffer(b)) {
- Object bufferA = acquireLib.acquireReadonly(a, frame, callData);
+ @Exclusive @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
+ if (checkBufferNode.execute(a) && checkBufferNode.execute(b)) {
+ Object bufferA = getBuffer.executeReadonly(frame, a);
try {
- Object bufferB = acquireLib.acquireReadonly(b, frame, callData);
+ Object bufferB = getBuffer.executeReadonly(frame, b);
try {
byte[] bytesA = accessLib.getInternalOrCopiedByteArray(bufferA);
byte[] bytesB = accessLib.getInternalOrCopiedByteArray(bufferB);
return cmp(bytesA, bytesB);
} finally {
- accessLib.release(bufferB, frame, callData);
+ releaseBuffer.execute(frame, bufferB);
}
} finally {
- accessLib.release(bufferA, frame, callData);
+ releaseBuffer.execute(frame, bufferA);
}
} else {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.UNSUPPORTED_OPERAND_TYPES_OR_COMBINATION_OF_TYPES, a, b);
@@ -286,42 +287,46 @@ static Object hmacNewFromFunction(VirtualFrame frame, PythonModule self, Object
@Exclusive @Cached CastToTruffleStringNode castStr,
@Exclusive @Cached CastToJavaStringNode castJStr,
@Shared("concatStr") @Cached TruffleString.ConcatNode concatStr,
- @Shared("acquireLib") @CachedLibrary(limit = "2") PythonBufferAcquireLibrary acquireLib,
+ @Shared("checkBuffer") @Cached PyObjectCheckBuffer checkBufferNode,
+ @Shared("getBuffer") @Cached PyObjectGetBuffer getBuffer,
@Shared("bufferLib") @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib,
- @Exclusive @Cached PRaiseNode raiseNode) {
+ @Exclusive @Cached PRaiseNode raiseNode,
+ @Shared @Cached PyBufferRelease releaseBuffer) {
// cast guaranteed in our initialize
EconomicMapStorage constructors = self.getModuleState(EconomicMapStorage.class);
Object name = getItemNode.execute(frame, inliningTarget, constructors, digestmod);
if (name != null) {
assert name instanceof TruffleString; // guaranteed in our initialize
- return hmacNew(self, key, msg, name, inliningTarget, castStr, castJStr, concatStr, acquireLib, bufferLib, raiseNode);
+ return hmacNew(frame, self, key, msg, name, inliningTarget, castStr, castJStr, concatStr, checkBufferNode, getBuffer, bufferLib, raiseNode, releaseBuffer);
} else {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError);
}
}
@Specialization(guards = "isString(digestmodObj)")
- static Object hmacNew(@SuppressWarnings("unused") PythonModule self, Object keyObj, Object msgObj, Object digestmodObj,
+ static Object hmacNew(VirtualFrame frame, @SuppressWarnings("unused") PythonModule self, Object keyObj, Object msgObj, Object digestmodObj,
@Bind Node inliningTarget,
@Exclusive @Cached CastToTruffleStringNode castStr,
@Exclusive @Cached CastToJavaStringNode castJStr,
@Shared("concatStr") @Cached TruffleString.ConcatNode concatStr,
- @Shared("acquireLib") @CachedLibrary(limit = "2") PythonBufferAcquireLibrary acquireLib,
+ @Shared("checkBuffer") @Cached PyObjectCheckBuffer checkBufferNode,
+ @Shared("getBuffer") @Cached PyObjectGetBuffer getBuffer,
@Shared("bufferLib") @CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib,
- @Exclusive @Cached PRaiseNode raiseNode) {
+ @Exclusive @Cached PRaiseNode raiseNode,
+ @Shared @Cached PyBufferRelease releaseBuffer) {
TruffleString digestmod = castStr.execute(inliningTarget, digestmodObj);
Object key;
- if (!acquireLib.hasBuffer(keyObj)) {
+ if (!checkBufferNode.execute(keyObj)) {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, keyObj);
} else {
- key = acquireLib.acquireReadonly(keyObj);
+ key = getBuffer.executeReadonly(frame, keyObj);
}
try {
Object msg;
if (msgObj instanceof PNone) {
msg = null;
- } else if (acquireLib.hasBuffer(msgObj)) {
- msg = acquireLib.acquireReadonly(msgObj);
+ } else if (checkBufferNode.execute(msgObj)) {
+ msg = getBuffer.executeReadonly(frame, msgObj);
} else {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, msgObj);
}
@@ -335,11 +340,11 @@ static Object hmacNew(@SuppressWarnings("unused") PythonModule self, Object keyO
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError, e);
} finally {
if (msg != null) {
- bufferLib.release(msg);
+ releaseBuffer.execute(frame, msg);
}
}
} finally {
- bufferLib.release(key);
+ releaseBuffer.execute(frame, key);
}
}
}
@@ -367,15 +372,16 @@ abstract static class CreateDigestNode extends Node {
@Specialization
static Object doIt(VirtualFrame frame, Node inliningTarget, PythonBuiltinClassType type, String pythonName, String javaName, Object value,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary(limit = "2") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectCheckBuffer checkBufferNode,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib,
- @Cached PRaiseNode raise) {
+ @Cached PRaiseNode raise,
+ @Cached PyBufferRelease releaseBuffer) {
Object buffer;
if (value == PNone.NO_VALUE) {
buffer = null;
- } else if (acquireLib.hasBuffer(value)) {
- buffer = acquireLib.acquireReadonly(value, frame, callData);
+ } else if (checkBufferNode.execute(value)) {
+ buffer = getBuffer.executeReadonly(frame, value);
} else {
throw raise.raise(inliningTarget, PythonBuiltinClassType.TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, value);
}
@@ -391,7 +397,7 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, PythonBuiltinClassTy
return PFactory.createDigestObject(PythonLanguage.get(inliningTarget), type, pythonName, digest);
} finally {
if (buffer != null) {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
@@ -506,7 +512,8 @@ static Object pbkdf2(VirtualFrame frame, TruffleString hashName, Object password
@Cached PyLongAsLongNode asLongNode,
@Cached InlinedConditionProfile noDklenProfile,
@Cached TruffleString.ToJavaStringNode toJavaStringNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
String javaHashName = toJavaStringNode.execute(hashName);
if (iterations < 1) {
@@ -533,8 +540,8 @@ static Object pbkdf2(VirtualFrame frame, TruffleString hashName, Object password
} catch (GeneralSecurityException e) {
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.UnsupportedDigestmodError, UNSUPPORTED_HASH_TYPE, hashName);
} finally {
- passwordLib.release(password);
- saltLib.release(salt);
+ releaseBuffer.execute(frame, password);
+ releaseBuffer.execute(frame, salt);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java
index 7bb34a012a..3cd0efd47c 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedIOBaseBuiltins.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
@@ -64,13 +64,13 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.dsl.Bind;
import com.oracle.truffle.api.dsl.Cached;
@@ -148,12 +148,12 @@ protected TruffleString getMethodName() {
@Specialization
Object readinto(VirtualFrame frame, Object self, Object buffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Cached PyObjectCallMethodObjArgs callMethod,
@Cached InlinedConditionProfile isBytes,
@Cached InlinedConditionProfile oversize,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
int len = bufferLib.getBufferLength(buffer);
Object data = callMethod.execute(frame, inliningTarget, self, getMethodName(), len);
@@ -169,7 +169,7 @@ Object readinto(VirtualFrame frame, Object self, Object buffer,
bufferLib.readIntoBuffer(data, 0, buffer, 0, dataLen, bufferLib);
return dataLen;
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java
index f32954f9e4..99013b35c3 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedReaderMixinBuiltins.java
@@ -87,6 +87,7 @@
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.type.TpSlots;
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -97,7 +98,6 @@
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
import com.oracle.graal.python.nodes.object.GetClassNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.util.PythonUtils;
@@ -543,12 +543,12 @@ abstract static class ReadIntoNode extends PythonBinaryWithInitErrorClinicBuilti
@SuppressWarnings("truffle-static-method")
Object bufferedReadintoGeneric(VirtualFrame frame, PBuffered self, Object buffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
@Cached EnterBufferedNode lock,
@Cached FlushAndRewindUnlockedNode flushAndRewindUnlockedNode,
@Cached RawReadNode rawReadNode,
- @Cached FillBufferNode fillBufferNode) {
+ @Cached FillBufferNode fillBufferNode,
+ @Cached PyBufferRelease releaseBuffer) {
checkIsClosedNode.execute(frame, self);
try {
lock.enter(inliningTarget, self);
@@ -623,7 +623,7 @@ Object bufferedReadintoGeneric(VirtualFrame frame, PBuffered self, Object buffer
return written;
} finally {
EnterBufferedNode.leave(self);
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterMixinBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterMixinBuiltins.java
index bb06905c08..702ce29d3f 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterMixinBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BufferedWriterMixinBuiltins.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
@@ -56,11 +56,10 @@
import com.oracle.graal.python.builtins.modules.io.BufferedIONodes.EnterBufferedNode;
import com.oracle.graal.python.builtins.modules.io.BufferedIONodes.FlushAndRewindUnlockedNode;
import com.oracle.graal.python.builtins.objects.PNone;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.truffle.api.dsl.Bind;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -68,7 +67,6 @@
import com.oracle.truffle.api.dsl.NodeFactory;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
-import com.oracle.truffle.api.library.CachedLibrary;
import com.oracle.truffle.api.nodes.Node;
@CoreFunctions(extendClasses = {PBufferedWriter, PBufferedRandom})
@@ -98,17 +96,16 @@ abstract static class WriteNode extends PythonBinaryWithInitErrorClinicBuiltinNo
@Specialization(guards = "self.isOK()")
static Object write(@SuppressWarnings("unused") VirtualFrame frame, PBuffered self, Object buffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Cached EnterBufferedNode lock,
@Cached("create(T_WRITE)") CheckIsClosedNode checkIsClosedNode,
- @Cached BufferedWriterNodes.WriteNode writeNode) {
+ @Cached BufferedWriterNodes.WriteNode writeNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
lock.enter(inliningTarget, self);
checkIsClosedNode.execute(frame, self);
return writeNode.execute(frame, inliningTarget, self, buffer);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
EnterBufferedNode.leave(self);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java
index c8e2b30493..c193fe2403 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/BytesIOBuiltins.java
@@ -90,7 +90,6 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageAddAllToOther;
@@ -101,10 +100,12 @@
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotIterNext.TpIterNextBuiltin;
import com.oracle.graal.python.lib.IteratorExhausted;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyIndexCheckNode;
import com.oracle.graal.python.lib.PyIterNextNode;
import com.oracle.graal.python.lib.PyMemoryViewFromObject;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetIter;
import com.oracle.graal.python.lib.PyTupleCheckNode;
import com.oracle.graal.python.nodes.PGuards;
@@ -118,7 +119,6 @@
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
import com.oracle.graal.python.util.ArrayBuilder;
@@ -386,8 +386,8 @@ abstract static class ReadIntoNode extends ClosedCheckPythonBinaryClinicBuiltinN
@Specialization(guards = "self.hasBuf()")
static Object readinto(VirtualFrame frame, PBytesIO self, Object buffer,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib) {
+ @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
+ @Cached PyBufferRelease releaseBuffer) {
try {
/* adjust invalid sizes */
int len = bufferLib.getBufferLength(buffer);
@@ -406,7 +406,7 @@ static Object readinto(VirtualFrame frame, PBytesIO self, Object buffer,
return len;
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -461,16 +461,16 @@ static Object truncate(VirtualFrame frame, PBytesIO self, Object size,
@GenerateNodeFactory
abstract static class WriteNode extends ClosedCheckPythonBinaryBuiltinNode {
- @Specialization(guards = "self.hasBuf()", limit = "3")
+ @Specialization(guards = "self.hasBuf()")
static Object doWrite(VirtualFrame frame, PBytesIO self, Object b,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("b") PythonBufferAcquireLibrary acquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "2") PythonBufferAccessLibrary bufferLib,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
self.checkExports(inliningTarget, raiseNode);
- Object buffer = acquireLib.acquireReadonly(b, frame, callData);
+ Object buffer = getBuffer.executeReadonly(frame, b);
try {
int len = bufferLib.getBufferLength(buffer);
if (len == 0) {
@@ -486,7 +486,7 @@ static Object doWrite(VirtualFrame frame, PBytesIO self, Object b,
}
return len;
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
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 21fd8e5789..e0b8118db2 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
@@ -118,6 +118,7 @@
import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
import com.oracle.graal.python.builtins.objects.type.TpSlots;
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyIndexCheckNode;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
@@ -136,12 +137,11 @@
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
+import com.oracle.graal.python.nodes.util.PosixSupportNodes;
import com.oracle.graal.python.runtime.AsyncHandler;
import com.oracle.graal.python.runtime.GilNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PosixSupport;
import com.oracle.graal.python.runtime.PosixSupport.PosixException;
-import com.oracle.graal.python.nodes.util.PosixSupportNodes;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.object.PFactory;
@@ -659,12 +659,12 @@ abstract static class ReadintoNode extends PythonBinaryClinicBuiltinNode {
@Specialization(guards = {"!self.isClosed()", "self.isReadable()"})
static Object readinto(VirtualFrame frame, PFileIO self, Object buffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Cached InlinedBranchProfile readErrorProfile,
@Bind PythonContext context,
@Cached GilNode gil,
- @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
+ @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
int size = bufferLib.getBufferLength(buffer);
if (size == 0) {
@@ -682,7 +682,7 @@ static Object readinto(VirtualFrame frame, PFileIO self, Object buffer,
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
}
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -719,7 +719,8 @@ static Object write(VirtualFrame frame, PFileIO self, Object buffer,
@Cached InlinedBranchProfile errorProfile,
@Cached GilNode gil,
@Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
if (self.isClosed()) {
throw raiseNode.raise(inliningTarget, ValueError, IO_CLOSED);
@@ -737,7 +738,7 @@ static Object write(VirtualFrame frame, PFileIO self, Object buffer,
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
}
} finally {
- bufferLib.release(buffer);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIOBuffer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIOBuffer.java
index 912eea153a..dd09c829a8 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIOBuffer.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/PBytesIOBuffer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 2023, 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
@@ -40,13 +40,10 @@
*/
package com.oracle.graal.python.builtins.modules.io;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
-import com.oracle.truffle.api.library.ExportLibrary;
import com.oracle.truffle.api.object.Shape;
-@ExportLibrary(value = PythonBufferAcquireLibrary.class, delegateTo = "delegate")
public final class PBytesIOBuffer extends PythonBuiltinObject {
private final PBytesIO source;
@@ -58,6 +55,10 @@ public PBytesIOBuffer(Object cls, Shape instanceShape, PBytesIO source) {
this.delegate = source.getBuf();
}
+ public PByteArray getDelegate() {
+ return delegate;
+ }
+
public PBytesIO getSource() {
return source;
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java
index 30fa8ea2c5..a0bad65704 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/TextIOWrapperNodes.java
@@ -84,14 +84,15 @@
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked1Node;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
import com.oracle.graal.python.lib.PyObjectGetAttr;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
import com.oracle.graal.python.lib.PyObjectRichCompareBool;
@@ -99,7 +100,6 @@
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PNodeWithContext;
import com.oracle.graal.python.nodes.PRaiseNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.PythonOptions;
import com.oracle.graal.python.runtime.exception.PException;
@@ -502,7 +502,6 @@ protected abstract static class ReadChunkNode extends Node {
@Specialization(guards = "self.hasDecoder()")
static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self, int hint,
- @Cached("createFor($node)") InteropCallData callData,
@Cached SequenceNodes.GetObjectArrayNode getArray,
@Cached(inline = false) DecodeNode decodeNode,
@Cached PyObjectCallMethodObjArgs callMethodGetState,
@@ -510,9 +509,10 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self,
@Cached PyNumberAsSizeNode asSizeNode,
@Cached PyTupleCheckNode tupleCheckNode,
@Cached TruffleString.CodePointLengthNode codePointLengthNode,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary bufferAcquireLib,
+ @Cached PyObjectGetBuffer getBuffer,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
/*
* The return value is True unless EOF was reached. The decoded string is placed in
* self._decoded_chars (replacing its previous value). The entire input chunk is sent to
@@ -563,7 +563,7 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self,
Object inputChunkBuf;
try {
- inputChunkBuf = bufferAcquireLib.acquireReadonly(inputChunk, frame, callData);
+ inputChunkBuf = getBuffer.executeReadonly(frame, inputChunk);
} catch (PException e) {
throw raiseNode.raise(inliningTarget, TypeError, S_SHOULD_HAVE_RETURNED_A_BYTES_LIKE_OBJECT_NOT_P, (self.isHasRead1() ? T_READ1 : T_READ), inputChunk);
}
@@ -600,7 +600,7 @@ static boolean readChunk(VirtualFrame frame, Node inliningTarget, PTextIO self,
return !eof;
} finally {
- bufferLib.release(inputChunkBuf, frame, callData);
+ releaseBuffer.execute(frame, inputChunkBuf);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/WindowsConsoleIOBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/WindowsConsoleIOBuiltins.java
index dcd8cef20e..0e8ea79865 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/WindowsConsoleIOBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/io/WindowsConsoleIOBuiltins.java
@@ -69,6 +69,7 @@
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.type.TpSlots;
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
@@ -178,7 +179,8 @@ static Object write(VirtualFrame frame, PFileIO self, Object buffer,
@Bind PythonContext context,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
@Cached GilNode gil,
- @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
+ @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
if (self.isClosed()) {
throw PRaiseNode.raiseStatic(inliningTarget, ValueError, IO_CLOSED);
@@ -199,7 +201,7 @@ static Object write(VirtualFrame frame, PFileIO self, Object buffer,
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
}
} finally {
- bufferLib.release(buffer);
+ releaseBuffer.execute(frame, buffer);
}
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java
index 742883b050..625ca7376a 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/multiprocessing/MultiprocessingModuleBuiltins.java
@@ -51,17 +51,17 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
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.IndirectCallData.InteropCallData;
-import com.oracle.graal.python.runtime.PythonContext;
+import com.oracle.graal.python.nodes.util.PosixSupportNodes;
import com.oracle.graal.python.runtime.PosixSupport;
import com.oracle.graal.python.runtime.PosixSupport.PosixException;
-import com.oracle.graal.python.nodes.util.PosixSupportNodes;
+import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.truffle.api.dsl.Bind;
import com.oracle.truffle.api.dsl.Cached;
@@ -120,16 +120,16 @@ abstract static class Send extends PythonBinaryClinicBuiltinNode {
static int doit(VirtualFrame frame, int handle, Object buffer,
@Bind PythonContext context,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
- @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) {
+ @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer);
return context.getPosixSupport().send(handle, bytes, 0, bufferLib.getBufferLength(buffer), 0);
} catch (PosixException e) {
throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java
index 7a92f93473..8da898fffd 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickleBuffer.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -40,22 +40,10 @@
*/
package com.oracle.graal.python.builtins.modules.pickle;
-import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
-
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
-import com.oracle.graal.python.nodes.ErrorMessages;
-import com.oracle.graal.python.nodes.PRaiseNode;
-import com.oracle.truffle.api.dsl.Bind;
-import com.oracle.truffle.api.dsl.Cached;
-import com.oracle.truffle.api.library.CachedLibrary;
-import com.oracle.truffle.api.library.ExportLibrary;
-import com.oracle.truffle.api.library.ExportMessage;
-import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.Shape;
-@ExportLibrary(PythonBufferAcquireLibrary.class)
public final class PPickleBuffer extends PythonBuiltinObject {
// Buffer object implementing PythonBufferAccessLibrary
private Object view;
@@ -74,25 +62,4 @@ public void release() {
this.view = null;
}
- @ExportMessage
- @SuppressWarnings("static-method")
- boolean hasBuffer() {
- return true;
- }
-
- @ExportMessage
- Object acquire(int flags,
- @Bind Node inliningTarget,
- @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
- @Cached PRaiseNode raise) {
- Object owner = null;
- if (view != null) {
- owner = bufferLib.getOwner(view);
- }
- if (owner == null) {
- throw raise.raise(inliningTarget, ValueError, ErrorMessages.OP_FORBIDDEN_ON_OBJECT, "PickleBuffer");
- }
- return acquireLib.acquire(owner, flags);
- }
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java
index 68d31392b7..4b8edf21b8 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PPickler.java
@@ -74,7 +74,6 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.PNotImplemented;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesUtils;
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
@@ -100,9 +99,11 @@
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
import com.oracle.graal.python.lib.IteratorExhausted;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyCallableCheckNode;
import com.oracle.graal.python.lib.PyLongAsLongNode;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetIter;
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
@@ -622,7 +623,8 @@ public abstract static class SaveNode extends PicklerNodes.BasePickleNode {
@Child private PyObjectStrAsObjectNode pyObjectStrAsObjectNode;
@Child private PyObjectIsTrueNode isTrueNode;
@Child private IsNode isNode;
- @Child private PythonBufferAcquireLibrary bufferAcquireLibrary;
+ @Child private PyObjectGetBuffer getBufferNode;
+ @Child private PyBufferRelease releaseBufferNode;
@Child private PythonBufferAccessLibrary bufferLibrary;
@Child private PyCallableCheckNode callableCheckNode;
@Child private PyObjectReprAsTruffleStringNode reprNode;
@@ -1096,12 +1098,20 @@ private Object getIter(VirtualFrame frame, Object object) {
return getIterNode.executeCached(frame, object);
}
- private PythonBufferAcquireLibrary getBufferAcquireLibrary() {
- if (bufferAcquireLibrary == null) {
+ private PyBufferRelease getReleaseBufferNode() {
+ if (releaseBufferNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
- bufferAcquireLibrary = insert(PythonBufferAcquireLibrary.getFactory().createDispatched(3));
+ releaseBufferNode = insert(PyBufferRelease.create());
}
- return bufferAcquireLibrary;
+ return releaseBufferNode;
+ }
+
+ private PyObjectGetBuffer getBufferNode() {
+ if (getBufferNode == null) {
+ CompilerDirectives.transferToInterpreterAndInvalidate();
+ getBufferNode = insert(PyObjectGetBuffer.create());
+ }
+ return getBufferNode;
}
private PythonBufferAccessLibrary getBufferLibrary() {
@@ -1699,7 +1709,7 @@ private void saveFloat(PPickler pickler, int proto, double value) {
}
private void saveBytes(VirtualFrame frame, PythonContext ctx, PPickler pickler, int proto, boolean fastMode, PBytes obj) {
- Object buffer = getBufferAcquireLibrary().acquireReadonly(obj);
+ Object buffer = getBufferNode().executeReadonly(frame, obj);
PythonBufferAccessLibrary bufferLib = getBufferLibrary();
try {
if (proto < 3) {
@@ -1728,7 +1738,7 @@ private void saveBytes(VirtualFrame frame, PythonContext ctx, PPickler pickler,
saveBytesData(frame, pickler, proto, fastMode, obj, buffer, bufferLib);
}
} finally {
- bufferLib.release(buffer);
+ getReleaseBufferNode().execute(frame, buffer);
}
}
@@ -2247,7 +2257,7 @@ private void saveBytearrayData(VirtualFrame frame, PPickler pickler, int proto,
}
private void saveBytearray(VirtualFrame frame, Node inliningTarget, PythonContext ctx, PPickler pickler, int proto, boolean fastMode, PByteArray obj) {
- Object buffer = getBufferAcquireLibrary().acquireReadonly(obj);
+ Object buffer = getBufferNode().executeReadonly(frame, obj);
PythonBufferAccessLibrary bufferLib = getBufferLibrary();
try {
if (proto < 5) {
@@ -2268,7 +2278,7 @@ private void saveBytearray(VirtualFrame frame, Node inliningTarget, PythonContex
saveBytearrayData(frame, pickler, proto, fastMode, obj, buffer, bufferLib);
}
} finally {
- bufferLib.release(buffer);
+ getReleaseBufferNode().execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java
index b70dc9e32c..6e335f9119 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PUnpickler.java
@@ -141,7 +141,6 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.BufferFlags;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.common.EmptyStorage;
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
@@ -168,8 +167,10 @@
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotVarargs.CallSlotTpNewNode;
import com.oracle.graal.python.lib.IteratorExhausted;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyMemoryViewFromObject;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectGetIter;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
@@ -182,7 +183,6 @@
import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode;
import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.exception.PythonErrorType;
@@ -408,7 +408,8 @@ public abstract static class BasePickleReadNode extends PicklerNodes.BasePickleN
@Child private PyObjectReprAsTruffleStringNode reprNode;
@Child private PyMemoryViewFromObject memoryViewNode;
@Child private MemoryViewBuiltins.ToReadonlyNode toReadonlyNode;
- @Child private PythonBufferAcquireLibrary bufferAcquireLibrary;
+ @Child private PyObjectGetBuffer getBufferNode;
+ @Child private PyBufferRelease releaseBufferNode;
@Child private PythonBufferAccessLibrary bufferAccessLibrary;
@Child private TruffleString.ParseLongNode tsParseLongNode;
@@ -417,10 +418,6 @@ public abstract static class BasePickleReadNode extends PicklerNodes.BasePickleN
@CompilationFinal private boolean seenFileRead;
- // we only need the reference, doesn't matter that the object may not yet be fully
- // constructed
- @SuppressWarnings("this-escape") private final InteropCallData interopCallData = InteropCallData.createFor(this);
-
protected TruffleString castToString(Object value) {
if (castToTruffleStringNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -511,12 +508,20 @@ protected MemoryViewBuiltins.ToReadonlyNode getToReadonlyNode() {
return toReadonlyNode;
}
- protected PythonBufferAcquireLibrary getBufferAcquireLibrary() {
- if (bufferAcquireLibrary == null) {
+ private PyBufferRelease getReleaseBufferNode() {
+ if (releaseBufferNode == null) {
+ CompilerDirectives.transferToInterpreterAndInvalidate();
+ releaseBufferNode = insert(PyBufferRelease.create());
+ }
+ return releaseBufferNode;
+ }
+
+ protected PyObjectGetBuffer getBufferNode() {
+ if (getBufferNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
- bufferAcquireLibrary = insert(PythonBufferAcquireLibrary.getFactory().createDispatched(3));
+ getBufferNode = insert(PyObjectGetBuffer.create());
}
- return bufferAcquireLibrary;
+ return getBufferNode;
}
protected PythonBufferAccessLibrary getBufferAccessLibrary() {
@@ -558,7 +563,7 @@ protected void skipConsumed(VirtualFrame frame, PUnpickler self) {
}
protected int setStringInput(PUnpickler self, VirtualFrame frame, Object input) {
- Object buffer = getBufferAcquireLibrary().acquire(input, BufferFlags.PyBUF_CONTIG_RO, frame, interopCallData);
+ Object buffer = getBufferNode().execute(frame, input, BufferFlags.PyBUF_CONTIG_RO);
try {
self.inputBuffer = getBufferAccessLibrary().getCopiedByteArray(buffer);
self.inputLen = getBufferAccessLibrary().getBufferLength(buffer);
@@ -566,7 +571,7 @@ protected int setStringInput(PUnpickler self, VirtualFrame frame, Object input)
self.prefetchedIdx = self.inputLen;
return self.inputLen;
} finally {
- getBufferAccessLibrary().release(input, frame, interopCallData);
+ getReleaseBufferNode().execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java
index 133f2d2c4b..12744d8fcc 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleBufferBuiltins.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2024, 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
@@ -45,27 +45,26 @@
import java.util.List;
import com.oracle.graal.python.PythonLanguage;
+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.PythonBuiltinClassType;
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.BufferFlags;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.memoryview.MemoryViewNodes;
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
import com.oracle.graal.python.builtins.objects.type.TpSlots;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyMemoryViewFromObject;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.graal.python.util.BufferFormat;
import com.oracle.truffle.api.dsl.Bind;
@@ -74,7 +73,6 @@
import com.oracle.truffle.api.dsl.NodeFactory;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
-import com.oracle.truffle.api.library.CachedLibrary;
import com.oracle.truffle.api.nodes.Node;
@CoreFunctions(extendClasses = PythonBuiltinClassType.PickleBuffer)
@@ -91,12 +89,11 @@ protected List extends NodeFactory extends PythonBuiltinBaseNode>> getNodeFa
@SlotSignature(name = "PickleBuffer", minNumOfPositionalArgs = 2, parameterNames = {"$cls", "object"})
@GenerateNodeFactory
abstract static class ConstructPickleBufferNode extends PythonBinaryBuiltinNode {
- @Specialization(limit = "3")
+ @Specialization
static PPickleBuffer construct(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object object,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
- @CachedLibrary("object") PythonBufferAcquireLibrary acquireLib) {
- Object buffer = acquireLib.acquire(object, BufferFlags.PyBUF_FULL_RO, frame, callData);
+ @Cached PyObjectGetBuffer getBuffer) {
+ Object buffer = getBuffer.execute(frame, object, BufferFlags.PyBUF_FULL_RO);
return PFactory.createPickleBuffer(language, buffer);
}
}
@@ -138,11 +135,11 @@ Object raw(VirtualFrame frame, PPickleBuffer self,
@GenerateNodeFactory
public abstract static class PickleBufferReleaseNode extends PythonUnaryBuiltinNode {
@Specialization
- Object release(PPickleBuffer self,
- @CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib) {
+ Object release(VirtualFrame frame, PPickleBuffer self,
+ @Cached PyBufferRelease releaseBuffer) {
Object view = self.getView();
if (view != null) {
- bufferLib.release(view);
+ releaseBuffer.execute(frame, view);
self.release();
}
return PNone.NONE;
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java
index 539038ee45..39ac6f5ca5 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pickle/PickleModuleBuiltins.java
@@ -54,6 +54,7 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyObjectGetIter;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
import com.oracle.graal.python.nodes.HiddenAttr;
@@ -61,7 +62,6 @@
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.object.PFactory;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -252,9 +252,9 @@ static Object loads(VirtualFrame frame, @SuppressWarnings("unused") PythonModule
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
- @Cached("createFor($node)") InteropCallData callData,
@Cached PUnpickler.LoadNode loadNode,
- @Cached PyObjectGetIter getIter) {
+ @Cached PyObjectGetIter getIter,
+ @Cached PyBufferRelease releaseBuffer) {
try {
PUnpickler unpickler = PFactory.createUnpickler(language);
byte[] data = bufferLib.getInternalOrCopiedByteArray(buffer);
@@ -264,7 +264,7 @@ static Object loads(VirtualFrame frame, @SuppressWarnings("unused") PythonModule
unpickler.setFixImports(fixImports);
return loadNode.execute(frame, unpickler);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pyexpat/XMLParserBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pyexpat/XMLParserBuiltins.java
index 10d7290a37..107051a12d 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pyexpat/XMLParserBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/pyexpat/XMLParserBuiltins.java
@@ -85,15 +85,16 @@
import com.oracle.graal.python.builtins.PythonBuiltins;
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.dict.PDict;
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
import com.oracle.graal.python.builtins.objects.ints.PInt;
import com.oracle.graal.python.builtins.objects.type.TpSlots;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyLongAsLongNode;
import com.oracle.graal.python.lib.PyLongCheckNode;
import com.oracle.graal.python.lib.PyNumberIndexNode;
import com.oracle.graal.python.lib.PyObjectCallMethodObjArgs;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
import com.oracle.graal.python.lib.PyUnicodeCheckNode;
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -937,7 +938,7 @@ private static byte[] asByteArray(Object data) {
}
return Arrays.copyOfRange(internalByteArray.getArray(), internalByteArray.getOffset(), internalByteArray.getOffset() + chunkLen);
}
- Object buffer = PythonBufferAcquireLibrary.getUncached().acquireReadonly(data);
+ Object buffer = PyObjectGetBuffer.getUncached().executeReadonly(null, data);
try {
PythonBufferAccessLibrary accessLib = PythonBufferAccessLibrary.getUncached();
int chunkLen = accessLib.getBufferLength(buffer);
@@ -948,7 +949,7 @@ private static byte[] asByteArray(Object data) {
accessLib.readIntoByteArray(buffer, 0, bytes, 0, chunkLen);
return bytes;
} finally {
- PythonBufferAccessLibrary.getUncached().release(buffer);
+ PyBufferRelease.getUncached().execute(null, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternNodes.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternNodes.java
index 6b52d06a71..e07c6c502e 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternNodes.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternNodes.java
@@ -50,12 +50,13 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.array.PArray;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
import com.oracle.graal.python.builtins.objects.mmap.PMMap;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
+import com.oracle.graal.python.lib.PyBufferRelease;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.lib.PyObjectLookupAttr;
import com.oracle.graal.python.lib.PyObjectSizeNode;
import com.oracle.graal.python.lib.PyTupleGetItem;
@@ -67,7 +68,6 @@
import com.oracle.graal.python.nodes.statement.AbstractImportNode;
import com.oracle.graal.python.nodes.util.CannotCastException;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
-import com.oracle.graal.python.runtime.IndirectCallData;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Bind;
@@ -374,20 +374,19 @@ abstract static class BufferToTruffleStringNode extends PNodeWithContext {
public abstract TruffleString execute(VirtualFrame frame, Object buffer);
- @Specialization(limit = "3")
+ @Specialization
static TruffleString convert(VirtualFrame frame, Object bytesLikeObject,
@Bind Node inliningTarget,
- @Shared @Cached("createFor($node)") IndirectCallData.InteropCallData callData,
@Cached(inline = true) BufferToTruffleStringInnerNode innerNode,
- @CachedLibrary("bytesLikeObject") PythonBufferAcquireLibrary bufferAcquireLib,
- @CachedLibrary(limit = "1") @Shared PythonBufferAccessLibrary bufferLib) {
+ @Cached PyObjectGetBuffer getBuffer,
+ @Cached PyBufferRelease releaseBuffer) {
Object buffer = null;
try {
- buffer = bufferAcquireLib.acquireReadonly(bytesLikeObject, frame, callData);
+ buffer = getBuffer.executeReadonly(frame, bytesLikeObject);
return innerNode.execute(inliningTarget, buffer);
} finally {
if (buffer != null) {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/TRegexCache.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/TRegexCache.java
index cdea7942e4..c8a567e38c 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/TRegexCache.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/TRegexCache.java
@@ -52,7 +52,8 @@
import org.graalvm.collections.EconomicMap;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
+import com.oracle.graal.python.lib.PyBufferRelease;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.util.CannotCastException;
@@ -112,7 +113,7 @@ public TRegexCache(Node node, Object pattern, int flags) {
} catch (CannotCastException ce) {
Object buffer;
try {
- buffer = PythonBufferAcquireLibrary.getUncached().acquireReadonly(pattern);
+ buffer = PyObjectGetBuffer.getUncached().executeReadonly(null, pattern);
} catch (PException e) {
throw PRaiseNode.raiseStatic(node, TypeError, ErrorMessages.EXPECTED_STR_OR_BYTESLIKE_OBJ);
}
@@ -122,7 +123,7 @@ public TRegexCache(Node node, Object pattern, int flags) {
int bytesLen = bufferLib.getBufferLength(buffer);
patternStr = new String(bytes, 0, bytesLen, StandardCharsets.ISO_8859_1);
} finally {
- bufferLib.release(buffer);
+ PyBufferRelease.getUncached().execute(null, buffer);
}
}
validateFlags(node, binary, flags);
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java
index 8fd8860451..506ece9817 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZLibModuleBuiltins.java
@@ -73,6 +73,7 @@
import com.oracle.graal.python.builtins.objects.ints.PInt;
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
import com.oracle.graal.python.builtins.objects.module.PythonModule;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyLongAsIntNode;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PRaiseNode;
@@ -82,7 +83,6 @@
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.NativeZlibSupport;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.object.PFactory;
@@ -484,15 +484,15 @@ static PBytes compress(VirtualFrame frame, Object buffer, int level, int wbits,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached("createFor($node)") InteropCallData callData,
- @Cached CompressInnerNode innerNode) {
+ @Cached CompressInnerNode innerNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
byte[] bytes = bufferLib.getInternalOrCopiedByteArray(buffer);
int len = bufferLib.getBufferLength(buffer);
byte[] resultArray = innerNode.execute(inliningTarget, bytes, len, level, wbits);
return PFactory.createBytes(language, resultArray);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
@@ -548,9 +548,9 @@ static PBytes decompress(VirtualFrame frame, Object buffer, int wbits, int bufsi
@Bind Node inliningTarget,
@Bind PythonLanguage language,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached("createFor($node)") InteropCallData callData,
@Cached DecompressInnerNode innerNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
if (bufsize < 0) {
throw raiseNode.raise(inliningTarget, ZLibError, ErrorMessages.MUST_BE_NON_NEGATIVE, "bufsize");
@@ -560,7 +560,7 @@ static PBytes decompress(VirtualFrame frame, Object buffer, int wbits, int bufsi
byte[] resultArray = innerNode.execute(inliningTarget, bytes, len, wbits, bufsize);
return PFactory.createBytes(language, resultArray);
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java
index cea367d152..a1e79439ff 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibCompressBuiltins.java
@@ -62,6 +62,7 @@
import com.oracle.graal.python.builtins.objects.PNone;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.nodes.ErrorMessages;
import com.oracle.graal.python.nodes.PNodeWithContext;
import com.oracle.graal.python.nodes.PRaiseNode;
@@ -70,7 +71,6 @@
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.NativeZlibSupport;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.object.PFactory;
@@ -104,9 +104,9 @@ static PBytes compress(VirtualFrame frame, ZLibCompObject self, Object buffer,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached("createFor($node)") InteropCallData callData,
@Cached CompressInnerNode innerNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
if (!self.isInitialized()) {
throw raiseNode.raise(inliningTarget, ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while compressing data", "inconsistent stream state");
@@ -115,7 +115,7 @@ static PBytes compress(VirtualFrame frame, ZLibCompObject self, Object buffer,
int len = bufferLib.getBufferLength(buffer);
return PFactory.createBytes(language, innerNode.execute(inliningTarget, self, bytes, len));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java
index 9b8311f4df..d427e5d36e 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressBuiltins.java
@@ -64,6 +64,7 @@
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.nodes.PNodeWithContext;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
@@ -72,7 +73,6 @@
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.NativeZlibSupport;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PException;
@@ -112,9 +112,9 @@ static PBytes decompress(VirtualFrame frame, ZLibCompObject self, Object buffer,
@Bind Node inliningTarget,
@Bind PythonLanguage language,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached("createFor($node)") InteropCallData callData,
@Cached DecompressInnerNode innerNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
if (!self.isInitialized()) {
throw raiseNode.raise(inliningTarget, ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while decompressing data", "inconsistent stream state");
@@ -126,7 +126,7 @@ static PBytes decompress(VirtualFrame frame, ZLibCompObject self, Object buffer,
int len = bufferLib.getBufferLength(buffer);
return PFactory.createBytes(language, innerNode.execute(frame, inliningTarget, self, bytes, len, maxLength));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressorBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressorBuiltins.java
index d3204ca6f7..255e92cfb9 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressorBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/zlib/ZlibDecompressorBuiltins.java
@@ -52,10 +52,10 @@
import com.oracle.graal.python.PythonLanguage;
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.PythonBuiltins;
import com.oracle.graal.python.builtins.modules.zlib.ZLibModuleBuiltins.ExpectByteLikeNode;
@@ -63,13 +63,13 @@
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
import com.oracle.graal.python.builtins.objects.type.TpSlots;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.nodes.PRaiseNode;
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.NativeZlibSupport;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.object.PFactory;
@@ -169,9 +169,9 @@ static PBytes decompress(VirtualFrame frame, ZlibDecompressorObject self, Object
@Bind Node inliningTarget,
@Bind PythonLanguage language,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
- @Cached("createFor($node)") InteropCallData callData,
@Cached DecompressBufInnerNode innerNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
if (!self.isInitialized()) {
throw raiseNode.raise(inliningTarget, ZLibError, ERROR_D_S_S, Z_STREAM_ERROR, "while decompressing data", "inconsistent stream state");
@@ -192,7 +192,7 @@ static PBytes decompress(VirtualFrame frame, ZlibDecompressorObject self, Object
return PFactory.createBytes(language, innerNode.execute(frame, inliningTarget, self, bytes, len, maxLength));
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java
index 977d5b6d08..14b2fc7b4e 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/ArrayBuiltins.java
@@ -99,6 +99,7 @@
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqAssItem.SqAssItemBuiltinNode;
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSqContains.SqContainsBuiltinNode;
import com.oracle.graal.python.lib.IteratorExhausted;
+import com.oracle.graal.python.lib.PyBufferRelease;
import com.oracle.graal.python.lib.PyIndexCheckNode;
import com.oracle.graal.python.lib.PyIterNextNode;
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
@@ -127,7 +128,6 @@
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinClassExactProfile;
import com.oracle.graal.python.nodes.object.GetClassNode;
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
import com.oracle.graal.python.runtime.PythonContext;
import com.oracle.graal.python.runtime.exception.PException;
import com.oracle.graal.python.runtime.exception.PythonErrorType;
@@ -1244,11 +1244,11 @@ public abstract static class FromBytesNode extends PythonBinaryClinicBuiltinNode
@Specialization
static Object frombytes(VirtualFrame frame, PArray self, Object buffer,
@Bind Node inliningTarget,
- @Cached("createFor($node)") InteropCallData callData,
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
@Cached ArrayNodes.EnsureCapacityNode ensureCapacityNode,
@Cached ArrayNodes.SetLengthNode setLengthNode,
- @Cached PRaiseNode raiseNode) {
+ @Cached PRaiseNode raiseNode,
+ @Cached PyBufferRelease releaseBuffer) {
try {
int itemShift = self.getItemSizeShift();
int oldSize = self.getLength();
@@ -1268,7 +1268,7 @@ static Object frombytes(VirtualFrame frame, PArray self, Object buffer,
}
return PNone.NONE;
} finally {
- bufferLib.release(buffer, frame, callData);
+ releaseBuffer.execute(frame, buffer);
}
}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java
index bd86f9ad46..cc977dcb87 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/array/PArray.java
@@ -34,7 +34,6 @@
import java.util.concurrent.atomic.AtomicLong;
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
-import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -66,7 +65,6 @@
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.api.strings.TruffleString;
-@ExportLibrary(PythonBufferAcquireLibrary.class)
@ExportLibrary(PythonBufferAccessLibrary.class)
@ExportLibrary(InteropLibrary.class)
public final class PArray extends PythonBuiltinObject {
@@ -217,12 +215,6 @@ public static MachineFormat fromCode(int code) {
}
}
- @ExportMessage
- @SuppressWarnings("static-method")
- boolean hasBuffer() {
- return true;
- }
-
@ExportMessage
@SuppressWarnings("static-method")
boolean isBuffer() {
@@ -234,11 +226,6 @@ int getBufferLength() {
return storage.length();
}
- @ExportMessage
- Object acquire(@SuppressWarnings("unused") int flags) {
- return this;
- }
-
@ExportMessage
@SuppressWarnings("static-method")
boolean isReadonly() {
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/BufferFlags.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/BufferFlags.java
index b1dbe6587f..c2238f328e 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/BufferFlags.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/BufferFlags.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, 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
@@ -40,8 +40,10 @@
*/
package com.oracle.graal.python.builtins.objects.buffer;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
+
/**
- * Flags for getting buffers. Extracted from CPython. Used by {@link PythonBufferAcquireLibrary}.
+ * Flags for getting buffers. Extracted from CPython. Used by {@link PyObjectGetBuffer}.
*/
public abstract class BufferFlags {
public static final int PyBUF_SIMPLE = 0;
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/ForeignBufferAcquireExports.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/ForeignBufferAcquireExports.java
deleted file mode 100644
index ba8768cbf5..0000000000
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/ForeignBufferAcquireExports.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (c) 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
- *
- * Subject to the condition set forth below, permission is hereby granted to any
- * person obtaining a copy of this software, associated documentation and/or
- * data (collectively the "Software"), free of charge and under any and all
- * copyright rights in the Software, and any and all patent rights owned or
- * freely licensable by each licensor hereunder covering either (i) the
- * unmodified Software as contributed to or provided by such licensor, or (ii)
- * the Larger Works (as defined below), to deal in both
- *
- * (a) the Software, and
- *
- * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
- * one is included with the Software each a "Larger Work" to which the Software
- * is contributed by such licensors),
- *
- * without restriction, including without limitation the rights to copy, create
- * derivative works of, display, perform, and distribute the Software and make,
- * use, sell, offer for sale, import, export, have made, and have sold the
- * Software and the Larger Work(s), and to sublicense the foregoing rights on
- * either these or other terms.
- *
- * This license is subject to the following condition:
- *
- * The above copyright notice and either this complete permission notice or at a
- * minimum a reference to the UPL must be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package com.oracle.graal.python.builtins.objects.buffer;
-
-import static com.oracle.graal.python.builtins.PythonBuiltinClassType.BufferError;
-import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IndexError;
-import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
-
-import java.nio.ByteOrder;
-
-import com.oracle.graal.python.nodes.ErrorMessages;
-import com.oracle.graal.python.nodes.PRaiseNode;
-import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
-import com.oracle.graal.python.util.BufferFormat;
-import com.oracle.truffle.api.CompilerDirectives;
-import com.oracle.truffle.api.dsl.Bind;
-import com.oracle.truffle.api.dsl.Cached;
-import com.oracle.truffle.api.interop.InteropLibrary;
-import com.oracle.truffle.api.interop.InvalidBufferOffsetException;
-import com.oracle.truffle.api.interop.UnsupportedMessageException;
-import com.oracle.truffle.api.library.CachedLibrary;
-import com.oracle.truffle.api.library.ExportLibrary;
-import com.oracle.truffle.api.library.ExportMessage;
-import com.oracle.truffle.api.nodes.LoopNode;
-import com.oracle.truffle.api.nodes.Node;
-import com.oracle.truffle.api.strings.TruffleString;
-
-@ExportLibrary(value = PythonBufferAcquireLibrary.class, receiverType = Object.class)
-final class ForeignBufferAcquireExports {
-
- @ExportMessage
- static boolean hasBuffer(Object receiver,
- @CachedLibrary("receiver") InteropLibrary interop) {
- return interop.hasBufferElements(receiver);
- }
-
- @ExportMessage
- static Object acquire(Object receiver, int flags,
- @Bind Node inliningTarget,
- @Cached CastToJavaIntExactNode castInt,
- @CachedLibrary("receiver") InteropLibrary interop) {
- if (!interop.hasBufferElements(receiver)) {
- throw PRaiseNode.raiseStatic(inliningTarget, TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, receiver);
- }
-
- long bufferSize;
- try {
- bufferSize = interop.getBufferSize(receiver);
- } catch (UnsupportedMessageException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
-
- boolean readonly;
- try {
- readonly = !interop.isBufferWritable(receiver);
- } catch (UnsupportedMessageException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- if (BufferFlags.requestsWritable(flags) && readonly) {
- throw PRaiseNode.raiseStatic(inliningTarget, BufferError, ErrorMessages.OBJ_IS_NOT_WRITABLE);
- }
- return new ForeignBufferAdapter(receiver, castInt.execute(inliningTarget, bufferSize), readonly);
- }
-
- @ExportLibrary(PythonBufferAccessLibrary.class)
- static final class ForeignBufferAdapter {
- final Object foreignBuffer;
- final int len;
- final boolean readonly;
-
- ForeignBufferAdapter(Object foreignBuffer, int len, boolean readonly) {
- this.foreignBuffer = foreignBuffer;
- this.len = len;
- this.readonly = readonly;
- }
-
- @ExportMessage
- @SuppressWarnings("static-method")
- boolean isBuffer() {
- return true;
- }
-
- @ExportMessage
- boolean isReadonly() {
- return readonly;
- }
-
- @ExportMessage
- int getBufferLength() {
- return len;
- }
-
- @ExportMessage
- Object getOwner() {
- return foreignBuffer;
- }
-
- @ExportMessage
- byte readByte(int byteOffset,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- return interop.readBufferByte(foreignBuffer, byteOffset);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void writeByte(int byteOffset, byte value,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- assert !readonly;
- try {
- interop.writeBufferByte(foreignBuffer, byteOffset, value);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void readIntoByteArray(int srcOffset, byte[] dest, int destOffset, int length,
- @Bind Node inliningTarget,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- interop.readBuffer(foreignBuffer, srcOffset, dest, destOffset, length);
- } catch (InvalidBufferOffsetException e) {
- throw PRaiseNode.raiseStatic(inliningTarget, IndexError, ErrorMessages.STRUCT_OFFSET_OUT_OF_RANGE, e.getByteOffset(), len);
- } catch (UnsupportedMessageException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void readIntoBuffer(int srcOffset, Object dest, int destOffset, int length, PythonBufferAccessLibrary otherLib,
- @Bind Node inliningTarget,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- if (otherLib.hasInternalByteArray(dest)) {
- readIntoByteArray(srcOffset, otherLib.getInternalByteArray(dest), destOffset, length, inliningTarget, interop);
- } else {
- for (int i = 0; i < length; i++) {
- otherLib.writeByte(dest, destOffset + i, readByte(srcOffset + i, interop));
- }
- LoopNode.reportLoopCount(inliningTarget, Math.max(0, length));
- }
- }
-
- @ExportMessage
- short readShortByteOrder(int byteOffset, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- return interop.readBufferShort(foreignBuffer, byteOrder, byteOffset);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- int readIntByteOrder(int byteOffset, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- return interop.readBufferInt(foreignBuffer, byteOrder, byteOffset);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- long readLongByteOrder(int byteOffset, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- return interop.readBufferLong(foreignBuffer, byteOrder, byteOffset);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- float readFloatByteOrder(int byteOffset, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- return interop.readBufferFloat(foreignBuffer, byteOrder, byteOffset);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- double readDoubleByteOrder(int byteOffset, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- try {
- return interop.readBufferDouble(foreignBuffer, byteOrder, byteOffset);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void writeShortByteOrder(int byteOffset, short value, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- assert !readonly;
- try {
- interop.writeBufferShort(foreignBuffer, byteOrder, byteOffset, value);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void writeIntByteOrder(int byteOffset, int value, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- assert !readonly;
- try {
- interop.writeBufferInt(foreignBuffer, byteOrder, byteOffset, value);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void writeLongByteOrder(int byteOffset, long value, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- assert !readonly;
- try {
- interop.writeBufferLong(foreignBuffer, byteOrder, byteOffset, value);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void writeFloatByteOrder(int byteOffset, float value, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- assert !readonly;
- try {
- interop.writeBufferFloat(foreignBuffer, byteOrder, byteOffset, value);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- void writeDoubleByteOrder(int byteOffset, double value, ByteOrder byteOrder,
- @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
- assert !readonly;
- try {
- interop.writeBufferDouble(foreignBuffer, byteOrder, byteOffset, value);
- } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
- throw CompilerDirectives.shouldNotReachHere(e);
- }
- }
-
- @ExportMessage
- @SuppressWarnings("static-method")
- int getItemSize() {
- return 1;
- }
-
- @ExportMessage
- @SuppressWarnings("static-method")
- TruffleString getFormatString() {
- return BufferFormat.T_UINT_8_TYPE_CODE;
- }
- }
-}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/ForeignBufferAdapter.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/ForeignBufferAdapter.java
new file mode 100644
index 0000000000..43c8af9e42
--- /dev/null
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/ForeignBufferAdapter.java
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 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
+ *
+ * Subject to the condition set forth below, permission is hereby granted to any
+ * person obtaining a copy of this software, associated documentation and/or
+ * data (collectively the "Software"), free of charge and under any and all
+ * copyright rights in the Software, and any and all patent rights owned or
+ * freely licensable by each licensor hereunder covering either (i) the
+ * unmodified Software as contributed to or provided by such licensor, or (ii)
+ * the Larger Works (as defined below), to deal in both
+ *
+ * (a) the Software, and
+ *
+ * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
+ * one is included with the Software each a "Larger Work" to which the Software
+ * is contributed by such licensors),
+ *
+ * without restriction, including without limitation the rights to copy, create
+ * derivative works of, display, perform, and distribute the Software and make,
+ * use, sell, offer for sale, import, export, have made, and have sold the
+ * Software and the Larger Work(s), and to sublicense the foregoing rights on
+ * either these or other terms.
+ *
+ * This license is subject to the following condition:
+ *
+ * The above copyright notice and either this complete permission notice or at a
+ * minimum a reference to the UPL must be included in all copies or substantial
+ * portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+package com.oracle.graal.python.builtins.objects.buffer;
+
+import static com.oracle.graal.python.builtins.PythonBuiltinClassType.IndexError;
+
+import java.nio.ByteOrder;
+
+import com.oracle.graal.python.nodes.ErrorMessages;
+import com.oracle.graal.python.nodes.PRaiseNode;
+import com.oracle.graal.python.util.BufferFormat;
+import com.oracle.truffle.api.CompilerDirectives;
+import com.oracle.truffle.api.dsl.Bind;
+import com.oracle.truffle.api.interop.InteropLibrary;
+import com.oracle.truffle.api.interop.InvalidBufferOffsetException;
+import com.oracle.truffle.api.interop.UnsupportedMessageException;
+import com.oracle.truffle.api.library.CachedLibrary;
+import com.oracle.truffle.api.library.ExportLibrary;
+import com.oracle.truffle.api.library.ExportMessage;
+import com.oracle.truffle.api.nodes.LoopNode;
+import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.api.strings.TruffleString;
+
+@ExportLibrary(PythonBufferAccessLibrary.class)
+public final class ForeignBufferAdapter {
+ final Object foreignBuffer;
+ final int len;
+ final boolean readonly;
+
+ public ForeignBufferAdapter(Object foreignBuffer, int len, boolean readonly) {
+ this.foreignBuffer = foreignBuffer;
+ this.len = len;
+ this.readonly = readonly;
+ }
+
+ @ExportMessage
+ @SuppressWarnings("static-method")
+ boolean isBuffer() {
+ return true;
+ }
+
+ @ExportMessage
+ boolean isReadonly() {
+ return readonly;
+ }
+
+ @ExportMessage
+ int getBufferLength() {
+ return len;
+ }
+
+ @ExportMessage
+ Object getOwner() {
+ return foreignBuffer;
+ }
+
+ @ExportMessage
+ byte readByte(int byteOffset,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ return interop.readBufferByte(foreignBuffer, byteOffset);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void writeByte(int byteOffset, byte value,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ assert !readonly;
+ try {
+ interop.writeBufferByte(foreignBuffer, byteOffset, value);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void readIntoByteArray(int srcOffset, byte[] dest, int destOffset, int length,
+ @Bind Node inliningTarget,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ interop.readBuffer(foreignBuffer, srcOffset, dest, destOffset, length);
+ } catch (InvalidBufferOffsetException e) {
+ throw PRaiseNode.raiseStatic(inliningTarget, IndexError, ErrorMessages.STRUCT_OFFSET_OUT_OF_RANGE, e.getByteOffset(), len);
+ } catch (UnsupportedMessageException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void readIntoBuffer(int srcOffset, Object dest, int destOffset, int length, PythonBufferAccessLibrary otherLib,
+ @Bind Node inliningTarget,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ if (otherLib.hasInternalByteArray(dest)) {
+ readIntoByteArray(srcOffset, otherLib.getInternalByteArray(dest), destOffset, length, inliningTarget, interop);
+ } else {
+ for (int i = 0; i < length; i++) {
+ otherLib.writeByte(dest, destOffset + i, readByte(srcOffset + i, interop));
+ }
+ LoopNode.reportLoopCount(inliningTarget, Math.max(0, length));
+ }
+ }
+
+ @ExportMessage
+ short readShortByteOrder(int byteOffset, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ return interop.readBufferShort(foreignBuffer, byteOrder, byteOffset);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ int readIntByteOrder(int byteOffset, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ return interop.readBufferInt(foreignBuffer, byteOrder, byteOffset);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ long readLongByteOrder(int byteOffset, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ return interop.readBufferLong(foreignBuffer, byteOrder, byteOffset);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ float readFloatByteOrder(int byteOffset, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ return interop.readBufferFloat(foreignBuffer, byteOrder, byteOffset);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ double readDoubleByteOrder(int byteOffset, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ try {
+ return interop.readBufferDouble(foreignBuffer, byteOrder, byteOffset);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void writeShortByteOrder(int byteOffset, short value, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ assert !readonly;
+ try {
+ interop.writeBufferShort(foreignBuffer, byteOrder, byteOffset, value);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void writeIntByteOrder(int byteOffset, int value, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ assert !readonly;
+ try {
+ interop.writeBufferInt(foreignBuffer, byteOrder, byteOffset, value);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void writeLongByteOrder(int byteOffset, long value, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ assert !readonly;
+ try {
+ interop.writeBufferLong(foreignBuffer, byteOrder, byteOffset, value);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void writeFloatByteOrder(int byteOffset, float value, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ assert !readonly;
+ try {
+ interop.writeBufferFloat(foreignBuffer, byteOrder, byteOffset, value);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ void writeDoubleByteOrder(int byteOffset, double value, ByteOrder byteOrder,
+ @CachedLibrary("this.foreignBuffer") InteropLibrary interop) {
+ assert !readonly;
+ try {
+ interop.writeBufferDouble(foreignBuffer, byteOrder, byteOffset, value);
+ } catch (UnsupportedMessageException | InvalidBufferOffsetException e) {
+ throw CompilerDirectives.shouldNotReachHere(e);
+ }
+ }
+
+ @ExportMessage
+ @SuppressWarnings("static-method")
+ int getItemSize() {
+ return 1;
+ }
+
+ @ExportMessage
+ @SuppressWarnings("static-method")
+ TruffleString getFormatString() {
+ return BufferFormat.T_UINT_8_TYPE_CODE;
+ }
+}
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java
index 4ecfe395e3..6cbec8ad24 100644
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java
+++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAccessLibrary.java
@@ -45,24 +45,21 @@
import java.nio.ByteOrder;
-import com.oracle.graal.python.PythonLanguage;
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
-import com.oracle.graal.python.runtime.ExecutionContext.InteropCallContext;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
-import com.oracle.graal.python.runtime.PythonContext;
+import com.oracle.graal.python.lib.PyBufferRelease;
+import com.oracle.graal.python.lib.PyObjectGetBuffer;
import com.oracle.graal.python.util.PythonUtils;
-import com.oracle.truffle.api.nodes.LoopNode;
import com.oracle.truffle.api.CompilerDirectives;
-import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.library.GenerateLibrary;
import com.oracle.truffle.api.library.GenerateLibrary.Abstract;
import com.oracle.truffle.api.library.Library;
import com.oracle.truffle.api.library.LibraryFactory;
+import com.oracle.truffle.api.nodes.LoopNode;
import com.oracle.truffle.api.strings.TruffleString;
/**
- * A library for accessing buffers obtained using {@link PythonBufferAcquireLibrary}. The buffer
- * should always be released using {@link #release} after the access is finished. It is also
+ * A library for accessing buffers obtained using {@link PyObjectGetBuffer}. The buffer
+ * should always be released using {@link PyBufferRelease} after the access is finished. It is also
* permissible to use this library to access the underlying memory of {@link PBytesLike} objects
* that implement the API directly (i.e. as an equivalent of {@code PyBytes_AsStringAndSize}) - in
* that case, the buffer doesn't need to be acquired or released.
@@ -88,7 +85,7 @@ public abstract class PythonBufferAccessLibrary extends Library {
* Whether this object responds to this buffer API.
* Use this method with caution and only when absolutely needed. Code using
* buffers must know whether it works with a buffer object or not. Therefore, buffers
- * should be acquired first using {@link PythonBufferAcquireLibrary}. Use
+ * should be acquired first using {@link PyObjectGetBuffer}. Use
* {@link #assertIsBuffer(Object)} for assertions.
*/
@Abstract
@@ -103,43 +100,6 @@ public static void assertIsBuffer(Object receiver) {
assert PythonBufferAccessLibrary.getUncached().isBuffer(receiver);
}
- /**
- * Release the buffer. Equivalent of CPython's {@code PyBuffer_Release}, but must not be called
- * multiple times on the same buffer. If the caller has access to a VirtualFrame
- * {@link #release(Object, VirtualFrame, InteropCallData)} or
- * {@link #release(Object, VirtualFrame, PythonContext, PythonLanguage, InteropCallData)} should
- * be used. If the caller doesn't have access to a VirtualFrame it must be ensured that an
- * IndirectCallContext was already created in the call path.
- */
- public void release(@SuppressWarnings("unused") Object receiver) {
- }
-
- /**
- * Release the buffer. Equivalent of CPython's {@code PyBuffer_Release}, but must not be called
- * multiple times on the same buffer.
- */
- public final void release(Object receiver, VirtualFrame frame, InteropCallData callData) {
- Object savedState = InteropCallContext.enter(frame, this, callData);
- try {
- release(receiver);
- } finally {
- InteropCallContext.exit(frame, this, callData, savedState);
- }
- }
-
- /**
- * Release the buffer. Equivalent of CPython's {@code PyBuffer_Release}, but must not be called
- * multiple times on the same buffer.
- */
- public final void release(Object receiver, VirtualFrame frame, PythonContext context, PythonLanguage language, InteropCallData callData) {
- Object savedState = InteropCallContext.enter(frame, language, context, callData);
- try {
- release(receiver);
- } finally {
- InteropCallContext.exit(frame, language, context, savedState);
- }
- }
-
/**
* Return the buffer length in bytes. Equivalent of CPython's {@code Py_buffer.len}.
*/
diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java
deleted file mode 100644
index 973485799e..0000000000
--- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/buffer/PythonBufferAcquireLibrary.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * 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
- *
- * Subject to the condition set forth below, permission is hereby granted to any
- * person obtaining a copy of this software, associated documentation and/or
- * data (collectively the "Software"), free of charge and under any and all
- * copyright rights in the Software, and any and all patent rights owned or
- * freely licensable by each licensor hereunder covering either (i) the
- * unmodified Software as contributed to or provided by such licensor, or (ii)
- * the Larger Works (as defined below), to deal in both
- *
- * (a) the Software, and
- *
- * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
- * one is included with the Software each a "Larger Work" to which the Software
- * is contributed by such licensors),
- *
- * without restriction, including without limitation the rights to copy, create
- * derivative works of, display, perform, and distribute the Software and make,
- * use, sell, offer for sale, import, export, have made, and have sold the
- * Software and the Larger Work(s), and to sublicense the foregoing rights on
- * either these or other terms.
- *
- * This license is subject to the following condition:
- *
- * The above copyright notice and either this complete permission notice or at a
- * minimum a reference to the UPL must be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package com.oracle.graal.python.builtins.objects.buffer;
-
-import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
-
-import com.oracle.graal.python.PythonLanguage;
-import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion;
-import com.oracle.graal.python.nodes.ErrorMessages;
-import com.oracle.graal.python.nodes.PRaiseNode;
-import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext;
-import com.oracle.graal.python.runtime.ExecutionContext.InteropCallContext;
-import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
-import com.oracle.graal.python.runtime.PythonContext;
-import com.oracle.graal.python.runtime.exception.PException;
-import com.oracle.truffle.api.frame.VirtualFrame;
-import com.oracle.truffle.api.interop.InteropLibrary;
-import com.oracle.truffle.api.library.GenerateLibrary;
-import com.oracle.truffle.api.library.GenerateLibrary.DefaultExport;
-import com.oracle.truffle.api.library.GenerateLibrary.Abstract;
-import com.oracle.truffle.api.library.Library;
-import com.oracle.truffle.api.library.LibraryFactory;
-
-/**
- * Provide a way to acquire and release underlying byte buffer of objects that support it. Roughly
- * corresponds to CPython's internal buffer API, with the primary difference that we don't always
- * have direct access to the underlying array. Objects implementing this API are:
- *
- * IMPORTANT: This method may only be used in the context of an indirect interop call - * (see {@link InteropCallContext}) or indirect boundary call {@link BoundaryCallContext}. If a - * frame is available, prefer using convenience methods - * {@link #acquireReadonly(Object, VirtualFrame, InteropCallData)} or - * {@link #acquireReadonly(Object, VirtualFrame, PythonContext, PythonLanguage, InteropCallData)} - * . - *
- */ - public final Object acquireReadonly(Object receiver) { - return acquire(receiver, BufferFlags.PyBUF_SIMPLE); - } - - /** - * Convenience method that sets up an indirect call and then uses - * {@link #acquireReadonly(Object)}. NOTE: the provided indirectCallData must belong to a - * node which is an ancestor of the library. - */ - public final Object acquireReadonly(Object receiver, VirtualFrame frame, InteropCallData callData) { - Object savedState = InteropCallContext.enter(frame, this, callData); - try { - return acquire(receiver, BufferFlags.PyBUF_SIMPLE); - } finally { - InteropCallContext.exit(frame, this, callData, savedState); - } - } - - /** - * Convenience method that sets up an indirect call and then uses - * {@link #acquireReadonly(Object)}. NOTE: the provided indirectCallData must belong to a - * node which is an ancestor of the library. - */ - public final Object acquireReadonly(Object receiver, VirtualFrame frame, PythonContext context, PythonLanguage language, InteropCallData callData) { - Object savedState = InteropCallContext.enter(frame, language, context, callData); - try { - return acquire(receiver, BufferFlags.PyBUF_SIMPLE); - } finally { - InteropCallContext.exit(frame, language, context, savedState); - } - } - - /** - * Acquire a buffer object meant for writing. Equivalent of CPython's {@code PyObject_GetBuffer} - * with flag {@code PyBUF_WRITABLE}. For equivalents of clinic and {@code PyArg_Parse*} - * converters, see - * {@link #acquireWritableWithTypeError(Object, String, VirtualFrame, InteropCallData)} . Will - * raise exception if the acquisition fails. Must call - * {@link PythonBufferAccessLibrary#release(Object)} on the returned object after the access is - * finished. When intrinsifying CPython {PyObject_GetBuffer} calls, pay attention to what it - * does to the exception. More often than not, it replaces the exception raised here with - * another one. - *- * IMPORTANT: This method may only be used in the context of an indirect interop call - * (see {@link InteropCallContext}) or indirect boundary call {@link BoundaryCallContext}. If a - * frame is available, prefer using convenience methods - * {@link #acquireWritable(Object, VirtualFrame, InteropCallData)} or - * {@link #acquireWritable(Object, VirtualFrame, PythonContext, PythonLanguage, InteropCallData)} - * . - *
- */ - public final Object acquireWritable(Object receiver) { - return acquire(receiver, BufferFlags.PyBUF_WRITABLE); - } - - /** - * Convenience method that sets up an indirect call and then uses - * {@link #acquireWritable(Object)}. NOTE: the provided indirectCallData must belong to a - * node which is an ancestor of the library. - */ - public final Object acquireWritable(Object receiver, VirtualFrame frame, InteropCallData callData) { - Object savedState = InteropCallContext.enter(frame, this, callData); - try { - return acquire(receiver, BufferFlags.PyBUF_WRITABLE); - } finally { - InteropCallContext.exit(frame, this, callData, savedState); - } - } - - /** - * Convenience method that sets up an indirect call and then uses - * {@link #acquireWritable(Object)}. NOTE: the provided indirectCallData must belong to a - * node which is an ancestor of the library. - */ - public final Object acquireWritable(Object receiver, VirtualFrame frame, PythonContext context, PythonLanguage language, InteropCallData callData) { - Object savedState = InteropCallContext.enter(frame, language, context, callData); - try { - return acquire(receiver, BufferFlags.PyBUF_WRITABLE); - } finally { - InteropCallContext.exit(frame, language, context, savedState); - } - } - - /** - * Acquire a buffer object meant for writing. Equivalent of CPython's: - *- * IMPORTANT: This method may only be used in the context of an indirect interop call - * (see {@link InteropCallContext}) or indirect boundary call {@link BoundaryCallContext}. If a - * frame is available, prefer using convenience methods - * {@link #acquire(Object, int, VirtualFrame, InteropCallData)}}. - *
- * - * @param flags combined constants from {@link BufferFlags}. Unlike CPython, our buffer objects - * typically return themselves for performance reasons and thus cannot remove the - * format/shape/strides when the flags request them to do so. Be prepared to ignore - * those elements in such case. - */ - @Abstract - public Object acquire(Object receiver, int flags) { - throw PRaiseNode.raiseStatic(this, TypeError, ErrorMessages.BYTESLIKE_OBJ_REQUIRED, receiver); - } - - /** - * Convenience method that sets up an indirect call and then uses {@link #acquire(Object, int)}. - * NOTE: the provided indirectCallData must belong to a node which is an ancestor of the - * library. - */ - public final Object acquire(Object receiver, int flags, VirtualFrame frame, InteropCallData callData) { - Object savedState = InteropCallContext.enter(frame, this, callData); - try { - return acquire(receiver, flags); - } finally { - InteropCallContext.exit(frame, this, callData, savedState); - } - } - - static class Assertions extends PythonBufferAcquireLibrary { - @Child PythonBufferAcquireLibrary delegate; - - public Assertions(PythonBufferAcquireLibrary delegate) { - this.delegate = delegate; - } - - @Override - public boolean accepts(Object receiver) { - return delegate.accepts(receiver); - } - - @Override - public boolean hasBuffer(Object receiver) { - return delegate.hasBuffer(receiver); - } - - @Override - public Object acquire(Object receiver, int flags) { - Object buffer = delegate.acquire(receiver, flags); - assert delegate.hasBuffer(receiver); - assert PythonBufferAccessLibrary.getUncached().isBuffer(buffer); - return buffer; - } - } - - static final LibraryFactory