Skip to content

Commit df23fd9

Browse files
committed
Add missing memoryview release calls
1 parent 404ae9b commit df23fd9

File tree

2 files changed

+29
-15
lines changed

2 files changed

+29
-15
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/memoryview/MemoryViewBuiltins.java

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ Object setitem(VirtualFrame frame, PMemoryView self, Object index, Object object
260260
Object setitem(VirtualFrame frame, PMemoryView self, PSlice slice, Object object,
261261
@Cached GetItemNode getItemNode,
262262
@Cached BuiltinConstructors.MemoryViewNode createMemoryView,
263+
@Cached ReleaseNode releaseNode,
263264
@Cached MemoryViewNodes.PointerLookupNode pointerLookupNode,
264265
@Cached MemoryViewNodes.ToJavaBytesNode toJavaBytesNode,
265266
@Cached MemoryViewNodes.WriteBytesAtNode writeBytesAtNode) {
@@ -269,19 +270,27 @@ Object setitem(VirtualFrame frame, PMemoryView self, PSlice slice, Object object
269270
throw raise(NotImplementedError, ErrorMessages.MEMORYVIEW_SLICE_ASSIGNMENT_RESTRICTED_TO_DIM_1);
270271
}
271272
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);
283293
}
284-
return PNone.NONE;
285294
}
286295

287296
@Specialization
@@ -350,6 +359,7 @@ boolean eq(VirtualFrame frame, PMemoryView self, PMemoryView other,
350359
@Specialization(guards = "!isMemoryView(other)")
351360
Object eq(VirtualFrame frame, PMemoryView self, Object other,
352361
@Cached BuiltinConstructors.MemoryViewNode memoryViewNode,
362+
@Cached ReleaseNode releaseNode,
353363
@CachedLibrary(limit = "3") PythonObjectLibrary lib,
354364
@Cached MemoryViewNodes.ReadItemAtNode readSelf,
355365
@Cached MemoryViewNodes.ReadItemAtNode readOther) {
@@ -359,7 +369,11 @@ Object eq(VirtualFrame frame, PMemoryView self, Object other,
359369
} catch (PException e) {
360370
return PNotImplemented.NOT_IMPLEMENTED;
361371
}
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+
}
363377
}
364378

365379
@Fallback

graalpython/lib-graalpython/_io.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ def open_code(path):
563563

564564
# ----------------------------------------------------------------------------------------------------------------------
565565
#
566-
# following definitions: patched in the __builtins_patches__ module
566+
# following definitions: patched in the pyio_patches module
567567
#
568568
# ----------------------------------------------------------------------------------------------------------------------
569569
class _BufferedIOBase(_IOBase):
@@ -612,7 +612,7 @@ def open(*args, **kwargs):
612612

613613
# ----------------------------------------------------------------------------------------------------------------------
614614
#
615-
# needed for imports will be patched in the __builtins_patches__ module
615+
# needed for imports will be patched in the pyio_patches module
616616
#
617617
# ----------------------------------------------------------------------------------------------------------------------
618618
import builtins

0 commit comments

Comments
 (0)