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/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 1852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1863 void AstGraphBuilder::VisitYield(Yield* expr) { | 1863 void AstGraphBuilder::VisitYield(Yield* expr) { |
1864 // TODO(turbofan): Implement yield here. | 1864 // TODO(turbofan): Implement yield here. |
1865 SetStackOverflow(); | 1865 SetStackOverflow(); |
1866 ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); | 1866 ast_context()->ProduceValue(jsgraph()->UndefinedConstant()); |
1867 } | 1867 } |
1868 | 1868 |
1869 | 1869 |
1870 void AstGraphBuilder::VisitThrow(Throw* expr) { | 1870 void AstGraphBuilder::VisitThrow(Throw* expr) { |
1871 VisitForValue(expr->exception()); | 1871 VisitForValue(expr->exception()); |
1872 Node* exception = environment()->Pop(); | 1872 Node* exception = environment()->Pop(); |
1873 if (FLAG_turbo_exceptions) { | 1873 Node* value = BuildThrowError(exception, expr->id()); |
1874 execution_control()->ThrowValue(exception); | 1874 ast_context()->ProduceValue(value); |
1875 ast_context()->ProduceValue(exception); | |
1876 } else { | |
1877 // TODO(mstarzinger): Temporary workaround for bailout-id for debugger. | |
1878 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); | |
1879 Node* value = NewNode(op, exception); | |
1880 PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine()); | |
1881 ast_context()->ProduceValue(value); | |
1882 } | |
1883 } | 1875 } |
1884 | 1876 |
1885 | 1877 |
1886 void AstGraphBuilder::VisitProperty(Property* expr) { | 1878 void AstGraphBuilder::VisitProperty(Property* expr) { |
1887 Node* value; | 1879 Node* value; |
1888 VectorSlotPair pair = CreateVectorSlotPair(expr->PropertyFeedbackSlot()); | 1880 VectorSlotPair pair = CreateVectorSlotPair(expr->PropertyFeedbackSlot()); |
1889 if (expr->key()->IsPropertyName()) { | 1881 if (expr->key()->IsPropertyName()) { |
1890 VisitForValue(expr->obj()); | 1882 VisitForValue(expr->obj()); |
1891 Node* object = environment()->Pop(); | 1883 Node* object = environment()->Pop(); |
1892 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName()); | 1884 Unique<Name> name = MakeUnique(expr->key()->AsLiteral()->AsPropertyName()); |
(...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2842 Expression* expr) { | 2834 Expression* expr) { |
2843 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; | 2835 if (!FunctionLiteral::NeedsHomeObject(expr)) return value; |
2844 Unique<Name> name = MakeUnique(isolate()->factory()->home_object_symbol()); | 2836 Unique<Name> name = MakeUnique(isolate()->factory()->home_object_symbol()); |
2845 const Operator* op = javascript()->StoreNamed(language_mode(), name); | 2837 const Operator* op = javascript()->StoreNamed(language_mode(), name); |
2846 Node* store = NewNode(op, value, home_object); | 2838 Node* store = NewNode(op, value, home_object); |
2847 PrepareFrameState(store, BailoutId::None()); | 2839 PrepareFrameState(store, BailoutId::None()); |
2848 return store; | 2840 return store; |
2849 } | 2841 } |
2850 | 2842 |
2851 | 2843 |
| 2844 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { |
| 2845 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); |
| 2846 Node* call = NewNode(op, exception); |
| 2847 PrepareFrameState(call, bailout_id); |
| 2848 return call; |
| 2849 } |
| 2850 |
| 2851 |
2852 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, | 2852 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, |
2853 BailoutId bailout_id) { | 2853 BailoutId bailout_id) { |
2854 // TODO(mstarzinger): Should be unified with the VisitThrow implementation. | |
2855 Node* variable_name = jsgraph()->Constant(variable->name()); | 2854 Node* variable_name = jsgraph()->Constant(variable->name()); |
2856 const Operator* op = | 2855 const Operator* op = |
2857 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1); | 2856 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1); |
2858 Node* call = NewNode(op, variable_name); | 2857 Node* call = NewNode(op, variable_name); |
2859 PrepareFrameState(call, bailout_id); | 2858 PrepareFrameState(call, bailout_id); |
2860 return call; | 2859 return call; |
2861 } | 2860 } |
2862 | 2861 |
2863 | 2862 |
2864 Node* AstGraphBuilder::BuildThrowConstAssignError(BailoutId bailout_id) { | 2863 Node* AstGraphBuilder::BuildThrowConstAssignError(BailoutId bailout_id) { |
2865 // TODO(mstarzinger): Should be unified with the VisitThrow implementation. | |
2866 const Operator* op = | 2864 const Operator* op = |
2867 javascript()->CallRuntime(Runtime::kThrowConstAssignError, 0); | 2865 javascript()->CallRuntime(Runtime::kThrowConstAssignError, 0); |
2868 Node* call = NewNode(op); | 2866 Node* call = NewNode(op); |
2869 PrepareFrameState(call, bailout_id); | 2867 PrepareFrameState(call, bailout_id); |
2870 return call; | 2868 return call; |
2871 } | 2869 } |
2872 | 2870 |
2873 | 2871 |
2874 Node* AstGraphBuilder::BuildReturn(Node* return_value) { | 2872 Node* AstGraphBuilder::BuildReturn(Node* return_value) { |
2875 Node* control = NewNode(common()->Return(), return_value); | 2873 Node* control = NewNode(common()->Return(), return_value); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3250 // Phi does not exist yet, introduce one. | 3248 // Phi does not exist yet, introduce one. |
3251 value = NewPhi(inputs, value, control); | 3249 value = NewPhi(inputs, value, control); |
3252 value->ReplaceInput(inputs - 1, other); | 3250 value->ReplaceInput(inputs - 1, other); |
3253 } | 3251 } |
3254 return value; | 3252 return value; |
3255 } | 3253 } |
3256 | 3254 |
3257 } // namespace compiler | 3255 } // namespace compiler |
3258 } // namespace internal | 3256 } // namespace internal |
3259 } // namespace v8 | 3257 } // namespace v8 |
OLD | NEW |