Implement StringObject properly
authorLars Knoll <lars.knoll@digia.com>
Mon, 14 Jan 2013 13:51:53 +0000 (14:51 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Mon, 14 Jan 2013 15:33:03 +0000 (16:33 +0100)
we now pass all of 15.5.5

Change-Id: Ia72bd5f064e6edfcd440e2c2ea72459a09efd1e8
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
qmljs_engine.cpp
qmljs_engine.h
qmljs_objects.cpp
qmljs_objects.h
qmljs_runtime.cpp
qv4ecmaobjects.cpp
qv4ecmaobjects_p.h
tests/TestExpectations

index 07983b7..9264d8d 100644 (file)
@@ -279,9 +279,9 @@ String *ExecutionEngine::newString(const QString &s)
     return stringPool->newString(s);
 }
 
-Object *ExecutionEngine::newStringObject(const Value &value)
+Object *ExecutionEngine::newStringObject(ExecutionContext *ctx, const Value &value)
 {
-    StringObject *object = new (memoryManager) StringObject(value);
+    StringObject *object = new (memoryManager) StringObject(ctx, value);
     object->prototype = stringPrototype;
     return object;
 }
index 3e098be..babaf1a 100644 (file)
@@ -176,7 +176,7 @@ struct ExecutionEngine
     FunctionObject *newObjectCtor(ExecutionContext *ctx);
 
     String *newString(const QString &s);
-    Object *newStringObject(const Value &value);
+    Object *newStringObject(ExecutionContext *ctx, const Value &value);
     FunctionObject *newStringCtor(ExecutionContext *ctx);
 
     Object *newNumberObject(const Value &value);
index 631e90a..c0485bb 100644 (file)
@@ -1316,3 +1316,31 @@ void BoundFunction::getCollectables(QVector<Object *> &objects)
         if (Object *o = boundArgs.at(i).asObject())
             objects.append(o);
 }
+
+
+StringObject::StringObject(ExecutionContext *ctx, const Value &value)
+    : value(value)
+{
+    tmpProperty.type = PropertyDescriptor::Data;
+    tmpProperty.enumberable = PropertyDescriptor::Enabled;
+    tmpProperty.writable = PropertyDescriptor::Disabled;
+    tmpProperty.configurable = PropertyDescriptor::Disabled;
+    tmpProperty.value = Value::undefinedValue();
+
+    assert(value.isString());
+    defineReadonlyProperty(ctx->engine->id_length, Value::fromUInt32(value.stringValue()->toQString().length()));
+}
+
+PropertyDescriptor *StringObject::__getOwnProperty__(ExecutionContext *ctx, uint index)
+{
+    PropertyDescriptor *pd = Object::__getOwnProperty__(ctx, index);
+    if (pd)
+        return pd;
+    assert(value.isString());
+    QString str = value.stringValue()->toQString();
+    if (index >= (uint)str.length())
+        return 0;
+    String *result = ctx->engine->newString(str.mid(index, 1));
+    tmpProperty.value = Value::fromString(result);
+    return &tmpProperty;
+}
index d373573..5d3b9ca 100644 (file)
@@ -199,9 +199,12 @@ struct NumberObject: Object {
 
 struct StringObject: Object {
     Value value;
-    StringObject(const Value &value): value(value) {}
+    PropertyDescriptor tmpProperty;
+    StringObject(ExecutionContext *ctx, const Value &value);
     virtual QString className() { return QStringLiteral("String"); }
     virtual StringObject *asStringObject() { return this; }
+
+    virtual PropertyDescriptor *__getOwnProperty__(ExecutionContext *ctx, uint index);
 };
 
 struct DateObject: Object {
index c403186..8833f7b 100644 (file)
@@ -544,7 +544,7 @@ Value __qmljs_new_number_object(ExecutionContext *ctx, double number)
 Value __qmljs_new_string_object(ExecutionContext *ctx, String *string)
 {
     Value value = Value::fromString(string);
-    return Value::fromObject(ctx->engine->newStringObject(value));
+    return Value::fromObject(ctx->engine->newStringObject(ctx, value));
 }
 
 void __qmljs_set_property(ExecutionContext *ctx, Value object, String *name, Value value)
@@ -558,11 +558,10 @@ Value __qmljs_get_element(ExecutionContext *ctx, Value object, Value index)
 {
     uint idx = index.asArrayIndex();
     if (object.isString() && idx < UINT_MAX) {
-        const QString s = object.stringValue()->toQString().mid(idx, 1);
-        if (s.isNull())
+        if (idx >= object.stringValue()->toQString().length())
             return Value::undefinedValue();
-        else
-            return Value::fromString(ctx, s);
+        const QString s = object.stringValue()->toQString().mid(idx, 1);
+        return Value::fromString(ctx, s);
     }
 
     if (! object.isObject())
index 3090505..73ff246 100644 (file)
@@ -1009,7 +1009,7 @@ Value StringCtor::construct(ExecutionContext *ctx)
         value = Value::fromString(ctx->argument(0).toString(ctx));
     else
         value = Value::fromString(ctx, QString());
-    return Value::fromObject(ctx->engine->newStringObject(value));
+    return Value::fromObject(ctx->engine->newStringObject(ctx, value));
 }
 
 Value StringCtor::call(ExecutionContext *ctx)
index f1c7a0d..53936be 100644 (file)
@@ -97,7 +97,7 @@ struct StringCtor: FunctionObject
 
 struct StringPrototype: StringObject
 {
-    StringPrototype(ExecutionContext *ctx): StringObject(Value::fromString(ctx, QString())) {}
+    StringPrototype(ExecutionContext *ctx): StringObject(ctx, Value::fromString(ctx, QString())) {}
     void init(ExecutionContext *ctx, const Value &ctor);
 
     static QString getThisString(ExecutionContext *ctx);
index 4b2db80..e6349fe 100644 (file)
@@ -138,7 +138,6 @@ S11.2.1_A3_T2 failing
 S11.2.1_A3_T3 failing
 S11.2.1_A4_T1 failing
 S11.2.1_A4_T3 failing
-S11.2.1_A4_T5 failing
 11.2.3-3_3 failing
 S11.2.3_A3_T1 failing
 S11.2.3_A3_T2 failing
@@ -780,7 +779,6 @@ S15.1.3.2_A4_T4 failing
 S15.1.3.2_A5.1 failing
 S15.1.3.2_A5.2 failing
 S15.1.3.2_A5.3 failing
-15.2.3.3-3-14 failing
 15.2.3.3-4-10 failing
 15.2.3.3-4-11 failing
 15.2.3.3-4-12 failing
@@ -790,7 +788,6 @@ S15.1.3.2_A5.3 failing
 15.2.3.3-4-164 failing
 15.2.3.3-4-176 failing
 15.2.3.3-4-177 failing
-15.2.3.3-4-192 failing
 15.2.3.3-4-212 failing
 15.2.3.3-4-213 failing
 15.2.3.3-4-214 failing
@@ -2504,7 +2501,6 @@ S15.4.4.9_A3_T3 failing
 S15.4.4.9_A4_T1 failing
 S15.4.4.9_A4_T2 failing
 S15.5.4.13_A2_T2 failing
-S15.5.4.13_A2_T7 failing
 S15.5.4.13_A3_T3 failing
 S15.5.4.14_A1_T1 failing
 S15.5.4.14_A1_T10 failing
@@ -2608,7 +2604,6 @@ S15.5.4.15_A1_T2 failing
 S15.5.4.15_A1_T7 failing
 S15.5.4.15_A1_T8 failing
 S15.5.4.15_A1_T9 failing
-S15.5.4.15_A2_T8 failing
 15.5.4.20-0-1 failing
 15.5.4.20-0-2 failing
 15.5.4.20-1-3 failing
@@ -2741,12 +2736,6 @@ S15.5.4.4_A1_T10 failing
 S15.5.4.8_A1_T10 failing
 S15.5.4.8_A1_T12 failing
 S15.5.4.8_A1_T4 failing
-S15.5.5.1_A1 failing
-S15.5.5.1_A2 failing
-S15.5.5.1_A3 failing
-S15.5.5.1_A4 failing
-S15.5.5.1_A5 failing
-15.5.5.5.2-7-4 failing
 S15.7.4_A3.3 failing
 S15.7.4.5_A1.3_T01 failing
 S15.7.4.5_A1.3_T02 failing