Skip to content

Commit e4f8b00

Browse files
author
florianlink
committed
further PY3K port
git-svn-id: http://svn.code.sf.net/p/pythonqt/code/trunk@277 ea8d5007-eb21-0410-b261-ccb3ea6e24a9
1 parent ce17d7b commit e4f8b00

8 files changed

+164
-27
lines changed

src/PythonQt.cpp

+30-2
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ PythonQt::PythonQt(int flags, const QByteArray& pythonQtModuleName)
166166
_p->_PythonQtObjectPtr_metaId = qRegisterMetaType<PythonQtObjectPtr>("PythonQtObjectPtr");
167167

168168
if ((flags & PythonAlreadyInitialized) == 0) {
169+
#ifdef PY3K
170+
Py_SetProgramName(const_cast<wchar_t*>(L"PythonQt"));
171+
#else
172+
Py_SetProgramName(const_cast<char*>("PythonQt"));
173+
#endif
169174
if (flags & IgnoreSiteModule) {
170175
// this prevents the automatic importing of Python site files
171176
Py_NoSiteFlag = 1;
@@ -1442,13 +1447,32 @@ static PyMethodDef PythonQtMethods[] = {
14421447
{NULL, NULL, 0, NULL}
14431448
};
14441449

1450+
#ifdef PY3K
1451+
static PyModuleDef PythonQtModuleDef = {
1452+
PyModuleDef_HEAD_INIT,
1453+
"",
1454+
NULL,
1455+
-1,
1456+
PythonQtMethods,
1457+
NULL,
1458+
NULL,
1459+
NULL,
1460+
NULL
1461+
};
1462+
#endif
1463+
14451464
void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQtModuleName)
14461465
{
14471466
QByteArray name = "PythonQt";
14481467
if (!pythonQtModuleName.isEmpty()) {
14491468
name = pythonQtModuleName;
14501469
}
1470+
#ifdef PY3K
1471+
PythonQtModuleDef.m_name = name.constData();
1472+
_p->_pythonQtModule = PyModule_Create(&PythonQtModuleDef);
1473+
#else
14511474
_p->_pythonQtModule = Py_InitModule(name.constData(), PythonQtMethods);
1475+
#endif
14521476
_p->_pythonQtModuleName = name;
14531477

14541478
PythonQtObjectPtr sys;
@@ -1480,6 +1504,10 @@ void PythonQt::initPythonQtModule(bool redirectStdOut, const QByteArray& pythonQ
14801504
PyModule_AddObject(sys.object(), "builtin_module_names", module_names);
14811505
}
14821506
Py_XDECREF(old_module_names);
1507+
1508+
#ifdef PY3K
1509+
PyDict_SetItem(PyObject_GetAttrString(sys.object(), "modules"), PyUnicode_FromString(name.constData()), _p->_pythonQtModule.object());
1510+
#endif
14831511
}
14841512

14851513
QString PythonQt::getReturnTypeOfWrappedMethod(PyObject* module, const QString& name)
@@ -1911,7 +1939,7 @@ PyObject* PythonQtPrivate::wrapMemoryAsBuffer( const void* data, Py_ssize_t size
19111939
#ifdef PY3K
19121940
return PyMemoryView_FromMemory((char*)data, size, PyBUF_READ);
19131941
#else
1914-
return PyBuffer_FromMemory((void*)data, size);
1942+
return PyBuffer_FromMemory((char*)data, size);
19151943
#endif
19161944
}
19171945

@@ -1920,6 +1948,6 @@ PyObject* PythonQtPrivate::wrapMemoryAsBuffer( void* data, Py_ssize_t size )
19201948
#ifdef PY3K
19211949
return PyMemoryView_FromMemory((char*)data, size, PyBUF_READ | PyBUF_WRITE);
19221950
#else
1923-
return PyBuffer_FromReadWriteMemory(data, size);
1951+
return PyBuffer_FromReadWriteMemory((char*)data, size);
19241952
#endif
19251953
}

src/PythonQtClassWrapper.cpp

+17-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ static void initializeSlots(PythonQtClassWrapper* wrap)
156156
wrap->_base.as_number.nb_multiply = (binaryfunc)PythonQtInstanceWrapper_mul;
157157
}
158158
if (typeSlots & PythonQt::Type_Divide) {
159+
#ifndef PY3K
159160
wrap->_base.as_number.nb_divide = (binaryfunc)PythonQtInstanceWrapper_div;
161+
#endif
160162
wrap->_base.as_number.nb_true_divide = (binaryfunc)PythonQtInstanceWrapper_div;
161163
}
162164
if (typeSlots & PythonQt::Type_And) {
@@ -188,7 +190,9 @@ static void initializeSlots(PythonQtClassWrapper* wrap)
188190
wrap->_base.as_number.nb_inplace_multiply = (binaryfunc)PythonQtInstanceWrapper_imul;
189191
}
190192
if (typeSlots & PythonQt::Type_InplaceDivide) {
193+
#ifndef PY3K
191194
wrap->_base.as_number.nb_inplace_divide = (binaryfunc)PythonQtInstanceWrapper_idiv;
195+
#endif
192196
wrap->_base.as_number.nb_inplace_true_divide = (binaryfunc)PythonQtInstanceWrapper_idiv;
193197
}
194198
if (typeSlots & PythonQt::Type_InplaceAnd) {
@@ -213,7 +217,11 @@ static void initializeSlots(PythonQtClassWrapper* wrap)
213217
wrap->_base.as_number.nb_invert = (unaryfunc)PythonQtInstanceWrapper_invert;
214218
}
215219
if (typeSlots & PythonQt::Type_NonZero) {
220+
#ifdef PY3K
221+
wrap->_base.as_number.nb_bool = (inquiry)PythonQtInstanceWrapper_nonzero;
222+
#else
216223
wrap->_base.as_number.nb_nonzero = (inquiry)PythonQtInstanceWrapper_nonzero;
224+
#endif
217225
}
218226
}
219227
}
@@ -395,7 +403,11 @@ static PyObject *PythonQtClassWrapper_getattro(PyObject *obj, PyObject *name)
395403
}
396404

397405
// look for the internal methods (className(), help())
406+
#ifdef PY3K
407+
PyObject* internalMethod = PyObject_GenericGetAttr(obj, name);
408+
#else
398409
PyObject* internalMethod = Py_FindMethod( PythonQtClassWrapper_methods, obj, (char*)attributeName);
410+
#endif
399411
if (internalMethod) {
400412
return internalMethod;
401413
}
@@ -435,7 +447,7 @@ static PyObject * PythonQtClassWrapper_repr(PyObject * obj)
435447
*/
436448

437449
PyTypeObject PythonQtClassWrapper_Type = {
438-
PyVarObject_HEAD_INIT(NULL, 0),
450+
PyVarObject_HEAD_INIT(NULL, 0)
439451
"PythonQt.PythonQtClassWrapper", /*tp_name*/
440452
sizeof(PythonQtClassWrapper), /*tp_basicsize*/
441453
0, /*tp_itemsize*/
@@ -462,7 +474,11 @@ PyTypeObject PythonQtClassWrapper_Type = {
462474
0, /* tp_weaklistoffset */
463475
0, /* tp_iter */
464476
0, /* tp_iternext */
477+
#ifdef PY3K
478+
PythonQtClassWrapper_methods, /* tp_methods */
479+
#else
465480
0, /* tp_methods */
481+
#endif
466482
0, /* tp_members */
467483
0, /* tp_getset */
468484
0, /* tp_base */

src/PythonQtConversion.cpp

+34-17
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ void* PythonQtConv::handlePythonToQtAutoConversion(int typeId, PyObject* obj, vo
296296
if (typeId == cursorId) {
297297
static PyObject* qtCursorShapeEnum = PythonQtClassInfo::findEnumWrapper("Qt::CursorShape", NULL);
298298
if ((PyObject*)obj->ob_type == qtCursorShapeEnum) {
299-
Qt::CursorShape val = (Qt::CursorShape)PyInt_AS_LONG(obj);
299+
Qt::CursorShape val = (Qt::CursorShape)PyInt_AsLong(obj);
300300
if (!ptr) {
301301
PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QCursor(), ptr);
302302
ptr = (void*)((QVariant*)ptr)->constData();
@@ -308,7 +308,7 @@ void* PythonQtConv::handlePythonToQtAutoConversion(int typeId, PyObject* obj, vo
308308
// brushes can be created from QColor and from Qt::GlobalColor (and from brushes, but that's the default)
309309
static PyObject* qtColorClass = PythonQt::priv()->getClassInfo("QColor")->pythonQtClassWrapper();
310310
if ((PyObject*)obj->ob_type == qtGlobalColorEnum) {
311-
Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AS_LONG(obj);
311+
Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AsLong(obj);
312312
if (!ptr) {
313313
PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QPen(), ptr);
314314
ptr = (void*)((QVariant*)ptr)->constData();
@@ -327,7 +327,7 @@ void* PythonQtConv::handlePythonToQtAutoConversion(int typeId, PyObject* obj, vo
327327
// brushes can be created from QColor and from Qt::GlobalColor (and from brushes, but that's the default)
328328
static PyObject* qtColorClass = PythonQt::priv()->getClassInfo("QColor")->pythonQtClassWrapper();
329329
if ((PyObject*)obj->ob_type == qtGlobalColorEnum) {
330-
Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AS_LONG(obj);
330+
Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AsLong(obj);
331331
if (!ptr) {
332332
PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QBrush(), ptr);
333333
ptr = (void*)((QVariant*)ptr)->constData();
@@ -345,7 +345,7 @@ void* PythonQtConv::handlePythonToQtAutoConversion(int typeId, PyObject* obj, vo
345345
} else if (typeId == colorId) {
346346
// colors can be created from Qt::GlobalColor (and from colors, but that's the default)
347347
if ((PyObject*)obj->ob_type == qtGlobalColorEnum) {
348-
Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AS_LONG(obj);
348+
Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AsLong(obj);
349349
if (!ptr) {
350350
PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QColor(), ptr);
351351
ptr = (void*)((QVariant*)ptr)->constData();
@@ -707,7 +707,11 @@ QString PythonQtConv::PyObjGetRepresentation(PyObject* val)
707707
QString r;
708708
PyObject* str = PyObject_Repr(val);
709709
if (str) {
710-
r = QString(PyString_AS_STRING(str));
710+
#ifdef PY3K
711+
r = PyObjGetString(str);
712+
#else
713+
r = QString(PyString_AS_STRING(str));
714+
#endif
711715
Py_DECREF(str);
712716
}
713717
return r;
@@ -729,10 +733,13 @@ QString PythonQtConv::PyObjGetString(PyObject* val, bool strict, bool& ok) {
729733
}
730734
#endif
731735
} else if (!strict) {
732-
// EXTRA: could also use _Unicode, but why should we?
733736
PyObject* str = PyObject_Str(val);
734737
if (str) {
738+
#ifdef PY3K
739+
r = QString::fromUtf8(PyUnicode_AsUTF8(val));
740+
#else
735741
r = QString(PyString_AS_STRING(str));
742+
#endif
736743
Py_DECREF(str);
737744
} else {
738745
ok = false;
@@ -747,9 +754,8 @@ QByteArray PythonQtConv::PyObjGetBytes(PyObject* val, bool /*strict*/, bool& ok)
747754
// TODO: support buffer objects in general
748755
QByteArray r;
749756
ok = true;
750-
if (val->ob_type == &PyBytes_Type) {
751-
long size = PyBytes_GET_SIZE(val);
752-
r = QByteArray(PyBytes_AS_STRING(val), size);
757+
if (PyBytes_Check(val)) {
758+
r = QByteArray(PyBytes_AS_STRING(val), PyBytes_GET_SIZE(val));
753759
} else {
754760
ok = false;
755761
}
@@ -810,9 +816,12 @@ int PythonQtConv::PyObjGetInt(PyObject* val, bool strict, bool &ok) {
810816
qint64 PythonQtConv::PyObjGetLongLong(PyObject* val, bool strict, bool &ok) {
811817
qint64 d = 0;
812818
ok = true;
819+
#ifndef PY3K
813820
if (val->ob_type == &PyInt_Type) {
814821
d = PyInt_AS_LONG(val);
815-
} else if (val->ob_type == &PyLong_Type) {
822+
} else
823+
#endif
824+
if (val->ob_type == &PyLong_Type) {
816825
d = PyLong_AsLongLong(val);
817826
} else if (!strict) {
818827
if (PyObject_TypeCheck(val, &PyInt_Type)) {
@@ -842,9 +851,12 @@ qint64 PythonQtConv::PyObjGetLongLong(PyObject* val, bool strict, bool &ok) {
842851
quint64 PythonQtConv::PyObjGetULongLong(PyObject* val, bool strict, bool &ok) {
843852
quint64 d = 0;
844853
ok = true;
845-
if (PyObject_TypeCheck(val, &PyInt_Type)) {
854+
#ifndef PY3K
855+
if (Py_TYPE(val) == &PyInt_Type) {
846856
d = PyInt_AS_LONG(val);
847-
} else if (val->ob_type == &PyLong_Type) {
857+
} else
858+
#endif
859+
if (Py_TYPE(val) == &PyLong_Type) {
848860
d = PyLong_AsLongLong(val);
849861
} else if (!strict) {
850862
if (PyObject_TypeCheck(val, &PyInt_Type)) {
@@ -877,9 +889,12 @@ double PythonQtConv::PyObjGetDouble(PyObject* val, bool strict, bool &ok) {
877889
if (val->ob_type == &PyFloat_Type) {
878890
d = PyFloat_AS_DOUBLE(val);
879891
} else if (!strict) {
892+
#ifndef PY3K
880893
if (PyObject_TypeCheck(val, &PyInt_Type)) {
881894
d = PyInt_AS_LONG(val);
882-
} else if (val->ob_type == &PyLong_Type) {
895+
} else
896+
#endif
897+
if (PyLong_Check(val)) {
883898
d = PyLong_AsLong(val);
884899
} else if (val == Py_False) {
885900
d = 0;
@@ -936,11 +951,13 @@ QVariant PythonQtConv::PyObjToQVariant(PyObject* val, int type)
936951
type = QVariant::String;
937952
} else if (val == Py_False || val == Py_True) {
938953
type = QVariant::Bool;
954+
#ifndef PY3K
939955
} else if (PyObject_TypeCheck(val, &PyInt_Type)) {
940956
type = QVariant::Int;
941-
} else if (val->ob_type==&PyLong_Type) {
957+
#endif
958+
} else if (PyLong_Check(val)) {
942959
type = QVariant::LongLong;
943-
} else if (val->ob_type==&PyFloat_Type) {
960+
} else if (PyFloat_Check(val)) {
944961
type = QVariant::Double;
945962
} else if (PyObject_TypeCheck(val, &PythonQtInstanceWrapper_Type)) {
946963
PythonQtInstanceWrapper* wrap = (PythonQtInstanceWrapper*)val;
@@ -961,9 +978,9 @@ QVariant PythonQtConv::PyObjToQVariant(PyObject* val, int type)
961978
v = qVariantFromValue(myObject);
962979
}
963980
return v;
964-
} else if (val->ob_type==&PyDict_Type) {
981+
} else if (PyDict_Check(val)) {
965982
type = QVariant::Map;
966-
} else if (val->ob_type==&PyList_Type || val->ob_type==&PyTuple_Type || PySequence_Check(val)) {
983+
} else if (PyList_Check(val) || PyTuple_Check(val) || PySequence_Check(val)) {
967984
type = QVariant::List;
968985
} else if (val == Py_None) {
969986
// none is invalid

src/PythonQtImporter.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ Create a new PythonQtImporter instance. 'path' must be a valid path on disk/or i
400400
#define DEFERRED_ADDRESS(ADDR) 0
401401

402402
PyTypeObject PythonQtImporter_Type = {
403-
PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0),
403+
PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)
404404
"PythonQtImport.PythonQtImporter",
405405
sizeof(PythonQtImporter),
406406
0, /* tp_itemsize */
@@ -765,6 +765,20 @@ PyObject* PythonQtImport::getCodeFromPyc(const QString& file)
765765
PyDoc_STRVAR(mlabimport_doc,
766766
"Imports python files into PythonQt, completely replaces internal python import");
767767

768+
#ifdef PY3K
769+
static struct PyModuleDef PythonQtImport_def = {
770+
PyModuleDef_HEAD_INIT,
771+
"PythonQtImport", /* m_name */
772+
mlabimport_doc, /* m_doc */
773+
-1, /* m_size */
774+
NULL, /* m_methods */
775+
NULL, /* m_reload */
776+
NULL, /* m_traverse */
777+
NULL, /* m_clear */
778+
NULL /* m_free */
779+
};
780+
#endif
781+
768782
void PythonQtImport::init()
769783
{
770784
static bool first = true;
@@ -793,8 +807,12 @@ void PythonQtImport::init()
793807
mlab_searchorder[4] = tmp;
794808
}
795809

810+
#ifdef PY3K
811+
mod = PyModule_Create(&PythonQtImport_def);
812+
#else
796813
mod = Py_InitModule4("PythonQtImport", NULL, mlabimport_doc,
797814
NULL, PYTHON_API_VERSION);
815+
#endif
798816

799817
PythonQtImportError = PyErr_NewException(const_cast<char*>("PythonQtImport.PythonQtImportError"),
800818
PyExc_ImportError, NULL);

src/PythonQtSignal.cpp

+29-2
Original file line numberDiff line numberDiff line change
@@ -300,17 +300,44 @@ meth_hash(PythonQtSignalFunctionObject *a)
300300
return x;
301301
}
302302

303+
// for python 3.x
304+
static PyObject*
305+
meth_richcompare(PythonQtSignalFunctionObject *a, PythonQtSignalFunctionObject *b, int op)
306+
{
307+
int x = meth_compare(a, b);
308+
bool r;
309+
if (op == Py_LT)
310+
r = x < 0;
311+
else if (op == Py_LE)
312+
r = x < 1;
313+
else if (op == Py_EQ)
314+
r = x == 0;
315+
else if (op == Py_NE)
316+
r = x != 0;
317+
else if (op == Py_GE)
318+
r = x > -1;
319+
else if (op == Py_GT)
320+
r = x > 0;
321+
if (r)
322+
Py_RETURN_TRUE;
323+
else
324+
Py_RETURN_FALSE;
325+
}
303326

304327
PyTypeObject PythonQtSignalFunction_Type = {
305-
PyVarObject_HEAD_INIT(&PyType_Type, 0),
328+
PyVarObject_HEAD_INIT(&PyType_Type, 0)
306329
"builtin_qt_signal",
307330
sizeof(PythonQtSignalFunctionObject),
308331
0,
309332
(destructor)meth_dealloc, /* tp_dealloc */
310333
0, /* tp_print */
311334
0, /* tp_getattr */
312335
0, /* tp_setattr */
336+
#ifdef PY3K
337+
0,
338+
#else
313339
(cmpfunc)meth_compare, /* tp_compare */
340+
#endif
314341
(reprfunc)meth_repr, /* tp_repr */
315342
0, /* tp_as_number */
316343
0, /* tp_as_sequence */
@@ -326,7 +353,7 @@ PyTypeObject PythonQtSignalFunction_Type = {
326353
0, /* tp_doc */
327354
(traverseproc)meth_traverse, /* tp_traverse */
328355
0, /* tp_clear */
329-
0, /* tp_richcompare */
356+
(richcmpfunc)meth_richcompare, /* tp_richcompare */
330357
0, /* tp_weaklistoffset */
331358
0, /* tp_iter */
332359
0, /* tp_iternext */

0 commit comments

Comments
 (0)