aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/compiler/qv4isel_masm.cpp8
-rw-r--r--src/qml/compiler/qv4isel_masm_p.h6
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp288
-rw-r--r--src/qml/jsruntime/qv4lookup_p.h42
-rw-r--r--src/qml/jsruntime/qv4managed.cpp3
-rw-r--r--src/qml/jsruntime/qv4managed_p.h8
-rw-r--r--src/qml/jsruntime/qv4object.cpp16
-rw-r--r--src/qml/jsruntime/qv4object_p.h2
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp22
9 files changed, 159 insertions, 236 deletions
diff --git a/src/qml/compiler/qv4isel_masm.cpp b/src/qml/compiler/qv4isel_masm.cpp
index 9cdeab3036..4ad60c4d41 100644
--- a/src/qml/compiler/qv4isel_masm.cpp
+++ b/src/qml/compiler/qv4isel_masm.cpp
@@ -997,7 +997,7 @@ void InstructionSelection::getActivationProperty(const V4IR::Name *name, V4IR::T
{
if (useFastLookups && name->global) {
uint index = registerGlobalGetterLookup(*name->id);
- generateLookupCall(index, offsetof(QV4::Lookup, globalGetter), Assembler::ContextRegister, Assembler::PointerToValue(temp));
+ generateLookupCall(temp, index, offsetof(QV4::Lookup, globalGetter), Assembler::ContextRegister, Assembler::Void);
return;
}
generateFunctionCall(temp, __qmljs_get_activation_property, Assembler::ContextRegister, Assembler::PointerToString(*name->id));
@@ -1005,6 +1005,7 @@ void InstructionSelection::getActivationProperty(const V4IR::Name *name, V4IR::T
void InstructionSelection::setActivationProperty(V4IR::Expr *source, const QString &targetName)
{
+ // ### should use a lookup call here
generateFunctionCall(Assembler::Void, __qmljs_set_activation_property,
Assembler::ContextRegister, Assembler::PointerToString(targetName), Assembler::PointerToValue(source));
}
@@ -1019,8 +1020,7 @@ void InstructionSelection::getProperty(V4IR::Expr *base, const QString &name, V4
{
if (useFastLookups) {
uint index = registerGetterLookup(name);
- generateLookupCall(index, offsetof(QV4::Lookup, getter), Assembler::PointerToValue(target),
- Assembler::PointerToValue(base));
+ generateLookupCall(target, index, offsetof(QV4::Lookup, getter), Assembler::PointerToValue(base), Assembler::Void);
} else {
generateFunctionCall(target, __qmljs_get_property, Assembler::ContextRegister,
Assembler::PointerToValue(base), Assembler::PointerToString(name));
@@ -1032,7 +1032,7 @@ void InstructionSelection::setProperty(V4IR::Expr *source, V4IR::Expr *targetBas
{
if (useFastLookups) {
uint index = registerSetterLookup(targetName);
- generateLookupCall(index, offsetof(QV4::Lookup, setter),
+ generateLookupCall(Assembler::Void, index, offsetof(QV4::Lookup, setter),
Assembler::PointerToValue(targetBase),
Assembler::PointerToValue(source));
} else {
diff --git a/src/qml/compiler/qv4isel_masm_p.h b/src/qml/compiler/qv4isel_masm_p.h
index d32ab982ae..b3626701dc 100644
--- a/src/qml/compiler/qv4isel_masm_p.h
+++ b/src/qml/compiler/qv4isel_masm_p.h
@@ -1401,8 +1401,8 @@ private:
int prepareVariableArguments(V4IR::ExprList* args);
int prepareCallData(V4IR::ExprList* args, V4IR::Expr *thisObject);
- template <typename Arg1, typename Arg2>
- void generateLookupCall(uint index, uint getterSetterOffset, Arg1 arg1, Arg2 arg2)
+ template <typename Retval, typename Arg1, typename Arg2>
+ void generateLookupCall(Retval retval, uint index, uint getterSetterOffset, Arg1 arg1, Arg2 arg2)
{
_as->loadPtr(Assembler::Address(Assembler::ContextRegister, offsetof(QV4::ExecutionContext, lookups)),
Assembler::ReturnValueRegister);
@@ -1412,7 +1412,7 @@ private:
Assembler::Address getterSetter = lookupAddr;
getterSetter.offset += getterSetterOffset;
- _as->generateFunctionCallImp(Assembler::Void, "lookup getter/setter", getterSetter, lookupAddr, arg1, arg2);
+ _as->generateFunctionCallImp(retval, "lookup getter/setter", getterSetter, lookupAddr, arg1, arg2);
}
template <typename Arg1>
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp
index e2392d84f5..2b609752c9 100644
--- a/src/qml/jsruntime/qv4lookup.cpp
+++ b/src/qml/jsruntime/qv4lookup.cpp
@@ -87,12 +87,10 @@ Property *Lookup::lookup(Object *obj, PropertyAttributes *attrs)
}
-void Lookup::getterGeneric(QV4::Lookup *l, QV4::Value *result, const QV4::Value &object)
+ReturnedValue Lookup::getterGeneric(QV4::Lookup *l, const QV4::Value &object)
{
- if (Object *o = object.asObject()) {
- o->getLookup(l, result);
- return;
- }
+ if (Object *o = object.asObject())
+ return o->getLookup(l);
ExecutionEngine *engine = l->name->engine();
Object *proto;
@@ -108,8 +106,7 @@ void Lookup::getterGeneric(QV4::Lookup *l, QV4::Value *result, const QV4::Value
if (l->name == engine->id_length) {
// special case, as the property is on the object itself
l->getter = stringLengthGetter;
- stringLengthGetter(l, result, object);
- return;
+ return stringLengthGetter(l, object);
}
break;
case Value::Integer_Type:
@@ -127,121 +124,94 @@ void Lookup::getterGeneric(QV4::Lookup *l, QV4::Value *result, const QV4::Value
l->getter = Lookup::primitiveGetter0;
else if (l->level == 1)
l->getter = Lookup::primitiveGetter1;
- if (result)
- *result = p->value;
- return;
+ return p->value.asReturnedValue();
} else {
if (l->level == 0)
l->getter = Lookup::primitiveGetterAccessor0;
else if (l->level == 1)
l->getter = Lookup::primitiveGetterAccessor1;
- if (result)
- *result = p->value;
- Value res = Value::fromReturnedValue(proto->getValue(object, p, attrs));
- if (result)
- *result = res;
- return;
+ return proto->getValue(object, p, attrs);
}
}
- if (result)
- *result = Value::undefinedValue();
+ return Value::undefinedValue().asReturnedValue();
}
-void Lookup::getter0(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::getter0(Lookup *l, const Value &object)
{
if (Object *o = object.asObject()) {
- if (l->classList[0] == o->internalClass) {
- if (result)
- *result = o->memberData[l->index].value;
- return;
- }
+ if (l->classList[0] == o->internalClass)
+ return o->memberData[l->index].value.asReturnedValue();
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::getter1(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::getter1(Lookup *l, const Value &object)
{
if (Object *o = object.asObject()) {
if (l->classList[0] == o->internalClass &&
- l->classList[1] == o->prototype()->internalClass) {
- if (result)
- *result = o->prototype()->memberData[l->index].value;
- return;
- }
+ l->classList[1] == o->prototype()->internalClass)
+ return o->prototype()->memberData[l->index].value.asReturnedValue();
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::getter2(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::getter2(Lookup *l, const Value &object)
{
if (Object *o = object.asObject()) {
if (l->classList[0] == o->internalClass) {
o = o->prototype();
if (l->classList[1] == o->internalClass) {
o = o->prototype();
- if (l->classList[2] == o->internalClass) {
- if (result)
- *result = o->memberData[l->index].value;
- return;
- }
+ if (l->classList[2] == o->internalClass)
+ return o->memberData[l->index].value.asReturnedValue();
}
}
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::getterAccessor0(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::getterAccessor0(Lookup *l, const Value &object)
{
if (Object *o = object.asObject()) {
if (l->classList[0] == o->internalClass) {
Scope scope(o->engine());
- Value res;
FunctionObject *getter = o->memberData[l->index].getter();
- if (!getter) {
- res = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = object;
- res = Value::fromReturnedValue(getter->call(callData));
- }
- if (result)
- *result = res;
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = object;
+ return getter->call(callData);
}
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::getterAccessor1(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::getterAccessor1(Lookup *l, const Value &object)
{
if (Object *o = object.asObject()) {
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass) {
Scope scope(o->engine());
- Value res;
FunctionObject *getter = o->prototype()->memberData[l->index].getter();
- if (!getter) {
- res = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = object;
- res = Value::fromReturnedValue(getter->call(callData));
- }
- if (result)
- *result = res;
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = object;
+ return getter->call(callData);
}
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::getterAccessor2(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::getterAccessor2(Lookup *l, const Value &object)
{
if (Object *o = object.asObject()) {
if (l->classList[0] == o->internalClass) {
@@ -250,57 +220,46 @@ void Lookup::getterAccessor2(Lookup *l, Value *result, const Value &object)
o = o->prototype();
if (l->classList[2] == o->internalClass) {
Scope scope(o->engine());
- Value res;
FunctionObject *getter = o->memberData[l->index].getter();
- if (!getter) {
- res = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = object;
- res = Value::fromReturnedValue(getter->call(callData));
- }
- if (result)
- *result = res;
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = object;
+ return getter->call(callData);
}
}
}
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::primitiveGetter0(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::primitiveGetter0(Lookup *l, const Value &object)
{
if (object.type() == l->type) {
Object *o = l->proto;
- if (l->classList[0] == o->internalClass) {
- if (result)
- *result = o->memberData[l->index].value;
- return;
- }
+ if (l->classList[0] == o->internalClass)
+ return o->memberData[l->index].value.asReturnedValue();
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::primitiveGetter1(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::primitiveGetter1(Lookup *l, const Value &object)
{
if (object.type() == l->type) {
Object *o = l->proto;
if (l->classList[0] == o->internalClass &&
- l->classList[1] == o->prototype()->internalClass) {
- if (result)
- *result = o->prototype()->memberData[l->index].value;
- return;
- }
+ l->classList[1] == o->prototype()->internalClass)
+ return o->prototype()->memberData[l->index].value.asReturnedValue();
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::primitiveGetterAccessor0(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::primitiveGetterAccessor0(Lookup *l, const Value &object)
{
if (object.type() == l->type) {
Object *o = l->proto;
@@ -308,23 +267,19 @@ void Lookup::primitiveGetterAccessor0(Lookup *l, Value *result, const Value &obj
Scope scope(o->engine());
Value res;
FunctionObject *getter = o->memberData[l->index].getter();
- if (!getter) {
- res = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = object;
- res = Value::fromReturnedValue(getter->call(callData));
- }
- if (result)
- *result = res;
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = object;
+ return getter->call(callData);
}
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::primitiveGetterAccessor1(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::primitiveGetterAccessor1(Lookup *l, const Value &object)
{
if (object.type() == l->type) {
Object *o = l->proto;
@@ -333,35 +288,29 @@ void Lookup::primitiveGetterAccessor1(Lookup *l, Value *result, const Value &obj
Scope scope(o->engine());
Value res;
FunctionObject *getter = o->prototype()->memberData[l->index].getter();
- if (!getter) {
- res = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = object;
- res = Value::fromReturnedValue(getter->call(callData));
- }
- if (result)
- *result = res;
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = object;
+ return getter->call(callData);
}
}
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::stringLengthGetter(Lookup *l, Value *result, const Value &object)
+ReturnedValue Lookup::stringLengthGetter(Lookup *l, const Value &object)
{
- if (String *s = object.asString()) {
- if (result)
- *result = Value::fromUInt32(s->length());
- return;
- }
+ if (String *s = object.asString())
+ return Value::fromUInt32(s->length()).asReturnedValue();
+
l->getter = getterGeneric;
- getterGeneric(l, result, object);
+ return getterGeneric(l, object);
}
-void Lookup::globalGetterGeneric(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetterGeneric(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
PropertyAttributes attrs;
@@ -374,8 +323,7 @@ void Lookup::globalGetterGeneric(Lookup *l, ExecutionContext *ctx, Value *result
l->globalGetter = globalGetter1;
else if (l->level == 2)
l->globalGetter = globalGetter2;
- *result = p->value;
- return;
+ return p->value.asReturnedValue();
} else {
if (l->level == 0)
l->globalGetter = globalGetterAccessor0;
@@ -383,39 +331,34 @@ void Lookup::globalGetterGeneric(Lookup *l, ExecutionContext *ctx, Value *result
l->globalGetter = globalGetterAccessor1;
else if (l->level == 2)
l->globalGetter = globalGetterAccessor2;
- Value res = Value::fromReturnedValue(o->getValue(p, attrs));
- if (result)
- *result = res;
- return;
+ return o->getValue(p, attrs);
}
}
ctx->throwReferenceError(Value::fromString(l->name));
}
-void Lookup::globalGetter0(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetter0(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
- if (l->classList[0] == o->internalClass) {
- *result = o->memberData[l->index].value;
- return;
- }
+ if (l->classList[0] == o->internalClass)
+ return o->memberData[l->index].value.asReturnedValue();
+
l->globalGetter = globalGetterGeneric;
- globalGetterGeneric(l, ctx, result);
+ return globalGetterGeneric(l, ctx);
}
-void Lookup::globalGetter1(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetter1(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
if (l->classList[0] == o->internalClass &&
- l->classList[1] == o->prototype()->internalClass) {
- *result = o->prototype()->memberData[l->index].value;
- return;
- }
+ l->classList[1] == o->prototype()->internalClass)
+ return o->prototype()->memberData[l->index].value.asReturnedValue();
+
l->globalGetter = globalGetterGeneric;
- globalGetterGeneric(l, ctx, result);
+ return globalGetterGeneric(l, ctx);
}
-void Lookup::globalGetter2(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetter2(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
if (l->classList[0] == o->internalClass) {
@@ -423,55 +366,50 @@ void Lookup::globalGetter2(Lookup *l, ExecutionContext *ctx, Value *result)
if (l->classList[1] == o->internalClass) {
o = o->prototype();
if (l->classList[2] == o->internalClass) {
- *result = o->prototype()->memberData[l->index].value;
- return;
+ return o->prototype()->memberData[l->index].value.asReturnedValue();
}
}
}
l->globalGetter = globalGetterGeneric;
- globalGetterGeneric(l, ctx, result);
+ return globalGetterGeneric(l, ctx);
}
-void Lookup::globalGetterAccessor0(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetterAccessor0(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
if (l->classList[0] == o->internalClass) {
Scope scope(o->engine());
FunctionObject *getter = o->memberData[l->index].getter();
- if (!getter) {
- *result = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = Value::undefinedValue();
- *result = Value::fromReturnedValue(getter->call(callData));
- }
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = Value::undefinedValue();
+ return getter->call(callData);
}
l->globalGetter = globalGetterGeneric;
- globalGetterGeneric(l, ctx, result);
+ return globalGetterGeneric(l, ctx);
}
-void Lookup::globalGetterAccessor1(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetterAccessor1(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass) {
Scope scope(o->engine());
FunctionObject *getter = o->prototype()->memberData[l->index].getter();
- if (!getter) {
- *result = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = Value::undefinedValue();
- *result = Value::fromReturnedValue(getter->call(callData));
- }
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = Value::undefinedValue();
+ return getter->call(callData);
}
l->globalGetter = globalGetterGeneric;
- globalGetterGeneric(l, ctx, result);
+ return globalGetterGeneric(l, ctx);
}
-void Lookup::globalGetterAccessor2(Lookup *l, ExecutionContext *ctx, Value *result)
+ReturnedValue Lookup::globalGetterAccessor2(Lookup *l, ExecutionContext *ctx)
{
Object *o = ctx->engine->globalObject;
if (l->classList[0] == o->internalClass) {
@@ -481,19 +419,17 @@ void Lookup::globalGetterAccessor2(Lookup *l, ExecutionContext *ctx, Value *resu
if (l->classList[2] == o->internalClass) {
Scope scope(o->engine());
FunctionObject *getter = o->memberData[l->index].getter();
- if (!getter) {
- *result = Value::undefinedValue();
- } else {
- ScopedCallData callData(scope, 0);
- callData->thisObject = Value::undefinedValue();
- *result = Value::fromReturnedValue(getter->call(callData));
- }
- return;
+ if (!getter)
+ return Value::undefinedValue().asReturnedValue();
+
+ ScopedCallData callData(scope, 0);
+ callData->thisObject = Value::undefinedValue();
+ return getter->call(callData);
}
}
}
l->globalGetter = globalGetterGeneric;
- globalGetterGeneric(l, ctx, result);
+ return globalGetterGeneric(l, ctx);
}
void Lookup::setterGeneric(Lookup *l, const Value &object, const Value &value)
diff --git a/src/qml/jsruntime/qv4lookup_p.h b/src/qml/jsruntime/qv4lookup_p.h
index b37738dd92..b79e91028f 100644
--- a/src/qml/jsruntime/qv4lookup_p.h
+++ b/src/qml/jsruntime/qv4lookup_p.h
@@ -55,8 +55,8 @@ namespace QV4 {
struct Lookup {
enum { Size = 4 };
union {
- void (*getter)(Lookup *l, Value *result, const Value &object);
- void (*globalGetter)(Lookup *l, ExecutionContext *ctx, Value *result);
+ ReturnedValue (*getter)(Lookup *l, const Value &object);
+ ReturnedValue (*globalGetter)(Lookup *l, ExecutionContext *ctx);
void (*setter)(Lookup *l, const Value &object, const Value &v);
};
union {
@@ -72,27 +72,27 @@ struct Lookup {
uint index;
String *name;
- static void getterGeneric(Lookup *l, Value *result, const Value &object);
- static void getter0(Lookup *l, Value *result, const Value &object);
- static void getter1(Lookup *l, Value *result, const Value &object);
- static void getter2(Lookup *l, Value *result, const Value &object);
- static void getterAccessor0(Lookup *l, Value *result, const Value &object);
- static void getterAccessor1(Lookup *l, Value *result, const Value &object);
- static void getterAccessor2(Lookup *l, Value *result, const Value &object);
+ static ReturnedValue getterGeneric(Lookup *l, const Value &object);
+ static ReturnedValue getter0(Lookup *l, const Value &object);
+ static ReturnedValue getter1(Lookup *l, const Value &object);
+ static ReturnedValue getter2(Lookup *l, const Value &object);
+ static ReturnedValue getterAccessor0(Lookup *l, const Value &object);
+ static ReturnedValue getterAccessor1(Lookup *l, const Value &object);
+ static ReturnedValue getterAccessor2(Lookup *l, const Value &object);
- static void primitiveGetter0(Lookup *l, Value *result, const Value &object);
- static void primitiveGetter1(Lookup *l, Value *result, const Value &object);
- static void primitiveGetterAccessor0(Lookup *l, Value *result, const Value &object);
- static void primitiveGetterAccessor1(Lookup *l, Value *result, const Value &object);
- static void stringLengthGetter(Lookup *l, Value *result, const Value &object);
+ static ReturnedValue primitiveGetter0(Lookup *l, const Value &object);
+ static ReturnedValue primitiveGetter1(Lookup *l, const Value &object);
+ static ReturnedValue primitiveGetterAccessor0(Lookup *l, const Value &object);
+ static ReturnedValue primitiveGetterAccessor1(Lookup *l, const Value &object);
+ static ReturnedValue stringLengthGetter(Lookup *l, const Value &object);
- static void globalGetterGeneric(Lookup *l, ExecutionContext *ctx, Value *result);
- static void globalGetter0(Lookup *l, ExecutionContext *ctx, Value *result);
- static void globalGetter1(Lookup *l, ExecutionContext *ctx, Value *result);
- static void globalGetter2(Lookup *l, ExecutionContext *ctx, Value *result);
- static void globalGetterAccessor0(Lookup *l, ExecutionContext *ctx, Value *result);
- static void globalGetterAccessor1(Lookup *l, ExecutionContext *ctx, Value *result);
- static void globalGetterAccessor2(Lookup *l, ExecutionContext *ctx, Value *result);
+ static ReturnedValue globalGetterGeneric(Lookup *l, ExecutionContext *ctx);
+ static ReturnedValue globalGetter0(Lookup *l, ExecutionContext *ctx);
+ static ReturnedValue globalGetter1(Lookup *l, ExecutionContext *ctx);
+ static ReturnedValue globalGetter2(Lookup *l, ExecutionContext *ctx);
+ static ReturnedValue globalGetterAccessor0(Lookup *l, ExecutionContext *ctx);
+ static ReturnedValue globalGetterAccessor1(Lookup *l, ExecutionContext *ctx);
+ static ReturnedValue globalGetterAccessor2(Lookup *l, ExecutionContext *ctx);
static void setterGeneric(Lookup *l, const Value &object, const Value &value);
static void setter0(Lookup *l, const Value &object, const Value &value);
diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp
index 4179527841..4404f909b6 100644
--- a/src/qml/jsruntime/qv4managed.cpp
+++ b/src/qml/jsruntime/qv4managed.cpp
@@ -186,9 +186,10 @@ ReturnedValue Managed::call(Managed *m, CallData *)
m->engine()->current->throwTypeError();
}
-void Managed::getLookup(Managed *m, Lookup *, Value *)
+ReturnedValue Managed::getLookup(Managed *m, Lookup *)
{
m->engine()->current->throwTypeError();
+ return 0;
}
void Managed::setLookup(Managed *m, Lookup *, const Value &)
diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h
index 2ffacf6dd5..df25bab64a 100644
--- a/src/qml/jsruntime/qv4managed_p.h
+++ b/src/qml/jsruntime/qv4managed_p.h
@@ -105,7 +105,7 @@ struct ManagedVTable
PropertyAttributes (*queryIndexed)(const Managed *, uint index);
bool (*deleteProperty)(Managed *m, String *name);
bool (*deleteIndexedProperty)(Managed *m, uint index);
- void (*getLookup)(Managed *m, Lookup *l, Value *result);
+ ReturnedValue (*getLookup)(Managed *m, Lookup *l);
void (*setLookup)(Managed *m, Lookup *l, const Value &v);
bool (*isEqualTo)(Managed *m, Managed *other);
Property *(*advanceIterator)(Managed *m, ObjectIterator *it, String **name, uint *index, PropertyAttributes *attributes);
@@ -277,8 +277,8 @@ public:
{ return vtbl->deleteProperty(this, name); }
bool deleteIndexedProperty(uint index)
{ return vtbl->deleteIndexedProperty(this, index); }
- void getLookup(Lookup *l, Value *result)
- { vtbl->getLookup(this, l, result); }
+ ReturnedValue getLookup(Lookup *l)
+ { return vtbl->getLookup(this, l); }
void setLookup(Lookup *l, const Value &v)
{ vtbl->setLookup(this, l, v); }
@@ -291,7 +291,7 @@ public:
static bool hasInstance(Managed *that, const Value &value);
static ReturnedValue construct(Managed *m, CallData *d);
static ReturnedValue call(Managed *m, CallData *);
- static void getLookup(Managed *m, Lookup *, Value *);
+ static ReturnedValue getLookup(Managed *m, Lookup *);
static void setLookup(Managed *m, Lookup *l, const Value &v);
static bool isEqualTo(Managed *m, Managed *other);
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index e682f80b5e..a7945334f8 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -510,7 +510,7 @@ bool Object::deleteIndexedProperty(Managed *m, uint index)
return static_cast<Object *>(m)->internalDeleteIndexedProperty(index);
}
-void Object::getLookup(Managed *m, Lookup *l, Value *result)
+ReturnedValue Object::getLookup(Managed *m, Lookup *l)
{
Object *o = static_cast<Object *>(m);
PropertyAttributes attrs;
@@ -523,9 +523,7 @@ void Object::getLookup(Managed *m, Lookup *l, Value *result)
l->getter = Lookup::getter1;
else if (l->level == 2)
l->getter = Lookup::getter2;
- if (result)
- *result = p->value;
- return;
+ return p->value.asReturnedValue();
} else {
if (l->level == 0)
l->getter = Lookup::getterAccessor0;
@@ -533,16 +531,10 @@ void Object::getLookup(Managed *m, Lookup *l, Value *result)
l->getter = Lookup::getterAccessor1;
else if (l->level == 2)
l->getter = Lookup::getterAccessor2;
- if (result)
- *result = p->value;
- Value res = Value::fromReturnedValue(o->getValue(p, attrs));
- if (result)
- *result = res;
- return;
+ return o->getValue(p, attrs);
}
- } else if (result) {
- *result = Value::undefinedValue();
}
+ return Value::undefinedValue().asReturnedValue();
}
void Object::setLookup(Managed *m, Lookup *l, const Value &value)
diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h
index e11eecf9cb..d64d2d119d 100644
--- a/src/qml/jsruntime/qv4object_p.h
+++ b/src/qml/jsruntime/qv4object_p.h
@@ -324,7 +324,7 @@ protected:
static PropertyAttributes queryIndexed(const Managed *m, uint index);
static bool deleteProperty(Managed *m, String *name);
static bool deleteIndexedProperty(Managed *m, uint index);
- static void getLookup(Managed *m, Lookup *l, Value *result);
+ static ReturnedValue getLookup(Managed *m, Lookup *l);
static void setLookup(Managed *m, Lookup *l, const Value &v);
static Property *advanceIterator(Managed *m, ObjectIterator *it, String **name, uint *index, PropertyAttributes *attributes);
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 107ae695a8..e17d9b833d 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -930,17 +930,16 @@ QV4::Bool __qmljs_cmp_le(const QV4::ValueRef l, const QV4::ValueRef r)
ReturnedValue __qmljs_call_global_lookup(ExecutionContext *context, uint index, CallDataRef callData)
{
+ Scope scope(context);
Q_ASSERT(callData->thisObject.isUndefined());
Lookup *l = context->lookups + index;
- Value v;
- l->globalGetter(l, context, &v);
- FunctionObject *o = v.asFunctionObject();
+ Scoped<FunctionObject> o(scope, l->globalGetter(l, context));
if (!o)
context->throwTypeError();
- if (o == context->engine->evalFunction && l->name->isEqualTo(context->engine->id_eval))
- return static_cast<EvalFunction *>(o)->evalCall(callData->thisObject, callData->args, callData->argc, true);
+ if (o.getPointer() == context->engine->evalFunction && l->name->isEqualTo(context->engine->id_eval))
+ return static_cast<EvalFunction *>(o.getPointer())->evalCall(callData->thisObject, callData->args, callData->argc, true);
return o->call(callData);
}
@@ -997,12 +996,10 @@ ReturnedValue __qmljs_call_property(ExecutionContext *context, String *name, Cal
ReturnedValue __qmljs_call_property_lookup(ExecutionContext *context, uint index, CallDataRef callData)
{
- Value func;
+ Scope scope(context);
Lookup *l = context->lookups + index;
- l->getter(l, &func, callData->thisObject);
-
- Object *o = func.asObject();
+ Scoped<Object> o(scope, l->getter(l, callData->thisObject));
if (!o)
context->throwTypeError();
@@ -1034,14 +1031,11 @@ ReturnedValue __qmljs_call_value(ExecutionContext *context, const ValueRef func,
ReturnedValue __qmljs_construct_global_lookup(ExecutionContext *context, uint index, CallDataRef callData)
{
+ Scope scope(context);
Q_ASSERT(callData->thisObject.isUndefined());
- Value func;
-
Lookup *l = context->lookups + index;
- l->globalGetter(l, context, &func);
-
- Object *f = func.asObject();
+ Scoped<Object> f(scope, l->globalGetter(l, context));
if (!f)
context->throwTypeError();