Convert unary ops to new calling convention
authorSimon Hausmann <simon.hausmann@digia.com>
Thu, 14 Feb 2013 14:55:43 +0000 (15:55 +0100)
committerLars Knoll <lars.knoll@digia.com>
Thu, 14 Feb 2013 19:28:20 +0000 (20:28 +0100)
Change-Id: I974fd474c4f35885e42dd219e2daa65098f4e0a1
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/v4/llvm_runtime.cpp
src/v4/moth/qv4isel_moth.cpp
src/v4/moth/qv4vme_moth.cpp
src/v4/qmljs_runtime.cpp
src/v4/qmljs_runtime.h
src/v4/qv4isel_masm.cpp

index e89c8c8..af5f036 100644 (file)
@@ -210,22 +210,22 @@ void __qmljs_llvm_in(ExecutionContext *ctx, Value *result, Value *left, Value *r
 
 void __qmljs_llvm_uplus(ExecutionContext *ctx, Value *result, const Value *value)
 {
-    *result = __qmljs_uplus(*value, ctx);
+    __qmljs_uplus(result, *value, ctx);
 }
 
 void __qmljs_llvm_uminus(ExecutionContext *ctx, Value *result, const Value *value)
 {
-    *result = __qmljs_uminus(*value, ctx);
+    __qmljs_uminus(result, *value, ctx);
 }
 
 void __qmljs_llvm_compl(ExecutionContext *ctx, Value *result, const Value *value)
 {
-    *result = __qmljs_compl(*value, ctx);
+    __qmljs_compl(result, *value, ctx);
 }
 
 void __qmljs_llvm_not(ExecutionContext *ctx, Value *result, const Value *value)
 {
-    *result = __qmljs_not(*value, ctx);
+    __qmljs_not(result, *value, ctx);
 }
 
 void __qmljs_llvm_inplace_bit_and_name(ExecutionContext *ctx, String *dest, Value *src)
index 8cd9e38..fccd750 100644 (file)
@@ -482,7 +482,7 @@ void InstructionSelection::copyValue(IR::Temp *sourceTemp, IR::Temp *targetTemp)
 
 void InstructionSelection::unop(IR::AluOp oper, IR::Temp *sourceTemp, IR::Temp *targetTemp)
 {
-    VM::Value (*op)(const VM::Value& value, VM::ExecutionContext *ctx) = 0;
+    VM::UnaryOpName op = 0;
     switch (oper) {
     case IR::OpIfTrue: assert(!"unreachable"); break;
     case IR::OpNot: op = VM::__qmljs_not; break;
index 00db920..c6abce5 100644 (file)
@@ -406,7 +406,7 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co
     MOTH_END_INSTR(CJump)
 
     MOTH_BEGIN_INSTR(Unop)
-        VALUE(instr.result) = instr.alu(VALUE(instr.source), context);
+        instr.alu(VALUEPTR(instr.result), VALUE(instr.source), context);
     MOTH_END_INSTR(Unop)
 
     MOTH_BEGIN_INSTR(Binop)
index 3efeaaa..be0353b 100644 (file)
@@ -1289,26 +1289,28 @@ void __qmljs_builtin_define_getter_setter(Value object, String *name, Value gett
     o->__defineOwnProperty__(ctx, name, &pd);
 }
 
-Value __qmljs_increment(const Value &value, ExecutionContext *ctx)
+void __qmljs_increment(Value *result, const Value &value, ExecutionContext *ctx)
 {
     TRACE1(value);
 
     if (value.isInteger())
-        return Value::fromInt32(value.integerValue() + 1);
-
-    double d = __qmljs_to_number(value, ctx);
-    return Value::fromDouble(d + 1);
+        *result = Value::fromInt32(value.integerValue() + 1);
+    else {
+        double d = __qmljs_to_number(value, ctx);
+        *result = Value::fromDouble(d + 1);
+    }
 }
 
-Value __qmljs_decrement(const Value &value, ExecutionContext *ctx)
+void __qmljs_decrement(Value *result, const Value &value, ExecutionContext *ctx)
 {
     TRACE1(value);
 
     if (value.isInteger())
-        return Value::fromInt32(value.integerValue() - 1);
-
-    double d = __qmljs_to_number(value, ctx);
-    return Value::fromDouble(d - 1);
+        *result = Value::fromInt32(value.integerValue() - 1);
+    else {
+        double d = __qmljs_to_number(value, ctx);
+        *result = Value::fromDouble(d - 1);
+    }
 }
 
 } // extern "C"
index 0662bbc..ec418d3 100644 (file)
@@ -201,13 +201,13 @@ Bool __qmljs_equal(const Value &x, const Value &y, ExecutionContext *ctx);
 Bool __qmljs_strict_equal(const Value &x, const Value &y);
 
 // unary operators
-typedef Value (*UnaryOpName)(const Value &, ExecutionContext* ctx);
-Value __qmljs_uplus(const Value &value, ExecutionContext *ctx);
-Value __qmljs_uminus(const Value &value, ExecutionContext *ctx);
-Value __qmljs_compl(const Value &value, ExecutionContext *ctx);
-Value __qmljs_not(const Value &value, ExecutionContext *ctx);
-Value __qmljs_increment(const Value &value, ExecutionContext *ctx);
-Value __qmljs_decrement(const Value &value, ExecutionContext *ctx);
+typedef void (*UnaryOpName)(Value *, const Value &, ExecutionContext* ctx);
+void __qmljs_uplus(Value *result, const Value &value, ExecutionContext *ctx);
+void __qmljs_uminus(Value *result, const Value &value, ExecutionContext *ctx);
+void __qmljs_compl(Value *result, const Value &value, ExecutionContext *ctx);
+void __qmljs_not(Value *result, const Value &value, ExecutionContext *ctx);
+void __qmljs_increment(Value *result, const Value &value, ExecutionContext *ctx);
+void __qmljs_decrement(Value *result, const Value &value, ExecutionContext *ctx);
 
 Value __qmljs_delete_subscript(ExecutionContext *ctx, const Value &base, Value index);
 Value __qmljs_delete_member(ExecutionContext *ctx, const Value &base, String *name);
@@ -481,30 +481,32 @@ inline Value __qmljs_default_value(const Value &value, ExecutionContext *ctx, in
 }
 
 
-inline Value __qmljs_uplus(const Value &value, ExecutionContext *ctx)
+inline void __qmljs_uplus(Value *result, const Value &value, ExecutionContext *ctx)
 {
     TRACE1(value);
 
-    Value copy = value;
-    if (copy.tryIntegerConversion())
-        return copy;
+    *result = value;
+    if (result->tryIntegerConversion())
+        return;
 
     double n = __qmljs_to_number(value, ctx);
-    return Value::fromDouble(n);
+    *result = Value::fromDouble(n);
 }
 
-inline Value __qmljs_uminus(const Value &value, ExecutionContext *ctx)
+inline void __qmljs_uminus(Value *result, const Value &value, ExecutionContext *ctx)
 {
     TRACE1(value);
 
     // +0 != -0, so we need to convert to double when negating 0
     if (value.isInteger() && value.integerValue())
-        return Value::fromInt32(-value.integerValue());
-    double n = __qmljs_to_number(value, ctx);
-    return Value::fromDouble(-n);
+        *result = Value::fromInt32(-value.integerValue());
+    else {
+        double n = __qmljs_to_number(value, ctx);
+        *result = Value::fromDouble(-n);
+    }
 }
 
-inline Value __qmljs_compl(const Value &value, ExecutionContext *ctx)
+inline void __qmljs_compl(Value *result, const Value &value, ExecutionContext *ctx)
 {
     TRACE1(value);
 
@@ -514,15 +516,15 @@ inline Value __qmljs_compl(const Value &value, ExecutionContext *ctx)
     else
         n = Value::toInt32(__qmljs_to_number(value, ctx));
 
-    return Value::fromInt32(~n);
+    *result = Value::fromInt32(~n);
 }
 
-inline Value __qmljs_not(const Value &value, ExecutionContext *ctx)
+inline void __qmljs_not(Value *result, const Value &value, ExecutionContext *ctx)
 {
     TRACE1(value);
 
     bool b = __qmljs_to_boolean(value, ctx);
-    return Value::fromBoolean(!b);
+    *result = Value::fromBoolean(!b);
 }
 
 // binary operators
index d91917b..ed1a09e 100644 (file)
@@ -739,7 +739,7 @@ void InstructionSelection::copyValue(IR::Temp *sourceTemp, IR::Temp *targetTemp)
 
 void InstructionSelection::unop(IR::AluOp oper, IR::Temp *sourceTemp, IR::Temp *targetTemp)
 {
-    Value (*op)(const Value& value, ExecutionContext *ctx) = 0;
+    VM::UnaryOpName op = 0;
     const char *opName = 0;
     switch (oper) {
     case IR::OpIfTrue: assert(!"unreachable"); break;
@@ -753,7 +753,7 @@ void InstructionSelection::unop(IR::AluOp oper, IR::Temp *sourceTemp, IR::Temp *
     } // switch
 
     if (op)
-        _as->generateFunctionCallImp(targetTemp, opName, op, Assembler::PointerToValue(sourceTemp),
+        _as->generateFunctionCallImp(Assembler::Void, opName, op, Assembler::PointerToValue(targetTemp), Assembler::PointerToValue(sourceTemp),
                                       Assembler::ContextRegister);
 }