From 830eba61b73852a354954086a67e24cc22393558 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 6 Jan 2021 18:06:13 +0100 Subject: QJSManagedValue: Allow array access to strings If you access a string as an array you get a one-character string of the index you are asking for. Change-Id: Ie2ac3243c9e23f37b8904c54d824946646a596eb Reviewed-by: Fabian Kosmale Reviewed-by: Andrei Golubev --- src/qml/jsapi/qjsmanagedvalue.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src') diff --git a/src/qml/jsapi/qjsmanagedvalue.cpp b/src/qml/jsapi/qjsmanagedvalue.cpp index 35efd5c0f3..cd93366524 100644 --- a/src/qml/jsapi/qjsmanagedvalue.cpp +++ b/src/qml/jsapi/qjsmanagedvalue.cpp @@ -830,6 +830,9 @@ bool QJSManagedValue::hasProperty(quint32 arrayIndex) const if (!d || d->isNullOrUndefined()) return false; + if (QV4::String *string = d->as()) + return arrayIndex < quint32(string->d()->length()); + if (QV4::Object *obj = d->as()) { bool hasProperty = false; if (arrayIndex == std::numeric_limits::max()) @@ -852,6 +855,9 @@ bool QJSManagedValue::hasOwnProperty(quint32 arrayIndex) const if (!d || d->isNullOrUndefined()) return false; + if (QV4::String *string = d->as()) + return arrayIndex < quint32(string->d()->length()); + if (QV4::Object *obj = d->as()) { if (arrayIndex == std::numeric_limits::max()) { return obj->getOwnProperty(obj->engine()->id_uintMax()->toPropertyKey()) @@ -875,6 +881,13 @@ QJSValue QJSManagedValue::property(quint32 arrayIndex) const if (!d || d->isNullOrUndefined()) return QJSValue(); + if (QV4::String *string = d->as()) { + const QString qString = string->toQString(); + if (arrayIndex < qString.size()) + return qString.sliced(arrayIndex, 1); + return QJSValue(); + } + if (QV4::Object *obj = d->as()) { if (arrayIndex == std::numeric_limits::max()) return QJSValuePrivate::fromReturnedValue(obj->get(obj->engine()->id_uintMax())); -- cgit v1.2.3