@@ -4524,38 +4524,43 @@ static int private_store_del(PyObject* py_self, const char* name) {
45244524 PyObject* dict = _get_store (py_self, false );
45254525 if (!dict)
45264526 return 0 ;
4527- if (PyDict_DelItemString (dict, name))
4528- PyErr_Clear ();
4529- return 0 ;
4527+ if (!PyDict_GetItemString (dict, name))
4528+ return 0 ;
4529+ int result = PyDict_DelItemString (dict, name);
4530+ Py_DECREF (dict);
4531+ return result;
45304532};
45314533
45324534
4535+ static PyObject* view_manager = NULL ;
4536+
4537+
45334538static int store_view (PyObject* py_self, PyObject* view,
45344539 PyObject* callback=NULL ) {
4535- PyObject* views = private_store_get (py_self, " views" );
4536- if (!views) {
4537- views = PyList_New (0 );
4538- private_store_set (py_self, " views" , views);
4539- Py_DECREF (views);
4540- }
4541- PyObject* ref = PyWeakref_NewRef (view, callback);
4542- if (!ref)
4540+ PyObject* view_ref = PyWeakref_NewRef (view, callback);
4541+ if (!view_ref)
45434542 return -1 ;
4544- int result = PyList_Append (views, ref);
4545- Py_DECREF (ref);
4546- return result;
4543+ PyObject* marker = private_store_get (py_self, " marker" );
4544+ if (!marker) {
4545+ // Marker is any weakrefable object.
4546+ marker = PySet_New (NULL );
4547+ if (!marker)
4548+ return -1 ;
4549+ int error = private_store_set (py_self, " marker" , marker);
4550+ Py_DECREF (marker);
4551+ if (error)
4552+ return -1 ;
4553+ }
4554+ PyObject* OK = PyObject_CallMethod (
4555+ view_manager, " store_view" , " (OO)" , marker, view_ref);
4556+ Py_DECREF (view_ref);
4557+ if (!OK )
4558+ return -1 ;
4559+ Py_DECREF (OK );
4560+ return 0 ;
45474561};
45484562static int release_views (PyObject* py_self) {
4549- PyObject* views = private_store_get (py_self, " views" );
4550- if (!views)
4551- return 0 ;
4552- PyObject* view = NULL ;
4553- for (Py_ssize_t idx = PyList_Size (views); idx > 0 ; idx--) {
4554- view = PyWeakref_GetObject (PyList_GetItem (views, idx - 1 ));
4555- if (PyMemoryView_Check (view))
4556- Py_XDECREF (PyObject_CallMethod (view, " release" , NULL ));
4557- }
4558- private_store_del (py_self, " views" );
4563+ private_store_del (py_self, " marker" );
45594564 return 0 ;
45604565};
45614566
@@ -6997,6 +7002,20 @@ SWIG_init(void) {
69977002 }
69987003 }
69997004
7005+
7006+ {
7007+ PyObject* mod = PyImport_ImportModule (" exiv2.utilities" );
7008+ if (!mod)
7009+ return INIT_ERROR_RETURN ;
7010+ view_manager = PyObject_GetAttrString (mod, " view_manager" );
7011+ if (!view_manager) {
7012+ PyErr_SetString (
7013+ PyExc_RuntimeError,
7014+ " Import error: exiv2.utilities.view_manager not found." );
7015+ return INIT_ERROR_RETURN ;
7016+ }
7017+ }
7018+
70007019 SWIG_Python_SetConstant (d, d == md ? public_interface : NULL , " Position" ,_create_enum_Exiv2_BasicIo_Position (
70017020 " Position" , " Seek starting positions." , _get_enum_list (0 , " beg" ,Exiv2::BasicIo::beg," cur" ,Exiv2::BasicIo::cur," end" ,Exiv2::BasicIo::end, NULL )));
70027021 builtin_base_count = 0 ;
0 commit comments