39
39
*/
40
40
// ----------------------------------------------------------------------------------
41
41
42
-
43
42
#include < PythonQt.h>
43
+
44
+ #ifndef Py_XSETREF // Some Python2, but not the latest one
45
+ #define Py_XSETREF (op1, op2 ) \
46
+ do { \
47
+ auto **op = &(op1); \
48
+ PyObject *tmp = static_cast <PyObject *>(*op); \
49
+ *op = (op2); \
50
+ Py_XDECREF (tmp); \
51
+ } while (0 )
52
+ #endif
44
53
45
54
QVariant PythonQtObjectPtr::evalScript (const QString& script, int start)
46
55
{
@@ -90,8 +99,8 @@ QVariant PythonQtObjectPtr::call(const QVariantList& args, const QVariantMap& kw
90
99
91
100
PythonQtObjectPtr::PythonQtObjectPtr (PyObject* o)
92
101
{
102
+ Py_XINCREF (o);
93
103
_object = o;
94
- if (o) Py_INCREF (_object);
95
104
}
96
105
97
106
PythonQtObjectPtr::PythonQtObjectPtr (PythonQtSafeObjectPtr &&p) :_object(p.takeObject())
@@ -100,14 +109,13 @@ PythonQtObjectPtr::PythonQtObjectPtr(PythonQtSafeObjectPtr &&p) :_object(p.takeO
100
109
101
110
PythonQtObjectPtr::~PythonQtObjectPtr ()
102
111
{
103
- if (_object && Py_IsInitialized ()) Py_DECREF (_object);
112
+ if (_object && Py_IsInitialized ()) Py_XDECREF (_object);
104
113
}
105
114
106
115
void PythonQtObjectPtr::setNewRef (PyObject* o)
107
116
{
108
117
if (o != _object) {
109
- if (_object) Py_DECREF (_object);
110
- _object = o;
118
+ Py_XSETREF (_object, o);
111
119
}
112
120
}
113
121
@@ -137,19 +145,15 @@ QVariant PythonQtObjectPtr::toVariant()
137
145
138
146
PythonQtObjectPtr & PythonQtObjectPtr::operator =(PythonQtSafeObjectPtr &&p)
139
147
{
140
- if (_object) {
141
- setObject (nullptr );
142
- }
143
- _object = p.takeObject ();
148
+ Py_XSETREF (_object, p.takeObject ());
144
149
return *this ;
145
150
}
146
151
147
152
void PythonQtObjectPtr::setObject (PyObject* o)
148
153
{
149
154
if (o != _object) {
150
- if (_object) Py_DECREF (_object);
151
- _object = o;
152
- if (_object) Py_INCREF (_object);
155
+ Py_XINCREF (o);
156
+ Py_XSETREF (_object, o);
153
157
}
154
158
}
155
159
@@ -160,7 +164,7 @@ PythonQtSafeObjectPtr::PythonQtSafeObjectPtr(PyObject* o)
160
164
_object = o;
161
165
if (o) {
162
166
PYTHONQT_GIL_SCOPE
163
- Py_INCREF (_object );
167
+ Py_INCREF (o );
164
168
}
165
169
}
166
170
@@ -176,18 +180,16 @@ void PythonQtSafeObjectPtr::setObject(PyObject* o)
176
180
{
177
181
if (o != _object) {
178
182
PYTHONQT_GIL_SCOPE
179
- if (_object) Py_DECREF (_object);
180
- _object = o;
181
- if (_object) Py_INCREF (_object);
183
+ Py_XINCREF (o);
184
+ Py_XSETREF (_object, o);
182
185
}
183
186
}
184
187
185
188
void PythonQtSafeObjectPtr::setObjectUnsafe (PyObject* o)
186
189
{
187
190
if (o != _object) {
188
- if (_object) Py_DECREF (_object);
189
- _object = o;
190
- if (_object) Py_INCREF (_object);
191
+ Py_XINCREF (o);
192
+ Py_XSETREF (_object, o);
191
193
}
192
194
}
193
195
0 commit comments