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