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); }
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); );