UINT_MAX is not a valid array index
authorLars Knoll <lars.knoll@digia.com>
Fri, 3 May 2013 20:40:58 +0000 (22:40 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Sat, 4 May 2013 08:50:36 +0000 (10:50 +0200)
Make sure indexed getter and setter in QJSValue do the right
thing for UINT_MAX

Change-Id: I57bc24016d85050b30422efc18479d17ec95ba56
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/qml/v4/qv4engine.cpp
src/qml/qml/v4/qv4engine_p.h
src/qml/qml/v8/qjsvalue.cpp

index aced2d2..013817a 100644 (file)
@@ -107,6 +107,7 @@ ExecutionEngine::ExecutionEngine(QQmlJS::EvalISelFactory *factory)
     id_get = newIdentifier(QStringLiteral("get"));
     id_set = newIdentifier(QStringLiteral("set"));
     id_eval = newIdentifier(QStringLiteral("eval"));
+    id_uintMax = newIdentifier(QStringLiteral("4294967295"));
 
     emptyClass = new InternalClass(this);
     arrayClass = emptyClass->addMember(id_length, Attr_NotConfigurable|Attr_NotEnumerable);
@@ -570,6 +571,7 @@ void ExecutionEngine::markObjects()
     id_get->mark();
     id_set->mark();
     id_eval->mark();
+    id_uintMax->mark();
 }
 
 Value ExecutionEngine::run(Function *function, ExecutionContext *ctx)
index 818cd9e..728e1d0 100644 (file)
@@ -191,6 +191,7 @@ struct Q_QML_EXPORT ExecutionEngine
     String *id_get;
     String *id_set;
     String *id_eval;
+    String *id_uintMax;
 
     QVector<Function *> functions;
 
index b0202fa..839bdab 100644 (file)
@@ -767,7 +767,7 @@ QJSValue QJSValue::property(quint32 arrayIndex) const
 
     QV4::ExecutionContext *ctx = d->engine->current;
     try {
-        QV4::Value v = o->getIndexed(ctx, arrayIndex);
+        QV4::Value v = arrayIndex == UINT_MAX ? o->get(ctx, ctx->engine->id_uintMax) : o->getIndexed(ctx, arrayIndex);
         return new QJSValuePrivate(d->engine, v);
     } catch (QV4::Exception &e) {
         e.accept(ctx);
@@ -828,7 +828,10 @@ void QJSValue::setProperty(quint32 arrayIndex, const QJSValue& value)
 
     QV4::ExecutionContext *ctx = d->engine->current;
     try {
-        o->putIndexed(ctx, arrayIndex, value.d->value);
+        if (arrayIndex != UINT_MAX)
+            o->putIndexed(ctx, arrayIndex, value.d->value);
+        else
+            o->put(ctx, ctx->engine->id_uintMax, value.d->value);
     } catch (QV4::Exception &e) {
         e.accept(ctx);
     }