diff options
author | Lars Knoll <lars.knoll@theqtcompany.com> | 2015-10-12 14:37:37 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@theqtcompany.com> | 2016-04-11 12:27:50 +0000 |
commit | 826b628f79e231762df6ad95195e35e51e934966 (patch) | |
tree | 9ec98d88c1170e4d2f733826ac24a1717e5a7364 /src/qml/compiler/qv4isel_moth.cpp | |
parent | ecc96bbfbfe15ed6fb8793766334f01aa465646f (diff) |
Make the moth representation relocatable
Remove direct use of function pointers in the instructions,
and instead index into the array of runtime methods.
This requires some rather ugly casting to retrieve the method.
Change-Id: I5dee8b49dbd7adbfb89a9cc33cbbda8fa53325ce
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
Diffstat (limited to 'src/qml/compiler/qv4isel_moth.cpp')
-rw-r--r-- | src/qml/compiler/qv4isel_moth.cpp | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/qml/compiler/qv4isel_moth.cpp b/src/qml/compiler/qv4isel_moth.cpp index 65bb68e3c2..edd8425678 100644 --- a/src/qml/compiler/qv4isel_moth.cpp +++ b/src/qml/compiler/qv4isel_moth.cpp @@ -54,7 +54,7 @@ using namespace QV4::Moth; namespace { -inline QV4::Runtime::BinaryOperation aluOpFunction(IR::AluOp op) +inline uint aluOpFunction(IR::AluOp op) { switch (op) { case IR::OpInvalid: @@ -70,43 +70,43 @@ inline QV4::Runtime::BinaryOperation aluOpFunction(IR::AluOp op) case IR::OpCompl: return 0; case IR::OpBitAnd: - return QV4::Runtime::method_bitAnd; + return offsetof(QV4::Runtime, bitAnd); case IR::OpBitOr: - return QV4::Runtime::method_bitOr; + return offsetof(QV4::Runtime, bitOr); case IR::OpBitXor: - return QV4::Runtime::method_bitXor; + return offsetof(QV4::Runtime, bitXor); case IR::OpAdd: return 0; case IR::OpSub: - return QV4::Runtime::method_sub; + return offsetof(QV4::Runtime, sub); case IR::OpMul: - return QV4::Runtime::method_mul; + return offsetof(QV4::Runtime, mul); case IR::OpDiv: - return QV4::Runtime::method_div; + return offsetof(QV4::Runtime, div); case IR::OpMod: - return QV4::Runtime::method_mod; + return offsetof(QV4::Runtime, mod); case IR::OpLShift: - return QV4::Runtime::method_shl; + return offsetof(QV4::Runtime, shl); case IR::OpRShift: - return QV4::Runtime::method_shr; + return offsetof(QV4::Runtime, shr); case IR::OpURShift: - return QV4::Runtime::method_ushr; + return offsetof(QV4::Runtime, ushr); case IR::OpGt: - return QV4::Runtime::method_greaterThan; + return offsetof(QV4::Runtime, greaterThan); case IR::OpLt: - return QV4::Runtime::method_lessThan; + return offsetof(QV4::Runtime, lessThan); case IR::OpGe: - return QV4::Runtime::method_greaterEqual; + return offsetof(QV4::Runtime, greaterEqual); case IR::OpLe: - return QV4::Runtime::method_lessEqual; + return offsetof(QV4::Runtime, lessEqual); case IR::OpEqual: - return QV4::Runtime::method_equal; + return offsetof(QV4::Runtime, equal); case IR::OpNotEqual: - return QV4::Runtime::method_notEqual; + return offsetof(QV4::Runtime, notEqual); case IR::OpStrictEqual: - return QV4::Runtime::method_strictEqual; + return offsetof(QV4::Runtime, strictEqual); case IR::OpStrictNotEqual: - return QV4::Runtime::method_strictNotEqual; + return offsetof(QV4::Runtime, strictNotEqual); case IR::OpInstanceof: return 0; case IR::OpIn: @@ -1040,11 +1040,11 @@ Param InstructionSelection::binopHelper(IR::AluOp oper, IR::Expr *leftSource, IR if (oper == IR::OpInstanceof || oper == IR::OpIn || oper == IR::OpAdd) { Instruction::BinopContext binop; if (oper == IR::OpInstanceof) - binop.alu = QV4::Runtime::method_instanceof; + binop.alu = offsetof(QV4::Runtime, instanceof); else if (oper == IR::OpIn) - binop.alu = QV4::Runtime::method_in; + binop.alu = offsetof(QV4::Runtime, in); else - binop.alu = QV4::Runtime::method_add; + binop.alu = offsetof(QV4::Runtime, add); binop.lhs = getParam(leftSource); binop.rhs = getParam(rightSource); binop.result = getResultParam(target); |