##// END OF EJS Templates
Start Python 3.x Port...
Start Python 3.x Port The main python interpreter works, BUT: Many tests still fail, Qt integration is broken

File last commit:

r206:316b4928f53f
r206:316b4928f53f
Show More
PythonQtInstanceWrapper.cpp
848 lines | 28.8 KiB | text/x-c | CppLexer
/ src / PythonQtInstanceWrapper.cpp
ezust
reorganized SVN tree into branches, tags and trunk...
r0 /*
*
florianlink
updated old license information and current date...
r133 * Copyright (C) 2010 MeVis Medical Solutions AG All Rights Reserved.
ezust
reorganized SVN tree into branches, tags and trunk...
r0 *
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
florianlink
updated old license information and current date...
r133 * Contact information: MeVis Medical Solutions AG, Universitaetsallee 29,
ezust
reorganized SVN tree into branches, tags and trunk...
r0 * 28359 Bremen, Germany or:
*
* http://www.mevis.de
*
*/
//----------------------------------------------------------------------------------
/*!
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 // \file PythonQtInstanceWrapper.cpp
ezust
reorganized SVN tree into branches, tags and trunk...
r0 // \author Florian Link
// \author Last changed by $Author: florian $
// \date 2006-05
*/
//----------------------------------------------------------------------------------
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 #include "PythonQtInstanceWrapper.h"
ezust
reorganized SVN tree into branches, tags and trunk...
r0 #include <QObject>
#include "PythonQt.h"
#include "PythonQtSlot.h"
florianlink
Updated from current MeVisLab development...
r173 #include "PythonQtSignal.h"
ezust
reorganized SVN tree into branches, tags and trunk...
r0 #include "PythonQtClassInfo.h"
#include "PythonQtConversion.h"
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 #include "PythonQtClassWrapper.h"
Orochimarufan
Start Python 3.x Port...
r206 #if PY_MAJOR_VERSION >= 3
#define PY3K
#endif
florianlink
named the struct and implemented classInfo() as a member of the struct and not the typedef (this seems to be a GCC issue, it worked well on MSVC8)...
r21 PythonQtClassInfo* PythonQtInstanceWrapperStruct::classInfo()
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 {
// take the class info from our type object
Orochimarufan
Start Python 3.x Port...
r206 return ((PythonQtClassWrapper*)Py_TYPE(this))->_classInfo;
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 }
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static void PythonQtInstanceWrapper_deleteObject(PythonQtInstanceWrapper* self, bool force = false) {
florianlink
added support for operators and rich compare...
r119
florianlink
- added hasOwner method to manage ownership more nicely...
r15 // is this a C++ wrapper?
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if (self->_wrappedPtr) {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 //mlabDebugConst("Python","c++ wrapper removed " << self->_wrappedPtr << " " << self->_obj->className() << " " << self->classInfo()->wrappedClassName().latin1());
florianlink
added support for operators and rich compare...
r119
ezust
reorganized SVN tree into branches, tags and trunk...
r0 PythonQt::priv()->removeWrapperPointer(self->_wrappedPtr);
// we own our qobject, so we delete it now:
delete self->_obj;
self->_obj = NULL;
florianlink
merged various changes from MeVisLab repository...
r180 if (force || self->_ownedByPythonQt) {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 int type = self->classInfo()->metaTypeId();
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 if (self->_useQMetaTypeDestroy && type>=0) {
// use QMetaType to destroy the object
QMetaType::destroy(type, self->_wrappedPtr);
ezust
reorganized SVN tree into branches, tags and trunk...
r0 } else {
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24 PythonQtSlotInfo* slot = self->classInfo()->destructor();
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 if (slot) {
void* args[2];
args[0] = NULL;
args[1] = &self->_wrappedPtr;
slot->decorator()->qt_metacall(QMetaObject::InvokeMetaMethod, slot->slotIndex(), args);
self->_wrappedPtr = NULL;
} else {
if (type>=0) {
// use QMetaType to destroy the object
QMetaType::destroy(type, self->_wrappedPtr);
} else {
// TODO: warn about not being able to destroy the object?
}
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
}
florianlink
merged in features from the MeVisLab repository...
r4 } else {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 //mlabDebugConst("Python","qobject wrapper removed " << self->_obj->className() << " " << self->classInfo()->wrappedClassName().latin1());
florianlink
merged in features from the MeVisLab repository...
r4 if (self->_objPointerCopy) {
PythonQt::priv()->removeWrapperPointer(self->_objPointerCopy);
}
if (self->_obj) {
florianlink
- added hasOwner method to manage ownership more nicely...
r15 if (force || self->_ownedByPythonQt) {
if (force || !self->_obj->parent()) {
florianlink
merged in features from the MeVisLab repository...
r4 delete self->_obj;
}
} else {
if (self->_obj->parent()==NULL) {
// tell someone who is interested that the qobject is no longer wrapped, if it has no parent
PythonQt::qObjectNoLongerWrappedCB(self->_obj);
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
}
}
florianlink
merged in features from the MeVisLab repository...
r4 self->_obj = NULL;
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 }
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static void PythonQtInstanceWrapper_dealloc(PythonQtInstanceWrapper* self)
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper_deleteObject(self);
florianlink
merged in features from the MeVisLab repository...
r4 self->_obj.~QPointer<QObject>();
Orochimarufan
Start Python 3.x Port...
r206 Py_TYPE(self)->tp_free((PyObject*)self);
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
cache enumWrappers in method infos and make use of the extra information for better enum overloading...
r55 static PyObject* PythonQtInstanceWrapper_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24 //PythonQtClassWrapper *classType = (PythonQtClassWrapper*)type;
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper *self;
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 static PyObject* emptyTuple = NULL;
if (emptyTuple==NULL) {
emptyTuple = PyTuple_New(0);
}
self = (PythonQtInstanceWrapper*)PyBaseObject_Type.tp_new(type, emptyTuple, NULL);
florianlink
merged in features from the MeVisLab repository...
r4
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if (self != NULL) {
florianlink
merged in features from the MeVisLab repository...
r4 new (&self->_obj) QPointer<QObject>();
ezust
reorganized SVN tree into branches, tags and trunk...
r0 self->_wrappedPtr = NULL;
self->_ownedByPythonQt = false;
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 self->_useQMetaTypeDestroy = false;
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24 self->_isShellInstance = false;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
return (PyObject *)self;
}
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 int PythonQtInstanceWrapper_init(PythonQtInstanceWrapper * self, PyObject * args, PyObject * kwds)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 if (args == PythonQtPrivate::dummyTuple()) {
// we are called from the internal PythonQt API, so our data will be filled later on...
return 0;
}
// we are called from python, try to construct our object
if (self->classInfo()->constructors()) {
void* directCPPPointer = NULL;
florianlink
fixed enum handling for static methods calls and added correct support for decorated enum detection...
r41 PythonQtSlotFunction_CallImpl(self->classInfo(), NULL, self->classInfo()->constructors(), args, kwds, NULL, &directCPPPointer);
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 if (PyErr_Occurred()) {
return -1;
}
if (directCPPPointer) {
// change ownershipflag to be owned by PythonQt
self->_ownedByPythonQt = true;
self->_useQMetaTypeDestroy = false;
if (self->classInfo()->isCPPWrapper()) {
self->_wrappedPtr = directCPPPointer;
// TODO xxx: if there is a wrapper factory, we might want to generate a wrapper for our class?!
} else {
self->setQObject((QObject*)directCPPPointer);
}
// register with PythonQt
PythonQt::priv()->addWrapperPointer(directCPPPointer, self);
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24
PythonQtShellSetInstanceWrapperCB* cb = self->classInfo()->shellSetInstanceWrapperCB();
if (cb) {
// if we are a derived python class, we set the wrapper
// to activate the shell class, otherwise we just ignore that it is a shell...
// we detect it be checking if the type does not have PythonQtInstanceWrapper_Type as direct base class,
// which is the case for all non-python derived types
if (((PyObject*)self)->ob_type->tp_base != &PythonQtInstanceWrapper_Type) {
// set the wrapper and remember that we have a shell instance!
(*cb)(directCPPPointer, self);
self->_isShellInstance = true;
}
}
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 }
} else {
QString error = QString("No constructors available for ") + self->classInfo()->className();
PyErr_SetString(PyExc_ValueError, error.toLatin1().data());
return -1;
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0 return 0;
}
florianlink
added support for operators and rich compare...
r119 static PyObject *PythonQtInstanceWrapper_richcompare(PythonQtInstanceWrapper* wrapper, PyObject* other, int code)
{
bool validPtrs = false;
bool areSamePtrs = false;
if (PyObject_TypeCheck((PyObject*)wrapper, &PythonQtInstanceWrapper_Type)) {
if (PyObject_TypeCheck(other, &PythonQtInstanceWrapper_Type)) {
validPtrs = true;
PythonQtInstanceWrapper* w1 = wrapper;
PythonQtInstanceWrapper* w2 = (PythonQtInstanceWrapper*)other;
// check pointers directly
if (w1->_wrappedPtr != NULL) {
if (w1->_wrappedPtr == w2->_wrappedPtr) {
areSamePtrs = true;
}
} else if (w1->_obj == w2->_obj) {
areSamePtrs = true;
}
} else if (other == Py_None) {
validPtrs = true;
if (wrapper->_obj || wrapper->_wrappedPtr) {
areSamePtrs = false;
} else {
areSamePtrs = true;
}
}
}
if ((wrapper->classInfo()->typeSlots() & PythonQt::Type_RichCompare) == 0) {
// shortcut if richcompare is not supported:
if (validPtrs && code == Py_EQ) {
return PythonQtConv::GetPyBool(areSamePtrs);
} else if (validPtrs && code == Py_NE) {
return PythonQtConv::GetPyBool(!areSamePtrs);
}
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
QByteArray memberName;
switch (code) {
case Py_LT:
{
static QByteArray name = "__lt__";
memberName = name;
}
break;
case Py_LE:
{
static QByteArray name = "__le__";
memberName = name;
}
break;
case Py_EQ:
{
static QByteArray name = "__eq__";
memberName = name;
}
break;
case Py_NE:
{
static QByteArray name = "__ne__";
memberName = name;
}
break;
case Py_GT:
{
static QByteArray name = "__gt__";
memberName = name;
}
break;
case Py_GE:
{
static QByteArray name = "__ge__";
memberName = name;
}
break;
}
PythonQtMemberInfo opSlot = wrapper->classInfo()->member(memberName);
if (opSlot._type == PythonQtMemberInfo::Slot) {
// TODO get rid of tuple
PyObject* args = PyTuple_New(1);
Py_INCREF(other);
PyTuple_SET_ITEM(args, 0, other);
PyObject* result = PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, opSlot._slot, args, NULL, wrapper->_wrappedPtr);
Py_DECREF(args);
return result;
} else {
// not implemented, let python try something else!
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
}
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 static PyObject *PythonQtInstanceWrapper_classname(PythonQtInstanceWrapper* obj)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromString(Py_TYPE(obj)->tp_name);
#else
return PyString_FromString(Py_TYPE(obj)->tp_name);
#endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
updated to upstream state in MeVisLab repository...
r157 PyObject *PythonQtInstanceWrapper_inherits(PythonQtInstanceWrapper* obj, PyObject *args)
{
char *name = NULL;
if (!PyArg_ParseTuple(args, "s:PythonQtInstanceWrapper.inherits",&name)) {
return NULL;
}
return PythonQtConv::GetPyBool(obj->classInfo()->inherits(name));
}
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 static PyObject *PythonQtInstanceWrapper_help(PythonQtInstanceWrapper* obj)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 return PythonQt::self()->helpCalled(obj->classInfo());
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
updated to upstream state in MeVisLab repository...
r157 PyObject *PythonQtInstanceWrapper_delete(PythonQtInstanceWrapper * self)
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper_deleteObject(self, true);
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 Py_INCREF(Py_None);
return Py_None;
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyMethodDef PythonQtInstanceWrapper_methods[] = {
{"className", (PyCFunction)PythonQtInstanceWrapper_classname, METH_NOARGS,
ezust
reorganized SVN tree into branches, tags and trunk...
r0 "Return the classname of the object"
},
florianlink
updated to upstream state in MeVisLab repository...
r157 {"inherits", (PyCFunction)PythonQtInstanceWrapper_inherits, METH_VARARGS,
"Returns if the class inherits or is of given type name"
},
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 {"help", (PyCFunction)PythonQtInstanceWrapper_help, METH_NOARGS,
ezust
reorganized SVN tree into branches, tags and trunk...
r0 "Shows the help of available methods for this class"
},
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 {"delete", (PyCFunction)PythonQtInstanceWrapper_delete, METH_NOARGS,
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 "Deletes the C++ object (at your own risk, my friend!)"
},
{NULL, NULL, 0, NULL} /* Sentinel */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 };
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyObject *PythonQtInstanceWrapper_getattro(PyObject *obj,PyObject *name)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
const char *attributeName;
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper *wrapper = (PythonQtInstanceWrapper *)obj;
florianlink
merged in features from the MeVisLab repository...
r4
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
if ((attributeName = PyUnicode_AsUTF8(name)) == NULL) {
#else
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if ((attributeName = PyString_AsString(name)) == NULL) {
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 return NULL;
}
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24 if (qstrcmp(attributeName, "__dict__")==0) {
florianlink
improved so that dict contains properties and that dir() shows all available things, including the derived base attributes...
r34 PyObject* dict = PyBaseObject_Type.tp_getattro(obj, name);
dict = PyDict_Copy(dict);
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 if (wrapper->_obj) {
// only the properties are missing, the rest is already available from
// PythonQtClassWrapper...
QStringList l = wrapper->classInfo()->propertyList();
Orochimarufan
Redo CMake build system, get Qt5 support...
r205 Q_FOREACH (QString name, l) {
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 PyObject* o = PyObject_GetAttrString(obj, name.toLatin1().data());
if (o) {
PyDict_SetItemString(dict, name.toLatin1().data(), o);
Py_DECREF(o);
} else {
std::cerr << "PythonQtInstanceWrapper: something is wrong, could not get attribute " << name.toLatin1().data();
}
florianlink
improved so that dict contains properties and that dir() shows all available things, including the derived base attributes...
r34 }
florianlink
added support for dynamic properties...
r85
florianlink
added support for operators and rich compare...
r119 QList<QByteArray> dynamicProps = wrapper->_obj->dynamicPropertyNames();
Orochimarufan
Redo CMake build system, get Qt5 support...
r205 Q_FOREACH (QByteArray name, dynamicProps) {
florianlink
added support for dynamic properties...
r85 PyObject* o = PyObject_GetAttrString(obj, name.data());
if (o) {
PyDict_SetItemString(dict, name.data(), o);
Py_DECREF(o);
} else {
std::cerr << "PythonQtInstanceWrapper: dynamic property could not be read " << name.data();
}
}
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24 }
// Note: we do not put children into the dict, is would look confusing?!
return dict;
}
// first look in super, to return derived methods from base object first
PyObject* superAttr = PyBaseObject_Type.tp_getattro(obj, name);
if (superAttr) {
return superAttr;
}
florianlink
fixed attr lookup and support for invalid (unregistered) properties...
r27 PyErr_Clear();
florianlink
- added support for deriving CPP classes in Python and to override all public and protected virtual functions from PythonQt...
r24
ezust
reorganized SVN tree into branches, tags and trunk...
r0 // mlabDebugConst("Python","get " << attributeName);
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 PythonQtMemberInfo member = wrapper->classInfo()->member(attributeName);
ezust
reorganized SVN tree into branches, tags and trunk...
r0 switch (member._type) {
case PythonQtMemberInfo::Property:
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 if (wrapper->_obj) {
florianlink
fixed attr lookup and support for invalid (unregistered) properties...
r27 if (member._property.userType() != QVariant::Invalid) {
florianlink
updated to upstream state in MeVisLab repository...
r157
PythonQt::ProfilingCB* profilingCB = PythonQt::priv()->profilingCB();
if (profilingCB) {
QString methodName = "getProperty(";
methodName += attributeName;
methodName += ")";
profilingCB(PythonQt::Enter, wrapper->_obj->metaObject()->className(), methodName.toLatin1());
}
PyObject* value = PythonQtConv::QVariantToPyObject(member._property.read(wrapper->_obj));
if (profilingCB) {
profilingCB(PythonQt::Leave, NULL, NULL);
}
return value;
florianlink
fixed attr lookup and support for invalid (unregistered) properties...
r27 } else {
Py_INCREF(Py_None);
return Py_None;
}
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 } else {
QString error = QString("Trying to read property '") + attributeName + "' from a destroyed " + wrapper->classInfo()->className() + " object";
PyErr_SetString(PyExc_ValueError, error.toLatin1().data());
return NULL;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
break;
case PythonQtMemberInfo::Slot:
return PythonQtSlotFunction_New(member._slot, obj, NULL);
break;
florianlink
Updated from current MeVisLab development...
r173 case PythonQtMemberInfo::Signal:
return PythonQtSignalFunction_New(member._slot, obj, NULL);
break;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 case PythonQtMemberInfo::EnumValue:
florianlink
fixed VC8 compilation...
r72 {
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 PyObject* enumValue = member._enumValue;
Py_INCREF(enumValue);
return enumValue;
florianlink
fixed VC8 compilation...
r72 }
florianlink
added enum wrapper classes derived from python int, so that enums are distinguishable from normal python integers. This will allow better overload handling e.g. of QColor constructors in the future...
r51 break;
case PythonQtMemberInfo::EnumWrapper:
florianlink
fixed VC8 compilation...
r72 {
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 PyObject* enumWrapper = member._enumWrapper;
Py_INCREF(enumWrapper);
return enumWrapper;
florianlink
fixed VC8 compilation...
r72 }
ezust
reorganized SVN tree into branches, tags and trunk...
r0 break;
florianlink
added support for dynamic properties...
r85 case PythonQtMemberInfo::NotFound:
florianlink
added initial support for public member variable access via getters/setters...
r113 {
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 static const QByteArray getterString("py_get_");
// check for a getter slot
PythonQtMemberInfo member = wrapper->classInfo()->member(getterString + attributeName);
florianlink
added initial support for public member variable access via getters/setters...
r113 if (member._type == PythonQtMemberInfo::Slot) {
return PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, member._slot, NULL, NULL, wrapper->_wrappedPtr);
}
// handle dynamic properties
if (wrapper->_obj) {
QVariant v = wrapper->_obj->property(attributeName);
if (v.isValid()) {
return PythonQtConv::QVariantToPyObject(v);
}
florianlink
added support for dynamic properties...
r85 }
}
break;
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 default:
// is an invalid type, go on
florianlink
- removed warnings...
r8 break;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
improved error handling on destroyed objects (since static access should still be possible)...
r78 // look for the internal methods (className(), help())
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
PyObject* internalMethod = PyObject_GenericGetAttr(obj, name);
#else
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PyObject* internalMethod = Py_FindMethod( PythonQtInstanceWrapper_methods, obj, (char*)attributeName);
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if (internalMethod) {
return internalMethod;
}
PyErr_Clear();
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 if (wrapper->_obj) {
// look for a child
QObjectList children = wrapper->_obj->children();
for (int i = 0; i < children.count(); i++) {
QObject *child = children.at(i);
if (child->objectName() == attributeName) {
florianlink
minor cleanup...
r81 return PythonQt::priv()->wrapQObject(child);
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 }
}
}
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 QString error = QString(wrapper->classInfo()->className()) + " has no attribute named '" + QString(attributeName) + "'";
ezust
reorganized SVN tree into branches, tags and trunk...
r0 PyErr_SetString(PyExc_AttributeError, error.toLatin1().data());
return NULL;
}
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static int PythonQtInstanceWrapper_setattro(PyObject *obj,PyObject *name,PyObject *value)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
QString error;
florianlink
added initial support for public member variable access via getters/setters...
r113 const char *attributeName;
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper *wrapper = (PythonQtInstanceWrapper *)obj;
florianlink
merged in features from the MeVisLab repository...
r4
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
if ((attributeName = PyUnicode_AsUTF8(name)) == NULL)
#else
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if ((attributeName = PyString_AsString(name)) == NULL)
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 return -1;
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 PythonQtMemberInfo member = wrapper->classInfo()->member(attributeName);
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if (member._type == PythonQtMemberInfo::Property) {
florianlink
moved check if a property can be set which was done to early...
r48
if (!wrapper->_obj) {
error = QString("Trying to set property '") + attributeName + "' on a destroyed " + wrapper->classInfo()->className() + " object";
PyErr_SetString(PyExc_AttributeError, error.toLatin1().data());
return -1;
}
florianlink
added support for operators and rich compare...
r119
ezust
reorganized SVN tree into branches, tags and trunk...
r0 QMetaProperty prop = member._property;
if (prop.isWritable()) {
QVariant v;
if (prop.isEnumType()) {
// this will give us either a string or an int, everything else will probably be an error
v = PythonQtConv::PyObjToQVariant(value);
} else {
int t = prop.userType();
v = PythonQtConv::PyObjToQVariant(value, t);
}
bool success = false;
if (v.isValid()) {
florianlink
updated to upstream state in MeVisLab repository...
r157 PythonQt::ProfilingCB* profilingCB = PythonQt::priv()->profilingCB();
if (profilingCB) {
QString methodName = "setProperty(";
methodName += attributeName;
methodName += ")";
profilingCB(PythonQt::Enter, wrapper->_obj->metaObject()->className(), methodName.toLatin1());
}
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 success = prop.write(wrapper->_obj, v);
florianlink
updated to upstream state in MeVisLab repository...
r157
if (profilingCB) {
profilingCB(PythonQt::Leave, NULL, NULL);
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
if (success) {
return 0;
} else {
error = QString("Property '") + attributeName + "' of type '" +
prop.typeName() + "' does not accept an object of type "
+ QString(value->ob_type->tp_name) + " (" + PythonQtConv::PyObjGetRepresentation(value) + ")";
}
} else {
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 error = QString("Property '") + attributeName + "' of " + obj->ob_type->tp_name + " object is not writable";
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 } else if (member._type == PythonQtMemberInfo::Slot) {
error = QString("Slot '") + attributeName + "' can not be overwritten on " + obj->ob_type->tp_name + " object";
florianlink
Updated from current MeVisLab development...
r173 } else if (member._type == PythonQtMemberInfo::Signal) {
error = QString("Signal '") + attributeName + "' can not be overwritten on " + obj->ob_type->tp_name + " object";
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 } else if (member._type == PythonQtMemberInfo::EnumValue) {
error = QString("EnumValue '") + attributeName + "' can not be overwritten on " + obj->ob_type->tp_name + " object";
florianlink
added enum wrapper classes derived from python int, so that enums are distinguishable from normal python integers. This will allow better overload handling e.g. of QColor constructors in the future...
r51 } else if (member._type == PythonQtMemberInfo::EnumWrapper) {
error = QString("Enum '") + attributeName + "' can not be overwritten on " + obj->ob_type->tp_name + " object";
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 } else if (member._type == PythonQtMemberInfo::NotFound) {
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 // check for a setter slot
florianlink
added support for operators and rich compare...
r119 static const QByteArray setterString("py_set_");
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 PythonQtMemberInfo setter = wrapper->classInfo()->member(setterString + attributeName);
florianlink
added initial support for public member variable access via getters/setters...
r113 if (setter._type == PythonQtMemberInfo::Slot) {
// call the setter and ignore the result value
void* result;
PyObject* args = PyTuple_New(1);
Py_INCREF(value);
PyTuple_SET_ITEM(args, 0, value);
PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, setter._slot, args, NULL, wrapper->_wrappedPtr, &result);
Py_DECREF(args);
return 0;
}
florianlink
added support for dynamic properties...
r85 // handle dynamic properties
if (wrapper->_obj) {
QVariant prop = wrapper->_obj->property(attributeName);
if (prop.isValid()) {
QVariant v = PythonQtConv::PyObjToQVariant(value);
if (v.isValid()) {
wrapper->_obj->setProperty(attributeName, v);
return 0;
} else {
error = QString("Dynamic property '") + attributeName + "' does not accept an object of type "
+ QString(value->ob_type->tp_name) + " (" + PythonQtConv::PyObjGetRepresentation(value) + ")";
PyErr_SetString(PyExc_AttributeError, error.toLatin1().data());
return -1;
}
}
}
florianlink
added support for operators and rich compare...
r119
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 // if we are a derived python class, we allow setting attributes.
// if we are a direct CPP wrapper, we do NOT allow it, since
// it would be confusing to allow it because a wrapper will go away when it is not seen by python anymore
// and when it is recreated from a CPP pointer the attributes are gone...
if (obj->ob_type->tp_base != &PythonQtInstanceWrapper_Type) {
return PyBaseObject_Type.tp_setattro(obj,name,value);
} else {
error = QString("'") + attributeName + "' does not exist on " + obj->ob_type->tp_name + " and creating new attributes on C++ objects is not allowed";
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
}
florianlink
merged in features from the MeVisLab repository...
r4
ezust
reorganized SVN tree into branches, tags and trunk...
r0 PyErr_SetString(PyExc_AttributeError, error.toLatin1().data());
return -1;
}
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 static QString getStringFromObject(PythonQtInstanceWrapper* wrapper) {
QString result;
if (wrapper->_wrappedPtr) {
// first try some manually string conversions for some variants
int metaid = wrapper->classInfo()->metaTypeId();
result = PythonQtConv::CPPObjectToString(metaid, wrapper->_wrappedPtr);
if (!result.isEmpty()) {
return result;
}
}
florianlink
Updated from current MeVisLab development...
r173 if (wrapper->_wrappedPtr || wrapper->_obj) {
// next, try to call py_toString
PythonQtMemberInfo info = wrapper->classInfo()->member("py_toString");
if (info._type == PythonQtMemberInfo::Slot) {
PyObject* resultObj = PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, info._slot, NULL, NULL, wrapper->_wrappedPtr);
if (resultObj) {
// TODO this is one conversion too much, would be nicer to call the slot directly...
result = PythonQtConv::PyObjGetString(resultObj);
Py_DECREF(resultObj);
}
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 }
}
return result;
}
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyObject * PythonQtInstanceWrapper_str(PyObject * obj)
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper* wrapper = (PythonQtInstanceWrapper*)obj;
florianlink
removed implicit conversion of QByteArray to python str, use str() to convert to Python string or QByteArray::data()...
r125
// QByteArray should be directly returned as a str
if (wrapper->classInfo()->metaTypeId()==QVariant::ByteArray) {
QByteArray* b = (QByteArray*) wrapper->_wrappedPtr;
if (b->data()) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromStringAndSize(b->data(), b->size());
#else
florianlink
removed implicit conversion of QByteArray to python str, use str() to convert to Python string or QByteArray::data()...
r125 return PyString_FromStringAndSize(b->data(), b->size());
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
removed implicit conversion of QByteArray to python str, use str() to convert to Python string or QByteArray::data()...
r125 } else {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_New(0, 0);
#else
florianlink
removed implicit conversion of QByteArray to python str, use str() to convert to Python string or QByteArray::data()...
r125 return PyString_FromString("");
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
removed implicit conversion of QByteArray to python str, use str() to convert to Python string or QByteArray::data()...
r125 }
}
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 const char* typeName = obj->ob_type->tp_name;
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 QObject *qobj = wrapper->_obj;
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 QString str = getStringFromObject(wrapper);
if (!str.isEmpty()) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s", str.toLatin1().constData());
#else
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 return PyString_FromFormat("%s", str.toLatin1().constData());
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 }
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 if (wrapper->_wrappedPtr) {
if (wrapper->_obj) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (C++ Object %p wrapped by %s %p)", typeName, wrapper->_wrappedPtr, wrapper->_obj->metaObject()->className(), qobj);
#else
return PyString_FromFormat("%s (C++ Object %p wrapped by %s %p)", typeName, wrapper->_wrappedPtr, wrapper->_obj->metaObject()->className(), qobj);
#endif
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 } else {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (C++ Object %p)", typeName, wrapper->_wrappedPtr);
#else
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 return PyString_FromFormat("%s (C++ Object %p)", typeName, wrapper->_wrappedPtr);
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 }
} else {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (QObject %p)", typeName, qobj);
#else
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 return PyString_FromFormat("%s (QObject %p)", typeName, qobj);
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 }
}
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyObject * PythonQtInstanceWrapper_repr(PyObject * obj)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper* wrapper = (PythonQtInstanceWrapper*)obj;
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 const char* typeName = obj->ob_type->tp_name;
florianlink
added support for operators and rich compare...
r119
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 QObject *qobj = wrapper->_obj;
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 QString str = getStringFromObject(wrapper);
if (!str.isEmpty()) {
if (str.startsWith(typeName)) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s", str.toLatin1().constData());
#else
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 return PyString_FromFormat("%s", str.toLatin1().constData());
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 } else {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (%s, at: %p)", typeName, str.toLatin1().constData(), wrapper->_wrappedPtr ? wrapper->_wrappedPtr : qobj);
#else
florianlink
updated to upstream state in MeVisLab repository...
r157 return PyString_FromFormat("%s (%s, at: %p)", typeName, str.toLatin1().constData(), wrapper->_wrappedPtr ? wrapper->_wrappedPtr : qobj);
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
adapted to new py_ naming of special methods and added support for py_toString...
r116 }
}
if (wrapper->_wrappedPtr) {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 if (wrapper->_obj) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (C++ object at: %p wrapped by %s at: %p)", typeName, wrapper->_wrappedPtr, wrapper->_obj->metaObject()->className(), qobj);
#else
florianlink
updated to upstream state in MeVisLab repository...
r157 return PyString_FromFormat("%s (C++ object at: %p wrapped by %s at: %p)", typeName, wrapper->_wrappedPtr, wrapper->_obj->metaObject()->className(), qobj);
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 } else {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (C++ object at: %p)", typeName, wrapper->_wrappedPtr);
#else
florianlink
updated to upstream state in MeVisLab repository...
r157 return PyString_FromFormat("%s (C++ object at: %p)", typeName, wrapper->_wrappedPtr);
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
} else {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromFormat("%s (%s at: %p)", typeName, wrapper->classInfo()->className(), qobj);
#else
florianlink
updated to upstream state in MeVisLab repository...
r157 return PyString_FromFormat("%s (%s at: %p)", typeName, wrapper->classInfo()->className(), qobj);
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
}
florianlink
added support for operators and rich compare...
r119 static int PythonQtInstanceWrapper_builtin_nonzero(PyObject *obj)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper* wrapper = (PythonQtInstanceWrapper*)obj;
return (wrapper->_wrappedPtr == NULL && wrapper->_obj == NULL)?0:1;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static long PythonQtInstanceWrapper_hash(PythonQtInstanceWrapper *obj)
florianlink
merged in features from the MeVisLab repository...
r4 {
if (obj->_wrappedPtr != NULL) {
return reinterpret_cast<long>(obj->_wrappedPtr);
} else {
QObject* qobj = obj->_obj; // get pointer from QPointer wrapper
return reinterpret_cast<long>(qobj);
}
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0 // we override nb_nonzero, so that one can do 'if' expressions to test for a NULL ptr
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyNumberMethods PythonQtInstanceWrapper_as_number = {
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_add */
0, /* nb_subtract */
0, /* nb_multiply */
Orochimarufan
Start Python 3.x Port...
r206 #ifndef PY3K
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_divide */
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_remainder */
0, /* nb_divmod */
0, /* nb_power */
0, /* nb_negative */
0, /* nb_positive */
0, /* nb_absolute */
Orochimarufan
Start Python 3.x Port...
r206 PythonQtInstanceWrapper_builtin_nonzero, /* nb_nonzero / nb_bool in Py3K */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_invert */
0, /* nb_lshift */
0, /* nb_rshift */
0, /* nb_and */
0, /* nb_xor */
0, /* nb_or */
Orochimarufan
Start Python 3.x Port...
r206 #ifndef PY3K
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_coerce */
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_int */
Orochimarufan
Start Python 3.x Port...
r206 0, /* nb_long / nb_reserved in Py3K */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_float */
Orochimarufan
Start Python 3.x Port...
r206 #ifndef PY3K
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_oct */
0, /* nb_hex */
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_inplace_add */
0, /* nb_inplace_subtract */
0, /* nb_inplace_multiply */
Orochimarufan
Start Python 3.x Port...
r206 #ifndef PY3K
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_inplace_divide */
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* nb_inplace_remainder */
0, /* nb_inplace_power */
0, /* nb_inplace_lshift */
0, /* nb_inplace_rshift */
0, /* nb_inplace_and */
0, /* nb_inplace_xor */
0, /* nb_inplace_or */
0, /* nb_floor_divide */
0, /* nb_true_divide */
0, /* nb_inplace_floor_divide */
0, /* nb_inplace_true_divide */
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
0, /* nb_index in Py3K */
#endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 };
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PyTypeObject PythonQtInstanceWrapper_Type = {
Orochimarufan
Start Python 3.x Port...
r206 PyVarObject_HEAD_INIT(&PythonQtClassWrapper_Type, 0)
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 "PythonQt.PythonQtInstanceWrapper", /*tp_name*/
sizeof(PythonQtInstanceWrapper), /*tp_basicsize*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_itemsize*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 (destructor)PythonQtInstanceWrapper_dealloc, /*tp_dealloc*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
florianlink
added support for operators and rich compare...
r119 0, /*tp_compare*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper_repr, /*tp_repr*/
&PythonQtInstanceWrapper_as_number, /*tp_as_number*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 (hashfunc)PythonQtInstanceWrapper_hash, /*tp_hash */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_call*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper_str, /*tp_str*/
PythonQtInstanceWrapper_getattro, /*tp_getattro*/
PythonQtInstanceWrapper_setattro, /*tp_setattro*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_as_buffer*/
Orochimarufan
Start Python 3.x Port...
r206 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE /*| Py_TPFLAGS_CHECKTYPES FIXME Py_TPFLAGS_CHECKTYPES removal */, /*tp_flags*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 "PythonQtInstanceWrapper object", /* tp_doc */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* tp_traverse */
0, /* tp_clear */
florianlink
added support for operators and rich compare...
r119 (richcmpfunc)PythonQtInstanceWrapper_richcompare, /* tp_richcompare */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 (initproc)PythonQtInstanceWrapper_init, /* tp_init */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* tp_alloc */
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtInstanceWrapper_new, /* tp_new */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 };
//-------------------------------------------------------