aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp5
-rw-r--r--sources/shiboken6/ApiExtractor/exception.h52
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.cpp8
-rw-r--r--sources/shiboken6/ApiExtractor/tests/testutil.h17
-rw-r--r--sources/shiboken6/generator/main.cpp16
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp31
-rw-r--r--sources/shiboken6/generator/shiboken/shibokengenerator.cpp23
7 files changed, 122 insertions, 30 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
index 8216a5e8e..73e974386 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetabuilder.cpp
@@ -31,6 +31,7 @@
#include "abstractmetafield.h"
#include "abstractmetafunction.h"
#include "graph.h"
+#include "exception.h"
#include "messages.h"
#include "propertyspec.h"
#include "reporthandler.h"
@@ -606,7 +607,7 @@ void AbstractMetaBuilderPrivate::traverseDom(const FileModelItem &dom)
const AddedFunctionList &globalUserFunctions = types->globalUserFunctions();
for (const AddedFunctionPtr &addedFunc : globalUserFunctions) {
if (!traverseAddedGlobalFunction(addedFunc, &errorMessage))
- qFatal("%s", qPrintable(errorMessage));
+ throw Exception(errorMessage);
}
m_itemToClass.clear();
@@ -1342,7 +1343,7 @@ void AbstractMetaBuilderPrivate::fillAddedFunctions(AbstractMetaClass *metaClass
const AddedFunctionList &addedFunctions = metaClass->typeEntry()->addedFunctions();
for (const AddedFunctionPtr &addedFunc : addedFunctions) {
if (!traverseAddedMemberFunction(addedFunc, metaClass, &errorMessage))
- qFatal("%s", qPrintable(errorMessage));
+ throw Exception(qPrintable(errorMessage));
}
}
diff --git a/sources/shiboken6/ApiExtractor/exception.h b/sources/shiboken6/ApiExtractor/exception.h
new file mode 100644
index 000000000..36e94638a
--- /dev/null
+++ b/sources/shiboken6/ApiExtractor/exception.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part 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$
+**
+****************************************************************************/
+
+#ifndef EXCEPTION_H
+#define EXCEPTION_H
+
+#include <QString>
+
+#include <string>
+#include <exception>
+
+class Exception : public std::exception
+{
+public:
+ explicit Exception(const QString &message) : m_message(message.toUtf8()) {}
+ explicit Exception(const char *message) : m_message(message) {}
+
+ const char *what() const noexcept override
+ {
+ return m_message.c_str();
+ }
+
+private:
+ const std::string m_message;
+};
+
+#endif // EXCEPTION
diff --git a/sources/shiboken6/ApiExtractor/modifications.cpp b/sources/shiboken6/ApiExtractor/modifications.cpp
index 9e5071a33..e4e9a7d02 100644
--- a/sources/shiboken6/ApiExtractor/modifications.cpp
+++ b/sources/shiboken6/ApiExtractor/modifications.cpp
@@ -28,6 +28,7 @@
#include "modifications.h"
#include "modifications_p.h"
+#include "exception.h"
#include "typedatabase.h"
#include "typeparser.h"
#include "typesystem.h"
@@ -42,8 +43,11 @@ static inline QString callOperator() { return QStringLiteral("operator()"); }
QString TemplateInstance::expandCode() const
{
TemplateEntry *templateEntry = TypeDatabase::instance()->findTemplate(m_name);
- if (!templateEntry)
- qFatal("<insert-template> referring to non-existing template '%s'.", qPrintable(m_name));
+ if (!templateEntry) {
+ const QString m = QLatin1String("<insert-template> referring to non-existing template '")
+ + m_name + QLatin1String("'.");
+ throw Exception(m);
+ }
QString code = templateEntry->code();
for (auto it = replaceRules.cbegin(), end = replaceRules.cend(); it != end; ++it)
diff --git a/sources/shiboken6/ApiExtractor/tests/testutil.h b/sources/shiboken6/ApiExtractor/tests/testutil.h
index e24e54365..56ce8a72e 100644
--- a/sources/shiboken6/ApiExtractor/tests/testutil.h
+++ b/sources/shiboken6/ApiExtractor/tests/testutil.h
@@ -36,6 +36,9 @@
#include "reporthandler.h"
#include "typedatabase.h"
+#include <exception>
+#include <memory>
+
namespace TestUtil
{
static AbstractMetaBuilder *parse(const char *cppCode, const char *xmlCode,
@@ -70,12 +73,16 @@ namespace TestUtil
arguments.append(QFile::encodeName(tempSource.fileName()));
tempSource.write(cppCode, qint64(strlen(cppCode)));
tempSource.close();
- auto *builder = new AbstractMetaBuilder;
- if (!builder->build(arguments)) {
- delete builder;
- return Q_NULLPTR;
+
+ auto builder = std::make_unique<AbstractMetaBuilder>();
+ try {
+ if (!builder->build(arguments))
+ return nullptr;
+ } catch (const std::exception &e) {
+ qWarning("%s", e.what());
+ return nullptr;
}
- return builder;
+ return builder.release();
}
} // namespace TestUtil
diff --git a/sources/shiboken6/generator/main.cpp b/sources/shiboken6/generator/main.cpp
index 049ffaf18..feb9cbc46 100644
--- a/sources/shiboken6/generator/main.cpp
+++ b/sources/shiboken6/generator/main.cpp
@@ -44,6 +44,8 @@
#include "headergenerator.h"
#include "qtdocgenerator.h"
+#include <exception>
+
static const QChar clangOptionsSplitter = u',';
static const QChar dropTypeEntriesSplitter = u';';
static const QChar apiVersionSplitter = u'|';
@@ -421,7 +423,7 @@ static void parseIncludePathOption(const QString &option, HeaderType headerType,
}
}
-int main(int argc, char *argv[])
+int shibokenMain(int argc, char *argv[])
{
// PYSIDE-757: Request a deterministic ordering of QHash in the code model
// and type system.
@@ -699,3 +701,15 @@ int main(int argc, char *argv[])
return EXIT_SUCCESS;
}
+
+int main(int argc, char *argv[])
+{
+ int ex = EXIT_SUCCESS;
+ try {
+ ex = shibokenMain(argc, argv);
+ } catch (const std::exception &e) {
+ std::cerr << e.what() << std::endl;
+ ex = EXIT_FAILURE;
+ }
+ return ex;
+}
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
index 426f7f6fd..14781527d 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
@@ -31,6 +31,7 @@
#include "cppgenerator.h"
#include "apiextractorresult.h"
#include "ctypenames.h"
+#include <exception.h>
#include "pytypenames.h"
#include "fileout.h"
#include "overloaddata.h"
@@ -2927,8 +2928,11 @@ void CppGenerator::writeSingleFunctionCall(TextStream &s,
} else if (!injectCodeCallsFunc && !func->isUserAdded() && !hasConversionRule) {
// When an argument is removed from a method signature and no other means of calling
// the method are provided (as with code injection) the generator must abort.
- qFatal("No way to call '%s::%s' with the modifications described in the type system.",
- qPrintable(func->ownerClass()->name()), qPrintable(func->signature()));
+ QString m;
+ QTextStream(&m) << "No way to call '" << func->ownerClass()->name()
+ << "::" << func->signature()
+ << "' with the modifications described in the type system.";
+ throw Exception(m);
}
removedArgs++;
continue;
@@ -3027,9 +3031,11 @@ void CppGenerator::writeCppToPythonFunction(TextStream &s, const AbstractMetaTyp
{
const CustomConversion *customConversion = containerType.typeEntry()->customConversion();
if (!customConversion) {
- qFatal("Can't write the C++ to Python conversion function for container type '%s' - "\
- "no conversion rule was defined for it in the type system.",
- qPrintable(containerType.typeEntry()->qualifiedCppName()));
+ QString m;
+ QTextStream(&m) << "Can't write the C++ to Python conversion function for container type '"
+ << containerType.typeEntry()->qualifiedCppName()
+ << "' - no conversion rule was defined for it in the type system.";
+ throw Exception(m);
}
if (!containerType.typeEntry()->isContainer()) {
writeCppToPythonFunction(s, customConversion);
@@ -3157,10 +3163,10 @@ void CppGenerator::writePythonToCppConversionFunctions(TextStream &s,
}
if (typeCheck.isEmpty()) {
if (!toNative->sourceType() || toNative->sourceType()->isPrimitive()) {
- qFatal("User added implicit conversion for C++ type '%s' must provide either an input "\
- "type check function or a non primitive type entry.",
- qPrintable(targetType->qualifiedCppName()));
-
+ QString m;
+ QTextStream(&m) << "User added implicit conversion for C++ type '" << targetType->qualifiedCppName()
+ << "' must provide either an input type check function or a non primitive type entry.";
+ throw Exception(m);
}
typeCheck = QString::fromLatin1("PyObject_TypeCheck(%in, %1)").arg(cpythonTypeNameExt(toNative->sourceType()));
}
@@ -6388,8 +6394,11 @@ void CppGenerator::writeDefaultSequenceMethods(TextStream &s,
const AbstractMetaTypeList &instantiations = metaClass->templateBaseClassInstantiations();
if (instantiations.isEmpty()) {
- qFatal("shiboken: %s: Internal error, no instantiations of \"%s\" were found.",
- __FUNCTION__, qPrintable(metaClass->qualifiedCppName()));
+ QString m;
+ QTextStream(&m) << "shiboken: " << __FUNCTION__
+ << ": Internal error, no instantiations of \"" << metaClass->qualifiedCppName()
+ << "\" were found.";
+ throw Exception(m);
}
const AbstractMetaType &itemType = instantiations.constFirst();
diff --git a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
index dc4648875..75b3fe890 100644
--- a/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/shibokengenerator.cpp
@@ -33,6 +33,7 @@
#include <abstractmetafield.h>
#include <abstractmetafunction.h>
#include <abstractmetalang.h>
+#include <exception.h>
#include <messages.h>
#include <modifications.h>
#include "overloaddata.h"
@@ -1892,7 +1893,7 @@ static QString getConverterTypeSystemVariableArgument(const QString &code, int p
++count;
}
if (parenthesisDepth != 0)
- qFatal("Unbalanced parenthesis on type system converter variable call.");
+ throw Exception("Unbalanced parenthesis on type system converter variable call.");
return arg;
}
@@ -1922,9 +1923,9 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
QString message;
const auto conversionTypeO = buildAbstractMetaTypeFromString(conversionTypeName, &message);
if (!conversionTypeO.has_value()) {
- qFatal("%s", qPrintable(msgCannotFindType(conversionTypeName,
- typeSystemConvName().value(converterVariable),
- message)));
+ throw Exception(msgCannotFindType(conversionTypeName,
+ typeSystemConvName().value(converterVariable),
+ message));
}
const auto conversionType = conversionTypeO.value();
QString conversion;
@@ -1944,7 +1945,7 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
if (!varType.isEmpty()) {
const QString conversionSignature = conversionType.cppSignature();
if (varType != QLatin1String("auto") && varType != conversionSignature)
- qFatal("%s", qPrintable(msgConversionTypesDiffer(varType, conversionSignature)));
+ throw Exception(msgConversionTypesDiffer(varType, conversionSignature));
c << getFullTypeName(conversionType) << ' ' << varName;
writeMinimalConstructorExpression(c, api(), conversionType);
c << ";\n";
@@ -1984,8 +1985,10 @@ void ShibokenGenerator::replaceConverterTypeSystemVariable(TypeSystemConverterVa
QString arg = getConverterTypeSystemVariableArgument(code, match.capturedEnd());
conversionString += arg;
if (converterVariable == TypeSystemToPythonFunction && !isVariable(arg)) {
- qFatal("Only variables are acceptable as argument to %%CONVERTTOPYTHON type system variable on code snippet: '%s'",
- qPrintable(code));
+ QString m;
+ QTextStream(&m) << "Only variables are acceptable as argument to %%CONVERTTOPYTHON type system variable on code snippet: '"
+ << code << '\'';
+ throw Exception(m);
}
if (conversion.contains(QLatin1String("%in"))) {
conversion.prepend(QLatin1Char('('));
@@ -2430,8 +2433,10 @@ void ShibokenGenerator::collectContainerTypesFromConverterMacros(const QString &
if (type.has_value()) {
addInstantiatedContainersAndSmartPointers(type.value(), type->originalTypeDescription());
} else {
- qFatal("%s: Cannot translate type \"%s\": %s", __FUNCTION__,
- qPrintable(typeString), qPrintable(errorMessage));
+ QString m;
+ QTextStream(&m) << __FUNCTION__ << ": Cannot translate type \""
+ << typeString << "\": " << errorMessage;
+ throw Exception(m);
}
}
start = end;