diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/samplebinding/typesystem_sample.xml | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml index f23320ccf..ec5f150dc 100644 --- a/tests/samplebinding/typesystem_sample.xml +++ b/tests/samplebinding/typesystem_sample.xml @@ -744,6 +744,19 @@ </modify-function> + <inject-code class="native" position="beginning"> + // simple class to avoid mem leak inside conversion rule used in arrayMethod + template<typename T> + struct ArrayDeleter { + ArrayDeleter(T* ptr) : m_ptr(ptr) {} + ~ArrayDeleter() { delete[] m_ptr; } + operator T*() { return m_ptr; } + private: + T* m_ptr; + ArrayDeleter(const ArrayDeleter&); + ArrayDeleter& operator=(ArrayDeleter&); + }; + </inject-code> <modify-function signature="arrayMethod(int, int*) const"> <modify-argument index="1"> <remove-argument/> @@ -757,17 +770,15 @@ <conversion-rule class="native"> int numItems = PySequence_Size(%PYARG_1); - int *%out = new int[numItems]; //memory leak - for (int i=0; i < numItems; i++) { + ArrayDeleter<int> %out(new int[numItems]); + for (int i=0; i < numItems; i++) %out[i] = %CONVERTTOCPP[int](PySequence_GetItem(%PYARG_1, i)); - } </conversion-rule> <conversion-rule class="target"> PyObject *%out = PyList_New(count); - for (int i=0; i < count; i++) { + for (int i=0; i < count; i++) PyList_SET_ITEM(%out, i, %CONVERTTOPYTHON[int](%in[i])); - } </conversion-rule> </modify-argument> |