aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsapi
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-01-06 18:06:13 +0100
committerUlf Hermann <ulf.hermann@qt.io>2021-01-12 11:44:07 +0100
commit830eba61b73852a354954086a67e24cc22393558 (patch)
treef82c195afd398805c538e3822052219c681760ed /src/qml/jsapi
parent7660c30e08975011c7bd47bcb1796139b9d77196 (diff)
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 <fabian.kosmale@qt.io> Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Diffstat (limited to 'src/qml/jsapi')
-rw-r--r--src/qml/jsapi/qjsmanagedvalue.cpp13
1 files changed, 13 insertions, 0 deletions
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<QV4::String>())
+ return arrayIndex < quint32(string->d()->length());
+
if (QV4::Object *obj = d->as<QV4::Object>()) {
bool hasProperty = false;
if (arrayIndex == std::numeric_limits<quint32>::max())
@@ -852,6 +855,9 @@ bool QJSManagedValue::hasOwnProperty(quint32 arrayIndex) const
if (!d || d->isNullOrUndefined())
return false;
+ if (QV4::String *string = d->as<QV4::String>())
+ return arrayIndex < quint32(string->d()->length());
+
if (QV4::Object *obj = d->as<QV4::Object>()) {
if (arrayIndex == std::numeric_limits<quint32>::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<QV4::String>()) {
+ const QString qString = string->toQString();
+ if (arrayIndex < qString.size())
+ return qString.sliced(arrayIndex, 1);
+ return QJSValue();
+ }
+
if (QV4::Object *obj = d->as<QV4::Object>()) {
if (arrayIndex == std::numeric_limits<quint32>::max())
return QJSValuePrivate::fromReturnedValue(obj->get(obj->engine()->id_uintMax()));