diff options
author | Jake Petroules <jake.petroules@qt.io> | 2017-02-24 14:30:37 -0800 |
---|---|---|
committer | Jake Petroules <jake.petroules@qt.io> | 2017-02-26 22:55:56 +0000 |
commit | 720de137e55f956a7558eacf45c99c0c83dd3001 (patch) | |
tree | 1fc60a221ac3fb63dece9ea127ec1eb3ccbb0cca | |
parent | a929ab1f86b1d548582d94969eb2291fd8a0fabe (diff) |
Make calls to ScriptEngine::newFunction type-safe
Change-Id: I73a18457f549a5c460540f9f8602ad0805c05d88
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r-- | src/lib/corelib/buildgraph/buildgraph.cpp | 14 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/qtmocscanner.cpp | 7 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/qtmocscanner.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/transformer.cpp | 17 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.cpp | 22 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.h | 22 |
6 files changed, 51 insertions, 33 deletions
diff --git a/src/lib/corelib/buildgraph/buildgraph.cpp b/src/lib/corelib/buildgraph/buildgraph.cpp index 98a17ef30..740303dec 100644 --- a/src/lib/corelib/buildgraph/buildgraph.cpp +++ b/src/lib/corelib/buildgraph/buildgraph.cpp @@ -96,8 +96,7 @@ public: void init(QScriptValue &productScriptValue, const ResolvedProductConstPtr &product) { - QScriptValue depfunc = m_engine->newFunction(&js_productDependencies, - (void *)product.data()); + QScriptValue depfunc = m_engine->newFunction(&js_productDependencies, product.data()); setProduct(depfunc, product.data()); productScriptValue.setProperty(QLatin1String("dependencies"), depfunc, QScriptValue::ReadOnly | QScriptValue::Undeletable @@ -105,9 +104,9 @@ public: } private: - static QScriptValue js_productDependencies(QScriptContext *, QScriptEngine *engine, void *arg) + static QScriptValue js_productDependencies(QScriptContext *, ScriptEngine *engine, + const ResolvedProduct * const product) { - const ResolvedProduct * const product = static_cast<const ResolvedProduct *>(arg); QScriptValue result = engine->newArray(); quint32 idx = 0; QList<ResolvedProductPtr> productDeps = product->dependencies.toList(); @@ -129,9 +128,9 @@ private: return result; } - static QScriptValue js_moduleDependencies(QScriptContext *, QScriptEngine *engine, void *arg) + static QScriptValue js_moduleDependencies(QScriptContext *, ScriptEngine *engine, + const QVariantMap *modulesMap) { - const QVariantMap *modulesMap = static_cast<const QVariantMap *>(arg); QScriptValue result = engine->newArray(); quint32 idx = 0; for (QVariantMap::const_iterator it = modulesMap->begin(); it != modulesMap->end(); ++it) { @@ -157,7 +156,8 @@ private: } QVariantMap *modulesMap = new QVariantMap(propMap.value(QLatin1String("modules")).toMap()); engine->registerOwnedVariantMap(modulesMap); - QScriptValue depfunc = engine->newFunction(&js_moduleDependencies, modulesMap); + QScriptValue depfunc = engine->newFunction<const QVariantMap *>(&js_moduleDependencies, + modulesMap); moduleScriptValue.setProperty(QLatin1String("dependencies"), depfunc, QScriptValue::ReadOnly | QScriptValue::Undeletable | QScriptValue::PropertyGetter); diff --git a/src/lib/corelib/buildgraph/qtmocscanner.cpp b/src/lib/corelib/buildgraph/qtmocscanner.cpp index 9eb440df6..5db9af58c 100644 --- a/src/lib/corelib/buildgraph/qtmocscanner.cpp +++ b/src/lib/corelib/buildgraph/qtmocscanner.cpp @@ -44,6 +44,7 @@ #include "productbuilddata.h" #include "projectbuilddata.h" #include "rawscanresults.h" +#include <language/scriptengine.h> #include <logging/translator.h> #include <tools/fileinfo.h> #include <tools/scannerpluginmanager.h> @@ -99,7 +100,7 @@ QtMocScanner::QtMocScanner(const ResolvedProductPtr &product, QScriptValue targe , m_cppScanner(0) , m_hppScanner(0) { - QScriptEngine *engine = targetScriptValue.engine(); + ScriptEngine *engine = static_cast<ScriptEngine *>(targetScriptValue.engine()); QScriptValue scannerObj = engine->newObject(); targetScriptValue.setProperty(QLatin1String("QtMocScanner"), scannerObj); QScriptValue applyFunction = engine->newFunction(&js_apply, this); @@ -196,9 +197,9 @@ void QtMocScanner::findIncludedMocCppFiles() } } -QScriptValue QtMocScanner::js_apply(QScriptContext *ctx, QScriptEngine *engine, void *data) +QScriptValue QtMocScanner::js_apply(QScriptContext *ctx, QScriptEngine *engine, + QtMocScanner *that) { - QtMocScanner *that = reinterpret_cast<QtMocScanner *>(data); QScriptValue input = ctx->argument(0); return that->apply(engine, attachedPointer<Artifact>(input)); } diff --git a/src/lib/corelib/buildgraph/qtmocscanner.h b/src/lib/corelib/buildgraph/qtmocscanner.h index e7d034b16..67ef03fec 100644 --- a/src/lib/corelib/buildgraph/qtmocscanner.h +++ b/src/lib/corelib/buildgraph/qtmocscanner.h @@ -70,7 +70,7 @@ public: private: ScannerPlugin *scannerPluginForFileTags(const FileTags &ft); void findIncludedMocCppFiles(); - static QScriptValue js_apply(QScriptContext *ctx, QScriptEngine *engine, void *data); + static QScriptValue js_apply(QScriptContext *ctx, QScriptEngine *engine, QtMocScanner *that); QScriptValue apply(QScriptEngine *engine, const Artifact *artifact); const CommonFileTags &m_tags; diff --git a/src/lib/corelib/buildgraph/transformer.cpp b/src/lib/corelib/buildgraph/transformer.cpp index 5dced077c..ef728379b 100644 --- a/src/lib/corelib/buildgraph/transformer.cpp +++ b/src/lib/corelib/buildgraph/transformer.cpp @@ -65,27 +65,27 @@ Transformer::~Transformer() { } -static QScriptValue js_baseName(QScriptContext *ctx, QScriptEngine *engine, void *arg) +static QScriptValue js_baseName(QScriptContext *ctx, QScriptEngine *engine, + const Artifact *artifact) { Q_UNUSED(ctx); Q_UNUSED(engine); - Artifact *artifact = reinterpret_cast<Artifact *>(arg); return QScriptValue(FileInfo::baseName(artifact->filePath())); } -static QScriptValue js_completeBaseName(QScriptContext *ctx, QScriptEngine *engine, void *arg) +static QScriptValue js_completeBaseName(QScriptContext *ctx, QScriptEngine *engine, + const Artifact *artifact) { Q_UNUSED(ctx); Q_UNUSED(engine); - Artifact *artifact = reinterpret_cast<Artifact *>(arg); return QScriptValue(FileInfo::completeBaseName(artifact->filePath())); } -static QScriptValue js_baseDir(QScriptContext *ctx, QScriptEngine *engine, void *arg) +static QScriptValue js_baseDir(QScriptContext *ctx, QScriptEngine *engine, + const Artifact *artifact) { Q_UNUSED(ctx); Q_UNUSED(engine); - Artifact *artifact = reinterpret_cast<Artifact *>(arg); QString basedir; if (artifact->artifactType == Artifact::SourceFile) { QDir sourceDir(artifact->product->sourceDirectory); @@ -98,9 +98,10 @@ static QScriptValue js_baseDir(QScriptContext *ctx, QScriptEngine *engine, void } static void setArtifactProperty(QScriptValue &obj, const QString &name, - QScriptEngine::FunctionWithArgSignature func, const Artifact *artifact) + QScriptValue (*func)(QScriptContext *, QScriptEngine *, const Artifact *), + const Artifact *artifact) { - obj.setProperty(name, obj.engine()->newFunction(func, (void *)artifact), + obj.setProperty(name, static_cast<ScriptEngine *>(obj.engine())->newFunction(func, artifact), QScriptValue::PropertyGetter); } diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp index 079eff72e..b1a992b53 100644 --- a/src/lib/corelib/language/scriptengine.cpp +++ b/src/lib/corelib/language/scriptengine.cpp @@ -225,9 +225,9 @@ void ScriptEngine::defineProperty(QScriptValue &object, const QString &name, QBS_ASSERT(!hasErrorOrException(result), qDebug() << name << result.toString()); } -static QScriptValue js_observedGet(QScriptContext *context, QScriptEngine *, void *arg) +static QScriptValue js_observedGet(QScriptContext *context, QScriptEngine *, + ScriptPropertyObserver * const observer) { - ScriptPropertyObserver * const observer = static_cast<ScriptPropertyObserver *>(arg); const QScriptValue data = context->callee().property(QLatin1String("qbsdata")); const QScriptValue value = data.property(2); observer->onPropertyRead(data.property(0), data.property(1).toVariant().toString(), value); @@ -581,16 +581,11 @@ void ScriptEngine::installQbsBuiltins() globalObject().setProperty(QLatin1String("qbs"), m_qbsObject = newObject()); globalObject().setProperty(QLatin1String("console"), m_consoleObject = newObject()); - installConsoleFunction(QLatin1String("debug"), - reinterpret_cast<FunctionWithArgSignature>(&js_consoleDebug)); - installConsoleFunction(QLatin1String("error"), - reinterpret_cast<FunctionWithArgSignature>(&js_consoleError)); - installConsoleFunction(QLatin1String("info"), - reinterpret_cast<FunctionWithArgSignature>(&js_consoleInfo)); - installConsoleFunction(QLatin1String("log"), - reinterpret_cast<FunctionWithArgSignature>(&js_consoleLog)); - installConsoleFunction(QLatin1String("warn"), - reinterpret_cast<FunctionWithArgSignature>(&js_consoleWarn)); + installConsoleFunction(QLatin1String("debug"), &js_consoleDebug); + installConsoleFunction(QLatin1String("error"), &js_consoleError); + installConsoleFunction(QLatin1String("info"), &js_consoleInfo); + installConsoleFunction(QLatin1String("log"), &js_consoleLog); + installConsoleFunction(QLatin1String("warn"), &js_consoleWarn); } void ScriptEngine::extendJavaScriptBuiltins() @@ -640,7 +635,8 @@ void ScriptEngine::installQbsFunction(const QString &name, int length, FunctionS installFunction(name, length, &functionValue, f, &m_qbsObject); } -void ScriptEngine::installConsoleFunction(const QString &name, FunctionWithArgSignature f) +void ScriptEngine::installConsoleFunction(const QString &name, + QScriptValue (*f)(QScriptContext *, QScriptEngine *, Logger *)) { m_consoleObject.setProperty(name, newFunction(f, &m_logger)); } diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h index 7ee0134a7..39dd8ede2 100644 --- a/src/lib/corelib/language/scriptengine.h +++ b/src/lib/corelib/language/scriptengine.h @@ -159,7 +159,26 @@ public: bool isActive() const { return m_active; } void setActive(bool on) { m_active = on; } + using QScriptEngine::newFunction; + + template <typename T, typename E, + typename = typename std::enable_if<std::is_pointer<T>::value>::type, + typename = typename std::enable_if<std::is_pointer<E>::value>::type, + typename = typename std::enable_if<std::is_base_of< + QScriptEngine, typename std::remove_pointer<E>::type>::value>::type + > QScriptValue newFunction(QScriptValue (*signature)(QScriptContext *, E, T), T arg) { + return QScriptEngine::newFunction( + reinterpret_cast<FunctionWithArgSignature>(signature), + reinterpret_cast<void *>(const_cast< + typename std::add_pointer< + typename std::remove_const< + typename std::remove_pointer<T>::type>::type>::type>( + arg))); + } + private: + QScriptValue newFunction(FunctionWithArgSignature signature, void *arg) Q_DECL_EQ_DELETE; + void abort(); void installQbsBuiltins(); @@ -167,7 +186,8 @@ private: void installFunction(const QString &name, int length, QScriptValue *functionValue, FunctionSignature f, QScriptValue *targetObject); void installQbsFunction(const QString &name, int length, FunctionSignature f); - void installConsoleFunction(const QString &name, FunctionWithArgSignature f); + void installConsoleFunction(const QString &name, + QScriptValue (*f)(QScriptContext *, QScriptEngine *, Logger *)); void installImportFunctions(); void uninstallImportFunctions(); void importFile(const QString &filePath, QScriptValue &targetObject); |