@@ -260,6 +260,7 @@ Object setitem(VirtualFrame frame, PMemoryView self, Object index, Object object
260
260
Object setitem (VirtualFrame frame , PMemoryView self , PSlice slice , Object object ,
261
261
@ Cached GetItemNode getItemNode ,
262
262
@ Cached BuiltinConstructors .MemoryViewNode createMemoryView ,
263
+ @ Cached ReleaseNode releaseNode ,
263
264
@ Cached MemoryViewNodes .PointerLookupNode pointerLookupNode ,
264
265
@ Cached MemoryViewNodes .ToJavaBytesNode toJavaBytesNode ,
265
266
@ Cached MemoryViewNodes .WriteBytesAtNode writeBytesAtNode ) {
@@ -269,19 +270,27 @@ Object setitem(VirtualFrame frame, PMemoryView self, PSlice slice, Object object
269
270
throw raise (NotImplementedError , ErrorMessages .MEMORYVIEW_SLICE_ASSIGNMENT_RESTRICTED_TO_DIM_1 );
270
271
}
271
272
PMemoryView srcView = createMemoryView .execute (frame , object );
272
- PMemoryView destView = (PMemoryView ) getItemNode .execute (frame , self , slice );
273
- if (srcView .getDimensions () != destView .getDimensions () || srcView .getBufferShape ()[0 ] != destView .getBufferShape ()[0 ] || srcView .getFormat () != destView .getFormat ()) {
274
- throw raise (ValueError , ErrorMessages .MEMORYVIEW_DIFFERENT_STRUCTURES );
275
- }
276
- // The intermediate array is necessary for overlapping views (where src and dest are the
277
- // same buffer)
278
- byte [] srcBytes = toJavaBytesNode .execute (srcView );
279
- int itemsize = srcView .getItemSize ();
280
- for (int i = 0 ; i < destView .getBufferShape ()[0 ]; i ++) {
281
- MemoryViewNodes .MemoryPointer destPtr = pointerLookupNode .execute (frame , destView , i );
282
- writeBytesAtNode .execute (srcBytes , i * itemsize , itemsize , self , destPtr .ptr , destPtr .offset );
273
+ try {
274
+ PMemoryView destView = (PMemoryView ) getItemNode .execute (frame , self , slice );
275
+ try {
276
+ if (srcView .getDimensions () != destView .getDimensions () || srcView .getBufferShape ()[0 ] != destView .getBufferShape ()[0 ] || srcView .getFormat () != destView .getFormat ()) {
277
+ throw raise (ValueError , ErrorMessages .MEMORYVIEW_DIFFERENT_STRUCTURES );
278
+ }
279
+ // The intermediate array is necessary for overlapping views (where src and dest
280
+ // are the same buffer)
281
+ byte [] srcBytes = toJavaBytesNode .execute (srcView );
282
+ int itemsize = srcView .getItemSize ();
283
+ for (int i = 0 ; i < destView .getBufferShape ()[0 ]; i ++) {
284
+ MemoryViewNodes .MemoryPointer destPtr = pointerLookupNode .execute (frame , destView , i );
285
+ writeBytesAtNode .execute (srcBytes , i * itemsize , itemsize , self , destPtr .ptr , destPtr .offset );
286
+ }
287
+ return PNone .NONE ;
288
+ } finally {
289
+ releaseNode .execute (frame , destView );
290
+ }
291
+ } finally {
292
+ releaseNode .execute (frame , srcView );
283
293
}
284
- return PNone .NONE ;
285
294
}
286
295
287
296
@ Specialization
@@ -350,6 +359,7 @@ boolean eq(VirtualFrame frame, PMemoryView self, PMemoryView other,
350
359
@ Specialization (guards = "!isMemoryView(other)" )
351
360
Object eq (VirtualFrame frame , PMemoryView self , Object other ,
352
361
@ Cached BuiltinConstructors .MemoryViewNode memoryViewNode ,
362
+ @ Cached ReleaseNode releaseNode ,
353
363
@ CachedLibrary (limit = "3" ) PythonObjectLibrary lib ,
354
364
@ Cached MemoryViewNodes .ReadItemAtNode readSelf ,
355
365
@ Cached MemoryViewNodes .ReadItemAtNode readOther ) {
@@ -359,7 +369,11 @@ Object eq(VirtualFrame frame, PMemoryView self, Object other,
359
369
} catch (PException e ) {
360
370
return PNotImplemented .NOT_IMPLEMENTED ;
361
371
}
362
- return eq (frame , self , memoryView , lib , readSelf , readOther );
372
+ try {
373
+ return eq (frame , self , memoryView , lib , readSelf , readOther );
374
+ } finally {
375
+ releaseNode .execute (frame , memoryView );
376
+ }
363
377
}
364
378
365
379
@ Fallback
0 commit comments