1.1 --- a/jitcraft/BytecodeCompiler.cpp Tue Jul 17 03:59:52 2012 -0700
1.2 +++ b/jitcraft/BytecodeCompiler.cpp Tue Jul 17 21:40:44 2012 -0700
1.3 @@ -49,6 +49,10 @@
1.4 BinaryExpression *b = expr->toBinaryExpression();
1.5 if (b->token() >= TOK_EQUALS && b->token() <= TOK_OR)
1.6 return b->token();
1.7 + } else if (expr->isUnaryExpression()) {
1.8 + UnaryExpression *u = expr->toUnaryExpression();
1.9 + if (u->token() == TOK_NOT)
1.10 + return TOK_NOT;
1.11 }
1.12 return TOK_EOF;
1.13 }
1.14 @@ -404,6 +408,18 @@
1.15 BytecodeCompiler::visit(UnaryExpression *node)
1.16 {
1.17 switch (node->token()) {
1.18 + case TOK_NOT:
1.19 + {
1.20 + Local<Type> type(zone_, node->expression()->type());
1.21 + node->expression()->accept(this);
1.22 +
1.23 + if (node->type()->isFloat())
1.24 + __ not_f();
1.25 + else
1.26 + __ not_();
1.27 + break;
1.28 + }
1.29 +
1.30 default:
1.31 assert(node->token() == TOK_TILDE);
1.32 node->expression()->accept(this);
1.33 @@ -475,17 +491,22 @@
1.34 Label *fallthrough)
1.35 {
1.36 TokenKind token = ToCompare(expression);
1.37 - if (token == TOK_EOF) {
1.38 - expression->accept(this);
1.39 + if (token == TOK_EOF || token == TOK_NOT) {
1.40 + if (token == TOK_EOF)
1.41 + expression->accept(this);
1.42 + else
1.43 + expression->toUnaryExpression()->expression()->accept(this);
1.44 +
1.45 + bool jumpOnTrue = (fallthrough == falseBranch) ^ (token == TOK_NOT);
1.46
1.47 - Opcode op = (fallthrough == trueBranch) ? OP_JF : OP_JT;
1.48 + Opcode op = jumpOnTrue ? OP_JT : OP_JF;
1.49 if (expression->type()->isFloat())
1.50 op = (Opcode)(int(op) + (OP_JL_F - OP_JL));
1.51
1.52 - if (fallthrough == trueBranch)
1.53 - __ j(op, falseBranch);
1.54 + if (fallthrough == falseBranch)
1.55 + __ j(op, trueBranch);
1.56 else
1.57 - __ j(op, trueBranch);
1.58 + __ j(op, falseBranch);
1.59 return;
1.60 }
1.61