@@ -85,73 +85,78 @@ PyObject* EffectModule::json2python(const QJsonValue& jsonData)
8585{
8686 switch (jsonData.type ())
8787 {
88- case QJsonValue::Null:
89- Py_RETURN_NONE;
88+ case QJsonValue::Null:
89+ Py_RETURN_NONE;
9090
91- case QJsonValue::Undefined:
92- Py_RETURN_NOTIMPLEMENTED;
91+ case QJsonValue::Undefined:
92+ Py_RETURN_NOTIMPLEMENTED;
9393
94- case QJsonValue::Double:
95- {
96- double value = jsonData.toDouble ();
97- if (value == static_cast <int >(value)) // If no fractional part, value is equal to its integer representation
94+ case QJsonValue::Double:
9895 {
99- return Py_BuildValue (" i" , static_cast <int >(value));
96+ double value = jsonData.toDouble ();
97+ if (value == static_cast <int >(value)) // If no fractional part, value is equal to its integer representation
98+ {
99+ return Py_BuildValue (" i" , static_cast <int >(value));
100+ }
101+ return Py_BuildValue (" d" , value);
100102 }
101- return Py_BuildValue (" d" , value);
102- }
103103
104- case QJsonValue::Bool:
105- return PyBool_FromLong (jsonData.toBool () ? 1 : 0 );
104+ case QJsonValue::Bool:
105+ return PyBool_FromLong (jsonData.toBool () ? 1 : 0 );
106106
107- case QJsonValue::String:
108- return PyUnicode_FromString (jsonData.toString ().toUtf8 ().constData ());
107+ case QJsonValue::String:
108+ return PyUnicode_FromString (jsonData.toString ().toUtf8 ().constData ());
109109
110- case QJsonValue::Array:
111- {
112- QJsonArray arrayData = jsonData.toArray ();
113- PyObject* list = PyList_New (arrayData.size ());
114- int index = 0 ;
115- for (QJsonArray::iterator i = arrayData.begin (); i != arrayData.end (); ++i, ++index)
110+ case QJsonValue::Array:
116111 {
117- PyObject* obj = json2python (*i);
118- Py_INCREF (obj);
119- PyList_SetItem (list, index, obj);
120- Py_XDECREF (obj);
112+ QJsonArray arrayData = jsonData.toArray ();
113+ PyObject* list = PyList_New (arrayData.size ());
114+ int index = 0 ;
115+ for (QJsonArray::iterator i = arrayData.begin (); i != arrayData.end (); ++i, ++index)
116+ {
117+ PyObject* obj = json2python (*i);
118+ if (!obj)
119+ {
120+ Py_XDECREF (list);
121+ return nullptr ; // Error occurred, return null
122+ }
123+ PyList_SetItem (list, index, obj);
124+ }
125+ return list;
121126 }
122- return list;
123- }
124127
125- case QJsonValue::Object: {
126- // Python's dict
127- QJsonObject jsonObject = jsonData.toObject ();
128- PyObject* pyDict = PyDict_New ();
129- for (auto it = jsonObject.begin (); it != jsonObject.end (); ++it) {
130- // Convert key
131- PyObject* pyKey = PyUnicode_FromString (it.key ().toUtf8 ().constData ());
132- if (!pyKey) {
133- Py_XDECREF (pyDict);
134- return nullptr ; // Error occurred, return null
135- }
136- // Convert value
137- PyObject* pyValue = json2python (it.value ());
138- if (!pyValue) {
139- Py_XDECREF (pyKey);
140- Py_XDECREF (pyDict);
141- return nullptr ; // Error occurred, return null
128+ case QJsonValue::Object:
129+ {
130+ // Python's dict
131+ QJsonObject jsonObject = jsonData.toObject ();
132+ PyObject* pyDict = PyDict_New ();
133+ for (auto it = jsonObject.begin (); it != jsonObject.end (); ++it)
134+ {
135+ // Convert key
136+ PyObject* pyKey = PyUnicode_FromString (it.key ().toUtf8 ().constData ());
137+ if (!pyKey)
138+ {
139+ Py_XDECREF (pyDict);
140+ return nullptr ; // Error occurred, return null
141+ }
142+ // Convert value
143+ PyObject* pyValue = json2python (it.value ());
144+ if (!pyValue)
145+ {
146+ Py_XDECREF (pyKey);
147+ Py_XDECREF (pyDict);
148+ return nullptr ; // Error occurred, return null
149+ }
150+ // Add to dictionary
151+ PyDict_SetItem (pyDict, pyKey, pyValue);
142152 }
143- // Add to dictionary
144- PyDict_SetItem (pyDict, pyKey, pyValue);
145- Py_XDECREF (pyKey);
146- Py_XDECREF (pyValue);
153+ return pyDict;
147154 }
148- return pyDict;
149- }
150155
151- default :
152- // Unsupported type
153- PyErr_SetString (PyExc_TypeError, " Unsupported QJsonValue type." );
154- return nullptr ;
156+ default :
157+ // Unsupported type
158+ PyErr_SetString (PyExc_TypeError, " Unsupported QJsonValue type." );
159+ return nullptr ;
155160 }
156161
157162 assert (false );
@@ -349,6 +354,7 @@ PyObject* EffectModule::wrapGetImage(PyObject* self, PyObject* args)
349354 if (reader.canRead ())
350355 {
351356 PyObject* result = PyList_New (reader.imageCount ());
357+ if (!result) return nullptr ;
352358
353359 for (int i = 0 ; i < reader.imageCount (); ++i)
354360 {
@@ -363,6 +369,7 @@ PyObject* EffectModule::wrapGetImage(PyObject* self, PyObject* args)
363369 {
364370 if (cropLeft + cropRight >= width || cropTop + cropBottom >= height)
365371 {
372+ Py_DECREF (result);
366373 QString errorStr = QString (" Rejecting invalid crop values: left: %1, right: %2, top: %3, bottom: %4, higher than height/width %5/%6" ).arg (cropLeft).arg (cropRight).arg (cropTop).arg (cropBottom).arg (height).arg (width);
367374 PyErr_SetString (PyExc_RuntimeError, qPrintable (errorStr));
368375 return nullptr ;
@@ -386,10 +393,28 @@ PyObject* EffectModule::wrapGetImage(PyObject* self, PyObject* args)
386393 *dest++ = static_cast <char >(!grayscale ? qBlue (pixel) : qGray (pixel));
387394 }
388395 }
389- PyList_SET_ITEM (result, i, Py_BuildValue (" {s:i,s:i,s:O}" , " imageWidth" , width, " imageHeight" , height, " imageData" , PyByteArray_FromStringAndSize (binaryImage.constData (), binaryImage.size ())));
396+
397+ PyObject* pyBytes = PyByteArray_FromStringAndSize (binaryImage.constData (), binaryImage.size ());
398+ if (!pyBytes)
399+ {
400+ Py_DECREF (result);
401+ return nullptr ;
402+ }
403+
404+ PyObject* dict = Py_BuildValue (" {s:i,s:i,s:O}" , " imageWidth" , width, " imageHeight" , height, " imageData" , pyBytes);
405+ Py_DECREF (pyBytes);
406+
407+ if (!dict)
408+ {
409+ Py_DECREF (result);
410+ return nullptr ;
411+ }
412+
413+ PyList_SET_ITEM (result, i, dict);
390414 }
391415 else
392416 {
417+ Py_DECREF (result);
393418 PyErr_SetString (PyExc_TypeError, reader.errorString ().toUtf8 ().constData ());
394419 return nullptr ;
395420 }
0 commit comments