diff options
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/jsruntime.pri | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject.cpp | 76 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4executableallocator.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4numberobject.cpp | 24 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4profiling.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4qobjectwrapper.cpp | 14 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4util_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4variantobject.cpp | 7 |
12 files changed, 109 insertions, 38 deletions
diff --git a/src/qml/jsruntime/jsruntime.pri b/src/qml/jsruntime/jsruntime.pri index 0c55200c64..919524d1ed 100644 --- a/src/qml/jsruntime/jsruntime.pri +++ b/src/qml/jsruntime/jsruntime.pri @@ -83,7 +83,6 @@ HEADERS += \ $$PWD/qv4serialize_p.h \ $$PWD/qv4script_p.h \ $$PWD/qv4scopedvalue_p.h \ - $$PWD/qv4util_p.h \ $$PWD/qv4executableallocator_p.h \ $$PWD/qv4sequenceobject_p.h \ $$PWD/qv4include_p.h \ @@ -108,6 +107,7 @@ HEADERS += \ $$PWD/qv4runtimeapi_p.h \ $$PWD/qv4value_p.h \ $$PWD/qv4string_p.h \ + $$PWD/qv4util_p.h \ $$PWD/qv4value_p.h SOURCES += \ diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp index 659ede7552..20ba11fd75 100644 --- a/src/qml/jsruntime/qv4arrayobject.cpp +++ b/src/qml/jsruntime/qv4arrayobject.cpp @@ -96,6 +96,8 @@ void ArrayPrototype::init(ExecutionEngine *engine, Object *ctor) defineDefaultProperty(engine->id_toString(), method_toString, 0); defineDefaultProperty(QStringLiteral("toLocaleString"), method_toLocaleString, 0); defineDefaultProperty(QStringLiteral("concat"), method_concat, 1); + defineDefaultProperty(QStringLiteral("find"), method_find, 1); + defineDefaultProperty(QStringLiteral("findIndex"), method_findIndex, 1); defineDefaultProperty(QStringLiteral("join"), method_join, 1); defineDefaultProperty(QStringLiteral("pop"), method_pop, 0); defineDefaultProperty(QStringLiteral("push"), method_push, 1); @@ -182,6 +184,80 @@ ReturnedValue ArrayPrototype::method_concat(CallContext *ctx) return result.asReturnedValue(); } +ReturnedValue ArrayPrototype::method_find(CallContext *ctx) +{ + Scope scope(ctx); + ScopedObject instance(scope, ctx->thisObject().toObject(scope.engine)); + if (!instance) + return Encode::undefined(); + + uint len = instance->getLength(); + + ScopedFunctionObject callback(scope, ctx->argument(0)); + if (!callback) + return ctx->engine()->throwTypeError(); + + ScopedCallData callData(scope, 3); + callData->thisObject = ctx->argument(1); + callData->args[2] = instance; + + ScopedValue v(scope); + + for (uint k = 0; k < len; ++k) { + v = instance->getIndexed(k); + if (scope.hasException()) + return Encode::undefined(); + + callData->args[0] = v; + callData->args[1] = Primitive::fromDouble(k); + callback->call(scope, callData); + + if (scope.hasException()) + return Encode::undefined(); + else if (scope.result.toBoolean()) + return v->asReturnedValue(); + } + + return Encode::undefined(); +} + +ReturnedValue ArrayPrototype::method_findIndex(CallContext *ctx) +{ + Scope scope(ctx); + ScopedObject instance(scope, ctx->thisObject().toObject(scope.engine)); + if (!instance) + return Encode::undefined(); + + uint len = instance->getLength(); + + ScopedFunctionObject callback(scope, ctx->argument(0)); + if (!callback) + return ctx->engine()->throwTypeError(); + + ScopedCallData callData(scope, 3); + callData->thisObject = ctx->argument(1); + callData->args[2] = instance; + + ScopedValue v(scope); + + for (uint k = 0; k < len; ++k) { + v = instance->getIndexed(k); + if (scope.hasException()) + return Encode::undefined(); + + callData->args[0] = v; + callData->args[1] = Primitive::fromDouble(k); + callback->call(scope, callData); + + if (scope.hasException()) + return Encode::undefined(); + else if (scope.result.toBoolean()) + return Encode(k); + } + + return Encode(-1); +} + ReturnedValue ArrayPrototype::method_join(CallContext *ctx) { Scope scope(ctx); diff --git a/src/qml/jsruntime/qv4arrayobject_p.h b/src/qml/jsruntime/qv4arrayobject_p.h index 9a05bb8681..f00c0c0249 100644 --- a/src/qml/jsruntime/qv4arrayobject_p.h +++ b/src/qml/jsruntime/qv4arrayobject_p.h @@ -82,6 +82,8 @@ struct ArrayPrototype: ArrayObject static ReturnedValue method_toString(CallContext *ctx); static ReturnedValue method_toLocaleString(CallContext *ctx); static ReturnedValue method_concat(CallContext *ctx); + static ReturnedValue method_find(CallContext *ctx); + static ReturnedValue method_findIndex(CallContext *ctx); static ReturnedValue method_join(CallContext *ctx); static ReturnedValue method_pop(CallContext *ctx); static ReturnedValue method_push(CallContext *ctx); diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 2b90b43eab..8f2c5174da 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -462,7 +462,7 @@ ExecutionEngine::~ExecutionEngine() QSet<QV4::CompiledData::CompilationUnit*> remainingUnits; qSwap(compilationUnits, remainingUnits); - foreach (QV4::CompiledData::CompilationUnit *unit, remainingUnits) + for (QV4::CompiledData::CompilationUnit *unit : qAsConst(remainingUnits)) unit->unlink(); emptyClass->destroy(); @@ -1043,7 +1043,7 @@ ReturnedValue ExecutionEngine::throwURIError(const Value &msg) ReturnedValue ExecutionEngine::throwUnimplemented(const QString &message) { Scope scope(this); - ScopedValue v(scope, newString(QStringLiteral("Unimplemented ") + message)); + ScopedValue v(scope, newString(QLatin1String("Unimplemented ") + message)); v = newErrorObject(v); return throwError(v); } diff --git a/src/qml/jsruntime/qv4executableallocator.cpp b/src/qml/jsruntime/qv4executableallocator.cpp index 6fe25f192d..64ac1267ce 100644 --- a/src/qml/jsruntime/qv4executableallocator.cpp +++ b/src/qml/jsruntime/qv4executableallocator.cpp @@ -147,7 +147,7 @@ ExecutableAllocator::ExecutableAllocator() ExecutableAllocator::~ExecutableAllocator() { - foreach (ChunkOfPages *chunk, chunks) { + for (ChunkOfPages *chunk : qAsConst(chunks)) { for (Allocation *allocation = chunk->firstAllocation; allocation; allocation = allocation->next) if (!allocation->free) allocation->invalidate(); diff --git a/src/qml/jsruntime/qv4numberobject.cpp b/src/qml/jsruntime/qv4numberobject.cpp index 5b5aa29d55..3a6b9da763 100644 --- a/src/qml/jsruntime/qv4numberobject.cpp +++ b/src/qml/jsruntime/qv4numberobject.cpp @@ -63,7 +63,9 @@ NumberLocale::NumberLocale() : QLocale(QLocale::C), // -128 means shortest string that can accurately represent the number. defaultDoublePrecision(0xffffff80) { - setNumberOptions(QLocale::OmitGroupSeparator | QLocale::OmitLeadingZeroInExponent); + setNumberOptions(QLocale::OmitGroupSeparator | + QLocale::OmitLeadingZeroInExponent | + QLocale::IncludeTrailingZeroesAfterDot); } const NumberLocale *NumberLocale::instance() @@ -291,24 +293,6 @@ ReturnedValue NumberPrototype::method_toPrecision(CallContext *ctx) return ctx->engine()->throwRangeError(error); } - // TODO: Once we get a NumberOption to retain trailing zeroes, replace the code below with: - // QString result = NumberLocale::instance()->toString(v->asDouble(), 'g', precision); - QByteArray format = "%#." + QByteArray::number(precision) + "g"; - QString result = QString::asprintf(format.constData(), v->asDouble()); - if (result.endsWith(QLatin1Char('.'))) { - // This is 'f' notation, not 'e'. - result.chop(1); - } else { - int ePos = result.indexOf(QLatin1Char('e')); - if (ePos != -1) { - Q_ASSERT(ePos + 2 < result.length()); // always '+' or '-', and number, after 'e' - Q_ASSERT(ePos > 0); // 'e' is not the first character - - if (result.at(ePos + 2) == QLatin1Char('0')) // Drop leading zeroes in exponent - result = result.remove(ePos + 2, 1); - if (result.at(ePos - 1) == QLatin1Char('.')) // Drop trailing dots before 'e' - result = result.remove(ePos - 1, 1); - } - } + QString result = NumberLocale::instance()->toString(v->asDouble(), 'g', precision); return scope.engine->newString(result)->asReturnedValue(); } diff --git a/src/qml/jsruntime/qv4profiling.cpp b/src/qml/jsruntime/qv4profiling.cpp index 349ec48e06..8862cbef8e 100644 --- a/src/qml/jsruntime/qv4profiling.cpp +++ b/src/qml/jsruntime/qv4profiling.cpp @@ -96,7 +96,7 @@ void Profiler::reportData(bool trackLocations) FunctionLocationHash locations; properties.reserve(m_data.size()); - foreach (const FunctionCall &call, m_data) { + for (const FunctionCall &call : qAsConst(m_data)) { properties.append(call.properties()); Function *function = call.function(); SentMarker &marker = m_sentLocations[reinterpret_cast<quintptr>(function)]; diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp index 5f66b56a42..77dbb18b50 100644 --- a/src/qml/jsruntime/qv4qobjectwrapper.cpp +++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp @@ -1306,9 +1306,8 @@ static QV4::ReturnedValue CallPrecise(const QQmlObjectOrGadget &object, const QQ int returnType = object.methodReturnType(data, &unknownTypeError); if (returnType == QMetaType::UnknownType) { - QString typeName = QString::fromLatin1(unknownTypeError); - QString error = QStringLiteral("Unknown method return type: %1").arg(typeName); - return engine->throwError(error); + return engine->throwError(QLatin1String("Unknown method return type: ") + + QLatin1String(unknownTypeError)); } if (data.hasArguments()) { @@ -1323,9 +1322,8 @@ static QV4::ReturnedValue CallPrecise(const QQmlObjectOrGadget &object, const QQ args = object.methodParameterTypes(data.coreIndex(), &storage, &unknownTypeError); if (!args) { - QString typeName = QString::fromLatin1(unknownTypeError); - QString error = QStringLiteral("Unknown method parameter type: %1").arg(typeName); - return engine->throwError(error); + return engine->throwError(QLatin1String("Unknown method parameter type: ") + + QLatin1String(unknownTypeError)); } if (args[0] > callArgs->argc) { @@ -1914,8 +1912,8 @@ ReturnedValue QMetaObjectWrapper::constructInternal(CallData * callData) const { ExecutionEngine *v4 = engine(); const QMetaObject* mo = d()->metaObject; if (d()->constructorCount == 0) { - return v4->throwTypeError(QStringLiteral("%1 has no invokable constructor") - .arg(QLatin1String(mo->className()))); + return v4->throwTypeError(QLatin1String(mo->className()) + + QLatin1String(" has no invokable constructor")); } Scope scope(v4); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 57ad181030..d6c55926b1 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -176,7 +176,7 @@ struct RuntimeCounters::Data { } std::sort(lines.begin(), lines.end(), Line::less); outs << lines.size() << " counters:" << endl; - foreach (const Line &line, lines) + for (const Line &line : qAsConst(lines)) outs << qSetFieldWidth(10) << line.count << qSetFieldWidth(0) << " | " << line.func << " | " << pretty(line.tag1) diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp index 5d7df9a9d7..b54177bee9 100644 --- a/src/qml/jsruntime/qv4script.cpp +++ b/src/qml/jsruntime/qv4script.cpp @@ -99,7 +99,8 @@ void Script::parse() const bool parsed = parser.parseProgram(); - foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) { + const auto diagnosticMessages = parser.diagnosticMessages(); + for (const QQmlJS::DiagnosticMessage &m : diagnosticMessages) { if (m.isError()) { valueScope.engine->throwSyntaxError(m.message, sourceFile, m.loc.startLine, m.loc.startColumn); return; @@ -203,7 +204,8 @@ QQmlRefPointer<QV4::CompiledData::CompilationUnit> Script::precompile(IR::Module QList<QQmlError> errors; - foreach (const QQmlJS::DiagnosticMessage &m, parser.diagnosticMessages()) { + const auto diagnosticMessages = parser.diagnosticMessages(); + for (const QQmlJS::DiagnosticMessage &m : diagnosticMessages) { if (m.isWarning()) { qWarning("%s:%d : %s", qPrintable(url.toString()), m.loc.startLine, qPrintable(m.message)); continue; diff --git a/src/qml/jsruntime/qv4util_p.h b/src/qml/jsruntime/qv4util_p.h index 59c12c5e46..2669a3e4bf 100644 --- a/src/qml/jsruntime/qv4util_p.h +++ b/src/qml/jsruntime/qv4util_p.h @@ -90,6 +90,9 @@ public: : bits(size, value) {} + void clear() + { bits = std::vector<bool>(bits.size(), false); } + void reserve(int size) { bits.reserve(size); } @@ -153,6 +156,9 @@ public: : bits(size, value) {} + void clear() + { bits = QBitArray(bits.size(), false); } + void reserve(int size) { Q_UNUSED(size); } diff --git a/src/qml/jsruntime/qv4variantobject.cpp b/src/qml/jsruntime/qv4variantobject.cpp index b26dd27913..455a7ccb65 100644 --- a/src/qml/jsruntime/qv4variantobject.cpp +++ b/src/qml/jsruntime/qv4variantobject.cpp @@ -141,8 +141,11 @@ QV4::ReturnedValue VariantPrototype::method_toString(CallContext *ctx) if (!o) return Encode::undefined(); QString result = o->d()->data().toString(); - if (result.isEmpty() && !o->d()->data().canConvert(QVariant::String)) - result = QStringLiteral("QVariant(%0)").arg(QString::fromLatin1(o->d()->data().typeName())); + if (result.isEmpty() && !o->d()->data().canConvert(QVariant::String)) { + result = QLatin1String("QVariant(") + + QLatin1String(o->d()->data().typeName()) + + QLatin1Char(')'); + } return Encode(ctx->d()->engine->newString(result)); } |