105105import com .oracle .graal .python .builtins .objects .common .SequenceStorageNodes .GetInternalByteArrayNode ;
106106import com .oracle .graal .python .builtins .objects .module .PythonModule ;
107107import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
108+ import com .oracle .graal .python .lib .PyBufferRelease ;
108109import com .oracle .graal .python .lib .PyCallableCheckNode ;
109110import com .oracle .graal .python .lib .PyObjectGetBuffer ;
110111import com .oracle .graal .python .lib .PyObjectSizeNode ;
128129import com .oracle .graal .python .nodes .util .CastToTruffleStringNode ;
129130import com .oracle .graal .python .runtime .ExecutionContext .BoundaryCallContext ;
130131import com .oracle .graal .python .runtime .IndirectCallData .BoundaryCallData ;
131- import com .oracle .graal .python .runtime .IndirectCallData .InteropCallData ;
132132import com .oracle .graal .python .runtime .PythonContext ;
133133import com .oracle .graal .python .runtime .exception .PException ;
134134import 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 });
0 commit comments