| 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 3809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3820 Handle<FixedArray> value) { | 3820 Handle<FixedArray> value) { |
| 3821 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); | 3821 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot)); |
| 3822 return static_cast<LiteralType>(literal_type->value()); | 3822 return static_cast<LiteralType>(literal_type->value()); |
| 3823 } | 3823 } |
| 3824 | 3824 |
| 3825 | 3825 |
| 3826 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { | 3826 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { |
| 3827 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); | 3827 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); |
| 3828 } | 3828 } |
| 3829 | 3829 |
| 3830 | |
| 3831 void ParserTraits::ParseArrowFunctionFormalParameters( | 3830 void ParserTraits::ParseArrowFunctionFormalParameters( |
| 3832 ParserFormalParameters* parameters, Expression* expr, | 3831 ParserFormalParameters* parameters, Expression* expr, int end_pos, |
| 3833 const Scanner::Location& params_loc, bool* ok) { | 3832 bool* ok) { |
| 3834 if (parameters->Arity() >= Code::kMaxArguments) { | |
| 3835 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); | |
| 3836 *ok = false; | |
| 3837 return; | |
| 3838 } | |
| 3839 | |
| 3840 // ArrowFunctionFormals :: | 3833 // ArrowFunctionFormals :: |
| 3841 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) | 3834 // Binary(Token::COMMA, NonTailArrowFunctionFormals, Tail) |
| 3842 // Tail | 3835 // Tail |
| 3843 // NonTailArrowFunctionFormals :: | 3836 // NonTailArrowFunctionFormals :: |
| 3844 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) | 3837 // Binary(Token::COMMA, NonTailArrowFunctionFormals, VariableProxy) |
| 3845 // VariableProxy | 3838 // VariableProxy |
| 3846 // Tail :: | 3839 // Tail :: |
| 3847 // VariableProxy | 3840 // VariableProxy |
| 3848 // Spread(VariableProxy) | 3841 // Spread(VariableProxy) |
| 3849 // | 3842 // |
| 3850 // As we need to visit the parameters in left-to-right order, we recurse on | 3843 // As we need to visit the parameters in left-to-right order, we recurse on |
| 3851 // the left-hand side of comma expressions. | 3844 // the left-hand side of comma expressions. |
| 3852 // | 3845 // |
| 3853 if (expr->IsBinaryOperation()) { | 3846 if (expr->IsBinaryOperation()) { |
| 3854 BinaryOperation* binop = expr->AsBinaryOperation(); | 3847 BinaryOperation* binop = expr->AsBinaryOperation(); |
| 3855 // The classifier has already run, so we know that the expression is a valid | 3848 // The classifier has already run, so we know that the expression is a valid |
| 3856 // arrow function formals production. | 3849 // arrow function formals production. |
| 3857 DCHECK_EQ(binop->op(), Token::COMMA); | 3850 DCHECK_EQ(binop->op(), Token::COMMA); |
| 3858 Expression* left = binop->left(); | 3851 Expression* left = binop->left(); |
| 3859 Expression* right = binop->right(); | 3852 Expression* right = binop->right(); |
| 3860 ParseArrowFunctionFormalParameters(parameters, left, params_loc, ok); | 3853 int comma_pos = binop->position(); |
| 3854 ParseArrowFunctionFormalParameters(parameters, left, comma_pos, ok); |
| 3861 if (!*ok) return; | 3855 if (!*ok) return; |
| 3862 // LHS of comma expression should be unparenthesized. | 3856 // LHS of comma expression should be unparenthesized. |
| 3863 expr = right; | 3857 expr = right; |
| 3864 } | 3858 } |
| 3865 | 3859 |
| 3866 // Only the right-most expression may be a rest parameter. | 3860 // Only the right-most expression may be a rest parameter. |
| 3867 DCHECK(!parameters->has_rest); | 3861 DCHECK(!parameters->has_rest); |
| 3868 | 3862 |
| 3869 bool is_rest = expr->IsSpread(); | 3863 bool is_rest = expr->IsSpread(); |
| 3870 if (is_rest) { | 3864 if (is_rest) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3887 Assignment* assignment = expr->AsAssignment(); | 3881 Assignment* assignment = expr->AsAssignment(); |
| 3888 DCHECK(!assignment->is_compound()); | 3882 DCHECK(!assignment->is_compound()); |
| 3889 initializer = assignment->value(); | 3883 initializer = assignment->value(); |
| 3890 expr = assignment->target(); | 3884 expr = assignment->target(); |
| 3891 | 3885 |
| 3892 // TODO(adamk): Only call this if necessary. | 3886 // TODO(adamk): Only call this if necessary. |
| 3893 RewriteParameterInitializerScope(parser_->stack_limit(), initializer, | 3887 RewriteParameterInitializerScope(parser_->stack_limit(), initializer, |
| 3894 parser_->scope_, parameters->scope); | 3888 parser_->scope_, parameters->scope); |
| 3895 } | 3889 } |
| 3896 | 3890 |
| 3897 // TODO(adamk): params_loc.end_pos is not the correct initializer position, | 3891 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest); |
| 3898 // but it should be conservative enough to trigger hole checks for variables | |
| 3899 // referenced in the initializer (if any). | |
| 3900 AddFormalParameter(parameters, expr, initializer, params_loc.end_pos, | |
| 3901 is_rest); | |
| 3902 } | 3892 } |
| 3903 | 3893 |
| 3904 | 3894 |
| 3905 DoExpression* Parser::ParseDoExpression(bool* ok) { | 3895 DoExpression* Parser::ParseDoExpression(bool* ok) { |
| 3906 // AssignmentExpression :: | 3896 // AssignmentExpression :: |
| 3907 // do '{' StatementList '}' | 3897 // do '{' StatementList '}' |
| 3908 int pos = peek_position(); | 3898 int pos = peek_position(); |
| 3909 | 3899 |
| 3910 Expect(Token::DO, CHECK_OK); | 3900 Expect(Token::DO, CHECK_OK); |
| 3911 Variable* result = | 3901 Variable* result = |
| 3912 scope_->NewTemporary(ast_value_factory()->dot_result_string()); | 3902 scope_->NewTemporary(ast_value_factory()->dot_result_string()); |
| 3913 Block* block = ParseBlock(nullptr, false, CHECK_OK); | 3903 Block* block = ParseBlock(nullptr, false, CHECK_OK); |
| 3914 DoExpression* expr = factory()->NewDoExpression(block, result, pos); | 3904 DoExpression* expr = factory()->NewDoExpression(block, result, pos); |
| 3915 if (!Rewriter::Rewrite(this, expr, ast_value_factory())) { | 3905 if (!Rewriter::Rewrite(this, expr, ast_value_factory())) { |
| 3916 *ok = false; | 3906 *ok = false; |
| 3917 return nullptr; | 3907 return nullptr; |
| 3918 } | 3908 } |
| 3919 block->set_scope(block->scope()->FinalizeBlockScope()); | 3909 block->set_scope(block->scope()->FinalizeBlockScope()); |
| 3920 return expr; | 3910 return expr; |
| 3921 } | 3911 } |
| 3922 | 3912 |
| 3923 | 3913 |
| 3924 void ParserTraits::ParseArrowFunctionFormalParameterList( | 3914 void ParserTraits::ParseArrowFunctionFormalParameterList( |
| 3925 ParserFormalParameters* parameters, Expression* expr, | 3915 ParserFormalParameters* parameters, Expression* expr, |
| 3926 const Scanner::Location& params_loc, | 3916 const Scanner::Location& params_loc, |
| 3927 Scanner::Location* duplicate_loc, bool* ok) { | 3917 Scanner::Location* duplicate_loc, bool* ok) { |
| 3928 if (expr->IsEmptyParentheses()) return; | 3918 if (expr->IsEmptyParentheses()) return; |
| 3929 | 3919 |
| 3930 ParseArrowFunctionFormalParameters(parameters, expr, params_loc, ok); | 3920 ParseArrowFunctionFormalParameters(parameters, expr, params_loc.end_pos, ok); |
| 3931 if (!*ok) return; | 3921 if (!*ok) return; |
| 3932 | 3922 |
| 3923 if (parameters->Arity() > Code::kMaxArguments) { |
| 3924 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); |
| 3925 *ok = false; |
| 3926 return; |
| 3927 } |
| 3928 |
| 3933 Type::ExpressionClassifier classifier(parser_); | 3929 Type::ExpressionClassifier classifier(parser_); |
| 3934 if (!parameters->is_simple) { | 3930 if (!parameters->is_simple) { |
| 3935 classifier.RecordNonSimpleParameter(); | 3931 classifier.RecordNonSimpleParameter(); |
| 3936 } | 3932 } |
| 3937 for (int i = 0; i < parameters->Arity(); ++i) { | 3933 for (int i = 0; i < parameters->Arity(); ++i) { |
| 3938 auto parameter = parameters->at(i); | 3934 auto parameter = parameters->at(i); |
| 3939 DeclareFormalParameter(parameters->scope, parameter, &classifier); | 3935 DeclareFormalParameter(parameters->scope, parameter, &classifier); |
| 3940 if (!duplicate_loc->IsValid()) { | 3936 if (!duplicate_loc->IsValid()) { |
| 3941 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; | 3937 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; |
| 3942 } | 3938 } |
| (...skipping 2842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6785 try_block, target); | 6781 try_block, target); |
| 6786 final_loop = target; | 6782 final_loop = target; |
| 6787 } | 6783 } |
| 6788 | 6784 |
| 6789 return final_loop; | 6785 return final_loop; |
| 6790 } | 6786 } |
| 6791 | 6787 |
| 6792 | 6788 |
| 6793 } // namespace internal | 6789 } // namespace internal |
| 6794 } // namespace v8 | 6790 } // namespace v8 |
| OLD | NEW |