qmljs: Port to QCommandLineParser

Additionally, added a sanity check to return EXIT_FAILURE if JIT and
interpreter options are both  enabled.

Change-Id: I55433963f3539dac8cc4193ec64ec257bcc48f6f
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Amanda Hamblin-Trué 2023-06-27 11:43:12 +02:00
parent 1b1f4c254f
commit 85dcfcae79
1 changed files with 38 additions and 32 deletions

View File

@ -19,6 +19,7 @@
#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QDateTime>
#include <QtCore/qcommandlineparser.h>
#include <private/qqmljsengine_p.h>
#include <private/qqmljslexer_p.h>
#include <private/qqmljsparser_p.h>
@ -49,43 +50,48 @@ int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QCoreApplication::setApplicationVersion(QLatin1String(QT_VERSION_STR));
QStringList args = app.arguments();
args.removeFirst();
bool runAsQml = false;
bool runAsModule = false;
bool cache = false;
QCommandLineParser parser;
parser.addHelpOption();
parser.setApplicationDescription("Utility to execute scripts in QML's V4 engine");
parser.addVersionOption();
parser.addPositionalArgument("files", "Files to execute.", "[files...]");
if (!args.isEmpty()) {
if (args.constFirst() == QLatin1String("--jit")) {
qputenv("QV4_JIT_CALL_THRESHOLD", QByteArray("0"));
args.removeFirst();
}
if (args.constFirst() == QLatin1String("--interpret")) {
qputenv("QV4_FORCE_INTERPRETER", QByteArray("1"));
args.removeFirst();
}
if (args.constFirst() == QLatin1String("--qml")) {
runAsQml = true;
args.removeFirst();
}
QCommandLineOption forceJit("jit", "Force JIT.");
parser.addOption(forceJit);
if (args.constFirst() == QLatin1String("--module")) {
runAsModule = true;
args.removeFirst();
}
QCommandLineOption forceInterpreter("interpret", "Force interpreter.");
parser.addOption(forceInterpreter);
if (args.constFirst() == QLatin1String("--cache")) {
cache = true;
args.removeFirst();
}
QCommandLineOption qml("qml", "Run as QML.");
parser.addOption(qml);
if (args.constFirst() == QLatin1String("--help")) {
std::cerr << "Usage: qmljs [|--jit|--interpret|--qml] file..." << std::endl;
return EXIT_SUCCESS;
QCommandLineOption module("module", "Run as Module.");
parser.addOption(module);
QCommandLineOption cache("cache", "Use cache.");
parser.addOption(cache);
parser.process(app);
bool jitEnabled = false;
if (parser.isSet(forceJit)) {
qputenv("QV4_JIT_CALL_THRESHOLD", QByteArray("0"));
jitEnabled = true;
}
if (parser.isSet(forceInterpreter)) {
qputenv("QV4_FORCE_INTERPRETER", QByteArray("1"));
if (jitEnabled) {
std::cerr << "You cannot use 'Force JIT' and 'Force Interpreter' at the same time.";
return EXIT_FAILURE;
}
}
const bool runAsQml = parser.isSet(qml);
const bool runAsModule = parser.isSet(module);
const bool useCache = parser.isSet(cache);
const QStringList args = parser.positionalArguments();
QV4::ExecutionEngine vm;
@ -94,7 +100,7 @@ int main(int argc, char *argv[])
QV4::GlobalExtensions::init(vm.globalObject, QJSEngine::ConsoleExtension | QJSEngine::GarbageCollectionExtension);
for (const QString &fn : std::as_const(args)) {
for (const QString &fn : args) {
QV4::ScopedValue result(scope);
if (runAsModule) {
auto module = vm.loadModule(QUrl::fromLocalFile(QFileInfo(fn).absoluteFilePath()));
@ -113,7 +119,7 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
QScopedPointer<QV4::Script> script;
if (cache && QFile::exists(fn + QLatin1Char('c'))) {
if (useCache && QFile::exists(fn + QLatin1Char('c'))) {
QQmlRefPointer<QV4::ExecutableCompilationUnit> unit
= QV4::ExecutableCompilationUnit::create();
QString error;
@ -134,7 +140,7 @@ int main(int argc, char *argv[])
}
if (!scope.hasException()) {
const auto unit = script->compilationUnit;
if (cache && unit && !(unit->unitData()->flags & QV4::CompiledData::Unit::StaticData)) {
if (useCache && unit && !(unit->unitData()->flags & QV4::CompiledData::Unit::StaticData)) {
if (unit->unitData()->sourceTimeStamp == 0) {
const_cast<QV4::CompiledData::Unit*>(unit->unitData())->sourceTimeStamp = QFileInfo(fn).lastModified().toMSecsSinceEpoch();
}