jitcraft/BytecodeCompiler.cpp
changeset 79 0206df35882c
parent 78 93e0a19c805a
child 80 c58dff4e560c
     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