Exemple #1
0
int object_as_write_buffer(PyObject *obj, void ** buffer, Py_ssize_t * buffer_len) {
    Py_buffer *wpybuf;
    if (PyMemoryView_Check(obj)) {
        wpybuf = PyMemoryView_GET_BUFFER(obj);
		if (wpybuf->buf==NULL)
			return 1;
        buffer[0] = wpybuf->buf;
        return 0;
    }
    return PyObject_AsWriteBuffer(obj, buffer, buffer_len);
}
Exemple #2
0
int object_as_buffer(PyObject *obj, const void ** buffer, Py_ssize_t * buffer_len) {
    Py_buffer *rpybuf;
    if (PyMemoryView_Check(obj)) {
        rpybuf = PyMemoryView_GET_BUFFER(obj);
        if (rpybuf->buf==NULL)
        	return 1;
        buffer[0] = rpybuf->buf;
        return 0;
    }
    return PyObject_AsReadBuffer(obj, buffer, buffer_len);
}
inline bool
setViaBuffer(jarray array, int start, uint length, PyObject* sequence, setFnc setter) {
	//creates a PyMemoryView from sequence check for typeError,
	// if no underlying py_buff exists.
    if(! PyObject_CheckBuffer(sequence)) {
        return false;
    }

    // ensure memory is contiguous and 'C' ordered, this may involve a copy.
    PyObject* memview = PyMemoryView_GetContiguous(sequence, PyBUF_READ, 'C');
    // this function is defined in jpype_memory_view, but unusable?!
//    PyObject* memview = PyMemoryView_FromObject(sequence);

    // check for TypeError, if no underlying py_buff exists.
	PyObject* err = PyErr_Occurred();
	if (err) {
	    PyErr_Clear();
	    return false;
	}

	// create a memory view
	Py_buffer* py_buff = PyMemoryView_GET_BUFFER(memview);

    // ensure length of buffer contains enough elements somehow.
    if ((py_buff->len / sizeof(jelementtype)) != length) {
        std::stringstream ss;
        ss << "Underlying buffer does not contain requested number of elements! Has "
           << py_buff->len << ", but " << length <<" are requested. Element size is "
           << sizeof(jelementtype);
        RAISE(JPypeException, ss.str());
    }

    jarraytype a = (jarraytype)array;
    jelementtype* buffer = (jelementtype*) py_buff->buf;
    JPJavaEnv* env = JPEnv::getJava();

    try {
        (env->*setter)(a, start, length, buffer);
    } RETHROW_CATCH( /*cleanup*/ Py_DECREF(py_buff); Py_DECREF(memview); );