aboutsummaryrefslogtreecommitdiffstats
path: root/sources/shiboken2/libshiboken/voidptr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/shiboken2/libshiboken/voidptr.cpp')
-rw-r--r--sources/shiboken2/libshiboken/voidptr.cpp481
1 files changed, 0 insertions, 481 deletions
diff --git a/sources/shiboken2/libshiboken/voidptr.cpp b/sources/shiboken2/libshiboken/voidptr.cpp
deleted file mode 100644
index d4ce58c87..000000000
--- a/sources/shiboken2/libshiboken/voidptr.cpp
+++ /dev/null
@@ -1,481 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt for Python.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "voidptr.h"
-#include "sbkconverter.h"
-#include "basewrapper.h"
-#include "basewrapper_p.h"
-
-extern "C"
-{
-
-// Void pointer object definition.
-typedef struct {
- PyObject_HEAD
- void *cptr;
- Py_ssize_t size;
- bool isWritable;
-} SbkVoidPtrObject;
-
-PyObject *SbkVoidPtrObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- // PYSIDE-560: It is much safer to first call a function and then do a
- // type cast than to do everything in one line. The bad construct looked
- // like this, actual call forgotten:
- // SbkVoidPtrObject *self =
- // reinterpret_cast<SbkVoidPtrObject *>(type->tp_alloc);
- PyObject *ob = type->tp_alloc(type, 0);
- auto *self = reinterpret_cast<SbkVoidPtrObject *>(ob);
-
- if (self != nullptr) {
- self->cptr = nullptr;
- self->size = -1;
- self->isWritable = false;
- }
-
- return reinterpret_cast<PyObject *>(self);
-}
-
-#define SbkVoidPtr_Check(op) (Py_TYPE(op) == SbkVoidPtrTypeF())
-
-
-int SbkVoidPtrObject_init(PyObject *self, PyObject *args, PyObject *kwds)
-{
- PyObject *addressObject;
- Py_ssize_t size = -1;
- int isWritable = 0;
- auto *sbkSelf = reinterpret_cast<SbkVoidPtrObject *>(self);
-
- static const char *kwlist[] = {"address", "size", "writeable", nullptr};
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|ni", const_cast<char **>(kwlist),
- &addressObject, &size, &isWritable))
- return -1;
-
- // Void pointer.
- if (SbkVoidPtr_Check(addressObject)) {
- auto *sbkOther = reinterpret_cast<SbkVoidPtrObject *>(addressObject);
- sbkSelf->cptr = sbkOther->cptr;
- sbkSelf->size = sbkOther->size;
- sbkSelf->isWritable = sbkOther->isWritable;
- }
- // Python buffer interface.
- else if (PyObject_CheckBuffer(addressObject)) {
- Py_buffer bufferView;
-
- // Bail out if the object can't provide a simple contiguous buffer.
- if (PyObject_GetBuffer(addressObject, &bufferView, PyBUF_SIMPLE) < 0)
- return 0;
-
- sbkSelf->cptr = bufferView.buf;
- sbkSelf->size = bufferView.len > 0 ? bufferView.len : size;
- sbkSelf->isWritable = bufferView.readonly <= 0;
-
- // Release the buffer.
- PyBuffer_Release(&bufferView);
- }
- // Shiboken::Object wrapper.
- else if (Shiboken::Object::checkType(addressObject)) {
- auto *sbkOther = reinterpret_cast<SbkObject *>(addressObject);
- sbkSelf->cptr = sbkOther->d->cptr[0];
- sbkSelf->size = size;
- sbkSelf->isWritable = isWritable > 0;
- }
- // An integer representing an address.
- else {
- if (addressObject == Py_None) {
- sbkSelf->cptr = nullptr;
- sbkSelf->size = 0;
- sbkSelf->isWritable = false;
- }
-
- else {
- void *cptr = PyLong_AsVoidPtr(addressObject);
- if (PyErr_Occurred()) {
- PyErr_SetString(PyExc_TypeError,
- "Creating a VoidPtr object requires an address of a C++ object, "
- "a wrapped Shiboken Object type, "
- "an object implementing the Python Buffer interface, "
- "or another VoidPtr object.");
- return -1;
- }
- sbkSelf->cptr = cptr;
- sbkSelf->size = size;
- sbkSelf->isWritable = isWritable > 0;
- }
- }
-
- return 0;
-}
-
-PyObject *SbkVoidPtrObject_richcmp(PyObject *obj1, PyObject *obj2, int op)
-{
- PyObject *result = Py_False;
- void *cptr1 = nullptr;
- void *cptr2 = nullptr;
- bool validObjects = true;
-
- if (SbkVoidPtr_Check(obj1))
- cptr1 = reinterpret_cast<SbkVoidPtrObject *>(obj1)->cptr;
- else
- validObjects = false;
-
- if (SbkVoidPtr_Check(obj2))
- cptr2 = reinterpret_cast<SbkVoidPtrObject *>(obj2)->cptr;
- else
- validObjects = false;
-
- if (validObjects) {
- switch (op) {
- case Py_EQ: if (cptr1 == cptr2) result = Py_True; break;
- case Py_NE: if (cptr1 != cptr2) result = Py_True; break;
- case Py_LT: break;
- case Py_LE: break;
- case Py_GT: break;
- case Py_GE: break;
- }
- }
-
- Py_INCREF(result);
- return result;
-}
-
-PyObject *SbkVoidPtrObject_int(PyObject *v)
-{
- auto *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(v);
- return PyLong_FromVoidPtr(sbkObject->cptr);
-}
-
-PyObject *toBytes(PyObject *self, PyObject *args)
-{
- auto *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(self);
- if (sbkObject->size < 0) {
- PyErr_SetString(PyExc_IndexError, "VoidPtr does not have a size set.");
- return nullptr;
- }
- PyObject *bytes = PyBytes_FromStringAndSize(reinterpret_cast<const char *>(sbkObject->cptr),
- sbkObject->size);
- Py_XINCREF(bytes);
- return bytes;
-}
-
-static struct PyMethodDef SbkVoidPtrObject_methods[] = {
- {"toBytes", toBytes, METH_NOARGS},
- {nullptr}
-};
-
-static Py_ssize_t SbkVoidPtrObject_length(PyObject *v)
-{
- auto *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(v);
- if (sbkObject->size < 0) {
- PyErr_SetString(PyExc_IndexError, "VoidPtr does not have a size set.");
- return -1;
- }
-
- return sbkObject->size;
-}
-
-static const char trueString[] = "True" ;
-static const char falseString[] = "False" ;
-
-PyObject *SbkVoidPtrObject_repr(PyObject *v)
-{
-
-
- auto *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(v);
- #ifdef IS_PY3K
- PyObject *s = PyUnicode_FromFormat("%s(%p, %zd, %s)",
- #else
- PyObject *s = PyBytes_FromFormat("%s(%p, %zd, %s)",
- #endif
- Py_TYPE(sbkObject)->tp_name,
- sbkObject->cptr,
- sbkObject->size,
- sbkObject->isWritable ? trueString : falseString);
- Py_XINCREF(s);
- return s;
-}
-
-PyObject *SbkVoidPtrObject_str(PyObject *v)
-{
- auto *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(v);
- #ifdef IS_PY3K
- PyObject *s = PyUnicode_FromFormat("%s(Address %p, Size %zd, isWritable %s)",
- #else
- PyObject *s = PyBytes_FromFormat("%s(Address %p, Size %zd, isWritable %s)",
- #endif
- Py_TYPE(sbkObject)->tp_name,
- sbkObject->cptr,
- sbkObject->size,
- sbkObject->isWritable ? trueString : falseString);
- Py_XINCREF(s);
- return s;
-}
-
-
-static int SbkVoidPtrObject_getbuffer(PyObject *obj, Py_buffer *view, int flags)
-{
- if (view == nullptr)
- return -1;
-
- auto *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(obj);
- if (sbkObject->size < 0)
- return -1;
-
- int readonly = sbkObject->isWritable ? 0 : 1;
- if (((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) &&
- (readonly == 1)) {
- PyErr_SetString(PyExc_BufferError,
- "Object is not writable.");
- return -1;
- }
-
- view->obj = obj;
- if (obj)
- Py_XINCREF(obj);
- view->buf = sbkObject->cptr;
- view->len = sbkObject->size;
- view->readonly = readonly;
- view->itemsize = 1;
- view->format = nullptr;
- if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
- view->format = const_cast<char *>("B");
- view->ndim = 1;
- view->shape = nullptr;
- if ((flags & PyBUF_ND) == PyBUF_ND)
- view->shape = &(view->len);
- view->strides = nullptr;
- if ((flags & PyBUF_STRIDES) == PyBUF_STRIDES)
- view->strides = &(view->itemsize);
- view->suboffsets = nullptr;
- view->internal = nullptr;
- return 0;
-}
-
-#if PY_VERSION_HEX < 0x03000000
-
-static Py_ssize_t SbkVoidPtrObject_readbufferproc(PyObject *self, Py_ssize_t segment, void **ptrptr)
-{
- if (segment || !Shiboken::Object::isValid(self))
- return -1;
-
- SbkVoidPtrObject *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(self);
- *ptrptr = reinterpret_cast<void *>(sbkObject->cptr);
- return sbkObject->size;
-}
-
-static Py_ssize_t SbkVoidPtrObject_segcountproc(PyObject *self, Py_ssize_t *lenp)
-{
- if (lenp) {
- SbkVoidPtrObject *sbkObject = reinterpret_cast<SbkVoidPtrObject *>(self);
- *lenp = sbkObject->size;
- }
- return 1;
-}
-
-PyBufferProcs SbkVoidPtrObjectBufferProc = {
- &SbkVoidPtrObject_readbufferproc, // bf_getreadbuffer
- (writebufferproc)&SbkVoidPtrObject_readbufferproc, // bf_getwritebuffer
- &SbkVoidPtrObject_segcountproc, // bf_getsegcount
- (charbufferproc)&SbkVoidPtrObject_readbufferproc, // bf_getcharbuffer
- (getbufferproc)SbkVoidPtrObject_getbuffer, // bf_getbuffer
-};
-
-#else
-
-static PyBufferProcs SbkVoidPtrObjectBufferProc = {
- (getbufferproc)SbkVoidPtrObject_getbuffer, // bf_getbuffer
- (releasebufferproc)nullptr // bf_releasebuffer
-};
-
-#endif
-
-// Void pointer type definition.
-static PyType_Slot SbkVoidPtrType_slots[] = {
- {Py_tp_repr, (void *)SbkVoidPtrObject_repr},
- {Py_nb_int, (void *)SbkVoidPtrObject_int},
- {Py_sq_length, (void *)SbkVoidPtrObject_length},
- {Py_tp_str, (void *)SbkVoidPtrObject_str},
- {Py_tp_richcompare, (void *)SbkVoidPtrObject_richcmp},
- {Py_tp_init, (void *)SbkVoidPtrObject_init},
- {Py_tp_new, (void *)SbkVoidPtrObject_new},
- {Py_tp_dealloc, (void *)object_dealloc},
- {Py_tp_methods, (void *)SbkVoidPtrObject_methods},
- {0, nullptr}
-};
-static PyType_Spec SbkVoidPtrType_spec = {
- "shiboken2.libshiboken.VoidPtr",
- sizeof(SbkVoidPtrObject),
- 0,
- Py_TPFLAGS_DEFAULT,
- SbkVoidPtrType_slots,
-};
-
-
-}
-
-PyTypeObject *SbkVoidPtrTypeF(void)
-{
- static PyTypeObject *type = nullptr;
- if (!type)
- type = reinterpret_cast<PyTypeObject *>(PyType_FromSpec(&SbkVoidPtrType_spec));
-
-#if PY_VERSION_HEX < 0x03000000
- type->tp_as_buffer = &SbkVoidPtrObjectBufferProc;
- type->tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER;
-#else
- PepType_AS_BUFFER(type) = &SbkVoidPtrObjectBufferProc;
-#endif
-
- return type;
-}
-
-namespace VoidPtr {
-
-static int voidPointerInitialized = false;
-
-void init()
-{
- if (PyType_Ready(reinterpret_cast<PyTypeObject *>(SbkVoidPtrTypeF())) < 0)
- Py_FatalError("[libshiboken] Failed to initialize Shiboken.VoidPtr type.");
- else
- voidPointerInitialized = true;
-}
-
-void addVoidPtrToModule(PyObject *module)
-{
- if (voidPointerInitialized) {
- Py_INCREF(SbkVoidPtrTypeF());
- PyModule_AddObject(module, PepType_GetNameStr(SbkVoidPtrTypeF()),
- reinterpret_cast<PyObject *>(SbkVoidPtrTypeF()));
- }
-}
-
-static PyObject *createVoidPtr(void *cppIn, Py_ssize_t size = 0, bool isWritable = false)
-{
- if (!cppIn)
- Py_RETURN_NONE;
-
- SbkVoidPtrObject *result = PyObject_New(SbkVoidPtrObject, SbkVoidPtrTypeF());
- if (!result)
- Py_RETURN_NONE;
-
- result->cptr = cppIn;
- result->size = size;
- result->isWritable = isWritable;
-
- return reinterpret_cast<PyObject *>(result);
-}
-
-static PyObject *toPython(const void *cppIn)
-{
- return createVoidPtr(const_cast<void *>(cppIn));
-}
-
-static void VoidPtrToCpp(PyObject *pyIn, void *cppOut)
-{
- auto *sbkIn = reinterpret_cast<SbkVoidPtrObject *>(pyIn);
- *reinterpret_cast<void **>(cppOut) = sbkIn->cptr;
-}
-
-static PythonToCppFunc VoidPtrToCppIsConvertible(PyObject *pyIn)
-{
- return SbkVoidPtr_Check(pyIn) ? VoidPtrToCpp : nullptr;
-}
-
-static void SbkObjectToCpp(PyObject *pyIn, void *cppOut)
-{
- auto *sbkIn = reinterpret_cast<SbkObject *>(pyIn);
- *reinterpret_cast<void **>(cppOut) = sbkIn->d->cptr[0];
-}
-
-static PythonToCppFunc SbkObjectToCppIsConvertible(PyObject *pyIn)
-{
- return Shiboken::Object::checkType(pyIn) ? SbkObjectToCpp : nullptr;
-}
-
-static void PythonBufferToCpp(PyObject *pyIn, void *cppOut)
-{
- if (PyObject_CheckBuffer(pyIn)) {
- Py_buffer bufferView;
-
- // Bail out if the object can't provide a simple contiguous buffer.
- if (PyObject_GetBuffer(pyIn, &bufferView, PyBUF_SIMPLE) < 0)
- return;
-
- *reinterpret_cast<void **>(cppOut) = bufferView.buf;
-
- // Release the buffer.
- PyBuffer_Release(&bufferView);
- }
-}
-
-static PythonToCppFunc PythonBufferToCppIsConvertible(PyObject *pyIn)
-{
- if (PyObject_CheckBuffer(pyIn)) {
- Py_buffer bufferView;
-
- // Bail out if the object can't provide a simple contiguous buffer.
- if (PyObject_GetBuffer(pyIn, &bufferView, PyBUF_SIMPLE) < 0)
- return nullptr;
-
- // Release the buffer.
- PyBuffer_Release(&bufferView);
-
- return PythonBufferToCpp;
- }
- return nullptr;
-}
-
-SbkConverter *createConverter()
-{
- SbkConverter *converter = Shiboken::Conversions::createConverter(SbkVoidPtrTypeF(), toPython);
- Shiboken::Conversions::addPythonToCppValueConversion(converter,
- VoidPtrToCpp,
- VoidPtrToCppIsConvertible);
- Shiboken::Conversions::addPythonToCppValueConversion(converter,
- SbkObjectToCpp,
- SbkObjectToCppIsConvertible);
- Shiboken::Conversions::addPythonToCppValueConversion(converter,
- PythonBufferToCpp,
- PythonBufferToCppIsConvertible);
- return converter;
-}
-
-} // namespace VoidPtr