Exemple #1
0
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();
}
Exemple #2
0
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;
}
Exemple #3
0
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();
}
Exemple #4
0
void throw_not_owned() {
  PyErr_SetString(PyExc_ValueError,"arrays which don't own their data can't be converted to python");
  throw PythonError();
}