Chromium Code Reviews| Index: src/full-codegen.cc |
| diff --git a/src/full-codegen.cc b/src/full-codegen.cc |
| index 9353ab515617006609013744cb2035b04d38eae1..6cfe4ceb3354bc18440690545ace4e920f51f45f 100644 |
| --- a/src/full-codegen.cc |
| +++ b/src/full-codegen.cc |
| @@ -1290,6 +1290,58 @@ int FullCodeGenerator::TryCatch::Exit(int stack_depth) { |
| } |
| +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; |
| + |
| + UnaryOperation* left_unary = left->AsUnaryOperation(); |
| + UnaryOperation* right_unary = right->AsUnaryOperation(); |
| + Literal* left_literal = left->AsLiteral(); |
| + Literal* right_literal = right->AsLiteral(); |
| + |
| + // Check for the pattern: typeof <expression> == <string literal>. |
| + if (left_unary != NULL && left_unary->op() == Token::TYPEOF && |
| + right_literal != NULL && right_literal->handle()->IsString()) { |
| + EmitLiteralCompareTypeof(left_unary->expression(), |
| + Handle<String>::cast(right_literal->handle()), |
| + if_true, if_false, fall_through); |
| + return true; |
| + } |
| + |
| + // Check for the pattern: <string literal> == typeof <expression>. |
| + if (right_unary != NULL && right_unary->op() == Token::TYPEOF && |
| + left_literal != NULL && left_literal->handle()->IsString()) { |
| + EmitLiteralCompareTypeof(right_unary->expression(), |
| + Handle<String>::cast(left_literal->handle()), |
| + if_true, if_false, fall_through); |
| + return true; |
| + } |
| + |
|
fschneider
2011/06/21 11:36:08
Remove extra line.
Steven
2011/06/22 10:00:53
Done.
|
| + |
| + if (op != Token::EQ_STRICT) return false; |
| + |
| + // Check for the pattern: <expression> === void <literal>. |
| + if (right_unary != NULL && right_unary->op() == Token::VOID && |
| + right_unary->expression()->AsLiteral() != NULL) { |
| + EmitLiteralCompareUndefined(left, if_true, if_false, fall_through); |
| + return true; |
| + } |
| + |
| + // Check for the pattern: void <literal> === <expression>. |
| + if (left_unary != NULL && left_unary->op() == Token::VOID && |
| + left_unary->expression()->AsLiteral() != NULL) { |
| + EmitLiteralCompareUndefined(right, if_true, if_false, fall_through); |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| + |
| #undef __ |