aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristián Maureira-Fredes <cristian.maureira-fredes@qt.io>2024-11-07 09:36:21 +0100
committerCristián Maureira-Fredes <Cristian.Maureira-Fredes@qt.io>2024-11-08 08:33:38 +0100
commitfb13a26a76eba415e743d119d5d2782c607fee2f (patch)
tree1547b255a7e4afa4e328549d0e613e5b25a45b84
parent2b1dbe1b6610027dbf5f521ae9c7b56f3a343160 (diff)
limited api: replace PySequence_Fast_GET_ITEM by PySequence_GetItem
PySequence_Fast_GET_ITEM is defined as: (PyList_Check(o) ? PyList_GET_ITEM(o, i) : PyTuple_GET_ITEM(o, i)) and when using the Limited API we re-define the _GET_ITEM macro to be the _GetItem function, and considering this is our standard use case, the macro could be replaced directly by the function. However, the function returns a new reference, so we need to manually drecrease a reference after the usage, to avoid reference counting issues. Change-Id: If361e80b9e40b033e009ad46b2b9430e5b4c8eaa Pick-to: 6.8 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
-rw-r--r--sources/pyside6/PySide6/QtCore/glue/core_snippets.cpp2
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp2
-rw-r--r--sources/pyside6/PySide6/glue/qtgui.cpp6
-rw-r--r--sources/pyside6/PySide6/templates/core_common.xml20
-rw-r--r--sources/pyside6/PySide6/templates/gui_common.xml26
-rw-r--r--sources/pyside6/PySide6/templates/opengl_common.xml2
-rw-r--r--sources/pyside6/PySide6/templates/widgets_common.xml6
-rw-r--r--sources/pyside6/libpyside/pysidemetafunction.cpp5
-rw-r--r--sources/shiboken6/ApiExtractor/predefined_templates.cpp6
-rw-r--r--sources/shiboken6/libshiboken/basewrapper.cpp12
-rw-r--r--sources/shiboken6/libshiboken/helper.cpp5
-rw-r--r--sources/shiboken6/libshiboken/sbkarrayconverter.cpp6
-rw-r--r--sources/shiboken6/tests/samplebinding/typesystem_sample.xml47
-rw-r--r--sources/shiboken6/tests/smartbinding/typesystem_smart.xml2
14 files changed, 87 insertions, 60 deletions
diff --git a/sources/pyside6/PySide6/QtCore/glue/core_snippets.cpp b/sources/pyside6/PySide6/QtCore/glue/core_snippets.cpp
index f6acf9d60..e4aeb6e37 100644
--- a/sources/pyside6/PySide6/QtCore/glue/core_snippets.cpp
+++ b/sources/pyside6/PySide6/QtCore/glue/core_snippets.cpp
@@ -105,7 +105,7 @@ bool QVariant_isStringList(PyObject *list)
Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList"));
const Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object());
for (Py_ssize_t i = 0; i < size; ++i) {
- PyObject *item = PySequence_Fast_GET_ITEM(fast.object(), i);
+ Shiboken::AutoDecRef item(PySequence_GetItem(fast.object(), i));
if (PyUnicode_Check(item) == 0)
return false;
}
diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp
index 56d813b7e..50f1bfc8e 100644
--- a/sources/pyside6/PySide6/glue/qtcore.cpp
+++ b/sources/pyside6/PySide6/glue/qtcore.cpp
@@ -261,7 +261,7 @@ static QVariant QVariant_convertToVariantList(PyObject *list)
Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList"));
const Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object());
for (Py_ssize_t i = 0; i < size; ++i) {
- PyObject *pyItem = PySequence_Fast_GET_ITEM(fast.object(), i);
+ Shiboken::AutoDecRef pyItem(PySequence_GetItem(fast.object(), i));
QVariant item = %CONVERTTOCPP[QVariant](pyItem);
lst.append(item);
}
diff --git a/sources/pyside6/PySide6/glue/qtgui.cpp b/sources/pyside6/PySide6/glue/qtgui.cpp
index aacac3508..428840898 100644
--- a/sources/pyside6/PySide6/glue/qtgui.cpp
+++ b/sources/pyside6/PySide6/glue/qtgui.cpp
@@ -716,7 +716,7 @@ Shiboken::AutoDecRef seq(PySequence_Fast(%PYARG_1, "Can't turn into sequence"));
if (PySequence_Size(seq) == 16) {
float values[16];
for (Py_ssize_t i = 0; i < 16; ++i) {
- PyObject *pv = PySequence_Fast_GET_ITEM(seq.object(), i);
+ Shiboken::AutoDecRef pv(PySequence_GetItem(seq.object(), i));
values[i] = PyFloat_AsDouble(pv);
}
@@ -741,8 +741,8 @@ for (Py_ssize_t i = 0; i < 16; ++i) {
if (PySequence_Check(_key)) {
Shiboken::AutoDecRef key(PySequence_Fast(_key, "Invalid matrix index."));
if (PySequence_Fast_GET_SIZE(key.object()) == 2) {
- PyObject *posx = PySequence_Fast_GET_ITEM(key.object(), 0);
- PyObject *posy = PySequence_Fast_GET_ITEM(key.object(), 1);
+ Shiboken::AutoDecRef posx(PySequence_GetItem(key.object(), 0));
+ Shiboken::AutoDecRef posy(PySequence_GetItem(key.object(), 1));
Py_ssize_t x = PyLong_AsSsize_t(posx);
Py_ssize_t y = PyLong_AsSsize_t(posy);
float ret = (*%CPPSELF)(x,y);
diff --git a/sources/pyside6/PySide6/templates/core_common.xml b/sources/pyside6/PySide6/templates/core_common.xml
index 07bafc6ff..dd4588f71 100644
--- a/sources/pyside6/PySide6/templates/core_common.xml
+++ b/sources/pyside6/PySide6/templates/core_common.xml
@@ -155,18 +155,22 @@
<template name="fix_native_return_number*,number*,number*,number*">
PyObject* _obj = %PYARG_0.object();
+ Shiboken::AutoDecRef _obj0(PySequence_GetItem(_obj, 0));
+ Shiboken::AutoDecRef _obj1(PySequence_GetItem(_obj, 1));
+ Shiboken::AutoDecRef _obj2(PySequence_GetItem(_obj, 2));
+ Shiboken::AutoDecRef _obj3(PySequence_GetItem(_obj, 3));
if (!PySequence_Check(_obj)
|| PySequence_Fast_GET_SIZE(_obj) != 4
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 0))
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 1))
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 2))
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 3))) {
+ || !PyNumber_Check(_obj0)
+ || !PyNumber_Check(_obj1)
+ || !PyNumber_Check(_obj2)
+ || !PyNumber_Check(_obj3)) {
PyErr_SetString(PyExc_TypeError, "Sequence of 4 numbers expected");
} else {
- *%1 = %CONVERTTOCPP[$TYPE](PySequence_Fast_GET_ITEM(_obj, 0));
- *%2 = %CONVERTTOCPP[$TYPE](PySequence_Fast_GET_ITEM(_obj, 1));
- *%3 = %CONVERTTOCPP[$TYPE](PySequence_Fast_GET_ITEM(_obj, 2));
- *%4 = %CONVERTTOCPP[$TYPE](PySequence_Fast_GET_ITEM(_obj, 3));
+ *%1 = %CONVERTTOCPP[$TYPE](_obj0);
+ *%2 = %CONVERTTOCPP[$TYPE](_obj1);
+ *%3 = %CONVERTTOCPP[$TYPE](_obj2);
+ *%4 = %CONVERTTOCPP[$TYPE](_obj3);
}
</template>
diff --git a/sources/pyside6/PySide6/templates/gui_common.xml b/sources/pyside6/PySide6/templates/gui_common.xml
index 6a7404507..68ca5c2a8 100644
--- a/sources/pyside6/PySide6/templates/gui_common.xml
+++ b/sources/pyside6/PySide6/templates/gui_common.xml
@@ -20,7 +20,9 @@
Shiboken::AutoDecRef strList(PySequence_Fast(%PYARG_1, "Invalid sequence."));
Py_ssize_t lineCount = PySequence_Fast_GET_SIZE(strList.object());
for (Py_ssize_t line = 0; line &lt; lineCount; ++line) {
- if (!Shiboken::String::check(PySequence_Fast_GET_ITEM(strList.object(), line))) {
+ Shiboken::AutoDecRef _obj(PySequence_GetItem(strList.object(), line));
+ bool isString = Shiboken::String::check(_obj);
+ if (!isString) {
PyErr_SetString(PyExc_TypeError, "The argument must be a sequence of strings.");
break;
}
@@ -30,8 +32,10 @@
break;
auto xpm = new const char*[lineCount];
- for (Py_ssize_t line = 0; line &lt; lineCount; ++line)
- xpm[line] = Shiboken::String::toCString(PySequence_Fast_GET_ITEM(strList.object(), line));
+ for (Py_ssize_t line = 0; line &lt; lineCount; ++line) {
+ Shiboken::AutoDecRef _obj(PySequence_GetItem(strList.object(), line));
+ xpm[line] = Shiboken::String::toCString(_obj);
+ }
%0 = new %TYPE(xpm);
@@ -101,19 +105,23 @@
const Py_ssize_t size = PySequence_Fast_GET_SIZE(seq.object());
if (size > 1) {
- if (%ISCONVERTIBLE[QString](PySequence_Fast_GET_ITEM(seq.object(), 1)))
- %1 = %CONVERTTOCPP[QString](PySequence_Fast_GET_ITEM(seq.object(), 1));
+ Shiboken::AutoDecRef _obj1(PySequence_GetItem(seq.object(), 1));
+ if (%ISCONVERTIBLE[QString](_obj1))
+ %1 = %CONVERTTOCPP[QString](_obj1);
else
qWarning("%TYPE::%FUNCTION_NAME: Second tuple element is not convertible to unicode.");
}
if (size > 2) {
- if (%ISCONVERTIBLE[int](PySequence_Fast_GET_ITEM(seq.object(), 2)))
- %2 = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(seq.object(), 2));
+ Shiboken::AutoDecRef _obj2(PySequence_GetItem(seq.object(), 2));
+ if (%ISCONVERTIBLE[int](_obj2))
+ %2 = %CONVERTTOCPP[int](_obj2);
else
qWarning("%TYPE::%FUNCTION_NAME: Second tuple element is not convertible to int.");
}
- %PYARG_0.reset(PySequence_Fast_GET_ITEM(seq.object(), 0));
+ Shiboken::AutoDecRef _sobj(PySequence_GetItem(seq.object(), 0));
+
+ %PYARG_0.reset(_sobj);
Py_INCREF(%PYARG_0); // we need to incref, because "%PYARG_0 = ..." will decref the tuple and the tuple will be decrefed again at the end of this scope.
}
@@ -210,7 +218,7 @@
"Failed to parse sequence on %TYPE constructor."));
float values[%SIZE];
for(int i=0; i &lt; %SIZE; i++) {
- PyObject *pv = PySequence_Fast_GET_ITEM(fast.object(), i);
+ Shiboken::AutoDecRef pv(PySequence_GetItem(fast.object(), i));
values[i] = %CONVERTTOCPP[float](pv);
}
%0 = new %TYPE(values);
diff --git a/sources/pyside6/PySide6/templates/opengl_common.xml b/sources/pyside6/PySide6/templates/opengl_common.xml
index 566ebe6ee..3435ef810 100644
--- a/sources/pyside6/PySide6/templates/opengl_common.xml
+++ b/sources/pyside6/PySide6/templates/opengl_common.xml
@@ -12,7 +12,7 @@
Shiboken::AutoDecRef fast(PySequence_Fast(%PYARG_2,
"Failed to parse sequence with type %VECTOR_TYPE."));
for(Py_ssize_t i=0; i &lt; _size; i++) {
- PyObject* pv = PySequence_Fast_GET_ITEM(fast.object(), i);
+ Shiboken::AutoDecRef pv(PySequence_GetItem(fast.object(), i));
_list[i] = %CONVERTTOCPP[$ATTR_TYPE](pv);
}
}
diff --git a/sources/pyside6/PySide6/templates/widgets_common.xml b/sources/pyside6/PySide6/templates/widgets_common.xml
index b0dee43cd..fe2f35e7a 100644
--- a/sources/pyside6/PySide6/templates/widgets_common.xml
+++ b/sources/pyside6/PySide6/templates/widgets_common.xml
@@ -19,7 +19,8 @@
const Py_ssize_t numItems = PySequence_Size(%PYARG_1);
Shiboken::AutoArrayPointer&lt;QGraphicsItem*&gt; %out(numItems);
for (Py_ssize_t i = 0; i &lt; numItems; ++i) {
- %out[i] = %CONVERTTOCPP[QGraphicsItem*](PySequence_Fast_GET_ITEM(%PYARG_1, i));
+ Shiboken::AutoDecRef _arg1(PySequence_GetItem(%PYARG_1, i));
+ %out[i] = %CONVERTTOCPP[QGraphicsItem*](_arg1);
}
</template>
@@ -44,7 +45,8 @@
const Py_ssize_t numOptions = PySequence_Size(%PYARG_2);
Shiboken::AutoArrayPointer&lt;QStyleOptionGraphicsItem&gt; %out(numOptions);
for (Py_ssize_t i=0; i &lt; numOptions; ++i) {
- %out[i] = %CONVERTTOCPP[QStyleOptionGraphicsItem](PySequence_Fast_GET_ITEM(%PYARG_1, i));
+ Shiboken::AutoDecRef _arg1(PySequence_GetItem(%PYARG_1, i));
+ %out[i] = %CONVERTTOCPP[QStyleOptionGraphicsItem](_arg1);
}
</template>
diff --git a/sources/pyside6/libpyside/pysidemetafunction.cpp b/sources/pyside6/libpyside/pysidemetafunction.cpp
index 10ba894a7..342ffc04d 100644
--- a/sources/pyside6/libpyside/pysidemetafunction.cpp
+++ b/sources/pyside6/libpyside/pysidemetafunction.cpp
@@ -156,12 +156,13 @@ bool call(QObject *self, int methodIndex, PyObject *args, PyObject **retVal)
methArgs[i] = methValues[i].data();
if (i == 0) // Don't do this for return type
continue;
+ Shiboken::AutoDecRef obj(PySequence_GetItem(sequence.object(), i - 1));
if (metaType.id() == QMetaType::QString) {
QString tmp;
- converter.toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i - 1), &tmp);
+ converter.toCpp(obj, &tmp);
methValues[i] = tmp;
} else {
- converter.toCpp(PySequence_Fast_GET_ITEM(sequence.object(), i - 1), methArgs[i]);
+ converter.toCpp(obj, methArgs[i]);
}
} else {
PyErr_Format(PyExc_TypeError, "Unknown type used to call meta function (that may be a signal): %s", argTypes[i].constData());
diff --git a/sources/shiboken6/ApiExtractor/predefined_templates.cpp b/sources/shiboken6/ApiExtractor/predefined_templates.cpp
index 3d7e8f94f..6f38ee7f6 100644
--- a/sources/shiboken6/ApiExtractor/predefined_templates.cpp
+++ b/sources/shiboken6/ApiExtractor/predefined_templates.cpp
@@ -176,8 +176,10 @@ const PredefinedTemplates &predefinedTemplates()
// QPair/std::pair
{u"shiboken_conversion_pysequence_to_cpppair"_s,
- uR"(%out.first = %CONVERTTOCPP[%OUTTYPE_0](PySequence_Fast_GET_ITEM(%in, 0));
-%out.second = %CONVERTTOCPP[%OUTTYPE_1](PySequence_Fast_GET_ITEM(%in, 1));
+ uR"(Shiboken::AutoDecRef objfirst(PySequence_GetItem(%in, 0));
+Shiboken::AutoDecRef objsecond(PySequence_GetItem(%in, 1));
+%out.first = %CONVERTTOCPP[%OUTTYPE_0](objfirst);
+%out.second = %CONVERTTOCPP[%OUTTYPE_1](objsecond);
)"_s},
{u"shiboken_conversion_cpppair_to_pytuple"_s,
diff --git a/sources/shiboken6/libshiboken/basewrapper.cpp b/sources/shiboken6/libshiboken/basewrapper.cpp
index 04bbfd6f9..5256f73a8 100644
--- a/sources/shiboken6/libshiboken/basewrapper.cpp
+++ b/sources/shiboken6/libshiboken/basewrapper.cpp
@@ -894,9 +894,9 @@ std::vector<SbkObject *> splitPyObject(PyObject *pyObj)
AutoDecRef lst(PySequence_Fast(pyObj, "Invalid keep reference object."));
if (!lst.isNull()) {
for (Py_ssize_t i = 0, i_max = PySequence_Fast_GET_SIZE(lst.object()); i < i_max; ++i) {
- PyObject *item = PySequence_Fast_GET_ITEM(lst.object(), i);
+ Shiboken::AutoDecRef item(PySequence_GetItem(lst.object(), i));
if (Object::checkType(item))
- result.push_back(reinterpret_cast<SbkObject *>(item));
+ result.push_back(reinterpret_cast<SbkObject *>(item.object()));
}
}
} else {
@@ -1004,7 +1004,7 @@ introduceWrapperType(PyObject *enclosingObject,
unsigned wrapperFlags)
{
assert(PySequence_Fast_GET_SIZE(bases) > 0);
- typeSpec->slots[0].pfunc = PySequence_Fast_GET_ITEM(bases, 0);
+ typeSpec->slots[0].pfunc = PySequence_GetItem(bases, 0);
auto *type = SbkType_FromSpecBasesMeta(typeSpec, bases, SbkObjectType_TypeF());
@@ -1665,8 +1665,10 @@ void setParent(PyObject *parent, PyObject *child)
*/
if (PySequence_Check(child) && !Object::checkType(child)) {
Shiboken::AutoDecRef seq(PySequence_Fast(child, nullptr));
- for (Py_ssize_t i = 0, max = PySequence_Size(seq); i < max; ++i)
- setParent(parent, PySequence_Fast_GET_ITEM(seq.object(), i));
+ for (Py_ssize_t i = 0, max = PySequence_Size(seq); i < max; ++i) {
+ Shiboken::AutoDecRef obj(PySequence_GetItem(seq.object(), i));
+ setParent(parent, obj);
+ }
return;
}
diff --git a/sources/shiboken6/libshiboken/helper.cpp b/sources/shiboken6/libshiboken/helper.cpp
index 46af68956..f50136aff 100644
--- a/sources/shiboken6/libshiboken/helper.cpp
+++ b/sources/shiboken6/libshiboken/helper.cpp
@@ -148,10 +148,9 @@ static void formatPySequence(PyObject *obj, std::ostream &str)
if (i)
str << ", ";
str << '(';
- PyObject *item = PySequence_GetItem(obj, i);
+ Shiboken::AutoDecRef item(PySequence_GetItem(obj, i));
formatPyObject(item, str);
str << ')';
- Py_XDECREF(item);
}
if (printSize < size)
str << ",...";
@@ -529,7 +528,7 @@ int *sequenceToIntArray(PyObject *obj, bool zeroTerminated)
int *array = new int[size + (zeroTerminated ? 1 : 0)];
for (int i = 0; i < size; i++) {
- PyObject *item = PySequence_Fast_GET_ITEM(seq.object(), i);
+ Shiboken::AutoDecRef item(PySequence_GetItem(seq.object(), i));
if (!PyLong_Check(item)) {
PyErr_SetString(PyExc_TypeError, "Sequence of ints expected");
delete[] array;
diff --git a/sources/shiboken6/libshiboken/sbkarrayconverter.cpp b/sources/shiboken6/libshiboken/sbkarrayconverter.cpp
index bcc3fb767..be7c6296e 100644
--- a/sources/shiboken6/libshiboken/sbkarrayconverter.cpp
+++ b/sources/shiboken6/libshiboken/sbkarrayconverter.cpp
@@ -22,9 +22,8 @@ static bool sequenceAllOf(PyObject *pyIn, Predicate p)
{
const Py_ssize_t size = PySequence_Size(pyIn);
for (Py_ssize_t i = 0; i < size; ++i) {
- PyObject *item = PySequence_GetItem(pyIn, i);
+ AutoDecRef item(PySequence_GetItem(pyIn, i));
const bool ok = p(item);
- Py_XDECREF(item);
if (!ok)
return false;
}
@@ -37,9 +36,8 @@ inline void convertPySequence(PyObject *pyIn, Converter c, T *out)
{
const Py_ssize_t size = PySequence_Size(pyIn);
for (Py_ssize_t i = 0; i < size; ++i) {
- PyObject *item = PySequence_GetItem(pyIn, i);
+ AutoDecRef item(PySequence_GetItem(pyIn, i));
*out++ = c(item);
- Py_XDECREF(item);
}
}
diff --git a/sources/shiboken6/tests/samplebinding/typesystem_sample.xml b/sources/shiboken6/tests/samplebinding/typesystem_sample.xml
index ca646a846..92a886b1e 100644
--- a/sources/shiboken6/tests/samplebinding/typesystem_sample.xml
+++ b/sources/shiboken6/tests/samplebinding/typesystem_sample.xml
@@ -226,8 +226,8 @@
<add-conversion type="PySequence">
%OUTTYPE&amp; list = %out;
Shiboken::AutoDecRef seq(PySequence_Fast(%in, 0));
- for (int i = 0; i &lt; PySequence_Fast_GET_SIZE(seq.object()); i++) {
- PyObject* pyItem = PySequence_Fast_GET_ITEM(seq.object(), i);
+ for (int i = 0; i &lt; PySequence_Size(seq.object()); i++) {
+ Shiboken::AutoDecRef pyItem(PySequence_GetItem(seq.object(), i));
PStr cppItem = %CONVERTTOCPP[PStr](pyItem);
list.push_back(cppItem);
}
@@ -1129,8 +1129,10 @@
<replace-type modified-type="PySequence" />
<conversion-rule class="native">
Shiboken::AutoArrayPointer&lt;Point&gt; %out(%1);
- for (Py_ssize_t i = 0; i &lt; %1; ++i)
- %out[i] = %CONVERTTOCPP[Point](PySequence_Fast_GET_ITEM(%PYARG_1, i));
+ for (Py_ssize_t i = 0; i &lt; %1; ++i) {
+ Shiboken::AutoDecRef _obj(PySequence_GetItem(%PYARG_1, i));
+ %out[i] = %CONVERTTOCPP[Point](_obj);
+ }
</conversion-rule>
</modify-argument>
</modify-function>
@@ -1385,18 +1387,22 @@
</template>
<template name="fix_native_return_int*,int*,int*,int*">
PyObject* _obj = %PYARG_0;
+ Shiboken::AutoDecRef _obj0(PySequence_GetItem(_obj, 0));
+ Shiboken::AutoDecRef _obj1(PySequence_GetItem(_obj, 1));
+ Shiboken::AutoDecRef _obj2(PySequence_GetItem(_obj, 2));
+ Shiboken::AutoDecRef _obj3(PySequence_GetItem(_obj, 3));
if (!PySequence_Check(_obj)
|| PySequence_Fast_GET_SIZE(_obj) != 4
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 0))
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 1))
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 2))
- || !PyNumber_Check(PySequence_Fast_GET_ITEM(_obj, 3))) {
+ || !PyNumber_Check(_obj0)
+ || !PyNumber_Check(_obj1)
+ || !PyNumber_Check(_obj2)
+ || !PyNumber_Check(_obj3)) {
PyErr_SetString(PyExc_TypeError, "Sequence of 4 numbers expected");
} else {
- *%1 = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(_obj, 0));
- *%2 = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(_obj, 1));
- *%3 = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(_obj, 2));
- *%4 = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(_obj, 3));
+ *%1 = %CONVERTTOCPP[int](_obj0);
+ *%2 = %CONVERTTOCPP[int](_obj1);
+ *%3 = %CONVERTTOCPP[int](_obj2);
+ *%4 = %CONVERTTOCPP[int](_obj3);
}
</template>
<modify-function signature="getMargins(int*,int*,int*,int*)const">
@@ -1586,9 +1592,10 @@
const auto numItems = PySequence_Size(%PYARG_1);
Shiboken::AutoArrayPointer&lt;int&gt; %out(numItems);
for (Py_ssize_t i = 0; i &lt; numItems; ++i) {
- if (%CHECKTYPE[int](PySequence_Fast_GET_ITEM(%PYARG_1, i)))
- %out[i] = %CONVERTTOCPP[int](PySequence_Fast_GET_ITEM(%PYARG_1, i));
- else if (%ISCONVERTIBLE[int](PySequence_Fast_GET_ITEM(%PYARG_1, i)))
+ Shiboken::AutoDecRef _obj(PySequence_GetItem(%PYARG_1, i));
+ if (%CHECKTYPE[int](_obj))
+ %out[i] = %CONVERTTOCPP[int](_obj);
+ else if (%ISCONVERTIBLE[int](_obj))
%out[i] = -1;
else
%out[i] = -2;
@@ -1612,8 +1619,10 @@
<inject-code class="target" position="beginning">
int numItems = PySequence_Size(%PYARG_1);
int *cppItems = new int[numItems];
- for (int i = 0; i &lt; numItems; i++)
- cppItems[i] = %CONVERTTOCPP[int](PySequence_GetItem(%PYARG_1, i));
+ for (int i = 0; i &lt; numItems; i++) {
+ Shiboken::AutoDecRef _obj(PySequence_GetItem(%PYARG_1, i));
+ cppItems[i] = %CONVERTTOCPP[int](_obj);
+ }
%RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(numItems, cppItems);
%PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0);
delete[] cppItems;
@@ -1953,7 +1962,9 @@
Shiboken::AutoDecRef strList(PySequence_Fast(%PYARG_1, "The argument must be a sequence."));
int lineCount = PySequence_Fast_GET_SIZE(strList.object());
for (int line = 0; line &lt; lineCount; ++line) {
- if (!Shiboken::String::check(PySequence_Fast_GET_ITEM(strList.object(), line))) {
+ Shiboken::AutoDecRef _obj(PySequence_GetItem(strList.object(), line));
+ bool isString = Shiboken::String::check(_obj);
+ if (!isString) {
PyErr_SetString(PyExc_TypeError, "The argument must be a sequence of strings.");
break;
}
diff --git a/sources/shiboken6/tests/smartbinding/typesystem_smart.xml b/sources/shiboken6/tests/smartbinding/typesystem_smart.xml
index e479e4ddf..fd44f4f6d 100644
--- a/sources/shiboken6/tests/smartbinding/typesystem_smart.xml
+++ b/sources/shiboken6/tests/smartbinding/typesystem_smart.xml
@@ -12,7 +12,7 @@
<template name="pyseq_to_cpplist_convertion">
Shiboken::AutoDecRef seq(PySequence_Fast(%in, 0));
for (int i = 0, size = PySequence_Fast_GET_SIZE(seq.object()); i &lt; size; ++i) {
- PyObject* pyItem = PySequence_Fast_GET_ITEM(seq.object(), i);
+ Shiboken::AutoDecRef pyItem(PySequence_GetItem(seq.object(), i));
%OUTTYPE_0 cppItem = %CONVERTTOCPP[%OUTTYPE_0](pyItem);
%out.push_back(cppItem);
}