static inline bool wxPointFromObjects(PyObject* o1, PyObject* o2, wxPoint* point) { if (PyInt_Check(o1) && PyInt_Check(o2)) { point->x = PyInt_AS_LONG(o1); point->y = PyInt_AS_LONG(o2); return true; } if (PyFloat_Check(o1) && PyFloat_Check(o2)) { point->x = (int)PyFloat_AS_DOUBLE(o1); point->y = (int)PyFloat_AS_DOUBLE(o2); return true; } if (PyInstance_Check(o1) || PyInstance_Check(o2)) { // Disallow instances because they can cause havok return false; } if (PyNumber_Check(o1) && PyNumber_Check(o2)) { point->x = PyInt_AsLong(o1); point->y = PyInt_AsLong(o2); return true; } return false; } wxPoint* wxPoint_LIST_helper(PyObject* source, int *count) { // Putting all of the declarations here allows // us to put the error handling all in one place. int x; wxPoint* temp; PyObject *o, *o1, *o2; int isFast = PyList_Check(source) || PyTuple_Check(source); // The length of the sequence is returned in count. if (!PySequence_Check(source)) {goto error0;} *count = PySequence_Length(source); if (*count < 0) {goto error0;} temp = new wxPoint[*count]; if (!temp) { PyErr_SetString(PyExc_MemoryError, "Unable to allocate temporary array"); return NULL; } for (x=0; x<*count; x++) { // Get an item: try fast way first. if (isFast) { o = PySequence_Fast_GET_ITEM(source, x); } else { o = PySequence_GetItem(source, x); if (o == NULL) {goto error1;} } // Convert o to wxPoint. if ((PyTuple_Check(o) && PyTuple_GET_SIZE(o) == 2) || (PyList_Check(o) && PyList_GET_SIZE(o) == 2)) { o1 = PySequence_Fast_GET_ITEM(o, 0); o2 = PySequence_Fast_GET_ITEM(o, 1); if (!wxPointFromObjects(o1, o2, &temp[x])) {goto error2;} } else if (PyInstance_Check(o)) { wxPoint* pt; if (SWIG_GetPtrObj(o, (void **)&pt, "_wxPoint_p")) {goto error2;} temp[x] = *pt; } else if (PySequence_Check(o) && PySequence_Length(o) == 2) { o1 = PySequence_GetItem(o, 0); o2 = PySequence_GetItem(o, 1); if (!wxPointFromObjects(o1, o2, &temp[x])) {goto error3;} Py_DECREF(o1); Py_DECREF(o2); } else {goto error2;} // Clean up. if (!isFast) Py_DECREF(o); } return temp; error3: Py_DECREF(o1); Py_DECREF(o2); error2: if (!isFast) Py_DECREF(o); error1: delete temp; error0: PyErr_SetString(PyExc_TypeError, "Expected a sequence of length-2 sequences or wxPoints."); return NULL; }