OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/parsing/parser.h" | 5 #include "src/parsing/parser.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/ast-expression-rewriter.h" | 9 #include "src/ast/ast-expression-rewriter.h" |
10 #include "src/ast/ast-expression-visitor.h" | 10 #include "src/ast/ast-expression-visitor.h" |
(...skipping 2639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2650 return_value = factory()->NewConditional( | 2650 return_value = factory()->NewConditional( |
2651 is_undefined, ThisExpression(scope_, factory(), pos), | 2651 is_undefined, ThisExpression(scope_, factory(), pos), |
2652 is_object_conditional, pos); | 2652 is_object_conditional, pos); |
2653 } else { | 2653 } else { |
2654 ReturnExprScope maybe_allow_tail_calls( | 2654 ReturnExprScope maybe_allow_tail_calls( |
2655 function_state_, ReturnExprContext::kInsideValidReturnStatement); | 2655 function_state_, ReturnExprContext::kInsideValidReturnStatement); |
2656 return_value = ParseExpression(true, CHECK_OK); | 2656 return_value = ParseExpression(true, CHECK_OK); |
2657 | 2657 |
2658 if (allow_tailcalls() && !is_sloppy(language_mode())) { | 2658 if (allow_tailcalls() && !is_sloppy(language_mode())) { |
2659 // ES6 14.6.1 Static Semantics: IsInTailPosition | 2659 // ES6 14.6.1 Static Semantics: IsInTailPosition |
2660 Scanner::Location loc(pos, pos + 1); | 2660 function_state_->AddImplicitTailCallExpression(return_value); |
2661 function_state_->AddExpressionInTailPosition(return_value, loc); | |
2662 } | 2661 } |
2663 } | 2662 } |
2664 } | 2663 } |
2665 ExpectSemicolon(CHECK_OK); | 2664 ExpectSemicolon(CHECK_OK); |
2666 | 2665 |
2667 if (is_generator()) { | 2666 if (is_generator()) { |
2668 return_value = BuildIteratorResult(return_value, true); | 2667 return_value = BuildIteratorResult(return_value, true); |
2669 } | 2668 } |
2670 | 2669 |
2671 result = factory()->NewReturnStatement(return_value, loc.beg_pos); | 2670 result = factory()->NewReturnStatement(return_value, loc.beg_pos); |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2982 // to the list of return expressions. | 2981 // to the list of return expressions. |
2983 function_state_->tail_call_expressions().Append( | 2982 function_state_->tail_call_expressions().Append( |
2984 tail_call_expressions_in_catch_block); | 2983 tail_call_expressions_in_catch_block); |
2985 | 2984 |
2986 DCHECK(finally_block == NULL); | 2985 DCHECK(finally_block == NULL); |
2987 DCHECK(catch_scope != NULL && catch_variable != NULL); | 2986 DCHECK(catch_scope != NULL && catch_variable != NULL); |
2988 result = factory()->NewTryCatchStatement(try_block, catch_scope, | 2987 result = factory()->NewTryCatchStatement(try_block, catch_scope, |
2989 catch_variable, catch_block, pos); | 2988 catch_variable, catch_block, pos); |
2990 } else { | 2989 } else { |
2991 if (FLAG_harmony_explicit_tailcalls && | 2990 if (FLAG_harmony_explicit_tailcalls && |
2992 !tail_call_expressions_in_catch_block.is_empty()) { | 2991 tail_call_expressions_in_catch_block.has_explicit_tail_calls()) { |
2993 // TODO(ishell): update chapter number. | 2992 // TODO(ishell): update chapter number. |
2994 // ES8 XX.YY.ZZ | 2993 // ES8 XX.YY.ZZ |
2995 ReportMessageAt(tail_call_expressions_in_catch_block.location(), | 2994 ReportMessageAt(tail_call_expressions_in_catch_block.location(), |
2996 MessageTemplate::kUnexpectedTailCallInCatchBlock); | 2995 MessageTemplate::kUnexpectedTailCallInCatchBlock); |
2997 *ok = false; | 2996 *ok = false; |
2998 return NULL; | 2997 return NULL; |
2999 } | 2998 } |
3000 DCHECK(finally_block != NULL); | 2999 DCHECK(finally_block != NULL); |
3001 result = factory()->NewTryFinallyStatement(try_block, finally_block, pos); | 3000 result = factory()->NewTryFinallyStatement(try_block, finally_block, pos); |
3002 } | 3001 } |
(...skipping 3814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6817 try_block, target); | 6816 try_block, target); |
6818 final_loop = target; | 6817 final_loop = target; |
6819 } | 6818 } |
6820 | 6819 |
6821 return final_loop; | 6820 return final_loop; |
6822 } | 6821 } |
6823 | 6822 |
6824 | 6823 |
6825 } // namespace internal | 6824 } // namespace internal |
6826 } // namespace v8 | 6825 } // namespace v8 |
OLD | NEW |