diff -r 93e0a19c805a -r 0206df35882c jitcraft/BytecodeCompiler.cpp --- a/jitcraft/BytecodeCompiler.cpp Tue Jul 17 03:59:52 2012 -0700 +++ b/jitcraft/BytecodeCompiler.cpp Tue Jul 17 21:40:44 2012 -0700 @@ -49,6 +49,10 @@ BinaryExpression *b = expr->toBinaryExpression(); if (b->token() >= TOK_EQUALS && b->token() <= TOK_OR) return b->token(); + } else if (expr->isUnaryExpression()) { + UnaryExpression *u = expr->toUnaryExpression(); + if (u->token() == TOK_NOT) + return TOK_NOT; } return TOK_EOF; } @@ -404,6 +408,18 @@ BytecodeCompiler::visit(UnaryExpression *node) { switch (node->token()) { + case TOK_NOT: + { + Local type(zone_, node->expression()->type()); + node->expression()->accept(this); + + if (node->type()->isFloat()) + __ not_f(); + else + __ not_(); + break; + } + default: assert(node->token() == TOK_TILDE); node->expression()->accept(this); @@ -475,17 +491,22 @@ Label *fallthrough) { TokenKind token = ToCompare(expression); - if (token == TOK_EOF) { - expression->accept(this); + if (token == TOK_EOF || token == TOK_NOT) { + if (token == TOK_EOF) + expression->accept(this); + else + expression->toUnaryExpression()->expression()->accept(this); + + bool jumpOnTrue = (fallthrough == falseBranch) ^ (token == TOK_NOT); - Opcode op = (fallthrough == trueBranch) ? OP_JF : OP_JT; + Opcode op = jumpOnTrue ? OP_JT : OP_JF; if (expression->type()->isFloat()) op = (Opcode)(int(op) + (OP_JL_F - OP_JL)); - if (fallthrough == trueBranch) - __ j(op, falseBranch); + if (fallthrough == falseBranch) + __ j(op, trueBranch); else - __ j(op, trueBranch); + __ j(op, falseBranch); return; }