@@ -68,6 +68,15 @@ void PythonQt_init_QtGuiBuiltin(PyObject*);
68
68
void PythonQt_init_QtCoreBuiltin (PyObject*);
69
69
70
70
71
+ static inline int PyModule_AddObject_DECREF (PyObject *module, const char *name, PyObject *value)
72
+ {
73
+ int ret = PyModule_AddObject (module, name, value);
74
+ if (ret < 0 )
75
+ Py_XDECREF (value);
76
+ return ret;
77
+ }
78
+
79
+
71
80
void PythonQt::init (int flags, const QByteArray& pythonQtModuleName)
72
81
{
73
82
if (!_self) {
@@ -244,9 +253,9 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
244
253
for (unsigned int i = 0 ;i<16 ; i++) {
245
254
PyObject* obj = PyObject_GetAttrString (qtNamespace, names[i]);
246
255
if (obj) {
247
- PyModule_AddObject (pack, names[i], obj);
256
+ PyModule_AddObject_DECREF (pack, names[i], obj);
248
257
Py_INCREF (obj);
249
- PyModule_AddObject (pack2, names[i], obj);
258
+ PyModule_AddObject_DECREF (pack2, names[i], obj);
250
259
} else {
251
260
std::cerr << " method not found " << names[i] << std::endl;
252
261
}
@@ -268,19 +277,19 @@ void PythonQt::init(int flags, const QByteArray& pythonQtModuleName)
268
277
269
278
for (int i = 0 ; i<sizeof (enumValues)/sizeof (int ); i++) {
270
279
PyObject* obj = PyInt_FromLong (enumValues[i]);
271
- PyModule_AddObject (pack, enumNames[i], obj);
280
+ PyModule_AddObject_DECREF (pack, enumNames[i], obj);
272
281
Py_INCREF (obj);
273
- PyModule_AddObject (pack2, enumNames[i], obj);
282
+ PyModule_AddObject_DECREF (pack2, enumNames[i], obj);
274
283
}
275
284
276
285
_self->priv ()->pythonQtModule ().addObject (" Debug" , _self->priv ()->_debugAPI );
277
286
278
287
Py_INCREF ((PyObject*)&PythonQtSlotDecorator_Type);
279
288
Py_INCREF ((PyObject*)&PythonQtSignalFunction_Type);
280
289
Py_INCREF ((PyObject*)&PythonQtProperty_Type);
281
- PyModule_AddObject (pack, " Slot" , (PyObject*)&PythonQtSlotDecorator_Type);
282
- PyModule_AddObject (pack, " Signal" , (PyObject*)&PythonQtSignalFunction_Type);
283
- PyModule_AddObject (pack, " Property" , (PyObject*)&PythonQtProperty_Type);
290
+ PyModule_AddObject_DECREF (pack, " Slot" , (PyObject*)&PythonQtSlotDecorator_Type);
291
+ PyModule_AddObject_DECREF (pack, " Signal" , (PyObject*)&PythonQtSignalFunction_Type);
292
+ PyModule_AddObject_DECREF (pack, " Property" , (PyObject*)&PythonQtProperty_Type);
284
293
285
294
}
286
295
}
@@ -423,11 +432,11 @@ void PythonQt::setRedirectStdInCallback(PythonQtInputChangedCB* callback, void *
423
432
((PythonQtStdInRedirect*)in.object ())->_cb = callback;
424
433
((PythonQtStdInRedirect*)in.object ())->_callData = callbackData;
425
434
// replace the built in file objects with our own objects
426
- PyModule_AddObject (sys.object (), " stdin" , in);
435
+ PyModule_AddObject_DECREF (sys.object (), " stdin" , in);
427
436
428
437
// Backup custom 'stdin' into 'pythonqt_stdin'
429
438
Py_INCREF (in); // AddObject steals the reference, so increment it
430
- PyModule_AddObject (sys.object (), " pythonqt_stdin" , in);
439
+ PyModule_AddObject_DECREF (sys.object (), " pythonqt_stdin" , in);
431
440
}
432
441
433
442
void PythonQt::setRedirectStdInCallbackEnabled (bool enabled)
@@ -503,7 +512,7 @@ void PythonQtPrivate::registerClass(const QMetaObject* metaobject, const char* p
503
512
PyObject* classWrapper = info->pythonQtClassWrapper ();
504
513
// AddObject steals a reference, so we need to INCREF
505
514
Py_INCREF (classWrapper);
506
- PyModule_AddObject (module, info->className (), classWrapper);
515
+ PyModule_AddObject_DECREF (module, info->className (), classWrapper);
507
516
}
508
517
if (first) {
509
518
first = false ;
@@ -537,13 +546,13 @@ void PythonQtPrivate::createPythonQtClassWrapper(PythonQtClassInfo* info, const
537
546
outerClassInfo->addNestedClass (info);
538
547
} else {
539
548
Py_INCREF (pyobj);
540
- PyModule_AddObject (pack, info->className (), pyobj);
549
+ PyModule_AddObject_DECREF (pack, info->className (), pyobj);
541
550
}
542
551
if (!module && package && strncmp (package, " Qt" , 2 ) == 0 ) {
543
552
// since PyModule_AddObject steals the reference, we need a incref once more...
544
553
Py_INCREF (pyobj);
545
554
// put all qt objects into Qt as well
546
- PyModule_AddObject (packageByName (" Qt" ), info->className (), pyobj);
555
+ PyModule_AddObject_DECREF (packageByName (" Qt" ), info->className (), pyobj);
547
556
}
548
557
info->setPythonQtClassWrapper (pyobj);
549
558
Py_DECREF (pyobj);
@@ -1071,7 +1080,7 @@ void PythonQt::addObject(PyObject* object, const QString& name, QObject* qObject
1071
1080
PyObject *wrappedObject = _p->wrapQObject (qObject);
1072
1081
if (PyModule_Check (object)) {
1073
1082
Py_XINCREF (wrappedObject);
1074
- PyModule_AddObject (object, QStringToPythonCharPointer (name), wrappedObject);
1083
+ PyModule_AddObject_DECREF (object, QStringToPythonCharPointer (name), wrappedObject);
1075
1084
} else if (PyDict_Check (object)) {
1076
1085
PyDict_SetItemString (object, QStringToPythonCharPointer (name), wrappedObject);
1077
1086
} else {
@@ -1085,7 +1094,7 @@ void PythonQt::addVariable(PyObject* object, const QString& name, const QVariant
1085
1094
PyObject *value = PythonQtConv::QVariantToPyObject (v);
1086
1095
if (PyModule_Check (object)) {
1087
1096
Py_XINCREF (value);
1088
- PyModule_AddObject (object, QStringToPythonCharPointer (name), value);
1097
+ PyModule_AddObject_DECREF (object, QStringToPythonCharPointer (name), value);
1089
1098
} else if (PyDict_Check (object)) {
1090
1099
PyDict_SetItemString (object, QStringToPythonCharPointer (name), value);
1091
1100
} else {
@@ -1697,12 +1706,12 @@ void PythonQt::overwriteSysPath(const QStringList& paths)
1697
1706
foreach (QString path, paths) {
1698
1707
nativePaths << QDir::toNativeSeparators (path);
1699
1708
}
1700
- PyModule_AddObject (sys, " path" , PythonQtConv::QStringListToPyList (nativePaths));
1709
+ PyModule_AddObject_DECREF (sys, " path" , PythonQtConv::QStringListToPyList (nativePaths));
1701
1710
}
1702
1711
1703
1712
void PythonQt::setModuleImportPath (PyObject* module, const QStringList& paths)
1704
1713
{
1705
- PyModule_AddObject (module, " __path__" , PythonQtConv::QStringListToPyList (paths));
1714
+ PyModule_AddObject_DECREF (module, " __path__" , PythonQtConv::QStringListToPyList (paths));
1706
1715
}
1707
1716
1708
1717
void PythonQt::stdOutRedirectCB (const QString& str)
@@ -1780,7 +1789,7 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1780
1789
_p->_pythonQtModuleName = name;
1781
1790
1782
1791
Py_INCREF ((PyObject*)&PythonQtBoolResult_Type);
1783
- PyModule_AddObject (_p->pythonQtModule ().object (), " BoolResult" , (PyObject*)&PythonQtBoolResult_Type);
1792
+ PyModule_AddObject_DECREF (_p->pythonQtModule ().object (), " BoolResult" , (PyObject*)&PythonQtBoolResult_Type);
1784
1793
PythonQtObjectPtr sys;
1785
1794
sys.setNewRef (PyImport_ImportModule (" sys" ));
1786
1795
@@ -1793,8 +1802,8 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1793
1802
err = PythonQtStdOutRedirectType.tp_new (&PythonQtStdOutRedirectType,NULL , NULL );
1794
1803
((PythonQtStdOutRedirect*)err.object ())->_cb = stdErrRedirectCB;
1795
1804
// replace the built in file objects with our own objects
1796
- PyModule_AddObject (sys, " stdout" , out);
1797
- PyModule_AddObject (sys, " stderr" , err);
1805
+ PyModule_AddObject_DECREF (sys, " stdout" , out);
1806
+ PyModule_AddObject_DECREF (sys, " stderr" , err);
1798
1807
}
1799
1808
1800
1809
// add PythonQt to the list of builtin module names
@@ -1808,7 +1817,7 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
1808
1817
PyTuple_SetItem (module_names, i, val);
1809
1818
}
1810
1819
PyTuple_SetItem (module_names, old_size, PyString_FromString (name.constData ()));
1811
- PyModule_AddObject (sys.object (), " builtin_module_names" , module_names);
1820
+ PyModule_AddObject_DECREF (sys.object (), " builtin_module_names" , module_names);
1812
1821
}
1813
1822
Py_XDECREF (old_module_names);
1814
1823
@@ -1991,7 +2000,7 @@ PyObject* PythonQtPrivate::packageByName(const char* name)
1991
2000
_packages.insert (name, v);
1992
2001
// AddObject steals the reference, so increment it!
1993
2002
Py_INCREF (v);
1994
- PyModule_AddObject (_pythonQtModule, name, v);
2003
+ PyModule_AddObject_DECREF (_pythonQtModule, name, v);
1995
2004
}
1996
2005
return v;
1997
2006
}
0 commit comments