Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 5484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5495 | 5495 |
| 5496 Representation HGraphBuilder::ToRepresentation(TypeInfo info) { | 5496 Representation HGraphBuilder::ToRepresentation(TypeInfo info) { |
| 5497 if (info.IsSmi()) return Representation::Integer32(); | 5497 if (info.IsSmi()) return Representation::Integer32(); |
| 5498 if (info.IsInteger32()) return Representation::Integer32(); | 5498 if (info.IsInteger32()) return Representation::Integer32(); |
| 5499 if (info.IsDouble()) return Representation::Double(); | 5499 if (info.IsDouble()) return Representation::Double(); |
| 5500 if (info.IsNumber()) return Representation::Double(); | 5500 if (info.IsNumber()) return Representation::Double(); |
| 5501 return Representation::Tagged(); | 5501 return Representation::Tagged(); |
| 5502 } | 5502 } |
| 5503 | 5503 |
| 5504 | 5504 |
| 5505 void HGraphBuilder::HandleLiteralCompareTypeof(CompareOperation* compare_expr, | |
| 5506 Expression* expr, | |
| 5507 Handle<String> check) { | |
| 5508 CHECK_ALIVE(VisitForTypeOf(expr)); | |
| 5509 HValue* expr_value = Pop(); | |
| 5510 HInstruction* instr = new(zone()) HTypeofIs(expr_value, check); | |
| 5511 instr->set_position(compare_expr->position()); | |
| 5512 ast_context()->ReturnInstruction(instr, compare_expr->id()); | |
| 5513 } | |
| 5514 | |
| 5515 | |
| 5516 void HGraphBuilder::HandleLiteralCompareUndefined( | |
| 5517 CompareOperation* compare_expr, Expression* expr) { | |
| 5518 CHECK_ALIVE(VisitForValue(expr)); | |
| 5519 HValue* lhs = Pop(); | |
| 5520 HValue* rhs = graph()->GetConstantUndefined(); | |
| 5521 HInstruction* instr = | |
| 5522 new(zone()) HCompareSymbolEq(lhs, rhs, Token::EQ_STRICT); | |
| 5523 instr->set_position(compare_expr->position()); | |
| 5524 ast_context()->ReturnInstruction(instr, compare_expr->id()); | |
| 5525 } | |
| 5526 | |
| 5527 | |
| 5505 void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { | 5528 void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
| 5506 ASSERT(!HasStackOverflow()); | 5529 ASSERT(!HasStackOverflow()); |
| 5507 ASSERT(current_block() != NULL); | 5530 ASSERT(current_block() != NULL); |
| 5508 ASSERT(current_block()->HasPredecessor()); | 5531 ASSERT(current_block()->HasPredecessor()); |
| 5509 if (IsClassOfTest(expr)) { | 5532 if (IsClassOfTest(expr)) { |
| 5510 CallRuntime* call = expr->left()->AsCallRuntime(); | 5533 CallRuntime* call = expr->left()->AsCallRuntime(); |
| 5511 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 5534 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 5512 HValue* value = Pop(); | 5535 HValue* value = Pop(); |
| 5513 Literal* literal = expr->right()->AsLiteral(); | 5536 Literal* literal = expr->right()->AsLiteral(); |
| 5514 Handle<String> rhs = Handle<String>::cast(literal->handle()); | 5537 Handle<String> rhs = Handle<String>::cast(literal->handle()); |
| 5515 HInstruction* instr = new(zone()) HClassOfTest(value, rhs); | 5538 HInstruction* instr = new(zone()) HClassOfTest(value, rhs); |
| 5516 instr->set_position(expr->position()); | 5539 instr->set_position(expr->position()); |
| 5517 ast_context()->ReturnInstruction(instr, expr->id()); | 5540 ast_context()->ReturnInstruction(instr, expr->id()); |
| 5518 return; | 5541 return; |
| 5519 } | 5542 } |
| 5520 | 5543 |
| 5521 // Check for the pattern: typeof <expression> == <string literal>. | 5544 if (expr->op() == Token::EQ || expr->op() == Token::EQ_STRICT) { |
| 5522 UnaryOperation* left_unary = expr->left()->AsUnaryOperation(); | 5545 UnaryOperation* left_unary = expr->left()->AsUnaryOperation(); |
| 5523 Literal* right_literal = expr->right()->AsLiteral(); | 5546 UnaryOperation* right_unary = expr->right()->AsUnaryOperation(); |
| 5524 if ((expr->op() == Token::EQ || expr->op() == Token::EQ_STRICT) && | 5547 Literal* left_literal = expr->left()->AsLiteral(); |
| 5525 left_unary != NULL && left_unary->op() == Token::TYPEOF && | 5548 Literal* right_literal = expr->right()->AsLiteral(); |
| 5526 right_literal != NULL && right_literal->handle()->IsString()) { | 5549 |
| 5527 CHECK_ALIVE(VisitForTypeOf(left_unary->expression())); | 5550 // Check for the pattern: typeof <expression> == <string literal>. |
|
fschneider
2011/06/21 11:36:08
Since this pattern matching code is exactly the sa
Steven
2011/06/22 10:00:53
Done.
| |
| 5528 HValue* left = Pop(); | 5551 if (left_unary != NULL && left_unary->op() == Token::TYPEOF && |
| 5529 HInstruction* instr = new(zone()) HTypeofIs(left, | 5552 right_literal != NULL && right_literal->handle()->IsString()) { |
| 5530 Handle<String>::cast(right_literal->handle())); | 5553 HandleLiteralCompareTypeof( |
| 5531 instr->set_position(expr->position()); | 5554 expr, left_unary->expression(), |
| 5532 ast_context()->ReturnInstruction(instr, expr->id()); | 5555 Handle<String>::cast(right_literal->handle())); |
| 5533 return; | 5556 return; |
| 5557 } | |
| 5558 | |
| 5559 // Check for the pattern: <string literal> == typeof <expression>. | |
| 5560 if (right_unary != NULL && right_unary->op() == Token::TYPEOF && | |
| 5561 left_literal != NULL && left_literal->handle()->IsString()) { | |
| 5562 HandleLiteralCompareTypeof( | |
| 5563 expr, right_unary->expression(), | |
| 5564 Handle<String>::cast(left_literal->handle())); | |
| 5565 return; | |
| 5566 } | |
| 5567 | |
| 5568 // Check for the pattern: <expression> === void <literal>. | |
| 5569 if (expr->op() == Token::EQ_STRICT && right_unary != NULL && | |
| 5570 right_unary->op() == Token::VOID && | |
| 5571 right_unary->expression()->AsLiteral() != NULL) { | |
| 5572 HandleLiteralCompareUndefined(expr, expr->left()); | |
| 5573 return; | |
| 5574 } | |
| 5575 | |
| 5576 // Check for the pattern: void <literal> === <expression>. | |
| 5577 if (expr->op() == Token::EQ_STRICT && left_unary != NULL && | |
| 5578 left_unary->op() == Token::VOID && | |
| 5579 left_unary->expression()->AsLiteral() != NULL) { | |
| 5580 HandleLiteralCompareUndefined(expr, expr->right()); | |
| 5581 return; | |
| 5582 } | |
| 5534 } | 5583 } |
| 5535 | 5584 |
| 5536 TypeInfo type_info = oracle()->CompareType(expr); | 5585 TypeInfo type_info = oracle()->CompareType(expr); |
| 5537 // Check if this expression was ever executed according to type feedback. | 5586 // Check if this expression was ever executed according to type feedback. |
| 5538 if (type_info.IsUninitialized()) { | 5587 if (type_info.IsUninitialized()) { |
| 5539 AddInstruction(new(zone()) HSoftDeoptimize); | 5588 AddInstruction(new(zone()) HSoftDeoptimize); |
| 5540 current_block()->MarkAsDeoptimizing(); | 5589 current_block()->MarkAsDeoptimizing(); |
| 5541 type_info = TypeInfo::Unknown(); | 5590 type_info = TypeInfo::Unknown(); |
| 5542 } | 5591 } |
| 5543 | 5592 |
| (...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6574 } | 6623 } |
| 6575 } | 6624 } |
| 6576 | 6625 |
| 6577 #ifdef DEBUG | 6626 #ifdef DEBUG |
| 6578 if (graph_ != NULL) graph_->Verify(); | 6627 if (graph_ != NULL) graph_->Verify(); |
| 6579 if (allocator_ != NULL) allocator_->Verify(); | 6628 if (allocator_ != NULL) allocator_->Verify(); |
| 6580 #endif | 6629 #endif |
| 6581 } | 6630 } |
| 6582 | 6631 |
| 6583 } } // namespace v8::internal | 6632 } } // namespace v8::internal |
| OLD | NEW |