Skip to content

Commit 9e96d7f

Browse files
committed
Replace PythonBufferAccessLibrary.release with a node
1 parent 3b9d387 commit 9e96d7f

62 files changed

Lines changed: 552 additions & 493 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: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
6565
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
6666
import com.oracle.graal.python.builtins.objects.str.PString;
67+
import com.oracle.graal.python.lib.PyBufferRelease;
6768
import com.oracle.graal.python.lib.PyObjectCheckBuffer;
6869
import com.oracle.graal.python.lib.PyObjectGetBuffer;
6970
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -76,7 +77,6 @@
7677
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode;
7778
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
7879
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
79-
import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
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;
@@ -191,14 +191,14 @@ public static AsciiBufferConverter create() {
191191
abstract static class A2bBase64Node extends PythonBinaryClinicBuiltinNode {
192192
@Specialization(limit = "3")
193193
PBytes doConvert(VirtualFrame frame, Object buffer, boolean strictMode,
194-
@Cached("createFor($node)") InteropCallData callData,
195194
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
196-
@Bind PythonLanguage language) {
195+
@Bind PythonLanguage language,
196+
@Cached PyBufferRelease releaseBuffer) {
197197
try {
198198
ByteSequenceStorage storage = b64decode(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), strictMode);
199199
return PFactory.createBytes(language, storage);
200200
} finally {
201-
bufferLib.release(buffer, frame, callData);
201+
releaseBuffer.execute(frame, buffer);
202202
}
203203
}
204204

@@ -276,14 +276,14 @@ protected ArgumentClinicProvider getArgumentClinic() {
276276
abstract static class A2bHexNode extends PythonUnaryClinicBuiltinNode {
277277
@Specialization(limit = "3")
278278
PBytes a2b(VirtualFrame frame, Object buffer,
279-
@Cached("createFor($node)") InteropCallData callData,
280279
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
281-
@Bind PythonLanguage language) {
280+
@Bind PythonLanguage language,
281+
@Cached PyBufferRelease releaseBuffer) {
282282
try {
283283
byte[] bytes = a2b(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer));
284284
return PFactory.createBytes(language, bytes);
285285
} finally {
286-
bufferLib.release(buffer, frame, callData);
286+
releaseBuffer.execute(frame, buffer);
287287
}
288288
}
289289

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

341341
@Specialization(limit = "3")
342342
PBytes b2aBuffer(VirtualFrame frame, Object buffer, boolean newline,
343-
@Cached("createFor($node)") InteropCallData callData,
344343
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
345-
@Bind PythonLanguage language) {
344+
@Bind PythonLanguage language,
345+
@Cached PyBufferRelease releaseBuffer) {
346346
try {
347347
return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), newline, language);
348348
} finally {
349-
bufferLib.release(buffer, frame, callData);
349+
releaseBuffer.execute(frame, buffer);
350350
}
351351
}
352352

@@ -367,18 +367,18 @@ abstract static class B2aHexNode extends PythonTernaryClinicBuiltinNode {
367367
@Specialization(limit = "3")
368368
static PBytes b2a(VirtualFrame frame, Object buffer, Object sep, int bytesPerSep,
369369
@Bind Node inliningTarget,
370-
@Cached("createFor($node)") InteropCallData callData,
371370
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
372371
@Bind PythonLanguage language,
373-
@Cached PRaiseNode raiseNode) {
372+
@Cached PRaiseNode raiseNode,
373+
@Cached PyBufferRelease releaseBuffer) {
374374
if (sep != PNone.NO_VALUE || bytesPerSep != 1) {
375375
// TODO implement sep and bytes_per_sep
376376
throw raiseNode.raise(inliningTarget, NotImplementedError);
377377
}
378378
try {
379379
return b2a(bufferLib.getInternalOrCopiedByteArray(buffer), bufferLib.getBufferLength(buffer), language);
380380
} finally {
381-
bufferLib.release(buffer, frame, callData);
381+
releaseBuffer.execute(frame, buffer);
382382
}
383383
}
384384

@@ -408,12 +408,12 @@ abstract static class Crc32Node extends PythonBinaryClinicBuiltinNode {
408408
@Specialization(limit = "3")
409409
static long b2a(VirtualFrame frame, Object buffer, long crc,
410410
@Bind Node inliningTarget,
411-
@Cached("createFor($node)") InteropCallData callData,
412-
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
411+
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
412+
@Cached PyBufferRelease releaseBuffer) {
413413
try {
414414
return crc32(inliningTarget, (int) crc, bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
415415
} finally {
416-
bufferLib.release(buffer, frame, callData);
416+
releaseBuffer.execute(frame, buffer);
417417
}
418418
}
419419

@@ -432,12 +432,12 @@ abstract static class CrcHqxNode extends PythonBinaryClinicBuiltinNode {
432432
@Specialization(limit = "3")
433433
static long b2a(VirtualFrame frame, Object buffer, long crc,
434434
@Bind Node inliningTarget,
435-
@Cached("createFor($node)") InteropCallData callData,
436-
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
435+
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
436+
@Cached PyBufferRelease releaseBuffer) {
437437
try {
438438
return crcHqx(inliningTarget, (int) crc, bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
439439
} finally {
440-
bufferLib.release(buffer, frame, callData);
440+
releaseBuffer.execute(frame, buffer);
441441
}
442442
}
443443

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@
170170
import com.oracle.graal.python.compiler.ParserCallbacksImpl;
171171
import com.oracle.graal.python.compiler.bytecode_dsl.BytecodeDSLCompiler;
172172
import com.oracle.graal.python.lib.IteratorExhausted;
173+
import com.oracle.graal.python.lib.PyBufferRelease;
173174
import com.oracle.graal.python.lib.PyBytesCheckNode;
174175
import com.oracle.graal.python.lib.PyCallableCheckNode;
175176
import com.oracle.graal.python.lib.PyEvalGetGlobals;
@@ -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;
@@ -1189,7 +1189,7 @@ TruffleString sourceAsString(VirtualFrame frame, Node inliningTarget, Object sou
11891189
int bytesLen = bufferLib.getBufferLength(source);
11901190
return doDecodeSource(getContext(), source, filename, bytes, bytesLen);
11911191
} finally {
1192-
bufferLib.release(buffer, frame, InteropCallData.getUncached());
1192+
PyBufferRelease.getUncached().execute(frame, buffer);
11931193
}
11941194
}
11951195
}

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetInternalByteArrayNode;
106106
import com.oracle.graal.python.builtins.objects.module.PythonModule;
107107
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
108+
import com.oracle.graal.python.lib.PyBufferRelease;
108109
import com.oracle.graal.python.lib.PyCallableCheckNode;
109110
import com.oracle.graal.python.lib.PyObjectGetBuffer;
110111
import com.oracle.graal.python.lib.PyObjectSizeNode;
@@ -128,7 +129,6 @@
128129
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
129130
import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext;
130131
import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData;
131-
import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
132132
import com.oracle.graal.python.runtime.PythonContext;
133133
import com.oracle.graal.python.runtime.exception.PException;
134134
import com.oracle.graal.python.runtime.object.PFactory;
@@ -241,6 +241,7 @@ byte[] encode(VirtualFrame frame, Object self, TruffleString encoding, TruffleSt
241241
@Cached TruffleString.ToJavaStringNode toJavaStringNode,
242242
@Cached TruffleString.EqualNode equalNode,
243243
@Cached ErrorHandlers.CallEncodingErrorHandlerNode errorHandler,
244+
@Cached PyBufferRelease releaseBuffer,
244245
@Cached PyObjectGetBuffer getBuffer,
245246
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
246247
@Cached CastToJavaStringNode castToJavaStringNode,
@@ -258,7 +259,8 @@ byte[] encode(VirtualFrame frame, Object self, TruffleString encoding, TruffleSt
258259
return ret;
259260
}
260261
}
261-
return slowPath(frame, encoding, errors, inliningTarget, toJavaStringNode, equalNode, errorHandler, getBuffer, bufferLib, castToJavaStringNode, raiseNode, input, charsetWrapper);
262+
return slowPath(frame, encoding, errors, inliningTarget, toJavaStringNode, equalNode, errorHandler, getBuffer, releaseBuffer, bufferLib, castToJavaStringNode, raiseNode, input,
263+
charsetWrapper);
262264
}
263265

264266
private static byte[] fastPath(TruffleString input,
@@ -296,6 +298,7 @@ private byte[] slowPath(VirtualFrame frame, TruffleString encoding, TruffleStrin
296298
TruffleString.EqualNode equalNode,
297299
ErrorHandlers.CallEncodingErrorHandlerNode errorHandler,
298300
PyObjectGetBuffer getBuffer,
301+
PyBufferRelease releaseBuffer,
299302
PythonBufferAccessLibrary bufferLib,
300303
CastToJavaStringNode castToJavaStringNode,
301304
PRaiseNode raiseNode,
@@ -321,7 +324,7 @@ private byte[] slowPath(VirtualFrame frame, TruffleString encoding, TruffleStrin
321324
try {
322325
encoder.replace(bufferLib.getInternalOrCopiedByteArray(buffer), 0, bufferLib.getBufferLength(buffer));
323326
} finally {
324-
bufferLib.release(buffer);
327+
releaseBuffer.execute(frame, buffer);
325328
}
326329
}
327330
}
@@ -384,7 +387,6 @@ protected ArgumentClinicProvider getArgumentClinic() {
384387
static Object decode(VirtualFrame frame, Object input, TruffleString encoding, TruffleString errors, boolean finalData,
385388
@Bind Node inliningTarget,
386389
@Bind PythonLanguage language,
387-
@Cached("createFor($node)") InteropCallData callData,
388390
@Cached PyObjectGetBuffer getBuffer,
389391
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
390392
@Cached TruffleString.FromByteArrayNode fromByteArrayNode,
@@ -393,7 +395,8 @@ static Object decode(VirtualFrame frame, Object input, TruffleString encoding, T
393395
@Cached InlinedConditionProfile fastPathProfile,
394396
@Cached(inline = true) CharsetLookupNode charsetLookupNode,
395397
@Cached("createFor($node)") BoundaryCallData boundaryCallData,
396-
@Cached PRaiseNode raiseNode) {
398+
@Cached PRaiseNode raiseNode,
399+
@Cached PyBufferRelease releaseBuffer) {
397400
Object buffer = getBuffer.executeReadonly(frame, input);
398401
try {
399402
int len = bufferLib.getBufferLength(buffer);
@@ -451,7 +454,7 @@ static Object decode(VirtualFrame frame, Object input, TruffleString encoding, T
451454
BoundaryCallContext.exit(frame, boundaryCallData, savedState);
452455
}
453456
} finally {
454-
bufferLib.release(buffer, frame, callData);
457+
releaseBuffer.execute(frame, buffer);
455458
}
456459
}
457460

@@ -487,7 +490,7 @@ public static Object[] decodeSlowPath(Object input, TruffleString encoding, Truf
487490
return new Object[]{decoder.getString(), decoder.getInputPosition()};
488491
} finally {
489492
if (releaseBuffer) {
490-
bufferLib.release(buffer);
493+
PyBufferRelease.getUncached().execute(null, buffer);
491494
}
492495
}
493496
}
@@ -514,13 +517,13 @@ Object decodeByteArray(byte[] bytes, TruffleString errors,
514517
@Specialization(limit = "3")
515518
Object decode(VirtualFrame frame, Object buffer, TruffleString errors,
516519
@Bind PythonLanguage language,
517-
@Cached("createFor($node)") InteropCallData callData,
518-
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib) {
520+
@CachedLibrary("buffer") PythonBufferAccessLibrary bufferLib,
521+
@Cached PyBufferRelease releaseBuffer) {
519522
try {
520523
int len = bufferLib.getBufferLength(buffer);
521524
return decodeBytes(bufferLib.getInternalOrCopiedByteArray(buffer), len, errors, language);
522525
} finally {
523-
bufferLib.release(buffer, frame, callData);
526+
releaseBuffer.execute(frame, buffer);
524527
}
525528
}
526529

@@ -1320,16 +1323,16 @@ protected ArgumentClinicProvider getArgumentClinic() {
13201323
Object doIt(VirtualFrame frame, Object data, TruffleString errors, Object mapping,
13211324
@Bind Node inliningTarget,
13221325
@Bind PythonContext context,
1323-
@Cached("createFor($node)") InteropCallData callData,
13241326
@Cached PyObjectGetBuffer getBuffer,
13251327
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
1326-
@Cached PyUnicodeDecodeCharmapNode pyUnicodeDecodeCharmapNode) {
1328+
@Cached PyUnicodeDecodeCharmapNode pyUnicodeDecodeCharmapNode,
1329+
@Cached PyBufferRelease releaseBuffer) {
13271330
Object dataBuffer = getBuffer.executeReadonly(frame, data);
13281331
int len;
13291332
try {
13301333
len = bufferLib.getBufferLength(dataBuffer);
13311334
} finally {
1332-
bufferLib.release(dataBuffer, frame, callData);
1335+
releaseBuffer.execute(frame, dataBuffer);
13331336
}
13341337
TruffleString result = len == 0 ? T_EMPTY_STRING : pyUnicodeDecodeCharmapNode.execute(frame, data, errors, mapping);
13351338
return PFactory.createTuple(context.getLanguage(inliningTarget), new Object[]{result, len});

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.FileDescriptorConversionNode;
6565
import com.oracle.graal.python.builtins.objects.PNone;
6666
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
67+
import com.oracle.graal.python.lib.PyBufferRelease;
6768
import com.oracle.graal.python.lib.PyLongAsIntNode;
6869
import com.oracle.graal.python.lib.PyLongAsLongNode;
6970
import com.oracle.graal.python.lib.PyObjectCheckBuffer;
@@ -78,7 +79,6 @@
7879
import com.oracle.graal.python.nodes.util.CannotCastException;
7980
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
8081
import com.oracle.graal.python.runtime.GilNode;
81-
import com.oracle.graal.python.runtime.IndirectCallData.InteropCallData;
8282
import com.oracle.graal.python.runtime.PosixConstants;
8383
import com.oracle.graal.python.runtime.PosixConstants.IntConstant;
8484
import com.oracle.graal.python.runtime.PosixSupport.PosixException;
@@ -207,15 +207,15 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat
207207
@Cached PyObjectCheckBuffer checkBufferNode,
208208
@Cached PyObjectGetBuffer getBuffer,
209209
@CachedLibrary(limit = "3") PythonBufferAccessLibrary bufferLib,
210-
@Cached("createFor($node)") InteropCallData callData,
211210
@Cached PyLongAsIntNode asIntNode,
212211
@Cached CastToTruffleStringNode castToString,
213212
@Cached TruffleString.SwitchEncodingNode switchEncodingNode,
214213
@Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode,
215214
@Cached GilNode gilNode,
216215
@Cached PRaiseNode raiseNode,
217216
@Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode,
218-
@Cached SysModuleBuiltins.AuditNode auditNode) {
217+
@Cached SysModuleBuiltins.AuditNode auditNode,
218+
@Cached PyBufferRelease releaseBuffer) {
219219
auditNode.audit(frame, inliningTarget, T_FCNT_IOCTL, fd, request, arg);
220220

221221
int intArg = 0;
@@ -272,7 +272,7 @@ Object ioctl(VirtualFrame frame, int fd, long request, Object arg, boolean mutat
272272
}
273273
}
274274
} finally {
275-
bufferLib.release(buffer, frame, callData);
275+
releaseBuffer.execute(frame, buffer);
276276
}
277277
}
278278
}

0 commit comments

Comments
 (0)