diff options
author | Lars Knoll <[email protected]> | 2013-09-09 21:35:37 +0200 |
---|---|---|
committer | The Qt Project <[email protected]> | 2013-09-12 21:52:27 +0200 |
commit | c2c038ae942c534555018ebae71f20334348e46c (patch) | |
tree | dd563df7090f9863a4207251d9aa8ed1d2c553e8 | |
parent | 95ee1133854a6c14f92b921859ae751b9c1a78a9 (diff) |
Convert unary operations and some other runtime methods
Change-Id: I985876ade37efd24e1d4f8360a6472282cf44f8b
Reviewed-by: Simon Hausmann <[email protected]>
-rw-r--r-- | src/qml/compiler/qv4isel_masm.cpp | 17 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 33 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime_p.h | 44 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4vme_moth.cpp | 10 |
4 files changed, 47 insertions, 57 deletions
diff --git a/src/qml/compiler/qv4isel_masm.cpp b/src/qml/compiler/qv4isel_masm.cpp index 7b1c27feb8..91787337c8 100644 --- a/src/qml/compiler/qv4isel_masm.cpp +++ b/src/qml/compiler/qv4isel_masm.cpp @@ -755,23 +755,21 @@ void InstructionSelection::callBuiltinTypeofValue(V4IR::Expr *value, V4IR::Temp void InstructionSelection::callBuiltinDeleteMember(V4IR::Temp *base, const QString &name, V4IR::Temp *result) { - generateFunctionCall(Assembler::Void, __qmljs_delete_member, Assembler::ContextRegister, - Assembler::PointerToValue(result), Assembler::Reference(base), - Assembler::PointerToString(name)); + generateFunctionCall(result, __qmljs_delete_member, Assembler::ContextRegister, + Assembler::Reference(base), Assembler::PointerToString(name)); } void InstructionSelection::callBuiltinDeleteSubscript(V4IR::Temp *base, V4IR::Expr *index, V4IR::Temp *result) { - generateFunctionCall(Assembler::Void, __qmljs_delete_subscript, Assembler::ContextRegister, - Assembler::PointerToValue(result), Assembler::Reference(base), - Assembler::PointerToValue(index)); + generateFunctionCall(result, __qmljs_delete_subscript, Assembler::ContextRegister, + Assembler::Reference(base), Assembler::PointerToValue(index)); } void InstructionSelection::callBuiltinDeleteName(const QString &name, V4IR::Temp *result) { - generateFunctionCall(Assembler::Void, __qmljs_delete_name, Assembler::ContextRegister, - Assembler::PointerToValue(result), Assembler::PointerToString(name)); + generateFunctionCall(result, __qmljs_delete_name, Assembler::ContextRegister, + Assembler::PointerToString(name)); } void InstructionSelection::callBuiltinDeleteValue(V4IR::Temp *result) @@ -1226,8 +1224,7 @@ void InstructionSelection::unop(V4IR::AluOp oper, V4IR::Temp *sourceTemp, V4IR:: } // switch if (op) { - _as->generateFunctionCallImp(Assembler::Void, opName, op, - Assembler::PointerToValue(targetTemp), + _as->generateFunctionCallImp(targetTemp, opName, op, Assembler::PointerToValue(sourceTemp)); storeTarget(0, targetTemp); } diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index e8213547bf..3d9c5f9a81 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -250,35 +250,28 @@ void __qmljs_init_closure(ExecutionContext *ctx, ValueRef result, int functionId *result = Value::fromObject(FunctionObject::creatScriptFunction(ctx, clos)); } -void __qmljs_delete_subscript(ExecutionContext *ctx, ValueRef result, const ValueRef base, const ValueRef index) +ReturnedValue __qmljs_delete_subscript(ExecutionContext *ctx, const ValueRef base, const ValueRef index) { if (Object *o = base->asObject()) { uint n = index->asArrayIndex(); if (n < UINT_MAX) { - Value res = Value::fromBoolean(o->deleteIndexedProperty(n)); - if (result) - *result = res; - return; + return Value::fromBoolean(o->deleteIndexedProperty(n)); } } String *name = index->toString(ctx); - __qmljs_delete_member(ctx, result, base, name); + return __qmljs_delete_member(ctx, base, name); } -void __qmljs_delete_member(ExecutionContext *ctx, ValueRef result, const ValueRef base, String *name) +ReturnedValue __qmljs_delete_member(ExecutionContext *ctx, const ValueRef base, String *name) { Object *obj = base->toObject(ctx); - Value res = Value::fromBoolean(obj->deleteProperty(name)); - if (result) - *result = res; + return Value::fromBoolean(obj->deleteProperty(name)); } -void __qmljs_delete_name(ExecutionContext *ctx, ValueRef result, String *name) +ReturnedValue __qmljs_delete_name(ExecutionContext *ctx, String *name) { - Value res = Value::fromBoolean(ctx->deleteProperty(name)); - if (result) - *result = res; + return Value::fromBoolean(ctx->deleteProperty(name)); } void __qmljs_add_helper(ExecutionContext *ctx, ValueRef result, const ValueRef left, const ValueRef right) @@ -1233,27 +1226,27 @@ QV4::ReturnedValue __qmljs_builtin_setup_arguments_object(ExecutionContext *ctx) return Value::fromObject(args); } -void __qmljs_increment(QV4::ValueRef result, const QV4::ValueRef value) +QV4::ReturnedValue __qmljs_increment(const QV4::ValueRef value) { TRACE1(value); if (value->isInteger()) - *result = Value::fromInt32(value->integerValue() + 1); + return Value::fromInt32(value->integerValue() + 1); else { double d = value->toNumber(); - *result = Value::fromDouble(d + 1); + return Value::fromDouble(d + 1); } } -void __qmljs_decrement(QV4::ValueRef result, const QV4::ValueRef value) +QV4::ReturnedValue __qmljs_decrement(const QV4::ValueRef value) { TRACE1(value); if (value->isInteger()) - *result = Value::fromInt32(value->integerValue() - 1); + return Value::fromInt32(value->integerValue() - 1); else { double d = value->toNumber(); - *result = Value::fromDouble(d - 1); + return Value::fromDouble(d - 1); } } diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h index e575146792..3cd5ecc2fa 100644 --- a/src/qml/jsruntime/qv4runtime_p.h +++ b/src/qml/jsruntime/qv4runtime_p.h @@ -178,13 +178,13 @@ QV4::Bool __qmljs_equal_helper(const ValueRef x, const ValueRef y); Q_QML_EXPORT QV4::Bool __qmljs_strict_equal(const ValueRef x, const ValueRef y); // unary operators -typedef void (*UnaryOpName)(QV4::ValueRef, const QV4::ValueRef); -void __qmljs_uplus(QV4::ValueRef result, const QV4::ValueRef value); -void __qmljs_uminus(QV4::ValueRef result, const QV4::ValueRef value); -void __qmljs_compl(QV4::ValueRef result, const QV4::ValueRef value); -void __qmljs_not(QV4::ValueRef result, const QV4::ValueRef value); -void __qmljs_increment(QV4::ValueRef result, const QV4::ValueRef value); -void __qmljs_decrement(QV4::ValueRef result, const QV4::ValueRef value); +typedef QV4::ReturnedValue (*UnaryOpName)(const QV4::ValueRef); +QV4::ReturnedValue __qmljs_uplus(const QV4::ValueRef value); +QV4::ReturnedValue __qmljs_uminus(const QV4::ValueRef value); +QV4::ReturnedValue __qmljs_compl(const QV4::ValueRef value); +QV4::ReturnedValue __qmljs_not(const QV4::ValueRef value); +QV4::ReturnedValue __qmljs_increment(const QV4::ValueRef value); +QV4::ReturnedValue __qmljs_decrement(const QV4::ValueRef value); Q_QML_EXPORT void __qmljs_value_to_double(double *result, const ValueRef value); Q_QML_EXPORT int __qmljs_value_to_int32(const ValueRef value); @@ -192,9 +192,9 @@ Q_QML_EXPORT int __qmljs_double_to_int32(const double &d); Q_QML_EXPORT unsigned __qmljs_value_to_uint32(const ValueRef value); Q_QML_EXPORT unsigned __qmljs_double_to_uint32(const double &d); -void __qmljs_delete_subscript(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::ValueRef base, const QV4::ValueRef index); -void __qmljs_delete_member(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::ValueRef base, QV4::String *name); -void __qmljs_delete_name(QV4::ExecutionContext *ctx, QV4::ValueRef result, QV4::String *name); +QV4::ReturnedValue __qmljs_delete_subscript(QV4::ExecutionContext *ctx, const QV4::ValueRef base, const QV4::ValueRef index); +ReturnedValue __qmljs_delete_member(QV4::ExecutionContext *ctx, const QV4::ValueRef base, QV4::String *name); +ReturnedValue __qmljs_delete_name(QV4::ExecutionContext *ctx, QV4::String *name); void Q_NORETURN __qmljs_throw(QV4::ExecutionContext*, const QV4::ValueRef value); @@ -309,32 +309,32 @@ inline QV4::ReturnedValue __qmljs_to_object(QV4::ExecutionContext *ctx, const QV } -inline void __qmljs_uplus(QV4::ValueRef result, const QV4::ValueRef value) +inline QV4::ReturnedValue __qmljs_uplus(const QV4::ValueRef value) { TRACE1(value); - result = value; - if (result->tryIntegerConversion()) - return; + Value result = *value; + if (result.tryIntegerConversion()) + return result; double n = __qmljs_to_number(value); - *result = QV4::Value::fromDouble(n); + return QV4::Value::fromDouble(n); } -inline void __qmljs_uminus(QV4::ValueRef result, const QV4::ValueRef value) +inline QV4::ReturnedValue __qmljs_uminus(const QV4::ValueRef value) { TRACE1(value); // +0 != -0, so we need to convert to double when negating 0 if (value->isInteger() && value->integerValue()) - *result = QV4::Value::fromInt32(-value->integerValue()); + return QV4::Value::fromInt32(-value->integerValue()); else { double n = __qmljs_to_number(value); - *result = QV4::Value::fromDouble(-n); + return QV4::Value::fromDouble(-n); } } -inline void __qmljs_compl(QV4::ValueRef result, const QV4::ValueRef value) +inline QV4::ReturnedValue __qmljs_compl(const QV4::ValueRef value) { TRACE1(value); @@ -344,15 +344,15 @@ inline void __qmljs_compl(QV4::ValueRef result, const QV4::ValueRef value) else n = QV4::Value::toInt32(__qmljs_to_number(value)); - *result = QV4::Value::fromInt32(~n); + return QV4::Value::fromInt32(~n); } -inline void __qmljs_not(QV4::ValueRef result, const QV4::ValueRef value) +inline QV4::ReturnedValue __qmljs_not(const QV4::ValueRef value) { TRACE1(value); bool b = value->toBoolean(); - *result = QV4::Value::fromBoolean(!b); + return QV4::Value::fromBoolean(!b); } // binary operators diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp index fd272b137c..43db067fe1 100644 --- a/src/qml/jsruntime/qv4vme_moth.cpp +++ b/src/qml/jsruntime/qv4vme_moth.cpp @@ -406,19 +406,19 @@ QV4::Value VME::run(QV4::ExecutionContext *context, const uchar *&code, MOTH_END_INSTR(CallBuiltinForeachIteratorObject) MOTH_BEGIN_INSTR(CallBuiltinForeachNextPropertyName) - VALUE(instr.result) = __qmljs_foreach_next_property_name(VALUEPTR(instr.arg)).get(); + VALUE(instr.result) = __qmljs_foreach_next_property_name(VALUEPTR(instr.arg)).get(); MOTH_END_INSTR(CallBuiltinForeachNextPropertyName) MOTH_BEGIN_INSTR(CallBuiltinDeleteMember) - __qmljs_delete_member(context, VALUEPTR(instr.result), VALUEPTR(instr.base), runtimeStrings[instr.member]); + VALUE(instr.result) = __qmljs_delete_member(context, VALUEPTR(instr.base), runtimeStrings[instr.member]).get(); MOTH_END_INSTR(CallBuiltinDeleteMember) MOTH_BEGIN_INSTR(CallBuiltinDeleteSubscript) - __qmljs_delete_subscript(context, VALUEPTR(instr.result), VALUEPTR(instr.base), VALUEPTR(instr.index)); + VALUE(instr.result) = __qmljs_delete_subscript(context, VALUEPTR(instr.base), VALUEPTR(instr.index)).get(); MOTH_END_INSTR(CallBuiltinDeleteSubscript) MOTH_BEGIN_INSTR(CallBuiltinDeleteName) - __qmljs_delete_name(context, VALUEPTR(instr.result), runtimeStrings[instr.name]); + VALUE(instr.result) = __qmljs_delete_name(context, runtimeStrings[instr.name]).get(); MOTH_END_INSTR(CallBuiltinDeleteName) MOTH_BEGIN_INSTR(CallBuiltinTypeofMember) @@ -504,7 +504,7 @@ QV4::Value VME::run(QV4::ExecutionContext *context, const uchar *&code, MOTH_END_INSTR(CJump) MOTH_BEGIN_INSTR(Unop) - instr.alu(QV4::ValueRef::fromRawValue(VALUEPTR(instr.result)), QV4::ValueRef::fromRawValue(VALUEPTR(instr.source))); + VALUE(instr.result) = instr.alu(VALUEPTR(instr.source)).get(); MOTH_END_INSTR(Unop) MOTH_BEGIN_INSTR(Binop) |