diff options
Diffstat (limited to 'tests/samplebinding/typesystem_sample.xml')
-rw-r--r-- | tests/samplebinding/typesystem_sample.xml | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml index 5184526e4..9624ba27a 100644 --- a/tests/samplebinding/typesystem_sample.xml +++ b/tests/samplebinding/typesystem_sample.xml @@ -664,6 +664,23 @@ <!-- change the name of this virtual method --> <modify-function signature="className()" rename="name"/> + + <modify-function signature="sumPointArray(int, const Point*)"> + <modify-argument index="1"> + <remove-argument/> + <conversion-rule class="native"> + int %out = PySequence_Size(%PYARG_1); + </conversion-rule> + </modify-argument> + <modify-argument index="2"> + <replace-type modified-type="PySequence" /> + <conversion-rule class="native"> + Shiboken::AutoArrayPointer<Point> %out(%1); + for (int i = 0; i < %1; ++i) + %out[i] = %CONVERTTOCPP[Point](PySequence_Fast_GET_ITEM(%PYARG_1, i)); + </conversion-rule> + </modify-argument> + </modify-function> </object-type> <object-type name="AbstractModifications"> @@ -936,22 +953,8 @@ %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](retval); } </inject-code> - </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/> @@ -959,24 +962,20 @@ int %out = PySequence_Size(%PYARG_1); </conversion-rule> </modify-argument> - <modify-argument index="2"> - <replace-type modified-type="PySequence"/> - - <conversion-rule class="native"> + <replace-type modified-type="PySequence"/> + <conversion-rule class="native"> int numItems = PySequence_Size(%PYARG_1); - 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++) + Shiboken::AutoArrayPointer<int> %out(numItems); + for (int i = 0; i < numItems; ++i) + %out[i] = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(%PYARG_1, i)); + </conversion-rule> + <conversion-rule class="target"> + PyObject* %out = PyList_New(count); + for (int i = 0; i < count; ++i) PyList_SET_ITEM(%out, i, %CONVERTTOPYTHON[int](%in[i])); - </conversion-rule> - </modify-argument> - + </conversion-rule> + </modify-argument> </modify-function> <modify-function signature="callArrayMethod(int, int*) const"> @@ -1356,10 +1355,10 @@ <add-function signature="strBufferOverloads(Str&,int)" return-type="Overload::FunctionEnum"> <inject-code class="target" position="beginning"> <insert-template name="buffer_argument"> - <replace from="%out" to="%1_out" /> + <replace from="%out" to="argOut" /> </insert-template> PyThreadState* _save = PyEval_SaveThread(); - %RETURN_TYPE cppResult = %CPPSELF.%FUNCTION_NAME(%1_out, %2); + %RETURN_TYPE cppResult = %CPPSELF.%FUNCTION_NAME(argOut, %2); PyEval_RestoreThread(_save); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](cppResult); </inject-code> |