diff options
author | Matthew Vogt <matthew.vogt@nokia.com> | 2012-03-12 08:18:01 +1000 |
---|---|---|
committer | Matthew Vogt <matthew.vogt@nokia.com> | 2012-03-12 08:35:40 +1000 |
commit | 1f52c5430144eb7ba6baa7e3954675ca0707b947 (patch) | |
tree | 22106095d5cc61c7b5625c8ff2639e1530d2c3b0 /src/qml/qml/v4/qv4irbuilder.cpp | |
parent | 616bbd1988f3b92f7d980b6c9a1278f11b712573 (diff) | |
parent | ed74ec4c40f1476c545bcaacb12fe3a607172035 (diff) |
Merge branch 'master' of git://gitorious.org/qt/qtdeclarative into api_changes
Change-Id: I578b1e2f1bb374da6194e6ba04a0fd459b2632fe
Diffstat (limited to 'src/qml/qml/v4/qv4irbuilder.cpp')
-rw-r--r-- | src/qml/qml/v4/qv4irbuilder.cpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/qml/qml/v4/qv4irbuilder.cpp b/src/qml/qml/v4/qv4irbuilder.cpp index 32581a072c..36e88e5276 100644 --- a/src/qml/qml/v4/qv4irbuilder.cpp +++ b/src/qml/qml/v4/qv4irbuilder.cpp @@ -531,7 +531,7 @@ bool QV4IRBuilder::visit(AST::NumericLiteral *ast) _expr.format = ExprResult::cx; _block->JUMP(ast->value ? _expr.iftrue : _expr.iffalse); } else { - _expr.code = _block->CONST(ast->value); + _expr.code = _block->CONST(IR::RealType, ast->value); } return false; } @@ -767,7 +767,7 @@ bool QV4IRBuilder::visit(AST::UnaryMinusExpression *ast) if (expr.isNot(IR::InvalidType)) { if (IR::Const *c = expr.code->asConst()) { _expr = expr; - _expr.code = _block->CONST(-c->value); + _expr.code = _block->CONST(expr->type, -c->value); return false; } @@ -785,7 +785,7 @@ bool QV4IRBuilder::visit(AST::TildeExpression *ast) if (expr.isNot(IR::InvalidType)) { if (IR::Const *c = expr.code->asConst()) { _expr = expr; - _expr.code = _block->CONST(~int(c->value)); + _expr.code = _block->CONST(expr->type, ~int(c->value)); return false; } IR::Expr *code = _block->UNOP(IR::OpCompl, expr); @@ -803,7 +803,7 @@ bool QV4IRBuilder::visit(AST::NotExpression *ast) if (expr.isNot(IR::InvalidType)) { if (IR::Const *c = expr.code->asConst()) { _expr = expr; - _expr.code = _block->CONST(!c->value); + _expr.code = _block->CONST(IR::BoolType, !c->value); return false; } @@ -823,16 +823,18 @@ bool QV4IRBuilder::visit(AST::NotExpression *ast) void QV4IRBuilder::binop(AST::BinaryExpression *ast, ExprResult left, ExprResult right) { if (IR::Type t = maxType(left.type(), right.type())) { - implicitCvt(left, t); - implicitCvt(right, t); + if (!left->asConst() && !right->asConst()) { + // the implicit conversions are needed only + // when compiling non-constant expressions. + implicitCvt(left, t); + implicitCvt(right, t); + } if (_expr.hint == ExprResult::cx) { _expr.format = ExprResult::cx; _block->CJUMP(_block->BINOP(IR::binaryOperator(ast->op), left, right), _expr.iftrue, _expr.iffalse); } else { - IR::Expr *code = _block->BINOP(IR::binaryOperator(ast->op), left, right); - _expr.code = _block->TEMP(code->type); - _block->MOVE(_expr.code, code); + _expr.code = _block->BINOP(IR::binaryOperator(ast->op), left, right); } } } @@ -862,7 +864,7 @@ bool QV4IRBuilder::visit(AST::BinaryExpression *ast) IR::Temp *r = _block->TEMP(IR::InvalidType); _block = iffalse; - _block->MOVE(r, _block->CONST(0)); // ### use the right null value + _block->MOVE(r, _block->CONST(IR::BoolType, 0)); // ### use the right null value _block->JUMP(endif); _block = iftrue; |