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;
}
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);
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;
+}
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 {
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)
{
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())
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)
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);
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
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
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
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
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
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