Skip to content

Commit cee402c

Browse files
committed
[GR-80789] Migrate PythonBufferAcquireLibrary to nodes
PullRequest: graalpython/4974
2 parents bf582d8 + 9e96d7f commit cee402c

78 files changed

Lines changed: 1469 additions & 1569 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_memoryview.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,13 @@ def test_memoryview_acquire_release(self):
515515
)
516516
obj = TestType()
517517
assert obj.get_bufcount() == 0
518+
assert bytes(obj) == bytes([123, 124, 125, 126])
519+
assert obj.get_bufcount() == 0
520+
assert struct.unpack("4B", obj) == (123, 124, 125, 126)
521+
assert obj.get_bufcount() == 0
522+
with self.assertRaises(struct.error):
523+
struct.unpack("B", obj)
524+
assert obj.get_bufcount() == 0
518525
mv1 = memoryview(obj)
519526
assert mv1[3] == 126
520527
assert obj.get_bufcount() == 1

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BinasciiModuleBuiltins.java‎

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,11 @@
6262
import com.oracle.graal.python.builtins.PythonBuiltins;
6363
import com.oracle.graal.python.builtins.objects.PNone;
6464
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
65-
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
6665
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
6766
import com.oracle.graal.python.builtins.objects.str.PString;
67+
import com.oracle.graal.python.lib.PyBufferRelease;
68+
import com.oracle.graal.python.lib.PyObjectCheckBuffer;
69+
import com.oracle.graal.python.lib.PyObjectGetBuffer;
6870
import com.oracle.graal.python.nodes.ErrorMessages;
6971
import com.oracle.graal.python.nodes.PRaiseNode;
7072
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
@@ -75,8 +77,6 @@
7577
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode;
7678
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
7779
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
78-
import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
79-
import com.oracle.graal.python.runtime.PythonContext;
8080
import com.oracle.graal.python.runtime.object.PFactory;
8181
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
8282
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
@@ -107,13 +107,11 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
107107
}
108108

109109
abstract static class AsciiBufferConverter extends ArgumentCastNode {
110-
@Specialization(guards = "acquireLib.hasBuffer(value)", limit = "getCallSiteInlineCacheMaxDepth()")
110+
@Specialization(guards = "checkBufferNode.execute(value)", limit = "1")
111111
static Object doObject(VirtualFrame frame, Object value,
112-
@Bind Node inliningTarget,
113-
@Bind PythonContext context,
114-
@Cached("createFor($node)") InteropCallData callData,
115-
@CachedLibrary("value") PythonBufferAcquireLibrary acquireLib) {
116-
return acquireLib.acquireReadonly(value, frame, context, context.getLanguage(inliningTarget), callData);
112+
@Cached PyObjectCheckBuffer checkBufferNode,
113+
@Cached PyObjectGetBuffer getBuffer) {
114+
return getBuffer.executeReadonly(frame, value);
117115
}
118116

119117
@ExportLibrary(PythonBufferAccessLibrary.class)
@@ -193,14 +191,14 @@ public static AsciiBufferConverter create() {
193191
abstract static class A2bBase64Node extends PythonBinaryClinicBuiltinNode {
194192
@Specialization(limit = "3")
195193
PBytes doConvert(VirtualFrame frame, Object buffer, boolean strictMode,
196-
@Cached("createFor($node)") InteropCallData callData,
197194
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
198-
@Bind PythonLanguage language) {
195+
@Bind PythonLanguage language,
196+
@Cached PyBufferRelease releaseBuffer) {
199197
try {
200198
ByteSequenceStorage storage = b64decode(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), strictMode);
201199
return PFactory.createBytes(language, storage);
202200
} finally {
203-
bufferLib.release(buffer, frame, callData);
201+
releaseBuffer.execute(frame, buffer);
204202
}
205203
}
206204

@@ -278,14 +276,14 @@ protected ArgumentClinicProvider getArgumentClinic() {
278276
abstract static class A2bHexNode extends PythonUnaryClinicBuiltinNode {
279277
@Specialization(limit = "3")
280278
PBytes a2b(VirtualFrame frame, Object buffer,
281-
@Cached("createFor($node)") InteropCallData callData,
282279
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
283-
@Bind PythonLanguage language) {
280+
@Bind PythonLanguage language,
281+
@Cached PyBufferRelease releaseBuffer) {
284282
try {
285283
byte[] bytes = a2b(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer));
286284
return PFactory.createBytes(language, bytes);
287285
} finally {
288-
bufferLib.release(buffer, frame, callData);
286+
releaseBuffer.execute(frame, buffer);
289287
}
290288
}
291289

@@ -342,13 +340,13 @@ private PBytes b2a(byte[] data, int lenght, boolean newline, PythonLanguage lang
342340

343341
@Specialization(limit = "3")
344342
PBytes b2aBuffer(VirtualFrame frame, Object buffer, boolean newline,
345-
@Cached("createFor($node)") InteropCallData callData,
346343
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
347-
@Bind PythonLanguage language) {
344+
@Bind PythonLanguage language,
345+
@Cached PyBufferRelease releaseBuffer) {
348346
try {
349347
return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), newline, language);
350348
} finally {
351-
bufferLib.release(buffer, frame, callData);
349+
releaseBuffer.execute(frame, buffer);
352350
}
353351
}
354352

@@ -369,18 +367,18 @@ abstract static class B2aHexNode extends PythonTernaryClinicBuiltinNode {
369367
@Specialization(limit = "3")
370368
static PBytes b2a(VirtualFrame frame, Object buffer, Object sep, int bytesPerSep,
371369
@Bind Node inliningTarget,
372-
@Cached("createFor($node)") InteropCallData callData,
373370
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
374371
@Bind PythonLanguage language,
375-
@Cached PRaiseNode raiseNode) {
372+
@Cached PRaiseNode raiseNode,
373+
@Cached PyBufferRelease releaseBuffer) {
376374
if (sep != PNone.NO_VALUE || bytesPerSep != 1) {
377375
// TODO implement sep and bytes_per_sep
378376
throw raiseNode.raise(inliningTarget, NotImplementedError);
379377
}
380378
try {
381379
return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), language);
382380
} finally {
383-
bufferLib.release(buffer, frame, callData);
381+
releaseBuffer.execute(frame, buffer);
384382
}
385383
}
386384

@@ -410,12 +408,12 @@ abstract static class Crc32Node extends PythonBinaryClinicBuiltinNode {
410408
@Specialization(limit = "3")
411409
static long b2a(VirtualFrame frame, Object buffer, long crc,
412410
@Bind Node inliningTarget,
413-
@Cached("createFor($node)") InteropCallData callData,
414-
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
411+
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
412+
@Cached PyBufferRelease releaseBuffer) {
415413
try {
416414
return crc32(inliningTarget, (int) crc, bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
417415
} finally {
418-
bufferLib.release(buffer, frame, callData);
416+
releaseBuffer.execute(frame, buffer);
419417
}
420418
}
421419

@@ -434,12 +432,12 @@ abstract static class CrcHqxNode extends PythonBinaryClinicBuiltinNode {
434432
@Specialization(limit = "3")
435433
static long b2a(VirtualFrame frame, Object buffer, long crc,
436434
@Bind Node inliningTarget,
437-
@Cached("createFor($node)") InteropCallData callData,
438-
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
435+
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
436+
@Cached PyBufferRelease releaseBuffer) {
439437
try {
440438
return crcHqx(inliningTarget, (int) crc, bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
441439
} finally {
442-
bufferLib.release(buffer, frame, callData);
440+
releaseBuffer.execute(frame, buffer);
443441
}
444442
}
445443

‎graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@
128128
import com.oracle.graal.python.builtins.objects.PNone;
129129
import com.oracle.graal.python.builtins.objects.PNotImplemented;
130130
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
131-
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
132131
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
133132
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
134133
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
@@ -171,6 +170,7 @@
171170
import com.oracle.graal.python.compiler.ParserCallbacksImpl;
172171
import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler;
173172
import com.oracle.graal.python.lib.IteratorExhausted;
173+
import com.oracle.graal.python.lib.PyBufferRelease;
174174
import com.oracle.graal.python.lib.PyBytesCheckNode;
175175
import com.oracle.graal.python.lib.PyCallableCheckNode;
176176
import com.oracle.graal.python.lib.PyEvalGetGlobals;
@@ -192,6 +192,7 @@
192192
import com.oracle.graal.python.lib.PyObjectFormat;
193193
import com.oracle.graal.python.lib.PyObjectGetAIter;
194194
import com.oracle.graal.python.lib.PyObjectGetAttrO;
195+
import com.oracle.graal.python.lib.PyObjectGetBuffer;
195196
import com.oracle.graal.python.lib.PyObjectGetIter;
196197
import com.oracle.graal.python.lib.PyObjectGetMethod;
197198
import com.oracle.graal.python.lib.PyObjectHashNode;
@@ -269,7 +270,6 @@
269270
import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext;
270271
import com.oracle.graal.python.runtime.GilNode;
271272
import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData;
272-
import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
273273
import com.oracle.graal.python.runtime.PythonContext;
274274
import com.oracle.graal.python.runtime.PythonOptions;
275275
import com.oracle.graal.python.runtime.exception.PException;
@@ -1062,7 +1062,7 @@ Object compile(TruffleString expression, TruffleString filename, TruffleString m
10621062
@Specialization(limit = "3")
10631063
@SuppressWarnings("truffle-static-method")
10641064
Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleString mode, int flags, boolean dontInherit, int optimize, int featureVersion,
1065-
@CachedLibrary(limit = "3") PythonBufferAcquireLibrary acquireLib,
1065+
@Cached PyObjectGetBuffer getBuffer,
10661066
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
10671067
@Bind PythonContext context,
10681068
@Bind Node inliningTarget,
@@ -1099,7 +1099,7 @@ Object generic(VirtualFrame frame, Object wSource, Object wFilename, TruffleStri
10991099
RootCallTarget rootCallTarget = context.getLanguage(inliningTarget).compileModule(context, mod, source, false, optimize, null, null, flags);
11001100
return wrapRootCallTarget(rootCallTarget, filename);
11011101
}
1102-
TruffleString source = sourceAsString(frame, inliningTarget, wSource, filename, interopLib, acquireLib, bufferLib, switchEncodingNode, raiseNode);
1102+
TruffleString source = sourceAsString(frame, inliningTarget, wSource, filename, interopLib, getBuffer, bufferLib, switchEncodingNode, raiseNode);
11031103
checkSource(source);
11041104
return compile(source, filename, mode, flags, dontInherit, optimize, featureVersion);
11051105
} finally {
@@ -1166,7 +1166,7 @@ private InputType getParserInputType(TruffleString mode, int flags) {
11661166
}
11671167

11681168
// modeled after _Py_SourceAsString
1169-
TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object source, TruffleString filename, InteropLibrary interopLib, PythonBufferAcquireLibrary acquireLib,
1169+
TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object source, TruffleString filename, InteropLibrary interopLib, PyObjectGetBuffer getBuffer,
11701170
PythonBufferAccessLibrary bufferLib, TruffleString.SwitchEncodingNode switchEncodingNode, PRaiseNode raiseNode) {
11711171
if (interopLib.isString(source)) {
11721172
try {
@@ -1179,7 +1179,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou
11791179
// buffers, since that's fast for us anyway
11801180
Object buffer;
11811181
try {
1182-
buffer = acquireLib.acquireReadonly(source, frame, InteropCallData.getUncached());
1182+
buffer = getBuffer.executeReadonly(frame, source);
11831183
} catch (PException e) {
11841184
throw raiseNode.raise(inliningTarget, TypeError, ErrorMessages.ARG_D_MUST_BE_S, "compile()", 1, "string, bytes or AST object");
11851185
}
@@ -1188,7 +1188,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou
11881188
int bytesLen = bufferLib.getBufferLength(source);
11891189
return doDecodeSource(getContext(), source, filename, bytes, bytesLen);
11901190
} finally {
1191-
bufferLib.release(buffer, frame, InteropCallData.getUncached());
1191+
PyBufferRelease.getUncached().execute(frame, buffer);
11921192
}
11931193
}
11941194
}

0 commit comments

Comments
 (0)