void add_descriptor(PyTypeObject* type, const char* name, PyObject* descr) { if (PyDict_GetItemString(type->tp_dict,name)) PyErr_Format(PyExc_TypeError,"Descriptor '%s.%s' already specified for class",type->tp_name,name); else if (!PyDict_SetItemString(type->tp_dict,name,descr)) return; Py_DECREF(descr); throw PythonError(); }
PyObject* wrap_method_helper(PyTypeObject* type,const char* name,wrapperfunc wrapper,void* method) { // Allocate wrapperbase wrapperbase* base = (wrapperbase*)malloc(sizeof(wrapperbase)); if (!base) throw std::bad_alloc(); memset(base,0,sizeof(wrapperbase)); // Fill in fields base->name = (char*)name; base->wrapper = wrapper; base->flags = 0; // no keyword args // Allocate wrapper PyObject* descr = PyDescr_NewWrapper(type,base,method); if (!descr) throw PythonError(); return descr; }
void throw_array_conversion_error(PyObject* object, int flags, int rank_range, PyArray_Descr* descr) { if (!PyArray_Check(object)) PyErr_Format(PyExc_TypeError, "expected numpy array, got %s", object->ob_type->tp_name); else if (!PyArray_EquivTypes(PyArray_DESCR((PyArrayObject*)object), descr)) PyErr_Format(PyExc_TypeError, "expected array type %s, got %s", descr->typeobj->tp_name, PyArray_DESCR((PyArrayObject*)object)->typeobj->tp_name); else if (!PyArray_CHKFLAGS((PyArrayObject*)object,flags)){ if (flags&NPY_ARRAY_WRITEABLE && !PyArray_ISWRITEABLE((PyArrayObject*)object)) PyErr_SetString(PyExc_TypeError, "unwriteable array"); else if (flags&NPY_ARRAY_ALIGNED && !PyArray_ISALIGNED((PyArrayObject*)object)) PyErr_SetString(PyExc_TypeError, "unaligned array"); else if (flags&NPY_ARRAY_C_CONTIGUOUS && !PyArray_ISCONTIGUOUS((PyArrayObject*)object)) PyErr_SetString(PyExc_TypeError, "noncontiguous array"); else PyErr_SetString(PyExc_TypeError, "unknown array flag mismatch");} else if (rank_range>=0) PyErr_Format(PyExc_ValueError, "expected rank %d, got %d", rank_range, PyArray_NDIM((PyArrayObject*)object)); else PyErr_Format(PyExc_ValueError, "expected rank at least %d, got %d", -rank_range-1, PyArray_NDIM((PyArrayObject*)object)); throw PythonError(); }
void throw_not_owned() { PyErr_SetString(PyExc_ValueError,"arrays which don't own their data can't be converted to python"); throw PythonError(); }