Change signature for call/callAsConstructor

Change-Id: I159b57acc7a2133ef1ad545aa84e792c63449a57
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Lars Knoll 2017-10-21 15:55:45 +02:00
parent 7f4a2f38b0
commit 6e3317bb17
35 changed files with 268 additions and 250 deletions

View File

@ -207,12 +207,12 @@ PropertyAttributes ArgumentsObject::queryIndexed(const Managed *m, uint index)
DEFINE_OBJECT_VTABLE(ArgumentsGetterFunction);
ReturnedValue ArgumentsGetterFunction::call(const Managed *getter, CallData *callData)
ReturnedValue ArgumentsGetterFunction::call(const FunctionObject *getter, const Value *thisObject, const Value *, int)
{
ExecutionEngine *v4 = static_cast<const ArgumentsGetterFunction *>(getter)->engine();
ExecutionEngine *v4 = getter->engine();
Scope scope(v4);
Scoped<ArgumentsGetterFunction> g(scope, static_cast<const ArgumentsGetterFunction *>(getter));
Scoped<ArgumentsObject> o(scope, callData->thisObject.as<ArgumentsObject>());
const ArgumentsGetterFunction *g = static_cast<const ArgumentsGetterFunction *>(getter);
Scoped<ArgumentsObject> o(scope, thisObject->as<ArgumentsObject>());
if (!o)
return v4->throwTypeError();
@ -222,17 +222,17 @@ ReturnedValue ArgumentsGetterFunction::call(const Managed *getter, CallData *cal
DEFINE_OBJECT_VTABLE(ArgumentsSetterFunction);
ReturnedValue ArgumentsSetterFunction::call(const Managed *setter, CallData *callData)
ReturnedValue ArgumentsSetterFunction::call(const FunctionObject *setter, const Value *thisObject, const Value *argv, int argc)
{
ExecutionEngine *v4 = static_cast<const ArgumentsSetterFunction *>(setter)->engine();
ExecutionEngine *v4 = setter->engine();
Scope scope(v4);
Scoped<ArgumentsSetterFunction> s(scope, static_cast<const ArgumentsSetterFunction *>(setter));
Scoped<ArgumentsObject> o(scope, callData->thisObject.as<ArgumentsObject>());
const ArgumentsSetterFunction *s = static_cast<const ArgumentsSetterFunction *>(setter);
Scoped<ArgumentsObject> o(scope, thisObject->as<ArgumentsObject>());
if (!o)
return v4->throwTypeError();
Q_ASSERT(s->index() < static_cast<unsigned>(o->context()->argc()));
o->context()->setArg(s->index(), (callData->argc() ? callData->args[0] : Primitive::undefinedValue()));
o->context()->setArg(s->index(), argc ? argv[0] : Primitive::undefinedValue());
return Encode::undefined();
}

View File

@ -98,7 +98,7 @@ struct ArgumentsGetterFunction: FunctionObject
V4_OBJECT2(ArgumentsGetterFunction, FunctionObject)
uint index() const { return d()->index; }
static ReturnedValue call(const Managed *that, CallData *d);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
inline void
@ -113,7 +113,7 @@ struct ArgumentsSetterFunction: FunctionObject
V4_OBJECT2(ArgumentsSetterFunction, FunctionObject)
uint index() const { return d()->index; }
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
inline void

View File

@ -52,12 +52,12 @@ void Heap::ArrayBufferCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("ArrayBuffer"));
}
ReturnedValue ArrayBufferCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue ArrayBufferCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
ExecutionEngine *v4 = m->engine();
ExecutionEngine *v4 = f->engine();
Scope scope(v4);
ScopedValue l(scope, callData->argument(0));
ScopedValue l(scope, argc ? argv[0] : Primitive::undefinedValue());
double dl = l->toInteger();
if (v4->hasException)
return Encode::undefined();
@ -73,9 +73,9 @@ ReturnedValue ArrayBufferCtor::callAsConstructor(const Managed *m, CallData *cal
}
ReturnedValue ArrayBufferCtor::call(const Managed *that, CallData *callData)
ReturnedValue ArrayBufferCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
return callAsConstructor(that, callData);
return callAsConstructor(f, argv, argc);
}
ReturnedValue ArrayBufferCtor::method_isView(const BuiltinFunction *, CallData *callData)

View File

@ -78,8 +78,8 @@ struct ArrayBufferCtor: FunctionObject
{
V4_OBJECT2(ArrayBufferCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
static ReturnedValue method_isView(const BuiltinFunction *, CallData *callData);

View File

@ -55,34 +55,34 @@ void Heap::ArrayCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("Array"));
}
ReturnedValue ArrayCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue ArrayCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
ExecutionEngine *v4 = static_cast<const ArrayCtor *>(m)->engine();
ExecutionEngine *v4 = static_cast<const ArrayCtor *>(f)->engine();
Scope scope(v4);
ScopedArrayObject a(scope, v4->newArrayObject());
uint len;
if (callData->argc() == 1 && callData->args[0].isNumber()) {
if (argc == 1 && argv[0].isNumber()) {
bool ok;
len = callData->args[0].asArrayLength(&ok);
len = argv[0].asArrayLength(&ok);
if (!ok)
return v4->throwRangeError(callData->args[0]);
return v4->throwRangeError(argv[0]);
if (len < 0x1000)
a->arrayReserve(len);
} else {
len = callData->argc();
len = argc;
a->arrayReserve(len);
a->arrayPut(0, callData->args, len);
a->arrayPut(0, argv, len);
}
a->setArrayLengthUnchecked(len);
return a.asReturnedValue();
}
ReturnedValue ArrayCtor::call(const Managed *that, CallData *callData)
ReturnedValue ArrayCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
return callAsConstructor(that, callData);
return callAsConstructor(f, argv, argc);
}
void ArrayPrototype::init(ExecutionEngine *engine, Object *ctor)

View File

@ -70,8 +70,8 @@ struct ArrayCtor: FunctionObject
{
V4_OBJECT2(ArrayCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct ArrayPrototype: ArrayObject

View File

@ -50,15 +50,15 @@ void Heap::BooleanCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("Boolean"));
}
ReturnedValue BooleanCtor::callAsConstructor(const Managed *that, CallData *callData)
ReturnedValue BooleanCtor::callAsConstructor(const FunctionObject *that, const Value *argv, int argc)
{
bool n = callData->argc() ? callData->args[0].toBoolean() : false;
bool n = argc ? argv[0].toBoolean() : false;
return Encode(that->engine()->newBooleanObject(n));
}
ReturnedValue BooleanCtor::call(const Managed *, CallData *callData)
ReturnedValue BooleanCtor::call(const FunctionObject *, const Value *, const Value *argv, int argc)
{
bool value = callData->argc() ? callData->args[0].toBoolean() : 0;
bool value = argc ? argv[0].toBoolean() : 0;
return Encode(value);
}

View File

@ -70,8 +70,8 @@ struct BooleanCtor: FunctionObject
{
V4_OBJECT2(BooleanCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct BooleanPrototype: BooleanObject

View File

@ -54,17 +54,17 @@ void Heap::DataViewCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("DataView"));
}
ReturnedValue DataViewCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue DataViewCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
Scope scope(m->engine());
Scoped<ArrayBuffer> buffer(scope, callData->argument(0));
Scope scope(f->engine());
Scoped<ArrayBuffer> buffer(scope, argc ? argv[0] : Primitive::undefinedValue());
if (!buffer)
return scope.engine->throwTypeError();
double bo = callData->argc() > 1 ? callData->args[1].toNumber() : 0;
double bo = argc > 1 ? argv[1].toNumber() : 0;
uint byteOffset = (uint)bo;
uint bufferLength = buffer->d()->data->size;
double bl = callData->argc() < 3 || callData->args[2].isUndefined() ? (bufferLength - bo) : callData->args[2].toNumber();
double bl = argc < 3 || argv[2].isUndefined() ? (bufferLength - bo) : argv[2].toNumber();
uint byteLength = (uint)bl;
if (bo != byteOffset || bl != byteLength || byteOffset + byteLength > bufferLength)
return scope.engine->throwRangeError(QStringLiteral("DataView: constructor arguments out of range"));
@ -76,9 +76,9 @@ ReturnedValue DataViewCtor::callAsConstructor(const Managed *m, CallData *callDa
return a.asReturnedValue();
}
ReturnedValue DataViewCtor::call(const Managed *that, CallData *callData)
ReturnedValue DataViewCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
return callAsConstructor(that, callData);
return callAsConstructor(f, argv, argc);
}
void DataViewPrototype::init(ExecutionEngine *engine, Object *ctor)

View File

@ -79,8 +79,8 @@ struct DataViewCtor: FunctionObject
{
V4_OBJECT2(DataViewCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct DataView : Object

View File

@ -678,16 +678,16 @@ void Heap::DateCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("Date"));
}
ReturnedValue DateCtor::callAsConstructor(const Managed *that, CallData *callData)
ReturnedValue DateCtor::callAsConstructor(const FunctionObject *that, const Value *argv, int argc)
{
double t = 0;
if (callData->argc() == 0)
if (argc == 0)
t = currentTime();
else if (callData->argc() == 1) {
else if (argc == 1) {
Scope scope(that->engine());
ScopedValue arg(scope, callData->args[0]);
ScopedValue arg(scope, argv[0]);
if (DateObject *d = arg->as<DateObject>()) {
t = d->date();
} else {
@ -701,13 +701,13 @@ ReturnedValue DateCtor::callAsConstructor(const Managed *that, CallData *callDat
}
else { // d.argc > 1
double year = callData->args[0].toNumber();
double month = callData->args[1].toNumber();
double day = callData->argc() >= 3 ? callData->args[2].toNumber() : 1;
double hours = callData->argc() >= 4 ? callData->args[3].toNumber() : 0;
double mins = callData->argc() >= 5 ? callData->args[4].toNumber() : 0;
double secs = callData->argc() >= 6 ? callData->args[5].toNumber() : 0;
double ms = callData->argc() >= 7 ? callData->args[6].toNumber() : 0;
double year = argv[0].toNumber();
double month = argv[1].toNumber();
double day = argc >= 3 ? argv[2].toNumber() : 1;
double hours = argc >= 4 ? argv[3].toNumber() : 0;
double mins = argc >= 5 ? argv[4].toNumber() : 0;
double secs = argc >= 6 ? argv[5].toNumber() : 0;
double ms = argc >= 7 ? argv[6].toNumber() : 0;
if (year >= 0 && year <= 99)
year += 1900;
t = MakeDate(MakeDay(year, month, day), MakeTime(hours, mins, secs, ms));
@ -717,7 +717,7 @@ ReturnedValue DateCtor::callAsConstructor(const Managed *that, CallData *callDat
return Encode(that->engine()->newDateObject(Primitive::fromDouble(t)));
}
ReturnedValue DateCtor::call(const Managed *m, CallData *)
ReturnedValue DateCtor::call(const FunctionObject *m, const Value *, const Value *, int)
{
double t = currentTime();
return m->engine()->newString(ToString(t))->asReturnedValue();

View File

@ -108,8 +108,8 @@ struct DateCtor: FunctionObject
{
V4_OBJECT2(DateCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *);
static ReturnedValue callAsConstructor(const FunctionObject *, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int);
};
struct DatePrototype: Object

View File

@ -233,15 +233,15 @@ void Heap::ErrorCtor::init(QV4::ExecutionContext *scope, const QString &name)
Heap::FunctionObject::init(scope, name);
}
ReturnedValue ErrorCtor::callAsConstructor(const Managed *that, CallData *callData)
ReturnedValue ErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
Value v = Value::fromReturnedValue(callData->argument(0));
return ErrorObject::create<ErrorObject>(that->engine(), v)->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<ErrorObject>(f->engine(), v)->asReturnedValue();
}
ReturnedValue ErrorCtor::call(const Managed *that, CallData *callData)
ReturnedValue ErrorCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
return static_cast<const FunctionObject *>(that)->callAsConstructor(callData->args, callData->argc());
return f->callAsConstructor(argv, argc);
}
void Heap::EvalErrorCtor::init(QV4::ExecutionContext *scope)
@ -249,9 +249,10 @@ void Heap::EvalErrorCtor::init(QV4::ExecutionContext *scope)
Heap::ErrorCtor::init(scope, QStringLiteral("EvalError"));
}
ReturnedValue EvalErrorCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue EvalErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
return ErrorObject::create<EvalErrorObject>(m->engine(), callData->args[0])->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<EvalErrorObject>(f->engine(), v)->asReturnedValue();
}
void Heap::RangeErrorCtor::init(QV4::ExecutionContext *scope)
@ -259,9 +260,10 @@ void Heap::RangeErrorCtor::init(QV4::ExecutionContext *scope)
Heap::ErrorCtor::init(scope, QStringLiteral("RangeError"));
}
ReturnedValue RangeErrorCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue RangeErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
return ErrorObject::create<RangeErrorObject>(m->engine(), callData->args[0])->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<RangeErrorObject>(f->engine(), v)->asReturnedValue();
}
void Heap::ReferenceErrorCtor::init(QV4::ExecutionContext *scope)
@ -269,9 +271,10 @@ void Heap::ReferenceErrorCtor::init(QV4::ExecutionContext *scope)
Heap::ErrorCtor::init(scope, QStringLiteral("ReferenceError"));
}
ReturnedValue ReferenceErrorCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue ReferenceErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
return ErrorObject::create<ReferenceErrorObject>(m->engine(), callData->args[0])->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<ReferenceErrorObject>(f->engine(), v)->asReturnedValue();
}
void Heap::SyntaxErrorCtor::init(QV4::ExecutionContext *scope)
@ -279,9 +282,10 @@ void Heap::SyntaxErrorCtor::init(QV4::ExecutionContext *scope)
Heap::ErrorCtor::init(scope, QStringLiteral("SyntaxError"));
}
ReturnedValue SyntaxErrorCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue SyntaxErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
return ErrorObject::create<SyntaxErrorObject>(m->engine(), callData->args[0])->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<SyntaxErrorObject>(f->engine(), v)->asReturnedValue();
}
void Heap::TypeErrorCtor::init(QV4::ExecutionContext *scope)
@ -289,9 +293,10 @@ void Heap::TypeErrorCtor::init(QV4::ExecutionContext *scope)
Heap::ErrorCtor::init(scope, QStringLiteral("TypeError"));
}
ReturnedValue TypeErrorCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue TypeErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
return ErrorObject::create<TypeErrorObject>(m->engine(), callData->args[0])->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<TypeErrorObject>(f->engine(), v)->asReturnedValue();
}
void Heap::URIErrorCtor::init(QV4::ExecutionContext *scope)
@ -299,9 +304,10 @@ void Heap::URIErrorCtor::init(QV4::ExecutionContext *scope)
Heap::ErrorCtor::init(scope, QStringLiteral("URIError"));
}
ReturnedValue URIErrorCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue URIErrorCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
return ErrorObject::create<URIErrorObject>(m->engine(), callData->args[0])->asReturnedValue();
Value v = argc ? *argv : Primitive::undefinedValue();
return ErrorObject::create<URIErrorObject>(f->engine(), v)->asReturnedValue();
}
void ErrorPrototype::init(ExecutionEngine *engine, Object *ctor, Object *obj, Heap::ErrorObject::ErrorType t)

View File

@ -229,50 +229,50 @@ struct ErrorCtor: FunctionObject
{
V4_OBJECT2(ErrorCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct EvalErrorCtor: ErrorCtor
{
V4_OBJECT2(EvalErrorCtor, ErrorCtor)
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
};
struct RangeErrorCtor: ErrorCtor
{
V4_OBJECT2(RangeErrorCtor, ErrorCtor)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
};
struct ReferenceErrorCtor: ErrorCtor
{
V4_OBJECT2(ReferenceErrorCtor, ErrorCtor)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
};
struct SyntaxErrorCtor: ErrorCtor
{
V4_OBJECT2(SyntaxErrorCtor, ErrorCtor)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
};
struct TypeErrorCtor: ErrorCtor
{
V4_OBJECT2(TypeErrorCtor, ErrorCtor)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
};
struct URIErrorCtor: ErrorCtor
{
V4_OBJECT2(URIErrorCtor, ErrorCtor)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
};

View File

@ -72,15 +72,11 @@ Q_STATIC_ASSERT((Heap::FunctionObject::markTable & Heap::Object::markTable) == H
static ReturnedValue jsCallWrapper(const QV4::FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
{
Scope scope(f->engine());
JSCallData callData(scope, argc, argv, thisObject);
return f->vtable()->call(f, callData.callData(f));
return f->vtable()->call(f, thisObject, argv, argc);
}
ReturnedValue jsConstructWrapper(const QV4::FunctionObject *f, const Value *argv, int argc)
{
Scope scope(f->engine());
JSCallData callData(scope, argc, argv);
return f->vtable()->callAsConstructor(f, callData.callData(f));
return f->vtable()->callAsConstructor(f, argv, argc);
}
@ -164,12 +160,12 @@ ReturnedValue FunctionObject::name() const
return get(scope()->internalClass->engine->id_name());
}
ReturnedValue FunctionObject::callAsConstructor(const Managed *that, CallData *)
ReturnedValue FunctionObject::callAsConstructor(const FunctionObject *f, const Value *, int)
{
return that->engine()->throwTypeError();
return f->engine()->throwTypeError();
}
ReturnedValue FunctionObject::call(const Managed *, CallData *)
ReturnedValue FunctionObject::call(const FunctionObject *, const Value *, const Value *, int)
{
return Encode::undefined();
}
@ -202,20 +198,19 @@ void Heap::FunctionCtor::init(QV4::ExecutionContext *scope)
}
// 15.3.2
ReturnedValue FunctionCtor::callAsConstructor(const Managed *that, CallData *callData)
ReturnedValue FunctionCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
Scope scope(that->engine());
Scoped<FunctionCtor> f(scope, static_cast<const FunctionCtor *>(that));
Scope scope(f->engine());
QString arguments;
QString body;
if (callData->argc() > 0) {
for (int i = 0, ei = callData->argc() - 1; i < ei; ++i) {
if (argc > 0) {
for (int i = 0, ei = argc - 1; i < ei; ++i) {
if (i)
arguments += QLatin1String(", ");
arguments += callData->args[i].toQString();
arguments += argv[i].toQString();
}
body = callData->args[callData->argc() - 1].toQString();
body = argv[argc - 1].toQString();
}
if (scope.engine->hasException)
return Encode::undefined();
@ -250,9 +245,9 @@ ReturnedValue FunctionCtor::callAsConstructor(const Managed *that, CallData *cal
}
// 15.3.1: This is equivalent to new Function(...)
ReturnedValue FunctionCtor::call(const Managed *that, CallData *callData)
ReturnedValue FunctionCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
return callAsConstructor(that, callData);
return callAsConstructor(f, argv, argc);
}
DEFINE_OBJECT_VTABLE(FunctionPrototype);
@ -377,35 +372,41 @@ ReturnedValue FunctionPrototype::method_bind(const BuiltinFunction *b, CallData
DEFINE_OBJECT_VTABLE(ScriptFunction);
ReturnedValue ScriptFunction::callAsConstructor(const Managed *that, CallData *callData)
ReturnedValue ScriptFunction::callAsConstructor(const FunctionObject *fo, const Value *argv, int argc)
{
ExecutionEngine *v4 = that->engine();
const ScriptFunction *f = static_cast<const ScriptFunction *>(that);
ExecutionEngine *v4 = fo->engine();
const ScriptFunction *f = static_cast<const ScriptFunction *>(fo);
Scope scope(v4);
JSCallData callData(scope, argc, argv);
CallData *cData = callData.callData(f);
InternalClass *ic = f->classForConstructor();
callData->context = f->scope();
callData->thisObject = v4->memoryManager->allocObject<Object>(ic);
cData->context = f->scope();
cData->thisObject = v4->memoryManager->allocObject<Object>(ic);
QV4::Function *v4Function = f->function();
Q_ASSERT(v4Function);
ReturnedValue result = v4Function->call(callData);
ReturnedValue result = v4Function->call(cData);
if (Q_UNLIKELY(v4->hasException))
return Encode::undefined();
else if (!Value::fromReturnedValue(result).isObject())
return callData->thisObject.asReturnedValue();
return cData->thisObject.asReturnedValue();
return result;
}
ReturnedValue ScriptFunction::call(const Managed *that, CallData *callData)
ReturnedValue ScriptFunction::call(const FunctionObject *fo, const Value *thisObject, const Value *argv, int argc)
{
const ScriptFunction *f = static_cast<const ScriptFunction *>(that);
const ScriptFunction *f = static_cast<const ScriptFunction *>(fo);
Scope scope(f->engine());
JSCallData callData(scope, argc, argv, thisObject);
CallData *cData = callData.callData(f);
cData->context = f->scope();
QV4::Function *v4Function = f->function();
Q_ASSERT(v4Function);
callData->context = f->scope();
return v4Function->call(callData);
return v4Function->call(cData);
}
void Heap::ScriptFunction::init(QV4::ExecutionContext *scope, Function *function)
@ -458,15 +459,17 @@ void Heap::BuiltinFunction::init(QV4::ExecutionContext *scope, QV4::String *name
this->code = code;
}
ReturnedValue BuiltinFunction::callAsConstructor(const Managed *f, CallData *)
ReturnedValue BuiltinFunction::callAsConstructor(const QV4::FunctionObject *f, const Value *, int)
{
return f->engine()->throwTypeError();
}
ReturnedValue BuiltinFunction::call(const Managed *that, CallData *callData)
ReturnedValue BuiltinFunction::call(const FunctionObject *fo, const Value *thisObject, const Value *argv, int argc)
{
const BuiltinFunction *f = static_cast<const BuiltinFunction *>(that);
return f->d()->code(f, callData);
const BuiltinFunction *f = static_cast<const BuiltinFunction *>(fo);
Scope scope(f->engine());
JSCallData callData(scope, argc, argv, thisObject);
return f->d()->code(f, callData.callData());
}
DEFINE_OBJECT_VTABLE(IndexedBuiltinFunction);
@ -499,38 +502,43 @@ void Heap::BoundFunction::init(QV4::ExecutionContext *scope, QV4::FunctionObject
f->insertMember(s.engine->id_caller(), pd, Attr_Accessor|Attr_NotConfigurable|Attr_NotEnumerable);
}
ReturnedValue BoundFunction::call(const Managed *that, CallData *callData)
ReturnedValue BoundFunction::call(const FunctionObject *fo, const Value *, const Value *argv, int argc)
{
const BoundFunction *f = static_cast<const BoundFunction *>(that);
Heap::MemberData *boundArgs = f->boundArgs();
const BoundFunction *f = static_cast<const BoundFunction *>(fo);
Scope scope(f->engine());
int nBoundArgs = boundArgs ? boundArgs->values.size : 0;
if (nBoundArgs) {
memmove(&callData->args + nBoundArgs, &callData->args, callData->argc()*sizeof(Value));
memcpy(callData->args, boundArgs->values.data(), nBoundArgs*sizeof(Value));
callData->setArgc(callData->argc() + nBoundArgs);
f->engine()->jsStackTop += nBoundArgs;
if (scope.hasException())
return Encode::undefined();
Scoped<MemberData> boundArgs(scope, f->boundArgs());
ScopedFunctionObject target(scope, f->target());
JSCallData jsCallData(scope, (boundArgs ? boundArgs->size() : 0) + argc);
*jsCallData->thisObject = f->boundThis();
Value *argp = jsCallData->args;
if (boundArgs) {
memcpy(argp, boundArgs->data(), boundArgs->size()*sizeof(Value));
argp += boundArgs->size();
}
callData->thisObject = f->boundThis();
callData->function = f->target();
return static_cast<FunctionObject &>(callData->function).call(&callData->thisObject, callData->args, callData->argc());
memcpy(argp, argv, argc*sizeof(Value));
return target->call(jsCallData);
}
ReturnedValue BoundFunction::callAsConstructor(const Managed *that, CallData *callData)
ReturnedValue BoundFunction::callAsConstructor(const FunctionObject *fo, const Value *argv, int argc)
{
const BoundFunction *f = static_cast<const BoundFunction *>(that);
Heap::MemberData *boundArgs = f->boundArgs();
const BoundFunction *f = static_cast<const BoundFunction *>(fo);
Scope scope(f->engine());
int nBoundArgs = boundArgs ? boundArgs->values.size : 0;
if (nBoundArgs) {
memmove(callData->args + nBoundArgs, callData->args, callData->argc()*sizeof(Value));
memcpy(callData->args, boundArgs->values.data(), nBoundArgs*sizeof(Value));
callData->setArgc(callData->argc() + nBoundArgs);
f->engine()->jsStackTop += nBoundArgs;
if (scope.hasException())
return Encode::undefined();
Scoped<MemberData> boundArgs(scope, f->boundArgs());
ScopedFunctionObject target(scope, f->target());
JSCallData jsCallData(scope, (boundArgs ? boundArgs->size() : 0) + argc);
Value *argp = jsCallData->args;
if (boundArgs) {
memcpy(argp, boundArgs->data(), boundArgs->size()*sizeof(Value));
argp += boundArgs->size();
}
callData->thisObject = f->boundThis();
callData->function = f->target();
return static_cast<FunctionObject &>(callData->function).callAsConstructor(callData->args, callData->argc());
memcpy(argp, argv, argc*sizeof(Value));
return target->callAsConstructor(jsCallData);
}

View File

@ -164,8 +164,8 @@ struct Q_QML_EXPORT FunctionObject: Object {
ReturnedValue call(const Value *thisObject, const Value *argv, int argc) const {
return d()->jsCall(this, thisObject, argv, argc);
}
static ReturnedValue callAsConstructor(const Managed *that, CallData *);
static ReturnedValue call(const Managed *that, CallData *d);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
static Heap::FunctionObject *createScriptFunction(ExecutionContext *scope, Function *function);
@ -186,8 +186,8 @@ struct FunctionCtor: FunctionObject
{
V4_OBJECT2(FunctionCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *that, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct FunctionPrototype: FunctionObject
@ -211,8 +211,8 @@ struct Q_QML_EXPORT BuiltinFunction : FunctionObject {
return scope->engine()->memoryManager->allocObject<BuiltinFunction>(scope, name, code);
}
static ReturnedValue callAsConstructor(const Managed *, CallData *);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct IndexedBuiltinFunction: BuiltinFunction
@ -233,8 +233,8 @@ struct ScriptFunction : FunctionObject {
V4_OBJECT2(ScriptFunction, FunctionObject)
V4_INTERNALCLASS(ScriptFunction)
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
InternalClass *classForConstructor() const;
};
@ -252,8 +252,8 @@ struct BoundFunction: FunctionObject {
Value boundThis() const { return d()->boundThis; }
Heap::MemberData *boundArgs() const { return d()->boundArgs; }
static ReturnedValue callAsConstructor(const Managed *, CallData *d);
static ReturnedValue call(const Managed *that, CallData *dd);
static ReturnedValue callAsConstructor(const FunctionObject *, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
}

View File

@ -338,9 +338,9 @@ void Heap::EvalFunction::init(QV4::ExecutionContext *scope)
f->defineReadonlyProperty(s.engine->id_length(), Primitive::fromInt32(1));
}
ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall) const
ReturnedValue EvalFunction::evalCall(const Value *, const Value *argv, int argc, bool directCall) const
{
if (callData->argc() < 1)
if (argc < 1)
return Encode::undefined();
ExecutionEngine *v4 = engine();
@ -354,9 +354,9 @@ ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall) const
ctx = v4->rootContext();
}
String *scode = callData->args[0].stringValue();
String *scode = argv[0].stringValue();
if (!scode)
return callData->args[0].asReturnedValue();
return argv[0].asReturnedValue();
const QString code = scode->toQString();
bool inheritContext = !ctx->d()->v4Function->isStrict();
@ -396,10 +396,10 @@ ReturnedValue EvalFunction::evalCall(CallData *callData, bool directCall) const
}
ReturnedValue EvalFunction::call(const Managed *that, CallData *callData)
ReturnedValue EvalFunction::call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
{
// indirect call
return static_cast<const EvalFunction *>(that)->evalCall(callData, false);
return static_cast<const EvalFunction *>(f)->evalCall(thisObject, argv, argc, false);
}

View File

@ -69,9 +69,9 @@ struct Q_QML_EXPORT EvalFunction : FunctionObject
{
V4_OBJECT2(EvalFunction, FunctionObject)
ReturnedValue evalCall(CallData *callData, bool directCall) const;
ReturnedValue evalCall(const Value *thisObject, const Value *argv, int argc, bool directCall) const;
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct GlobalFunctions

View File

@ -78,15 +78,15 @@ void Heap::NumberCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("Number"));
}
ReturnedValue NumberCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue NumberCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
double dbl = callData->argc() ? callData->args[0].toNumber() : 0.;
return Encode(m->engine()->newNumberObject(dbl));
double dbl = argc ? argv[0].toNumber() : 0.;
return Encode(f->engine()->newNumberObject(dbl));
}
ReturnedValue NumberCtor::call(const Managed *, CallData *callData)
ReturnedValue NumberCtor::call(const FunctionObject *, const Value *, const Value *argv, int argc)
{
double dbl = callData->argc() ? callData->args[0].toNumber() : 0.;
double dbl = argc ? argv[0].toNumber() : 0.;
return Encode(dbl);
}

View File

@ -79,8 +79,8 @@ struct NumberCtor: FunctionObject
{
V4_OBJECT2(NumberCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *that, CallData *callData);
static ReturnedValue call(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
};
struct NumberPrototype: NumberObject

View File

@ -395,14 +395,14 @@ bool Object::hasOwnProperty(uint index) const
return false;
}
ReturnedValue Object::callAsConstructor(const Managed *m, CallData *)
ReturnedValue Object::callAsConstructor(const FunctionObject *f, const Value *, int)
{
return m->engine()->throwTypeError();
return f->engine()->throwTypeError();
}
ReturnedValue Object::call(const Managed *m, CallData *)
ReturnedValue Object::call(const FunctionObject *f, const Value *, const Value *, int)
{
return m->engine()->throwTypeError();
return f->engine()->throwTypeError();
}
ReturnedValue Object::get(const Managed *m, String *name, bool *hasProperty)

View File

@ -175,8 +175,8 @@ Q_STATIC_ASSERT(Object::markTable == ((2 << 2) | (2 << 4)));
struct ObjectVTable
{
VTable vTable;
ReturnedValue (*call)(const Managed *, CallData *data);
ReturnedValue (*callAsConstructor)(const Managed *, CallData *data);
ReturnedValue (*call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
ReturnedValue (*callAsConstructor)(const FunctionObject *, const Value *argv, int argc);
ReturnedValue (*get)(const Managed *, String *name, bool *hasProperty);
ReturnedValue (*getIndexed)(const Managed *, uint index, bool *hasProperty);
bool (*put)(Managed *, String *name, const Value &value);
@ -428,8 +428,8 @@ public:
{ return vtable()->instanceOf(this, var); }
protected:
static ReturnedValue callAsConstructor(const Managed *m, CallData *);
static ReturnedValue call(const Managed *m, CallData *);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
static ReturnedValue get(const Managed *m, String *name, bool *hasProperty);
static ReturnedValue getIndexed(const Managed *m, uint index, bool *hasProperty);
static bool put(Managed *m, String *name, const Value &value);

View File

@ -61,11 +61,11 @@ void Heap::ObjectCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("Object"));
}
ReturnedValue ObjectCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue ObjectCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
ExecutionEngine *v4 = m->engine();
const ObjectCtor *ctor = static_cast<const ObjectCtor *>(m);
if (!callData->argc() || callData->args[0].isUndefined() || callData->args[0].isNull()) {
ExecutionEngine *v4 = f->engine();
const ObjectCtor *ctor = static_cast<const ObjectCtor *>(f);
if (!argc || argv[0].isUndefined() || argv[0].isNull()) {
Scope scope(v4);
ScopedObject obj(scope, scope.engine->newObject());
ScopedObject proto(scope, ctor->get(scope.engine->id_prototype()));
@ -73,17 +73,17 @@ ReturnedValue ObjectCtor::callAsConstructor(const Managed *m, CallData *callData
obj->setPrototype(proto);
return obj.asReturnedValue();
} else {
return callData->args[0].toObject(v4)->asReturnedValue();
return argv[0].toObject(v4)->asReturnedValue();
}
}
ReturnedValue ObjectCtor::call(const Managed *m, CallData *callData)
ReturnedValue ObjectCtor::call(const FunctionObject *m, const Value *, const Value *argv, int argc)
{
ExecutionEngine *v4 = m->engine();
if (!callData->argc() || callData->args[0].isUndefined() || callData->args[0].isNull()) {
if (!argc || argv[0].isUndefined() || argv[0].isNull()) {
return v4->newObject()->asReturnedValue();
} else {
return callData->args[0].toObject(v4)->asReturnedValue();
return argv[0].toObject(v4)->asReturnedValue();
}
}

View File

@ -70,8 +70,8 @@ struct ObjectCtor: FunctionObject
{
V4_OBJECT2(ObjectCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *that, CallData *callData);
static ReturnedValue call(const Managed *m, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *m, const Value *thisObject, const Value *argv, int argc);
};
struct ObjectPrototype: Object

View File

@ -1894,17 +1894,17 @@ QV4::ReturnedValue QObjectMethod::method_destroy(QV4::ExecutionEngine *engine, c
return Encode::undefined();
}
ReturnedValue QObjectMethod::call(const Managed *m, CallData *callData)
ReturnedValue QObjectMethod::call(const FunctionObject *m, const Value *thisObject, const Value *argv, int argc)
{
const QObjectMethod *This = static_cast<const QObjectMethod*>(m);
return This->callInternal(callData);
return This->callInternal(thisObject, argv, argc);
}
ReturnedValue QObjectMethod::callInternal(CallData *callData) const
ReturnedValue QObjectMethod::callInternal(const Value *thisObject, const Value *argv, int argc) const
{
ExecutionEngine *v4 = engine();
if (d()->index == DestroyMethod)
return method_destroy(v4, callData->args, callData->argc());
return method_destroy(v4, argv, argc);
else if (d()->index == ToStringMethod)
return method_toString(v4);
@ -1944,8 +1944,11 @@ ReturnedValue QObjectMethod::callInternal(CallData *callData) const
}
}
Scope scope(v4);
JSCallData cData(scope, argc, argv, thisObject);
CallData *callData = cData.callData();
if (method.isV4Function()) {
Scope scope(v4);
QV4::ScopedValue rv(scope, QV4::Primitive::undefinedValue());
QQmlV4Function func(callData, rv, v4);
QQmlV4Function *funcptr = &func;
@ -2022,13 +2025,14 @@ void QMetaObjectWrapper::init(ExecutionEngine *) {
}
}
ReturnedValue QMetaObjectWrapper::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue QMetaObjectWrapper::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
const QMetaObjectWrapper *This = static_cast<const QMetaObjectWrapper*>(m);
return This->constructInternal(callData);
const QMetaObjectWrapper *This = static_cast<const QMetaObjectWrapper*>(f);
return This->constructInternal(argv, argc);
}
ReturnedValue QMetaObjectWrapper::constructInternal(CallData * callData) const {
ReturnedValue QMetaObjectWrapper::constructInternal(const Value *argv, int argc) const
{
d()->ensureConstructorsCache();
@ -2041,6 +2045,8 @@ ReturnedValue QMetaObjectWrapper::constructInternal(CallData * callData) const {
Scope scope(v4);
Scoped<QObjectWrapper> object(scope);
JSCallData cData(scope, argc, argv);
CallData *callData = cData.callData();
if (d()->constructorCount == 1) {
object = callConstructor(d()->constructors[0], v4, callData);

View File

@ -237,9 +237,9 @@ struct Q_QML_EXPORT QObjectMethod : public QV4::FunctionObject
QV4::ReturnedValue method_toString(QV4::ExecutionEngine *engine) const;
QV4::ReturnedValue method_destroy(QV4::ExecutionEngine *ctx, const Value *args, int argc) const;
static ReturnedValue call(const Managed *, CallData *callData);
static ReturnedValue call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
ReturnedValue callInternal(CallData *callData) const;
ReturnedValue callInternal(const Value *thisObject, const Value *argv, int argc) const;
static QPair<QObject *, int> extractQtMethod(const QV4::FunctionObject *function);
};
@ -251,14 +251,14 @@ struct Q_QML_EXPORT QMetaObjectWrapper : public QV4::FunctionObject
V4_NEEDS_DESTROY
static ReturnedValue create(ExecutionEngine *engine, const QMetaObject* metaObject);
static ReturnedValue callAsConstructor(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *, const Value *argv, int argc);
static bool isEqualTo(Managed *a, Managed *b);
const QMetaObject *metaObject() const { return d()->metaObject; }
private:
void init(ExecutionEngine *engine);
ReturnedValue constructInternal(CallData *callData) const;
ReturnedValue constructInternal(const Value *argv, int argc) const;
ReturnedValue callConstructor(const QQmlPropertyData &data, QV4::ExecutionEngine *engine, QV4::CallData *callArgs) const;
ReturnedValue callOverloadedConstructor(QV4::ExecutionEngine *engine, QV4::CallData *callArgs) const;

View File

@ -214,11 +214,11 @@ void Heap::RegExpCtor::clearLastMatch()
lastMatchEnd = 0;
}
ReturnedValue RegExpCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue RegExpCtor::callAsConstructor(const FunctionObject *fo, const Value *argv, int argc)
{
Scope scope(m->engine());
ScopedValue r(scope, callData->argument(0));
ScopedValue f(scope, callData->argument(1));
Scope scope(fo->engine());
ScopedValue r(scope, argc ? argv[0] : Primitive::undefinedValue());
ScopedValue f(scope, argc > 1 ? argv[1] : Primitive::undefinedValue());
Scoped<RegExpObject> re(scope, r);
if (re) {
if (!f->isUndefined())
@ -263,14 +263,14 @@ ReturnedValue RegExpCtor::callAsConstructor(const Managed *m, CallData *callData
return Encode(scope.engine->newRegExpObject(regexp));
}
ReturnedValue RegExpCtor::call(const Managed *that, CallData *callData)
ReturnedValue RegExpCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
if (callData->argc() > 0 && callData->args[0].as<RegExpObject>()) {
if (callData->argc() == 1 || callData->args[1].isUndefined())
return Encode(callData->args[0]);
if (argc > 0 && argv[0].as<RegExpObject>()) {
if (argc == 1 || argv[1].isUndefined())
return Encode(argv[0]);
}
return callAsConstructor(that, callData);
return callAsConstructor(f, argv, argc);
}
void RegExpPrototype::init(ExecutionEngine *engine, Object *constructor)

View File

@ -150,8 +150,8 @@ struct RegExpCtor: FunctionObject
int lastMatchStart() { return d()->lastMatchStart; }
int lastMatchEnd() { return d()->lastMatchEnd; }
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};
struct RegExpPrototype: RegExpObject

View File

@ -977,25 +977,25 @@ ReturnedValue Runtime::method_callGlobalLookup(ExecutionEngine *engine, uint ind
ReturnedValue Runtime::method_callPossiblyDirectEval(ExecutionEngine *engine, Value *argv, int argc)
{
Scope scope(engine);
JSCallData callData(scope, argc, argv);
ScopedValue thisObject(scope);
ExecutionContext &ctx = static_cast<ExecutionContext &>(engine->currentStackFrame->jsFrame->context);
ScopedFunctionObject function(scope, ctx.getPropertyAndBase(engine->id_eval(), callData->thisObject));
ScopedFunctionObject function(scope, ctx.getPropertyAndBase(engine->id_eval(), thisObject));
if (engine->hasException)
return Encode::undefined();
if (!function) {
QString objectAsString = QStringLiteral("[null]");
if (!callData->thisObject->isUndefined())
objectAsString = callData->thisObject->toQStringNoThrow();
if (!thisObject->isUndefined())
objectAsString = thisObject->toQStringNoThrow();
QString msg = QStringLiteral("Property 'eval' of object %2 is not a function").arg(objectAsString);
return engine->throwTypeError(msg);
}
if (function->d() == engine->evalFunction()->d())
return static_cast<EvalFunction *>(function.getPointer())->evalCall(callData.callData(function), true);
return static_cast<EvalFunction *>(function.getPointer())->evalCall(thisObject, argv, argc, true);
return function->call(callData);
return function->call(thisObject, argv, argc);
}
ReturnedValue Runtime::method_callName(ExecutionEngine *engine, int nameIndex, Value *argv, int argc)

View File

@ -143,23 +143,23 @@ void Heap::StringCtor::init(QV4::ExecutionContext *scope)
Heap::FunctionObject::init(scope, QStringLiteral("String"));
}
ReturnedValue StringCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue StringCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
ExecutionEngine *v4 = static_cast<const Object *>(m)->engine();
ExecutionEngine *v4 = static_cast<const Object *>(f)->engine();
Scope scope(v4);
ScopedString value(scope);
if (callData->argc())
value = callData->args[0].toString(v4);
if (argc)
value = argv[0].toString(v4);
else
value = v4->newString();
return Encode(v4->newStringObject(value));
}
ReturnedValue StringCtor::call(const Managed *m, CallData *callData)
ReturnedValue StringCtor::call(const FunctionObject *m, const Value *, const Value *argv, int argc)
{
ExecutionEngine *v4 = m->engine();
if (callData->argc())
return callData->args[0].toString(v4)->asReturnedValue();
if (argc)
return argv[0].toString(v4)->asReturnedValue();
else
return v4->newString()->asReturnedValue();
}
@ -419,7 +419,7 @@ ReturnedValue StringPrototype::method_match(const BuiltinFunction *b, CallData *
if (!callData->args[0].as<RegExpObject>()) {
// convert args[0] to a regexp
callData->args[0] = RegExpCtor::callAsConstructor(b, callData);
callData->args[0] = RegExpCtor::callAsConstructor(b, callData->args, callData->argc());
if (v4->hasException)
return Encode::undefined();
}

View File

@ -106,8 +106,8 @@ struct StringCtor: FunctionObject
{
V4_OBJECT2(StringCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue call(const Managed *, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
};
struct StringPrototype: StringObject

View File

@ -209,14 +209,14 @@ void Heap::TypedArrayCtor::init(QV4::ExecutionContext *scope, TypedArray::Type t
type = t;
}
ReturnedValue TypedArrayCtor::callAsConstructor(const Managed *m, CallData *callData)
ReturnedValue TypedArrayCtor::callAsConstructor(const FunctionObject *f, const Value *argv, int argc)
{
Scope scope(m->engine());
Scoped<TypedArrayCtor> that(scope, static_cast<const TypedArrayCtor *>(m));
Scope scope(f->engine());
const TypedArrayCtor *that = static_cast<const TypedArrayCtor *>(f);
if (!callData->argc() || !callData->args[0].isObject()) {
if (!argc || !argv[0].isObject()) {
// ECMA 6 22.2.1.1
double l = callData->argc() ? callData->args[0].toNumber() : 0;
double l = argc ? argv[0].toNumber() : 0;
if (scope.engine->hasException)
return Encode::undefined();
uint len = (uint)l;
@ -234,7 +234,7 @@ ReturnedValue TypedArrayCtor::callAsConstructor(const Managed *m, CallData *call
return array.asReturnedValue();
}
Scoped<TypedArray> typedArray(scope, callData->argument(0));
Scoped<TypedArray> typedArray(scope, argc ? argv[0] : Primitive::undefinedValue());
if (!!typedArray) {
// ECMA 6 22.2.1.2
Scoped<ArrayBuffer> buffer(scope, typedArray->d()->buffer);
@ -272,23 +272,23 @@ ReturnedValue TypedArrayCtor::callAsConstructor(const Managed *m, CallData *call
return array.asReturnedValue();
}
Scoped<ArrayBuffer> buffer(scope, callData->argument(0));
Scoped<ArrayBuffer> buffer(scope, argc ? argv[0] : Primitive::undefinedValue());
if (!!buffer) {
// ECMA 6 22.2.1.4
double dbyteOffset = callData->argc() > 1 ? callData->args[1].toInteger() : 0;
double dbyteOffset = argc > 1 ? argv[1].toInteger() : 0;
uint byteOffset = (uint)dbyteOffset;
uint elementSize = operations[that->d()->type].bytesPerElement;
if (dbyteOffset < 0 || (byteOffset % elementSize) || dbyteOffset > buffer->byteLength())
return scope.engine->throwRangeError(QStringLiteral("new TypedArray: invalid byteOffset"));
uint byteLength;
if (callData->argc() < 3 || callData->args[2].isUndefined()) {
if (argc < 3 || argv[2].isUndefined()) {
byteLength = buffer->byteLength() - byteOffset;
if (buffer->byteLength() < byteOffset || byteLength % elementSize)
return scope.engine->throwRangeError(QStringLiteral("new TypedArray: invalid length"));
} else {
double l = qBound(0., callData->args[2].toInteger(), (double)UINT_MAX);
double l = qBound(0., argv[2].toInteger(), (double)UINT_MAX);
if (scope.engine->hasException)
return Encode::undefined();
l *= elementSize;
@ -306,7 +306,7 @@ ReturnedValue TypedArrayCtor::callAsConstructor(const Managed *m, CallData *call
// ECMA 6 22.2.1.3
ScopedObject o(scope, callData->argument(0));
ScopedObject o(scope, argc ? argv[0] : Primitive::undefinedValue());
uint l = (uint) qBound(0., ScopedValue(scope, o->get(scope.engine->id_length()))->toInteger(), (double)UINT_MAX);
if (scope.engine->hasException)
return scope.engine->throwTypeError();
@ -337,9 +337,9 @@ ReturnedValue TypedArrayCtor::callAsConstructor(const Managed *m, CallData *call
return array.asReturnedValue();
}
ReturnedValue TypedArrayCtor::call(const Managed *that, CallData *callData)
ReturnedValue TypedArrayCtor::call(const FunctionObject *f, const Value *, const Value *argv, int argc)
{
return callAsConstructor(that, callData);
return callAsConstructor(f, argv, argc);
}
void Heap::TypedArray::init(Type t)

View File

@ -141,8 +141,8 @@ struct TypedArrayCtor: FunctionObject
{
V4_OBJECT2(TypedArrayCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *m, CallData *callData);
static ReturnedValue call(const Managed *that, CallData *callData);
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *argv, int argc);
static ReturnedValue call(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc);
};

View File

@ -1635,12 +1635,10 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject
{
V4_OBJECT2(QQmlXMLHttpRequestCtor, FunctionObject)
static ReturnedValue callAsConstructor(const Managed *that, QV4::CallData *)
static ReturnedValue callAsConstructor(const FunctionObject *f, const Value *, int)
{
Scope scope(that->engine());
Scoped<QQmlXMLHttpRequestCtor> ctor(scope, that->as<QQmlXMLHttpRequestCtor>());
if (!ctor)
return scope.engine->throwTypeError();
Scope scope(f->engine());
const QQmlXMLHttpRequestCtor *ctor = static_cast<const QQmlXMLHttpRequestCtor *>(f);
QQmlXMLHttpRequest *r = new QQmlXMLHttpRequest(scope.engine->v8Engine->networkAccessManager());
Scoped<QQmlXMLHttpRequestWrapper> w(scope, scope.engine->memoryManager->allocObject<QQmlXMLHttpRequestWrapper>(r));
@ -1649,7 +1647,7 @@ struct QQmlXMLHttpRequestCtor : public FunctionObject
return w.asReturnedValue();
}
static ReturnedValue call(const Managed *, QV4::CallData *) {
static ReturnedValue call(const FunctionObject *, const Value *, const Value *, int) {
return Encode::undefined();
}

View File

@ -96,15 +96,15 @@ struct DelegateModelGroupFunction : QV4::FunctionObject
return scope->engine()->memoryManager->allocObject<DelegateModelGroupFunction>(scope, flag, code);
}
static ReturnedValue call(const QV4::Managed *that, QV4::CallData *callData)
static ReturnedValue call(const QV4::FunctionObject *that, const Value *thisObject, const Value *argv, int argc)
{
QV4::Scope scope(that->engine());
QV4::Scoped<DelegateModelGroupFunction> f(scope, static_cast<const DelegateModelGroupFunction *>(that));
QV4::Scoped<QQmlDelegateModelItemObject> o(scope, callData->thisObject);
QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject);
if (!o)
return scope.engine->throwTypeError(QStringLiteral("Not a valid VisualData object"));
QV4::ScopedValue v(scope, callData->argument(0));
QV4::ScopedValue v(scope, argc ? argv[0] : Primitive::undefinedValue());
return f->d()->code(o->d()->item, f->d()->flag, v);
}
};