aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/remoteobjects/modelview/modelviewclient.py62
-rw-r--r--examples/remoteobjects/modelview/modelviewserver.py140
-rw-r--r--sources/pyside2/CMakeLists.txt3
-rw-r--r--sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt44
-rw-r--r--sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml74
-rw-r--r--sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt2
-rw-r--r--sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml6
-rw-r--r--sources/pyside2/PySide2/glue/qtcore.cpp3
-rw-r--r--sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt1
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp22
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h2
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h11
-rw-r--r--sources/shiboken2/generator/shiboken2/cppgenerator.cpp1
-rw-r--r--sources/shiboken2/generator/shiboken2/shibokengenerator.cpp24
-rw-r--r--sources/shiboken2/tests/libsample/onlycopy.cpp32
-rw-r--r--sources/shiboken2/tests/libsample/onlycopy.h18
16 files changed, 407 insertions, 38 deletions
diff --git a/examples/remoteobjects/modelview/modelviewclient.py b/examples/remoteobjects/modelview/modelviewclient.py
new file mode 100644
index 000000000..319135886
--- /dev/null
+++ b/examples/remoteobjects/modelview/modelviewclient.py
@@ -0,0 +1,62 @@
+#############################################################################
+##
+## Copyright (C) 2017 Ford Motor Company
+## Copyright (C) 2019 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide2 port of the remoteobjects/modelviewclient example from Qt v5.x"""
+
+import sys
+
+from PySide2.QtCore import QUrl
+from PySide2.QtWidgets import (QApplication, QTreeView)
+from PySide2.QtRemoteObjects import (QAbstractItemModelReplica,
+ QRemoteObjectNode)
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ node = QRemoteObjectNode(QUrl("local:registry"))
+ node.setHeartbeatInterval(1000)
+ view = QTreeView()
+ view.setWindowTitle("RemoteView")
+ view.resize(640,480);
+ model = node.acquireModel("RemoteModel")
+ view.setModel(model);
+ view.show();
+
+ sys.exit(app.exec_())
diff --git a/examples/remoteobjects/modelview/modelviewserver.py b/examples/remoteobjects/modelview/modelviewserver.py
new file mode 100644
index 000000000..069cc1d2c
--- /dev/null
+++ b/examples/remoteobjects/modelview/modelviewserver.py
@@ -0,0 +1,140 @@
+#############################################################################
+##
+## Copyright (C) 2017 Ford Motor Company
+## Copyright (C) 2019 The Qt Company Ltd.
+## Contact: http://www.qt.io/licensing/
+##
+## This file is part of the Qt for Python examples of the Qt Toolkit.
+##
+## $QT_BEGIN_LICENSE:BSD$
+## You may use this file under the terms of the BSD license as follows:
+##
+## "Redistribution and use in source and binary forms, with or without
+## modification, are permitted provided that the following conditions are
+## met:
+## * Redistributions of source code must retain the above copyright
+## notice, this list of conditions and the following disclaimer.
+## * Redistributions in binary form must reproduce the above copyright
+## notice, this list of conditions and the following disclaimer in
+## the documentation and/or other materials provided with the
+## distribution.
+## * Neither the name of The Qt Company Ltd nor the names of its
+## contributors may be used to endorse or promote products derived
+## from this software without specific prior written permission.
+##
+##
+## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+"""PySide2 port of the remoteobjects/modelviewserver example from Qt v5.x"""
+
+import sys
+
+from PySide2.QtCore import (Qt, QByteArray, QModelIndex, QObject, QTimer, QUrl)
+from PySide2.QtGui import (QColor, QStandardItemModel, QStandardItem)
+from PySide2.QtWidgets import (QApplication, QTreeView)
+from PySide2.QtRemoteObjects import (QRemoteObjectHost, QRemoteObjectNode,
+ QRemoteObjectRegistryHost)
+
+class TimerHandler(QObject):
+ def __init__(self, model):
+ super(TimerHandler, self).__init__()
+ self._model = model
+
+ def change_data(self):
+ for i in range(10, 50):
+ self._model.setData(self._model.index(i, 1),
+ QColor(Qt.blue), Qt.BackgroundRole)
+
+ def insert_data(self):
+ self._model.insertRows(2, 9);
+ for i in range(2, 11):
+ self._model.setData(self._model.index(i, 1),
+ QColor(Qt.green), Qt.BackgroundRole)
+ self._model.setData(self._model.index(i, 1),
+ "InsertedRow", Qt.DisplayRole)
+
+ def remove_data(self):
+ self._model.removeRows(2, 4)
+
+ def change_flags(self):
+ item = self._model.item(0, 0)
+ item.setEnabled(False)
+ item = item.child(0, 0)
+ item.setFlags(item.flags() & Qt.ItemIsSelectable)
+
+ def move_data(self):
+ self._model.moveRows(QModelIndex(), 2, 4, QModelIndex(), 10)
+
+
+def add_child(num_children, nesting_level):
+ result = []
+ if nesting_level == 0:
+ return result;
+ for i in range(num_children):
+ child = QStandardItem("Child num {}, nesting Level {}".format(i + 1,
+ nesting_level))
+ if i == 0:
+ child.appendRow(add_child(num_children, nesting_level -1))
+ result.append(child)
+ return result;
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ model_size = 100000;
+ list = []
+ source_model = QStandardItemModel()
+ horizontal_header_list = ["First Column with spacing",
+ "Second Column with spacing"]
+ source_model.setHorizontalHeaderLabels(horizontal_header_list)
+ for i in range(model_size):
+ first_item = QStandardItem("FancyTextNumber {}".format(i))
+ if i == 0:
+ first_item.appendRow(add_child(2, 2))
+ second_item = QStandardItem("FancyRow2TextNumber {}".format(i))
+ if i % 2 == 0:
+ first_item.setBackground(Qt.red)
+ row = [first_item, second_item]
+ source_model.invisibleRootItem().appendRow(row)
+ list.append("FancyTextNumber {}".format(i))
+
+ # Needed by QMLModelViewClient
+ role_names = {
+ Qt.DisplayRole : QByteArray(b'_text'),
+ Qt.BackgroundRole : QByteArray(b'_color')
+ }
+ source_model.setItemRoleNames(role_names)
+
+ roles = [Qt.DisplayRole, Qt.BackgroundRole]
+
+ print("Creating registry host")
+ node = QRemoteObjectRegistryHost(QUrl("local:registry"))
+
+ node2 = QRemoteObjectHost(QUrl("local:replica"), QUrl("local:registry"))
+ node2.enableRemoting(source_model, "RemoteModel", roles)
+
+ view = QTreeView()
+ view.setWindowTitle("SourceView")
+ view.setModel(source_model)
+ view.show()
+ handler = TimerHandler(source_model)
+ QTimer.singleShot(5000, handler.change_data)
+ QTimer.singleShot(10000, handler.insert_data)
+ QTimer.singleShot(11000, handler.change_flags)
+ QTimer.singleShot(12000, handler.remove_data)
+ QTimer.singleShot(13000, handler.move_data)
+
+ sys.exit(app.exec_())
diff --git a/sources/pyside2/CMakeLists.txt b/sources/pyside2/CMakeLists.txt
index 1d563fb44..2fb5cedf5 100644
--- a/sources/pyside2/CMakeLists.txt
+++ b/sources/pyside2/CMakeLists.txt
@@ -353,7 +353,8 @@ if(APPLE)
endif()
# Collect all optional modules.
-set(ALL_OPTIONAL_MODULES Xml XmlPatterns Help Multimedia MultimediaWidgets OpenGL Positioning Location Qml Quick QuickWidgets Scxml Script ScriptTools Sensors TextToSpeech Charts Svg DataVisualization)
+set(ALL_OPTIONAL_MODULES Xml XmlPatterns Help Multimedia
+MultimediaWidgets OpenGL Positioning Location Qml Quick QuickWidgets RemoteObjects Scxml Script ScriptTools Sensors TextToSpeech Charts Svg DataVisualization)
find_package(Qt5UiTools)
if(Qt5UiTools_FOUND)
list(APPEND ALL_OPTIONAL_MODULES UiTools)
diff --git a/sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt b/sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt
new file mode 100644
index 000000000..29b49d895
--- /dev/null
+++ b/sources/pyside2/PySide2/QtRemoteObjects/CMakeLists.txt
@@ -0,0 +1,44 @@
+project(QtRemoteObjects)
+
+set(QtRemoteObjects_SRC
+${QtRemoteObjects_GEN_DIR}/qabstractitemmodelreplica_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectabstractpersistedstore_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectdynamicreplica_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjecthost_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjecthostbase_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectnode_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectpendingcall_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectpendingcallwatcher_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectregistry_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectregistryhost_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectreplica_wrapper.cpp
+# ${QtRemoteObjects_GEN_DIR}/qtremoteobjects_wrapper.cpp
+${QtRemoteObjects_GEN_DIR}/qremoteobjectsettingsstore_wrapper.cpp
+
+# module is always needed
+${QtRemoteObjects_GEN_DIR}/qtremoteobjects_module_wrapper.cpp
+)
+
+set(QtRemoteObjects_include_dirs ${QtRemoteObjects_SOURCE_DIR}
+ ${QtRemoteObjects_BINARY_DIR}
+ ${Qt5RemoteObjects_INCLUDE_DIRS}
+ ${SHIBOKEN_INCLUDE_DIR}
+ ${libpyside_SOURCE_DIR}
+ ${SHIBOKEN_PYTHON_INCLUDE_DIR}
+ ${QtCore_GEN_DIR})
+
+set(QtRemoteObjects_libraries pyside2
+ ${SHIBOKEN_PYTHON_LIBRARIES}
+ ${SHIBOKEN_LIBRARY}
+ ${Qt5RemoteObjects_LIBRARIES})
+
+set(QtRemoteObjects_deps QtCore QtNetwork)
+
+create_pyside_module(NAME QtRemoteObjects
+ INCLUDE_DIRS QtRemoteObjects_include_dirs
+ LIBRARIES QtRemoteObjects_libraries
+ DEPS QtRemoteObjects_deps
+ TYPESYSTEM_PATH QtRemoteObjects_SOURCE_DIR
+ SOURCES QtRemoteObjects_SRC
+ TYPESYSTEM_NAME ${QtRemoteObjects_BINARY_DIR}/typesystem_remoteobjects.xml
+ )
diff --git a/sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml b/sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml
new file mode 100644
index 000000000..8058cb56c
--- /dev/null
+++ b/sources/pyside2/PySide2/QtRemoteObjects/typesystem_remoteobjects.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<!--
+/****************************************************************************
+**
+** Copyright (C) 2019 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$
+**
+****************************************************************************/
+-->
+<typesystem package="PySide2.QtRemoteObjects">
+ <load-typesystem name="templates/core_common.xml" generate="no"/>
+ <load-typesystem name="QtCore/typesystem_core.xml" generate="no"/>
+ <rejection class="*" function-name="getTypeNameAndMetaobjectFromClassInfo"/>
+<!-- Exclude namespace due to Q_NAMESPACE link errors on Windows (QTBUG-68014)
+ <rejection class="QtRemoteObjects" field-name="staticMetaObject"/>
+ <namespace-type name="QtRemoteObjects">
+ <enum-type name="InitialAction"/>
+ <enum-type name="QRemoteObjectPacketTypeEnum"/>
+ </namespace-type>
+-->
+ <object-type name="QAbstractItemModelReplica"/>
+ <object-type name="QRemoteObjectAbstractPersistedStore"/>
+ <object-type name="QRemoteObjectDynamicReplica"/>
+ <object-type name="QRemoteObjectHost"/>
+ <object-type name="QRemoteObjectHostBase">
+ <enum-type name="AllowedSchemas"/>
+ </object-type>
+ <object-type name="QRemoteObjectNode">
+ <enum-type name="ErrorCode"/>
+ </object-type>
+ <object-type name="QRemoteObjectPendingCall">
+ <enum-type name="Error"/>
+ </object-type>
+ <object-type name="QRemoteObjectPendingCallWatcher"/>
+ <object-type name="QRemoteObjectRegistry"/>
+ <object-type name="QRemoteObjectRegistryHost"/>
+ <object-type name="QRemoteObjectReplica">
+ <enum-type name="State"/>
+ <!-- protected: <enum-type name="ConstructorType"/> -->
+ </object-type>
+ <object-type name="QRemoteObjectSettingsStore"/>
+</typesystem>
diff --git a/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt b/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt
index 7711aecbc..68b0a632f 100644
--- a/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt
+++ b/sources/pyside2/PySide2/QtWebEngineWidgets/CMakeLists.txt
@@ -3,7 +3,7 @@ project(QtWebEngineWidgets)
set(QtWebEngineWidgets_SRC
${QtWebEngineWidgets_GEN_DIR}/qwebenginecertificateerror_wrapper.cpp
${QtWebEngineWidgets_GEN_DIR}/qwebenginedownloaditem_wrapper.cpp
-#${QtWebEngineWidgets_GEN_DIR}/qwebenginehistory_wrapper.cpp
+${QtWebEngineWidgets_GEN_DIR}/qwebenginehistory_wrapper.cpp
${QtWebEngineWidgets_GEN_DIR}/qwebenginehistoryitem_wrapper.cpp
${QtWebEngineWidgets_GEN_DIR}/qwebenginepage_wrapper.cpp
${QtWebEngineWidgets_GEN_DIR}/qwebengineprofile_wrapper.cpp
diff --git a/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml b/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml
index b8546d824..dfe4e0d7a 100644
--- a/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml
+++ b/sources/pyside2/PySide2/QtWebEngineWidgets/typesystem_webenginewidgets.xml
@@ -58,10 +58,8 @@
<enum-type name="SavePageFormat"/>
</object-type>
- <!-- TODO: Deal with private constructor
- <value-type name="QWebEngineHistory"/> -->
-
- <object-type name="QWebEngineHistoryItem"/>
+ <object-type name="QWebEngineHistory"/>
+ <value-type name="QWebEngineHistoryItem"/>
<object-type name="QWebEnginePage">
<enum-type name="WebAction"/>
diff --git a/sources/pyside2/PySide2/glue/qtcore.cpp b/sources/pyside2/PySide2/glue/qtcore.cpp
index 4c77e9e87..ca88b9740 100644
--- a/sources/pyside2/PySide2/glue/qtcore.cpp
+++ b/sources/pyside2/PySide2/glue/qtcore.cpp
@@ -924,7 +924,8 @@ if (PyIndex_Check(_key)) {
}
if (step != 1 && value_length != slicelength) {
- PyErr_Format(PyExc_ValueError, "attempt to assign %s of size %d to extended slice of size %d",Py_TYPE(_value)->tp_name, value_length, slicelength);
+ PyErr_Format(PyExc_ValueError, "attempt to assign %s of size %d to extended slice of size %d",
+ Py_TYPE(_value)->tp_name, int(value_length), int(slicelength));
return -1;
}
diff --git a/sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt b/sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt
new file mode 100644
index 000000000..2f7cb08b9
--- /dev/null
+++ b/sources/pyside2/tests/QtRemoteObjects/CMakeLists.txt
@@ -0,0 +1 @@
+# Please add some tests, here
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
index f6724e61d..7498d3a18 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp
@@ -1367,17 +1367,21 @@ static bool _compareAbstractMetaFunctions(const AbstractMetaFunction* func, cons
}
AbstractMetaFunctionList AbstractMetaBuilderPrivate::classFunctionList(const ScopeModelItem &scopeItem,
- bool *constructorRejected)
+ AbstractMetaClass::Attributes *constructorAttributes)
{
- *constructorRejected = false;
+ *constructorAttributes = 0;
AbstractMetaFunctionList result;
const FunctionList &scopeFunctionList = scopeItem->functions();
result.reserve(scopeFunctionList.size());
for (const FunctionModelItem &function : scopeFunctionList) {
- if (AbstractMetaFunction *metaFunction = traverseFunction(function))
+ if (AbstractMetaFunction *metaFunction = traverseFunction(function)) {
result.append(metaFunction);
- else if (function->functionType() == CodeModel::Constructor)
- *constructorRejected = true;
+ } else if (function->functionType() == CodeModel::Constructor) {
+ auto arguments = function->arguments();
+ *constructorAttributes |= AbstractMetaAttributes::HasRejectedConstructor;
+ if (arguments.isEmpty() || arguments.constFirst()->defaultValue())
+ *constructorAttributes |= AbstractMetaAttributes::HasRejectedDefaultConstructor;
+ }
}
return result;
}
@@ -1408,12 +1412,10 @@ private:
void AbstractMetaBuilderPrivate::traverseFunctions(ScopeModelItem scopeItem,
AbstractMetaClass *metaClass)
{
- bool constructorRejected = false;
+ AbstractMetaAttributes::Attributes constructorAttributes;
const AbstractMetaFunctionList functions =
- classFunctionList(scopeItem, &constructorRejected);
-
- if (constructorRejected)
- *metaClass += AbstractMetaAttributes::HasRejectedConstructor;
+ classFunctionList(scopeItem, &constructorAttributes);
+ metaClass->setAttributes(metaClass->attributes() | constructorAttributes);
for (AbstractMetaFunction *metaFunction : functions){
metaFunction->setOriginalAttributes(metaFunction->attributes());
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
index ec55d1b47..1633bd868 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder_p.h
@@ -80,7 +80,7 @@ public:
void traverseEnums(const ScopeModelItem &item, AbstractMetaClass *parent,
const QStringList &enumsDeclarations);
AbstractMetaFunctionList classFunctionList(const ScopeModelItem &scopeItem,
- bool *constructorRejected);
+ AbstractMetaClass::Attributes *constructorAttributes);
AbstractMetaFunctionList templateClassFunctionList(const ScopeModelItem &scopeItem,
AbstractMetaClass *metaClass,
bool *constructorRejected);
diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h
index aaefa32d5..bb17ad8d7 100644
--- a/sources/shiboken2/ApiExtractor/abstractmetalang.h
+++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h
@@ -133,13 +133,14 @@ public:
Invokable = 0x00040000,
HasRejectedConstructor = 0x00080000,
+ HasRejectedDefaultConstructor = 0x00100000,
- FinalCppClass = 0x00100000,
- VirtualCppMethod = 0x00200000,
- OverriddenCppMethod = 0x00400000,
- FinalCppMethod = 0x00800000,
+ FinalCppClass = 0x00200000,
+ VirtualCppMethod = 0x00400000,
+ OverriddenCppMethod = 0x00800000,
+ FinalCppMethod = 0x01000000,
// Add by meta builder (implicit constructors, inherited methods, etc)
- AddedMethod = 0x01000000
+ AddedMethod = 0x02000000
};
Q_DECLARE_FLAGS(Attributes, Attribute)
Q_FLAG(Attribute)
diff --git a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
index ea0f43170..9cfc95fd1 100644
--- a/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/cppgenerator.cpp
@@ -1923,6 +1923,7 @@ void CppGenerator::writeArgumentsInitializer(QTextStream& s, OverloadData& overl
{
const AbstractMetaFunction* rfunc = overloadData.referenceFunction();
s << "PyTuple_GET_SIZE(args);" << endl;
+ writeUnusedVariableCast(s, QLatin1String("numArgs"));
int minArgs = overloadData.minArgs();
int maxArgs = overloadData.maxArgs();
diff --git a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
index ac0b2ffaf..a226f2c00 100644
--- a/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
+++ b/sources/shiboken2/generator/shiboken2/shibokengenerator.cpp
@@ -1055,12 +1055,26 @@ bool ShibokenGenerator::isValueTypeWithCopyConstructorOnly(const AbstractMetaCla
{
if (!metaClass || !metaClass->typeEntry()->isValue())
return false;
- if ((metaClass->attributes() & AbstractMetaAttributes::HasRejectedConstructor) != 0)
+ if (metaClass->attributes().testFlag(AbstractMetaAttributes::HasRejectedDefaultConstructor))
return false;
- AbstractMetaFunctionList ctors = metaClass->queryFunctions(AbstractMetaClass::Constructors);
- if (ctors.count() != 1)
- return false;
- return ctors.constFirst()->functionType() == AbstractMetaFunction::CopyConstructorFunction;
+ const AbstractMetaFunctionList ctors =
+ metaClass->queryFunctions(AbstractMetaClass::Constructors);
+ bool copyConstructorFound = false;
+ for (auto ctor : ctors) {
+ switch (ctor->functionType()) {
+ case AbstractMetaFunction::ConstructorFunction:
+ return false;
+ case AbstractMetaFunction::CopyConstructorFunction:
+ copyConstructorFound = true;
+ break;
+ case AbstractMetaFunction::MoveConstructorFunction:
+ break;
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+ }
+ return copyConstructorFound;
}
bool ShibokenGenerator::isValueTypeWithCopyConstructorOnly(const TypeEntry* type) const
diff --git a/sources/shiboken2/tests/libsample/onlycopy.cpp b/sources/shiboken2/tests/libsample/onlycopy.cpp
index 75bf23b5c..cfc7c9d99 100644
--- a/sources/shiboken2/tests/libsample/onlycopy.cpp
+++ b/sources/shiboken2/tests/libsample/onlycopy.cpp
@@ -28,18 +28,44 @@
#include "onlycopy.h"
-OnlyCopy::OnlyCopy(const OnlyCopy& other)
+class OnlyCopyPrivate
+{
+public:
+ explicit OnlyCopyPrivate(int v = 0) : value(v) {}
+
+ int value;
+};
+
+OnlyCopy::OnlyCopy(int value) : d(new OnlyCopyPrivate(value))
+{
+
+}
+
+OnlyCopy::OnlyCopy(OnlyCopyPrivate *dIn) : d(dIn)
+{
+}
+
+OnlyCopy::~OnlyCopy()
+{
+ delete d;
+}
+
+OnlyCopy::OnlyCopy(const OnlyCopy& other) : d(new OnlyCopyPrivate(other.value()))
{
- m_value = other.m_value;
}
OnlyCopy&
OnlyCopy::operator=(const OnlyCopy& other)
{
- m_value = other.m_value;
+ d->value = other.d->value;
return *this;
}
+int OnlyCopy::value() const
+{
+ return d->value;
+}
+
OnlyCopy
FriendOfOnlyCopy::createOnlyCopy(int value)
{
diff --git a/sources/shiboken2/tests/libsample/onlycopy.h b/sources/shiboken2/tests/libsample/onlycopy.h
index 2c1b255fd..84a32a951 100644
--- a/sources/shiboken2/tests/libsample/onlycopy.h
+++ b/sources/shiboken2/tests/libsample/onlycopy.h
@@ -32,20 +32,24 @@
#include "libsamplemacros.h"
#include <list>
-// These classes simulate a situation found in
-// QtWebKit's QWebDatabase and QWebSecurityOrigin.
+// These classes simulate a situation found in QWebEngineHistoryItem.
+
+class OnlyCopyPrivate;
class LIBSAMPLE_API OnlyCopy
{
public:
OnlyCopy(const OnlyCopy& other);
OnlyCopy& operator=(const OnlyCopy& other);
- int value() const { return m_value; }
- static int getValue(OnlyCopy onlyCopy) { return onlyCopy.m_value; }
- static int getValueFromReference(const OnlyCopy& onlyCopy) { return onlyCopy.m_value; }
+ ~OnlyCopy();
+
+ int value() const;
+ static int getValue(OnlyCopy onlyCopy) { return onlyCopy.value(); }
+ static int getValueFromReference(const OnlyCopy& onlyCopy) { return onlyCopy.value(); }
private:
- int m_value;
- OnlyCopy(int value) : m_value(value) {};
+ OnlyCopyPrivate *d;
+ explicit OnlyCopy(int value);
+ explicit OnlyCopy(OnlyCopyPrivate *d); // rejected due to unknown OnlyCopyPrivate
friend class FriendOfOnlyCopy;
};