OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 CaseClause* clause = clauses->at(i); | 581 CaseClause* clause = clauses->at(i); |
582 compare_switch.BeginCase(i); | 582 compare_switch.BeginCase(i); |
583 VisitStatements(clause->statements()); | 583 VisitStatements(clause->statements()); |
584 compare_switch.EndCase(); | 584 compare_switch.EndCase(); |
585 } | 585 } |
586 | 586 |
587 compare_switch.EndSwitch(); | 587 compare_switch.EndSwitch(); |
588 } | 588 } |
589 | 589 |
590 | 590 |
591 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( | |
592 IterationStatement* stmt) { | |
593 if (loop_assignment_analysis_ == NULL) return NULL; | |
594 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); | |
595 } | |
596 | |
597 | |
598 void AstGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { | 591 void AstGraphBuilder::VisitDoWhileStatement(DoWhileStatement* stmt) { |
599 LoopBuilder while_loop(this); | 592 LoopBuilder while_loop(this); |
600 while_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); | 593 while_loop.BeginLoop(GetVariablesAssignedInLoop(stmt)); |
601 VisitIterationBody(stmt, &while_loop, 0); | 594 VisitIterationBody(stmt, &while_loop, 0); |
602 while_loop.EndBody(); | 595 while_loop.EndBody(); |
603 VisitForTest(stmt->cond()); | 596 VisitForTest(stmt->cond()); |
604 Node* condition = environment()->Pop(); | 597 Node* condition = environment()->Pop(); |
605 while_loop.BreakUnless(condition); | 598 while_loop.BreakUnless(condition); |
606 while_loop.EndLoop(); | 599 while_loop.EndLoop(); |
607 } | 600 } |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 // code. We also have a stack overflow if the recursive compilation did. | 812 // code. We also have a stack overflow if the recursive compilation did. |
820 Handle<SharedFunctionInfo> shared_info = | 813 Handle<SharedFunctionInfo> shared_info = |
821 SearchSharedFunctionInfo(info()->shared_info()->code(), expr); | 814 SearchSharedFunctionInfo(info()->shared_info()->code(), expr); |
822 if (shared_info.is_null()) { | 815 if (shared_info.is_null()) { |
823 shared_info = Compiler::BuildFunctionInfo(expr, info()->script(), info()); | 816 shared_info = Compiler::BuildFunctionInfo(expr, info()->script(), info()); |
824 CHECK(!shared_info.is_null()); // TODO(mstarzinger): Set stack overflow? | 817 CHECK(!shared_info.is_null()); // TODO(mstarzinger): Set stack overflow? |
825 } | 818 } |
826 | 819 |
827 // Create node to instantiate a new closure. | 820 // Create node to instantiate a new closure. |
828 Node* info = jsgraph()->Constant(shared_info); | 821 Node* info = jsgraph()->Constant(shared_info); |
829 Node* pretenure = expr->pretenure() ? jsgraph()->TrueConstant() | 822 Node* pretenure = jsgraph()->BooleanConstant(expr->pretenure()); |
830 : jsgraph()->FalseConstant(); | |
831 const Operator* op = javascript()->CallRuntime(Runtime::kNewClosure, 3); | 823 const Operator* op = javascript()->CallRuntime(Runtime::kNewClosure, 3); |
832 Node* value = NewNode(op, context, info, pretenure); | 824 Node* value = NewNode(op, context, info, pretenure); |
833 ast_context()->ProduceValue(value); | 825 ast_context()->ProduceValue(value); |
834 } | 826 } |
835 | 827 |
836 | 828 |
837 void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) { | 829 void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) { |
838 UNREACHABLE(); | 830 UNREACHABLE(); |
839 } | 831 } |
840 | 832 |
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1926 Node* name = jsgraph()->Constant(variable->name()); | 1918 Node* name = jsgraph()->Constant(variable->name()); |
1927 const Operator* op = javascript()->DeleteProperty(strict_mode()); | 1919 const Operator* op = javascript()->DeleteProperty(strict_mode()); |
1928 Node* result = NewNode(op, global, name); | 1920 Node* result = NewNode(op, global, name); |
1929 PrepareFrameState(result, bailout_id, state_combine); | 1921 PrepareFrameState(result, bailout_id, state_combine); |
1930 return result; | 1922 return result; |
1931 } | 1923 } |
1932 case Variable::PARAMETER: | 1924 case Variable::PARAMETER: |
1933 case Variable::LOCAL: | 1925 case Variable::LOCAL: |
1934 case Variable::CONTEXT: | 1926 case Variable::CONTEXT: |
1935 // Local var, const, or let variable or context variable. | 1927 // Local var, const, or let variable or context variable. |
1936 return variable->is_this() ? jsgraph()->TrueConstant() | 1928 return jsgraph()->BooleanConstant(variable->is_this()); |
1937 : jsgraph()->FalseConstant(); | |
1938 case Variable::LOOKUP: { | 1929 case Variable::LOOKUP: { |
1939 // Dynamic lookup of context variable (anywhere in the chain). | 1930 // Dynamic lookup of context variable (anywhere in the chain). |
1940 Node* name = jsgraph()->Constant(variable->name()); | 1931 Node* name = jsgraph()->Constant(variable->name()); |
1941 const Operator* op = | 1932 const Operator* op = |
1942 javascript()->CallRuntime(Runtime::kDeleteLookupSlot, 2); | 1933 javascript()->CallRuntime(Runtime::kDeleteLookupSlot, 2); |
1943 Node* result = NewNode(op, current_context(), name); | 1934 Node* result = NewNode(op, current_context(), name); |
1944 PrepareFrameState(result, bailout_id, state_combine); | 1935 PrepareFrameState(result, bailout_id, state_combine); |
1945 return result; | 1936 return result; |
1946 } | 1937 } |
1947 } | 1938 } |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2165 void AstGraphBuilder::PrepareFrameState(Node* node, BailoutId ast_id, | 2156 void AstGraphBuilder::PrepareFrameState(Node* node, BailoutId ast_id, |
2166 OutputFrameStateCombine combine) { | 2157 OutputFrameStateCombine combine) { |
2167 if (OperatorProperties::HasFrameStateInput(node->op())) { | 2158 if (OperatorProperties::HasFrameStateInput(node->op())) { |
2168 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == | 2159 DCHECK(NodeProperties::GetFrameStateInput(node)->opcode() == |
2169 IrOpcode::kDead); | 2160 IrOpcode::kDead); |
2170 NodeProperties::ReplaceFrameStateInput( | 2161 NodeProperties::ReplaceFrameStateInput( |
2171 node, environment()->Checkpoint(ast_id, combine)); | 2162 node, environment()->Checkpoint(ast_id, combine)); |
2172 } | 2163 } |
2173 } | 2164 } |
2174 | 2165 |
| 2166 |
| 2167 BitVector* AstGraphBuilder::GetVariablesAssignedInLoop( |
| 2168 IterationStatement* stmt) { |
| 2169 if (loop_assignment_analysis_ == NULL) return NULL; |
| 2170 return loop_assignment_analysis_->GetVariablesAssignedInLoop(stmt); |
2175 } | 2171 } |
2176 } | 2172 |
2177 } // namespace v8::internal::compiler | 2173 } // namespace compiler |
| 2174 } // namespace internal |
| 2175 } // namespace v8 |
OLD | NEW |