if (ArrayObject *instance = ctx->thisObject.asArrayObject()) {
result->copyArrayData(instance);
+ } else if (ctx->thisObject.isString()) {
+ QString v = ctx->thisObject.stringValue()->toQString();
+ result->arraySet(0, Value::fromString(ctx, v));
} else if (ctx->thisObject.asStringObject()) {
QString v = ctx->thisObject.toString(ctx)->toQString();
result->arraySet(0, Value::fromString(ctx, v));
} else {
- Object *instance = ctx->thisObject.asObject();
- result->arraySet(0, ctx->thisObject);
+ Object *instance = ctx->thisObject.toObject(ctx);
+ result->arraySet(0, Value::fromObject(instance));
}
for (uint i = 0; i < ctx->argumentCount; ++i) {
Value args[3];
args[0] = v;
args[1] = Value::fromDouble(k);
- args[2] = ctx->thisObject;
+ args[2] = Value::fromObject(instance);
Value r = callback->call(thisArg, args, 3);
ok = r.toBoolean();
}
Value args[3];
args[0] = v;
args[1] = Value::fromDouble(k);
- args[2] = ctx->thisObject;
+ args[2] = Value::fromObject(instance);
Value r = callback->call(thisArg, args, 3);
if (r.toBoolean())
return Value::fromBoolean(true);
Value args[3];
args[0] = v;
args[1] = Value::fromDouble(k);
- args[2] = ctx->thisObject;
+ args[2] = Value::fromObject(instance);
callback->call(thisArg, args, 3);
}
return Value::undefinedValue();
Value args[3];
args[0] = v;
args[1] = Value::fromDouble(k);
- args[2] = ctx->thisObject;
+ args[2] = Value::fromObject(instance);
Value mapped = callback->call(thisArg, args, 3);
a->arraySet(k, mapped);
}
Value args[3];
args[0] = v;
args[1] = Value::fromDouble(k);
- args[2] = ctx->thisObject;
+ args[2] = Value::fromObject(instance);
Value selected = callback->call(thisArg, args, 3);
if (selected.toBoolean()) {
a->arraySet(to, v);
args[0] = acc;
args[1] = v;
args[2] = Value::fromDouble(k);
- args[3] = ctx->thisObject;
+ args[3] = Value::fromObject(instance);
acc = callback->call(Value::undefinedValue(), args, 4);
}
++k;
args[0] = acc;
args[1] = v;
args[2] = Value::fromDouble(k - 1);
- args[3] = ctx->thisObject;
+ args[3] = Value::fromObject(instance);
acc = callback->call(Value::undefinedValue(), args, 4);
}
--k;
ctx.argumentCount = argc;
v4->pushContext(&ctx);
- if (!f->strictMode && !thisObject.isObject()) {
- // Built-in functions allow for the this object to be null or undefined. This overrides
- // the behaviour of changing thisObject to the global object if null/undefined and allows
- // the built-in functions for example to throw a type error if null is passed.
- if (!thisObject.isUndefined() && !thisObject.isNull())
- ctx.thisObject = Value::fromObject(thisObject.toObject(context));
- }
-
- Value result = Value::undefinedValue();
+ Value result;
try {
result = f->code(&ctx);
} catch (Exception &ex) {
ctx.argumentCount = argc;
v4->pushContext(&ctx);
- if (!f->strictMode && !thisObject.isObject()) {
- // Built-in functions allow for the this object to be null or undefined. This overrides
- // the behaviour of changing thisObject to the global object if null/undefined and allows
- // the built-in functions for example to throw a type error if null is passed.
- if (!thisObject.isUndefined() && !thisObject.isNull())
- ctx.thisObject = Value::fromObject(thisObject.toObject(context));
- }
-
- Value result = Value::undefinedValue();
+ Value result;
try {
result = f->code(&ctx, f->index);
} catch (Exception &ex) {
defineDefaultProperty(ctx, QStringLiteral("toPrecision"), method_toPrecision);
}
+inline Value thisNumberValue(ExecutionContext *ctx)
+{
+ if (ctx->thisObject.isNumber())
+ return ctx->thisObject;
+ NumberObject *n = ctx->thisObject.asNumberObject();
+ if (!n)
+ ctx->throwTypeError();
+ return n->value;
+}
+
Value NumberPrototype::method_toString(SimpleCallContext *ctx)
{
- double num;
- if (ctx->thisObject.isNumber()) {
- num = ctx->thisObject.asDouble();
- } else {
- NumberObject *thisObject = ctx->thisObject.asNumberObject();
- if (!thisObject)
- ctx->throwTypeError();
- num = thisObject->value.asDouble();
- }
+ double num = thisNumberValue(ctx).asDouble();
Value arg = ctx->argument(0);
if (!arg.isUndefined()) {
Value NumberPrototype::method_toLocaleString(SimpleCallContext *ctx)
{
- NumberObject *thisObject = ctx->thisObject.asNumberObject();
- if (!thisObject)
- ctx->throwTypeError();
+ Value v = thisNumberValue(ctx);
- String *str = thisObject->value.toString(ctx);
+ String *str = v.toString(ctx);
return Value::fromString(str);
}
Value NumberPrototype::method_valueOf(SimpleCallContext *ctx)
{
- NumberObject *thisObject = ctx->thisObject.asNumberObject();
- if (!thisObject)
- ctx->throwTypeError();
-
- return thisObject->value;
+ return thisNumberValue(ctx);
}
Value NumberPrototype::method_toFixed(SimpleCallContext *ctx)
{
- NumberObject *thisObject = ctx->thisObject.asNumberObject();
- if (!thisObject)
- ctx->throwTypeError();
+ double v = thisNumberValue(ctx).asDouble();
double fdigits = 0;
if (fdigits < 0 || fdigits > 20)
ctx->throwRangeError(ctx->thisObject);
- double v = thisObject->value.asDouble();
QString str;
if (std::isnan(v))
str = QString::fromLatin1("NaN");
Value NumberPrototype::method_toExponential(SimpleCallContext *ctx)
{
- NumberObject *thisObject = ctx->thisObject.asNumberObject();
- if (!thisObject)
- ctx->throwTypeError();
+ double d = thisNumberValue(ctx).asDouble();
Value fraction = ctx->argument(0);
int fdigits = -1;
char str[100];
double_conversion::StringBuilder builder(str, sizeof(str));
- double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToExponential(thisObject->value.asDouble(), fdigits, &builder);
+ double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToExponential(d, fdigits, &builder);
QString result = QString::fromLatin1(builder.Finalize());
return Value::fromString(ctx, result);
Value NumberPrototype::method_toPrecision(SimpleCallContext *ctx)
{
- NumberObject *thisObject = ctx->thisObject.asNumberObject();
- if (!thisObject)
- ctx->throwTypeError();
+ Value v = thisNumberValue(ctx);
Value prec = ctx->argument(0);
if (prec.isUndefined())
- return __qmljs_to_string(thisObject->value, ctx);
+ return __qmljs_to_string(v, ctx);
double precision = prec.toInt32();
if (precision < 1 || precision > 21) {
char str[100];
double_conversion::StringBuilder builder(str, sizeof(str));
- double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToPrecision(thisObject->value.asDouble(), precision, &builder);
+ double_conversion::DoubleToStringConverter::EcmaScriptConverter().ToPrecision(v.asDouble(), precision, &builder);
QString result = QString::fromLatin1(builder.Finalize());
return Value::fromString(ctx, result);