aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <[email protected]>2013-09-09 21:35:37 +0200
committerThe Qt Project <[email protected]>2013-09-12 21:52:27 +0200
commitc2c038ae942c534555018ebae71f20334348e46c (patch)
treedd563df7090f9863a4207251d9aa8ed1d2c553e8
parent95ee1133854a6c14f92b921859ae751b9c1a78a9 (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.cpp17
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp33
-rw-r--r--src/qml/jsruntime/qv4runtime_p.h44
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp10
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)