OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2762 entry_(NULL), | 2762 entry_(NULL), |
2763 arguments_elements_(NULL), | 2763 arguments_elements_(NULL), |
2764 outer_(owner->function_state()) { | 2764 outer_(owner->function_state()) { |
2765 if (outer_ != NULL) { | 2765 if (outer_ != NULL) { |
2766 // State for an inline function. | 2766 // State for an inline function. |
2767 if (owner->ast_context()->IsTest()) { | 2767 if (owner->ast_context()->IsTest()) { |
2768 HBasicBlock* if_true = owner->graph()->CreateBasicBlock(); | 2768 HBasicBlock* if_true = owner->graph()->CreateBasicBlock(); |
2769 HBasicBlock* if_false = owner->graph()->CreateBasicBlock(); | 2769 HBasicBlock* if_false = owner->graph()->CreateBasicBlock(); |
2770 if_true->MarkAsInlineReturnTarget(); | 2770 if_true->MarkAsInlineReturnTarget(); |
2771 if_false->MarkAsInlineReturnTarget(); | 2771 if_false->MarkAsInlineReturnTarget(); |
2772 Expression* cond = TestContext::cast(owner->ast_context())->condition(); | 2772 TestContext* outer_test_context = TestContext::cast(owner->ast_context()); |
| 2773 Expression* cond = outer_test_context->condition(); |
| 2774 TypeFeedbackOracle* outer_oracle = outer_test_context->oracle(); |
2773 // The AstContext constructor pushed on the context stack. This newed | 2775 // The AstContext constructor pushed on the context stack. This newed |
2774 // instance is the reason that AstContext can't be BASE_EMBEDDED. | 2776 // instance is the reason that AstContext can't be BASE_EMBEDDED. |
2775 test_context_ = new TestContext(owner, cond, if_true, if_false); | 2777 test_context_ = |
| 2778 new TestContext(owner, cond, outer_oracle, if_true, if_false); |
2776 } else { | 2779 } else { |
2777 function_return_ = owner->graph()->CreateBasicBlock(); | 2780 function_return_ = owner->graph()->CreateBasicBlock(); |
2778 function_return()->MarkAsInlineReturnTarget(); | 2781 function_return()->MarkAsInlineReturnTarget(); |
2779 } | 2782 } |
2780 // Set this after possibly allocating a new TestContext above. | 2783 // Set this after possibly allocating a new TestContext above. |
2781 call_context_ = owner->ast_context(); | 2784 call_context_ = owner->ast_context(); |
2782 } | 2785 } |
2783 | 2786 |
2784 // Push on the state stack. | 2787 // Push on the state stack. |
2785 owner->set_function_state(this); | 2788 owner->set_function_state(this); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2932 // connects a branch node to a join node. We conservatively ensure that | 2935 // connects a branch node to a join node. We conservatively ensure that |
2933 // property by always adding an empty block on the outgoing edges of this | 2936 // property by always adding an empty block on the outgoing edges of this |
2934 // branch. | 2937 // branch. |
2935 HGraphBuilder* builder = owner(); | 2938 HGraphBuilder* builder = owner(); |
2936 if (value != NULL && value->CheckFlag(HValue::kIsArguments)) { | 2939 if (value != NULL && value->CheckFlag(HValue::kIsArguments)) { |
2937 builder->Bailout("arguments object value in a test context"); | 2940 builder->Bailout("arguments object value in a test context"); |
2938 } | 2941 } |
2939 HBasicBlock* empty_true = builder->graph()->CreateBasicBlock(); | 2942 HBasicBlock* empty_true = builder->graph()->CreateBasicBlock(); |
2940 HBasicBlock* empty_false = builder->graph()->CreateBasicBlock(); | 2943 HBasicBlock* empty_false = builder->graph()->CreateBasicBlock(); |
2941 TypeFeedbackId test_id = condition()->test_id(); | 2944 TypeFeedbackId test_id = condition()->test_id(); |
2942 ToBooleanStub::Types expected(builder->oracle()->ToBooleanTypes(test_id)); | 2945 ToBooleanStub::Types expected(oracle()->ToBooleanTypes(test_id)); |
2943 HBranch* test = new(zone()) HBranch(value, empty_true, empty_false, expected); | 2946 HBranch* test = new(zone()) HBranch(value, empty_true, empty_false, expected); |
2944 builder->current_block()->Finish(test); | 2947 builder->current_block()->Finish(test); |
2945 | 2948 |
2946 empty_true->Goto(if_true(), owner()->function_state()); | 2949 empty_true->Goto(if_true(), owner()->function_state()); |
2947 empty_false->Goto(if_false(), owner()->function_state()); | 2950 empty_false->Goto(if_false(), owner()->function_state()); |
2948 builder->set_current_block(NULL); | 2951 builder->set_current_block(NULL); |
2949 } | 2952 } |
2950 | 2953 |
2951 | 2954 |
2952 // HGraphBuilder infrastructure for bailing out and checking bailouts. | 2955 // HGraphBuilder infrastructure for bailing out and checking bailouts. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2990 ValueContext for_value(this, ARGUMENTS_NOT_ALLOWED); | 2993 ValueContext for_value(this, ARGUMENTS_NOT_ALLOWED); |
2991 for_value.set_for_typeof(true); | 2994 for_value.set_for_typeof(true); |
2992 Visit(expr); | 2995 Visit(expr); |
2993 } | 2996 } |
2994 | 2997 |
2995 | 2998 |
2996 | 2999 |
2997 void HGraphBuilder::VisitForControl(Expression* expr, | 3000 void HGraphBuilder::VisitForControl(Expression* expr, |
2998 HBasicBlock* true_block, | 3001 HBasicBlock* true_block, |
2999 HBasicBlock* false_block) { | 3002 HBasicBlock* false_block) { |
3000 TestContext for_test(this, expr, true_block, false_block); | 3003 TestContext for_test(this, expr, oracle(), true_block, false_block); |
3001 Visit(expr); | 3004 Visit(expr); |
3002 } | 3005 } |
3003 | 3006 |
3004 | 3007 |
3005 void HGraphBuilder::VisitArgument(Expression* expr) { | 3008 void HGraphBuilder::VisitArgument(Expression* expr) { |
3006 CHECK_ALIVE(VisitForValue(expr)); | 3009 CHECK_ALIVE(VisitForValue(expr)); |
3007 Push(AddInstruction(new(zone()) HPushArgument(Pop()))); | 3010 Push(AddInstruction(new(zone()) HPushArgument(Pop()))); |
3008 } | 3011 } |
3009 | 3012 |
3010 | 3013 |
(...skipping 6612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9623 } | 9626 } |
9624 } | 9627 } |
9625 | 9628 |
9626 #ifdef DEBUG | 9629 #ifdef DEBUG |
9627 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 9630 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
9628 if (allocator_ != NULL) allocator_->Verify(); | 9631 if (allocator_ != NULL) allocator_->Verify(); |
9629 #endif | 9632 #endif |
9630 } | 9633 } |
9631 | 9634 |
9632 } } // namespace v8::internal | 9635 } } // namespace v8::internal |
OLD | NEW |