| Index: src/ia32/full-codegen-ia32.cc
|
| diff --git a/src/ia32/full-codegen-ia32.cc b/src/ia32/full-codegen-ia32.cc
|
| index 02fa2c29fbc23bcfce0bcef48459928b0646c827..f3edad3c0505b516cf8d36fa243d499d86707252 100644
|
| --- a/src/ia32/full-codegen-ia32.cc
|
| +++ b/src/ia32/full-codegen-ia32.cc
|
| @@ -3930,25 +3930,13 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
| }
|
|
|
|
|
| -bool FullCodeGenerator::TryLiteralCompare(Token::Value op,
|
| - Expression* left,
|
| - Expression* right,
|
| - Label* if_true,
|
| - Label* if_false,
|
| - Label* fall_through) {
|
| - if (op != Token::EQ && op != Token::EQ_STRICT) return false;
|
| -
|
| - // Check for the pattern: typeof <expression> == <string literal>.
|
| - Literal* right_literal = right->AsLiteral();
|
| - if (right_literal == NULL) return false;
|
| - Handle<Object> right_literal_value = right_literal->handle();
|
| - if (!right_literal_value->IsString()) return false;
|
| - UnaryOperation* left_unary = left->AsUnaryOperation();
|
| - if (left_unary == NULL || left_unary->op() != Token::TYPEOF) return false;
|
| - Handle<String> check = Handle<String>::cast(right_literal_value);
|
| -
|
| +void FullCodeGenerator::EmitLiteralCompareTypeof(Expression* expr,
|
| + Handle<String> check,
|
| + Label* if_true,
|
| + Label* if_false,
|
| + Label* fall_through) {
|
| { AccumulatorValueContext context(this);
|
| - VisitForTypeofValue(left_unary->expression());
|
| + VisitForTypeofValue(expr);
|
| }
|
| PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
|
|
|
| @@ -3998,8 +3986,18 @@ bool FullCodeGenerator::TryLiteralCompare(Token::Value op,
|
| } else {
|
| if (if_false != fall_through) __ jmp(if_false);
|
| }
|
| +}
|
| +
|
| +
|
| +void FullCodeGenerator::EmitLiteralCompareUndefined(Expression* expr,
|
| + Label* if_true,
|
| + Label* if_false,
|
| + Label* fall_through) {
|
| + VisitForAccumulatorValue(expr);
|
| + PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
|
|
|
| - return true;
|
| + __ cmp(eax, isolate()->factory()->undefined_value());
|
| + Split(equal, if_true, if_false, fall_through);
|
| }
|
|
|
|
|
| @@ -4019,14 +4017,12 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
|
|
| // First we try a fast inlined version of the compare when one of
|
| // the operands is a literal.
|
| - Token::Value op = expr->op();
|
| - Expression* left = expr->left();
|
| - Expression* right = expr->right();
|
| - if (TryLiteralCompare(op, left, right, if_true, if_false, fall_through)) {
|
| + if (TryLiteralCompare(expr, if_true, if_false, fall_through)) {
|
| context()->Plug(if_true, if_false);
|
| return;
|
| }
|
|
|
| + Token::Value op = expr->op();
|
| VisitForStackValue(expr->left());
|
| switch (expr->op()) {
|
| case Token::IN:
|
|
|