Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 10 additions & 25 deletions src/PythonQtConversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,24 +592,21 @@ void* PythonQtConv::ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& i
{
QByteArray bytes = PyObjGetBytesAllowString(obj, strict, ok);
if (ok) {
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame, QVariant(bytes), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
ptr = ConversionUtils::getPtrAndUpdateCppObject<QByteArray>(alreadyAllocatedCPPObject, frame, bytes);
}
} break;
case QMetaType::QString:
{
QString str = PyObjGetString(obj, strict, ok);
if (ok) {
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame, QVariant(str), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
ptr = ConversionUtils::getPtrAndUpdateCppObject<QString>(alreadyAllocatedCPPObject, frame, str);
}
} break;
case QMetaType::QStringList:
{
QStringList l = PyObjToStringList(obj, strict, ok);
if (ok) {
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame, QVariant(l), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
ptr = ConversionUtils::getPtrAndUpdateCppObject<QStringList>(alreadyAllocatedCPPObject, frame, l);
}
} break;

Expand Down Expand Up @@ -649,7 +646,7 @@ void* PythonQtConv::ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& i
QString str = PyObjGetString(obj, strict, ok);
if (ok) {
void* ptr2 = nullptr;
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(nullptr, frame, QVariant(str), ptr2);
PythonQtArgumentFrame_ADD_VARIANT_VALUE(frame, QVariant(str), ptr2);
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame,
QVariant::fromValue(QStringRef((const QString*)((QVariant*)ptr2)->constData())), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
Expand All @@ -663,38 +660,26 @@ void* PythonQtConv::ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& i
// Handle QStringView, which needs a reference to a persistent QString
QString str = PyObjGetString(obj, strict, ok);
if (ok) {
void* ptr2 = nullptr;
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(nullptr, frame, QVariant(str), ptr2);
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame,
QVariant::fromValue(QStringView(*((const QString*)((QVariant*)ptr2)->constData()))), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
return ptr;
return ConversionUtils::getPtrAndUpdateCppViewObject<QString, QStringView>(alreadyAllocatedCPPObject, frame,
str);
} else {
return nullptr;
}
} else if (info.typeId == anyStringViewTypeId) {
// Handle QAnyStringView, which needs a reference to a persistent QString
QString str = PyObjGetString(obj, strict, ok);
if (ok) {
void* ptr2 = nullptr;
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(nullptr, frame, QVariant(str), ptr2);
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame,
QVariant::fromValue(QAnyStringView(*((const QString*)((QVariant*)ptr2)->constData()))), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
return ptr;
return ConversionUtils::getPtrAndUpdateCppViewObject<QString, QAnyStringView>(alreadyAllocatedCPPObject,
frame, str);
} else {
return nullptr;
}
} else if (info.typeId == byteArrayViewTypeId) {
// Handle QByteArrayView, which needs a reference to a persistent QByteArray
QByteArray ba = PyObjGetBytesAllowString(obj, strict, ok);
if (ok) {
void* ptr2 = nullptr;
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(nullptr, frame, QVariant(ba), ptr2);
PythonQtArgumentFrame_ADD_VARIANT_VALUE_IF_NEEDED(alreadyAllocatedCPPObject, frame,
QVariant::fromValue(QByteArrayView(*((const QByteArray*)((QVariant*)ptr2)->constData()))), ptr);
ptr = (void*)((QVariant*)ptr)->constData();
return ptr;
return ConversionUtils::getPtrAndUpdateCppViewObject<QByteArray, QByteArrayView>(alreadyAllocatedCPPObject,
frame, ba);
} else {
return nullptr;
}
Expand Down
1 change: 1 addition & 0 deletions src/PythonQtConversion.h
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ class PYTHONQT_EXPORT PythonQtConv
static PyObject* ConvertQtValueToPython(const PythonQtMethodInfo::ParameterInfo& info, const void* data);

//! convert python object to Qt (according to the given parameter) and if the conversion should be strict (classInfo is currently not used anymore)
//! If an alreadyAllocatedCPPObject is used it must have the same type as given by info.typeId
static void* ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& info, PyObject* obj, bool strict,
PythonQtClassInfo* classInfo, void* alreadyAllocatedCPPObject, PythonQtArgumentFrame* frame = nullptr);

Expand Down
31 changes: 31 additions & 0 deletions src/PythonQtMisc.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,4 +133,35 @@ class PythonQtArgumentFrame
static PythonQtArgumentFrame* _freeListHead;
};

namespace ConversionUtils {
template<typename Class>
void* getPtrAndUpdateCppObject(void* alreadyAllocatedPtr, PythonQtArgumentFrame* store, const Class& value)
{
if (alreadyAllocatedPtr) {
*reinterpret_cast<Class*>(alreadyAllocatedPtr) = value;
return alreadyAllocatedPtr;
} else {
QVariant* item = store->nextVariantPtr();
*item = QVariant(value);
return const_cast<void*>(item->constData());
}
}

template<typename Class, typename ViewClass>
void* getPtrAndUpdateCppViewObject(void* alreadyAllocatedPtr, PythonQtArgumentFrame* store, const Class& value)
{
QVariant* itemStore = store->nextVariantPtr();
*itemStore = QVariant(value);
if (alreadyAllocatedPtr) {
*reinterpret_cast<ViewClass*>(alreadyAllocatedPtr) =
ViewClass(*reinterpret_cast<const Class*>(itemStore->constData()));
return alreadyAllocatedPtr;
} else {
QVariant* item = store->nextVariantPtr();
*item = QVariant::fromValue(ViewClass(*reinterpret_cast<const Class*>(itemStore->constData())));
return const_cast<void*>(item->constData());
}
}
}

#endif