Skip to content

Commit 379d1f0

Browse files
Better 'check' typemaps for BasicIo
1 parent 120e7f3 commit 379d1f0

4 files changed

Lines changed: 281 additions & 53 deletions

File tree

src/interface/basicio.i

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,25 +146,39 @@ OUTPUT_BUFFER_RW(Exiv2::byte* buf, size_t rcount)
146146
%ignore Exiv2::BasicIo::mmap();
147147

148148
// Convert mmap() result to a Python memoryview
149-
RETURN_VIEW(Exiv2::byte* mmap, $1 ? arg1->size() : 0,
149+
RETURN_VIEW(Exiv2::byte* mmap, $1 ? _global_self->size() : 0,
150150
_global_writeable ? PyBUF_WRITE : PyBUF_READ,)
151151

152-
// Release memoryviews (and save isWriteable) when mmap or data is called
153-
%typemap(check, fragment="memoryview_funcs") bool isWriteable
154-
(bool _global_writeable) {
155-
_global_writeable = $1;
152+
// Save self and isWriteable (and release memoryviews) when mmap or data
153+
// is called
154+
%typemap(check, fragment="memoryview_funcs")
155+
(Exiv2::BasicIo* self, bool isWriteable)
156+
(Exiv2::BasicIo* _global_self, bool _global_writeable) {
157+
_global_self = $1;
158+
_global_writeable = $2;
156159
release_views(self);
157160
}
158161

159-
// Release memoryviews when some other functions are called
160-
%typemap(ret, fragment="memoryview_funcs")
161-
(int close), (int munmap), (long write), (size_t write) %{
162-
release_views(self);
162+
// Most methods of BasicIo release any existing memoryview
163+
%{
164+
#define NO_RELEASE_delete_BasicIo
165+
#define NO_RELEASE_BasicIo_eof
166+
#define NO_RELEASE_BasicIo_error
167+
#define NO_RELEASE_BasicIo_ioType
168+
#define NO_RELEASE_BasicIo_isopen
169+
#define NO_RELEASE_BasicIo_path
170+
#define NO_RELEASE_BasicIo_size
171+
#define NO_RELEASE_BasicIo__view_deleted_cb
163172
%}
173+
%typemap(check, fragment="memoryview_funcs") Exiv2::BasicIo* self {
174+
%#ifndef NO_RELEASE_$symname
175+
release_views(self);
176+
%#endif
177+
}
164178

165179
// Add data() method for easy access
166180
// The callback is used to call munmap when the memoryview is deleted
167-
RETURN_VIEW(Exiv2::byte* data, $1 ? arg1->size() : 0,
181+
RETURN_VIEW(Exiv2::byte* data, $1 ? _global_self->size() : 0,
168182
_global_writeable ? PyBUF_WRITE : PyBUF_READ,)
169183
%feature("docstring") Exiv2::BasicIo::data
170184
"Easy access to the IO data.

0 commit comments

Comments
 (0)