diff options
-rw-r--r-- | sources/pyside2/tests/support/CMakeLists.txt | 1 | ||||
-rw-r--r-- | sources/pyside2/tests/support/voidptr_test.py | 47 | ||||
-rw-r--r-- | sources/shiboken2/libshiboken/voidptr.cpp | 9 |
3 files changed, 55 insertions, 2 deletions
diff --git a/sources/pyside2/tests/support/CMakeLists.txt b/sources/pyside2/tests/support/CMakeLists.txt new file mode 100644 index 000000000..1f18ecf23 --- /dev/null +++ b/sources/pyside2/tests/support/CMakeLists.txt @@ -0,0 +1 @@ +PYSIDE_TEST(voidptr_test.py) diff --git a/sources/pyside2/tests/support/voidptr_test.py b/sources/pyside2/tests/support/voidptr_test.py new file mode 100644 index 000000000..8179407e5 --- /dev/null +++ b/sources/pyside2/tests/support/voidptr_test.py @@ -0,0 +1,47 @@ +############################################################################# +## +## Copyright (C) 2018 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the test suite of Qt for Python. +## +## $QT_BEGIN_LICENSE:GPL-EXCEPT$ +## 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 General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 3 as published by the Free Software +## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +## 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-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +import unittest +from PySide2 import shiboken2 +from PySide2.support import VoidPtr +from PySide2.QtCore import QByteArray + +class PySide2Support(unittest.TestCase): + + def testVoidPtr(self): + # 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. + ba = QByteArray(b"Hello world") + voidptr = VoidPtr(ba) + self.assertIsInstance(voidptr, shiboken2.VoidPtr) + +if __name__ == '__main__': + unittest.main() + diff --git a/sources/shiboken2/libshiboken/voidptr.cpp b/sources/shiboken2/libshiboken/voidptr.cpp index afb3f4040..94c667598 100644 --- a/sources/shiboken2/libshiboken/voidptr.cpp +++ b/sources/shiboken2/libshiboken/voidptr.cpp @@ -55,8 +55,13 @@ typedef struct { PyObject *SbkVoidPtrObject_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - SbkVoidPtrObject *self = - reinterpret_cast<SbkVoidPtrObject *>(PepType(type)->tp_alloc); + // 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 *>(PepType(type)->tp_alloc); + PyObject *ob = PepType(type)->tp_alloc(type, 0); + SbkVoidPtrObject *self = reinterpret_cast<SbkVoidPtrObject *>(ob); if (self != 0) { self->cptr = 0; |