diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-11 22:45:47 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-18 13:13:38 +0200 |
commit | 2187beaaae09d3cf279f50d1f606ef6077250bfe (patch) | |
tree | c9f175d7ef98a8c94cf4f16fd57bf1b3edd512a7 /src/qml | |
parent | 6c9f1c8ed93374c16ca6ac540f39e98b451be0d8 (diff) |
Convert lookups to use ReturnedValue
Change-Id: Idbcd1fbd2aa43775ce8c1a3d8fac29a6b58b678a
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml')
-rw-r--r-- | src/qml/compiler/qv4isel_masm.cpp | 8 | ||||
-rw-r--r-- | src/qml/compiler/qv4isel_masm_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4lookup.cpp | 288 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4lookup_p.h | 42 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 16 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 22 |
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(); |