Skip to content

Commit 0f2f0aa

Browse files
Moved stuff to keep reference to input buffer
The typedefs and macros belong with the INPUT_BUFFER_RO macro, so it makes sense to define them together.
1 parent ee6b93d commit 0f2f0aa

4 files changed

Lines changed: 53 additions & 40 deletions

File tree

src/interface/image.i

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,13 @@ UNIQUE_PTR(Exiv2::Image);
5656
%thread Exiv2::ImageFactory::open;
5757

5858
// ImageFactory can open image or get type from a buffer
59-
INPUT_BUFFER_RO(const Exiv2::byte* data, long size)
60-
INPUT_BUFFER_RO(const Exiv2::byte* data, size_t size)
61-
// Keep reference to memoryview of buffer until it can be released
62-
%{
63-
#define KEEPREF_VIEW_ImageFactory_open
64-
#define KEEPREF_VIEW_ImageFactory_createIo
65-
%}
66-
%typemap(argout, fragment="private_data")
67-
(const Exiv2::byte* data, long size),
68-
(const Exiv2::byte* data, size_t size) %{
69-
#ifdef KEEPREF_VIEW_$symname
70-
private_store_set(resultobj, "using_view", _global_view);
71-
#endif
72-
%}
59+
INPUT_BUFFER_RO(const Exiv2::byte* data, long size,
60+
ImageFactory_open, ImageFactory_createIo)
61+
INPUT_BUFFER_RO(const Exiv2::byte* data, size_t size,
62+
ImageFactory_open, ImageFactory_createIo)
7363

7464
// Release memory buffer after writeMetadata, as it creates its own copy
75-
%typemap(ret, fragment="private_data") void writeMetadata %{
76-
private_store_del(self, "using_view");
77-
%}
65+
RELEASE_BUFFER(void writeMetadata)
7866

7967
// Convert path encoding on Windows
8068
WINDOWS_PATH(const std::string& path)

src/interface/shared/buffers.i

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,18 @@
1616
// along with this program. If not, see <http://www.gnu.org/licenses/>.
1717

1818

19+
// Recursive macro to output #define statements for list of functions
20+
%define _HOLD_BUFFER(hold_func, remainder...)
21+
%{#define KEEPREF_VIEW_##hold_func%}
22+
#if #remainder != ""
23+
_HOLD_BUFFER(remainder)
24+
#endif
25+
%enddef
26+
1927
// Macro for input read only byte buffer
20-
%define INPUT_BUFFER_RO(buf_type, len_type)
28+
// hold_funcs is a list of functions that don't read the input data
29+
// immediately, so keep a reference to the Python object
30+
%define INPUT_BUFFER_RO(buf_type, len_type, hold_funcs...)
2131
%typemap(doctype) buf_type ":py:term:`bytes-like object`";
2232
%typemap(in) (buf_type, len_type) (PyObject* _global_view = NULL) {
2333
_global_view = PyMemoryView_GetContiguous($input, PyBUF_READ, 'A');
@@ -36,8 +46,23 @@
3646
%typemap(typecheck, precedence=SWIG_TYPECHECK_CHAR_PTR) buf_type %{
3747
$1 = PyObject_CheckBuffer($input) ? 1 : 0;
3848
%}
49+
50+
#if #hold_funcs != ""
51+
_HOLD_BUFFER(hold_funcs)
52+
%typemap(argout, fragment="private_data") (buf_type, len_type) {
53+
%#ifdef KEEPREF_VIEW_$symname
54+
private_store_set(resultobj, "using_view", _global_view);
55+
%#endif
56+
}
57+
#endif
3958
%enddef // INPUT_BUFFER_RO
4059

60+
// Macro for functions to release the held reference
61+
%define RELEASE_BUFFER(signature)
62+
%typemap(ret, fragment="private_data") signature %{
63+
private_store_del(self, "using_view");
64+
%}
65+
%enddef
4166

4267
// Macro for output writeable byte buffer
4368
%define OUTPUT_BUFFER_RW(buf_type, count_type)

src/swig-0_27_7/image_wrap.cxx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4379,10 +4379,10 @@ static void _set_python_exception() {
43794379
#define EXV_ENABLE_FILESYSTEM
43804380
#endif
43814381

4382-
43834382
#define KEEPREF_VIEW_ImageFactory_open
43844383
#define KEEPREF_VIEW_ImageFactory_createIo
4385-
4384+
#define KEEPREF_VIEW_ImageFactory_open
4385+
#define KEEPREF_VIEW_ImageFactory_createIo
43864386

43874387
static bool enableBMFF(bool enable) {
43884388
// deprecated since 2024-08-01
@@ -6539,11 +6539,11 @@ SWIGINTERN PyObject *_wrap_ImageFactory_open__SWIG_1(PyObject *self, Py_ssize_t
65396539

65406540
resultobj = SWIG_NewPointerObj((&result)->release(), SWIGTYPE_p_Exiv2__Image, SWIG_POINTER_OWN | 0 );
65416541

6542-
6542+
{
65436543
#ifdef KEEPREF_VIEW_ImageFactory_open
6544-
private_store_set(resultobj, "using_view", _global_view);
6544+
private_store_set(resultobj, "using_view", _global_view);
65456545
#endif
6546-
6546+
}
65476547

65486548
Py_XDECREF(_global_view);
65496549

@@ -6810,11 +6810,11 @@ SWIGINTERN PyObject *_wrap_ImageFactory_getType__SWIG_1(PyObject *self, Py_ssize
68106810
if (!resultobj)
68116811
SWIG_fail;
68126812
}
6813-
6813+
{
68146814
#ifdef KEEPREF_VIEW_ImageFactory_getType
6815-
private_store_set(resultobj, "using_view", _global_view);
6815+
private_store_set(resultobj, "using_view", _global_view);
68166816
#endif
6817-
6817+
}
68186818

68196819
Py_XDECREF(_global_view);
68206820

@@ -7051,11 +7051,11 @@ SWIGINTERN PyObject *_wrap_ImageFactory_createIo__SWIG_1(PyObject *self, Py_ssiz
70517051

70527052
resultobj = SWIG_NewPointerObj((&result)->release(), SWIGTYPE_p_Exiv2__BasicIo, SWIG_POINTER_OWN | 0 );
70537053

7054-
7054+
{
70557055
#ifdef KEEPREF_VIEW_ImageFactory_createIo
7056-
private_store_set(resultobj, "using_view", _global_view);
7056+
private_store_set(resultobj, "using_view", _global_view);
70577057
#endif
7058-
7058+
}
70597059

70607060
Py_XDECREF(_global_view);
70617061

src/swig-0_28_5/image_wrap.cxx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4377,10 +4377,10 @@ static void _set_python_exception() {
43774377
#define EXV_ENABLE_FILESYSTEM
43784378
#endif
43794379

4380-
43814380
#define KEEPREF_VIEW_ImageFactory_open
43824381
#define KEEPREF_VIEW_ImageFactory_createIo
4383-
4382+
#define KEEPREF_VIEW_ImageFactory_open
4383+
#define KEEPREF_VIEW_ImageFactory_createIo
43844384

43854385
static bool enableBMFF(bool enable) {
43864386
// deprecated since 2024-08-01
@@ -6537,11 +6537,11 @@ SWIGINTERN PyObject *_wrap_ImageFactory_open__SWIG_1(PyObject *self, Py_ssize_t
65376537

65386538
resultobj = SWIG_NewPointerObj((&result)->release(), SWIGTYPE_p_Exiv2__Image, SWIG_POINTER_OWN | 0 );
65396539

6540-
6540+
{
65416541
#ifdef KEEPREF_VIEW_ImageFactory_open
6542-
private_store_set(resultobj, "using_view", _global_view);
6542+
private_store_set(resultobj, "using_view", _global_view);
65436543
#endif
6544-
6544+
}
65456545

65466546
Py_XDECREF(_global_view);
65476547

@@ -6812,11 +6812,11 @@ SWIGINTERN PyObject *_wrap_ImageFactory_getType__SWIG_1(PyObject *self, Py_ssize
68126812
if (!resultobj)
68136813
SWIG_fail;
68146814
}
6815-
6815+
{
68166816
#ifdef KEEPREF_VIEW_ImageFactory_getType
6817-
private_store_set(resultobj, "using_view", _global_view);
6817+
private_store_set(resultobj, "using_view", _global_view);
68186818
#endif
6819-
6819+
}
68206820

68216821
Py_XDECREF(_global_view);
68226822

@@ -7053,11 +7053,11 @@ SWIGINTERN PyObject *_wrap_ImageFactory_createIo__SWIG_1(PyObject *self, Py_ssiz
70537053

70547054
resultobj = SWIG_NewPointerObj((&result)->release(), SWIGTYPE_p_Exiv2__BasicIo, SWIG_POINTER_OWN | 0 );
70557055

7056-
7056+
{
70577057
#ifdef KEEPREF_VIEW_ImageFactory_createIo
7058-
private_store_set(resultobj, "using_view", _global_view);
7058+
private_store_set(resultobj, "using_view", _global_view);
70597059
#endif
7060-
7060+
}
70617061

70627062
Py_XDECREF(_global_view);
70637063

0 commit comments

Comments
 (0)