aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Petroules <jake.petroules@qt.io>2017-02-24 14:30:37 -0800
committerJake Petroules <jake.petroules@qt.io>2017-02-26 22:55:56 +0000
commit720de137e55f956a7558eacf45c99c0c83dd3001 (patch)
tree1fc60a221ac3fb63dece9ea127ec1eb3ccbb0cca
parenta929ab1f86b1d548582d94969eb2291fd8a0fabe (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.cpp14
-rw-r--r--src/lib/corelib/buildgraph/qtmocscanner.cpp7
-rw-r--r--src/lib/corelib/buildgraph/qtmocscanner.h2
-rw-r--r--src/lib/corelib/buildgraph/transformer.cpp17
-rw-r--r--src/lib/corelib/language/scriptengine.cpp22
-rw-r--r--src/lib/corelib/language/scriptengine.h22
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);