| Index: src/codegen-arm.cc
|
| ===================================================================
|
| --- src/codegen-arm.cc (revision 732)
|
| +++ src/codegen-arm.cc (working copy)
|
| @@ -2985,55 +2985,47 @@
|
| Expression* right = node->right();
|
| Token::Value op = node->op();
|
|
|
| - // NOTE: To make null checks efficient, we check if either left or
|
| - // right is the literal 'null'. If so, we optimize the code by
|
| - // inlining a null check instead of calling the (very) general
|
| - // runtime routine for checking equality.
|
| -
|
| + // To make null checks efficient, we check if either left or right is the
|
| + // literal 'null'. If so, we optimize the code by inlining a null check
|
| + // instead of calling the (very) general runtime routine for checking
|
| + // equality.
|
| if (op == Token::EQ || op == Token::EQ_STRICT) {
|
| bool left_is_null =
|
| - left->AsLiteral() != NULL && left->AsLiteral()->IsNull();
|
| + left->AsLiteral() != NULL && left->AsLiteral()->IsNull();
|
| bool right_is_null =
|
| - right->AsLiteral() != NULL && right->AsLiteral()->IsNull();
|
| - // The 'null' value is only equal to 'null' or 'undefined'.
|
| + right->AsLiteral() != NULL && right->AsLiteral()->IsNull();
|
| + // The 'null' value can only be equal to 'null' or 'undefined'.
|
| if (left_is_null || right_is_null) {
|
| Load(left_is_null ? right : left);
|
| - Label exit, undetectable;
|
| frame_->Pop(r0);
|
| __ cmp(r0, Operand(Factory::null_value()));
|
|
|
| - // The 'null' value is only equal to 'undefined' if using
|
| - // non-strict comparisons.
|
| + // The 'null' value is only equal to 'undefined' if using non-strict
|
| + // comparisons.
|
| if (op != Token::EQ_STRICT) {
|
| - __ b(eq, &exit);
|
| + __ b(eq, true_target());
|
| +
|
| __ cmp(r0, Operand(Factory::undefined_value()));
|
| + __ b(eq, true_target());
|
|
|
| - // NOTE: it can be undetectable object.
|
| - __ b(eq, &exit);
|
| __ tst(r0, Operand(kSmiTagMask));
|
| + __ b(eq, false_target());
|
|
|
| - __ b(ne, &undetectable);
|
| - __ b(false_target());
|
| -
|
| - __ bind(&undetectable);
|
| - __ ldr(r1, FieldMemOperand(r0, HeapObject::kMapOffset));
|
| - __ ldrb(r2, FieldMemOperand(r1, Map::kBitFieldOffset));
|
| - __ and_(r2, r2, Operand(1 << Map::kIsUndetectable));
|
| - __ cmp(r2, Operand(1 << Map::kIsUndetectable));
|
| + // It can be an undetectable object.
|
| + __ ldr(r0, FieldMemOperand(r0, HeapObject::kMapOffset));
|
| + __ ldrb(r0, FieldMemOperand(r0, Map::kBitFieldOffset));
|
| + __ and_(r0, r0, Operand(1 << Map::kIsUndetectable));
|
| + __ cmp(r0, Operand(1 << Map::kIsUndetectable));
|
| }
|
|
|
| - __ bind(&exit);
|
| -
|
| cc_reg_ = eq;
|
| return;
|
| }
|
| }
|
|
|
| -
|
| - // NOTE: To make typeof testing for natives implemented in
|
| - // JavaScript really efficient, we generate special code for
|
| - // expressions of the form: 'typeof <expression> == <string>'.
|
| -
|
| + // To make typeof testing for natives implemented in JavaScript really
|
| + // efficient, we generate special code for expressions of the form:
|
| + // 'typeof <expression> == <string>'.
|
| UnaryOperation* operation = left->AsUnaryOperation();
|
| if ((op == Token::EQ || op == Token::EQ_STRICT) &&
|
| (operation != NULL && operation->op() == Token::TYPEOF) &&
|
| @@ -3058,7 +3050,7 @@
|
|
|
| __ ldr(r1, FieldMemOperand(r1, HeapObject::kMapOffset));
|
|
|
| - // NOTE: it might be an undetectable string object
|
| + // It can be an undetectable string object.
|
| __ ldrb(r2, FieldMemOperand(r1, Map::kBitFieldOffset));
|
| __ and_(r2, r2, Operand(1 << Map::kIsUndetectable));
|
| __ cmp(r2, Operand(1 << Map::kIsUndetectable));
|
| @@ -3081,7 +3073,7 @@
|
| __ tst(r1, Operand(kSmiTagMask));
|
| __ b(eq, false_target());
|
|
|
| - // NOTE: it can be undetectable object.
|
| + // It can be an undetectable object.
|
| __ ldr(r1, FieldMemOperand(r1, HeapObject::kMapOffset));
|
| __ ldrb(r2, FieldMemOperand(r1, Map::kBitFieldOffset));
|
| __ and_(r2, r2, Operand(1 << Map::kIsUndetectable));
|
| @@ -3105,7 +3097,7 @@
|
| __ cmp(r1, Operand(Factory::null_value()));
|
| __ b(eq, true_target());
|
|
|
| - // NOTE: it might be an undetectable object.
|
| + // It can be an undetectable object.
|
| __ ldrb(r1, FieldMemOperand(r2, Map::kBitFieldOffset));
|
| __ and_(r1, r1, Operand(1 << Map::kIsUndetectable));
|
| __ cmp(r1, Operand(1 << Map::kIsUndetectable));
|
| @@ -3118,8 +3110,8 @@
|
| cc_reg_ = le;
|
|
|
| } else {
|
| - // Uncommon case: Typeof testing against a string literal that
|
| - // is never returned from the typeof operator.
|
| + // Uncommon case: typeof testing against a string literal that is
|
| + // never returned from the typeof operator.
|
| __ b(false_target());
|
| }
|
| return;
|
|
|