Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Side by Side Diff: src/preparser.h

Issue 1287063004: [es6] Implement default parameters (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix TODO Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #ifndef V8_PREPARSER_H 5 #ifndef V8_PREPARSER_H
6 #define V8_PREPARSER_H 6 #define V8_PREPARSER_H
7 7
8 #include "src/bailout-reason.h" 8 #include "src/bailout-reason.h"
9 #include "src/expression-classifier.h" 9 #include "src/expression-classifier.h"
10 #include "src/func-name-inferrer.h" 10 #include "src/func-name-inferrer.h"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 zone_(zone), 104 zone_(zone),
105 scanner_(scanner), 105 scanner_(scanner),
106 stack_overflow_(false), 106 stack_overflow_(false),
107 allow_lazy_(false), 107 allow_lazy_(false),
108 allow_natives_(false), 108 allow_natives_(false),
109 allow_harmony_arrow_functions_(false), 109 allow_harmony_arrow_functions_(false),
110 allow_harmony_sloppy_(false), 110 allow_harmony_sloppy_(false),
111 allow_harmony_sloppy_function_(false), 111 allow_harmony_sloppy_function_(false),
112 allow_harmony_sloppy_let_(false), 112 allow_harmony_sloppy_let_(false),
113 allow_harmony_rest_parameters_(false), 113 allow_harmony_rest_parameters_(false),
114 allow_harmony_default_parameters_(false),
114 allow_harmony_spreadcalls_(false), 115 allow_harmony_spreadcalls_(false),
115 allow_harmony_destructuring_(false), 116 allow_harmony_destructuring_(false),
116 allow_harmony_spread_arrays_(false), 117 allow_harmony_spread_arrays_(false),
117 allow_harmony_new_target_(false), 118 allow_harmony_new_target_(false),
118 allow_strong_mode_(false), 119 allow_strong_mode_(false),
119 allow_legacy_const_(true) {} 120 allow_legacy_const_(true) {}
120 121
121 #define ALLOW_ACCESSORS(name) \ 122 #define ALLOW_ACCESSORS(name) \
122 bool allow_##name() const { return allow_##name##_; } \ 123 bool allow_##name() const { return allow_##name##_; } \
123 void set_allow_##name(bool allow) { allow_##name##_ = allow; } 124 void set_allow_##name(bool allow) { allow_##name##_ = allow; }
124 125
125 ALLOW_ACCESSORS(lazy); 126 ALLOW_ACCESSORS(lazy);
126 ALLOW_ACCESSORS(natives); 127 ALLOW_ACCESSORS(natives);
127 ALLOW_ACCESSORS(harmony_arrow_functions); 128 ALLOW_ACCESSORS(harmony_arrow_functions);
128 ALLOW_ACCESSORS(harmony_sloppy); 129 ALLOW_ACCESSORS(harmony_sloppy);
129 ALLOW_ACCESSORS(harmony_sloppy_function); 130 ALLOW_ACCESSORS(harmony_sloppy_function);
130 ALLOW_ACCESSORS(harmony_sloppy_let); 131 ALLOW_ACCESSORS(harmony_sloppy_let);
131 ALLOW_ACCESSORS(harmony_rest_parameters); 132 ALLOW_ACCESSORS(harmony_rest_parameters);
133 ALLOW_ACCESSORS(harmony_default_parameters);
132 ALLOW_ACCESSORS(harmony_spreadcalls); 134 ALLOW_ACCESSORS(harmony_spreadcalls);
133 ALLOW_ACCESSORS(harmony_destructuring); 135 ALLOW_ACCESSORS(harmony_destructuring);
134 ALLOW_ACCESSORS(harmony_spread_arrays); 136 ALLOW_ACCESSORS(harmony_spread_arrays);
135 ALLOW_ACCESSORS(harmony_new_target); 137 ALLOW_ACCESSORS(harmony_new_target);
136 ALLOW_ACCESSORS(strong_mode); 138 ALLOW_ACCESSORS(strong_mode);
137 ALLOW_ACCESSORS(legacy_const); 139 ALLOW_ACCESSORS(legacy_const);
138 #undef ALLOW_ACCESSORS 140 #undef ALLOW_ACCESSORS
139 141
140 protected: 142 protected:
141 enum AllowRestrictedIdentifiers { 143 enum AllowRestrictedIdentifiers {
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 Scanner* scanner_; 800 Scanner* scanner_;
799 bool stack_overflow_; 801 bool stack_overflow_;
800 802
801 bool allow_lazy_; 803 bool allow_lazy_;
802 bool allow_natives_; 804 bool allow_natives_;
803 bool allow_harmony_arrow_functions_; 805 bool allow_harmony_arrow_functions_;
804 bool allow_harmony_sloppy_; 806 bool allow_harmony_sloppy_;
805 bool allow_harmony_sloppy_function_; 807 bool allow_harmony_sloppy_function_;
806 bool allow_harmony_sloppy_let_; 808 bool allow_harmony_sloppy_let_;
807 bool allow_harmony_rest_parameters_; 809 bool allow_harmony_rest_parameters_;
810 bool allow_harmony_default_parameters_;
808 bool allow_harmony_spreadcalls_; 811 bool allow_harmony_spreadcalls_;
809 bool allow_harmony_destructuring_; 812 bool allow_harmony_destructuring_;
810 bool allow_harmony_spread_arrays_; 813 bool allow_harmony_spread_arrays_;
811 bool allow_harmony_new_target_; 814 bool allow_harmony_new_target_;
812 bool allow_strong_mode_; 815 bool allow_strong_mode_;
813 bool allow_legacy_const_; 816 bool allow_legacy_const_;
814 }; 817 };
815 818
816 819
817 class PreParserIdentifier { 820 class PreParserIdentifier {
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 inline void MaterializeTemplateCallsiteLiterals(); 1633 inline void MaterializeTemplateCallsiteLiterals();
1631 PreParserExpression NoTemplateTag() { 1634 PreParserExpression NoTemplateTag() {
1632 return PreParserExpression::NoTemplateTag(); 1635 return PreParserExpression::NoTemplateTag();
1633 } 1636 }
1634 static bool IsTaggedTemplate(const PreParserExpression tag) { 1637 static bool IsTaggedTemplate(const PreParserExpression tag) {
1635 return !tag.IsNoTemplateTag(); 1638 return !tag.IsNoTemplateTag();
1636 } 1639 }
1637 1640
1638 void AddFormalParameter( 1641 void AddFormalParameter(
1639 PreParserFormalParameters* parameters, PreParserExpression pattern, 1642 PreParserFormalParameters* parameters, PreParserExpression pattern,
1640 bool is_rest) { 1643 PreParserExpression initializer, bool is_rest) {
1641 ++parameters->arity; 1644 ++parameters->arity;
1642 } 1645 }
1643 void DeclareFormalParameter(Scope* scope, PreParserIdentifier parameter, 1646 void DeclareFormalParameter(Scope* scope, PreParserIdentifier parameter,
1644 bool is_simple, 1647 bool is_simple,
1645 ExpressionClassifier* classifier) {} 1648 ExpressionClassifier* classifier) {}
1646 1649
1647 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {} 1650 void CheckConflictingVarDeclarations(Scope* scope, bool* ok) {}
1648 1651
1649 // Temporary glue; these functions will move to ParserBase. 1652 // Temporary glue; these functions will move to ParserBase.
1650 PreParserExpression ParseV8Intrinsic(bool* ok); 1653 PreParserExpression ParseV8Intrinsic(bool* ok);
(...skipping 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after
2866 classifier->Accumulate(arrow_formals_classifier, 2869 classifier->Accumulate(arrow_formals_classifier,
2867 ExpressionClassifier::StandardProductions | 2870 ExpressionClassifier::StandardProductions |
2868 ExpressionClassifier::FormalParametersProductions); 2871 ExpressionClassifier::FormalParametersProductions);
2869 2872
2870 if (!Token::IsAssignmentOp(peek())) { 2873 if (!Token::IsAssignmentOp(peek())) {
2871 if (fni_ != NULL) fni_->Leave(); 2874 if (fni_ != NULL) fni_->Leave();
2872 // Parsed conditional expression only (no assignment). 2875 // Parsed conditional expression only (no assignment).
2873 return expression; 2876 return expression;
2874 } 2877 }
2875 2878
2876 if (!allow_harmony_destructuring()) { 2879 if (!(allow_harmony_destructuring() || allow_harmony_default_parameters())) {
2877 BindingPatternUnexpectedToken(classifier); 2880 BindingPatternUnexpectedToken(classifier);
2878 } 2881 }
2879 2882
2880 expression = this->CheckAndRewriteReferenceExpression( 2883 expression = this->CheckAndRewriteReferenceExpression(
2881 expression, lhs_beg_pos, scanner()->location().end_pos, 2884 expression, lhs_beg_pos, scanner()->location().end_pos,
2882 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); 2885 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK);
2883 expression = this->MarkExpressionAsAssigned(expression); 2886 expression = this->MarkExpressionAsAssigned(expression);
2884 2887
2885 Token::Value op = Next(); // Get assignment operator. 2888 Token::Value op = Next(); // Get assignment operator.
2886 if (op != Token::ASSIGN) { 2889 if (op != Token::ASSIGN) {
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
3631 // BindingElement[?Yield, ?GeneratorParameter] 3634 // BindingElement[?Yield, ?GeneratorParameter]
3632 bool is_rest = parameters->has_rest; 3635 bool is_rest = parameters->has_rest;
3633 3636
3634 Token::Value next = peek(); 3637 Token::Value next = peek();
3635 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); 3638 ExpressionT pattern = ParsePrimaryExpression(classifier, ok);
3636 if (!*ok) return; 3639 if (!*ok) return;
3637 3640
3638 ValidateBindingPattern(classifier, ok); 3641 ValidateBindingPattern(classifier, ok);
3639 if (!*ok) return; 3642 if (!*ok) return;
3640 3643
3641 if (!allow_harmony_destructuring() && !Traits::IsIdentifier(pattern)) { 3644 if (!Traits::IsIdentifier(pattern)) {
3642 ReportUnexpectedToken(next); 3645 if (is_rest || !allow_harmony_destructuring()) {
3643 *ok = false; 3646 ReportUnexpectedToken(next);
3644 return; 3647 *ok = false;
3648 return;
3649 }
3650 parameters->is_simple = false;
3645 } 3651 }
3646 3652
3647 if (parameters->is_simple) { 3653 ExpressionT initializer = Traits::EmptyExpression();
3648 parameters->is_simple = !is_rest && Traits::IsIdentifier(pattern); 3654 if (!is_rest && allow_harmony_default_parameters() && Check(Token::ASSIGN)) {
3655 ExpressionClassifier init_classifier;
3656 initializer = ParseAssignmentExpression(true, &init_classifier, ok);
3657 if (!*ok) return;
3658 ValidateExpression(&init_classifier, ok);
3659 if (!*ok) return;
3660 parameters->is_simple = false;
3649 } 3661 }
3650 parameters->has_rest = is_rest; 3662
3651 if (is_rest && !Traits::IsIdentifier(pattern)) { 3663 Traits::AddFormalParameter(parameters, pattern, initializer, is_rest);
3652 ReportUnexpectedToken(next);
3653 *ok = false;
3654 return;
3655 }
3656 Traits::AddFormalParameter(parameters, pattern, is_rest);
3657 } 3664 }
3658 3665
3659 3666
3660 template <class Traits> 3667 template <class Traits>
3661 void ParserBase<Traits>::ParseFormalParameterList( 3668 void ParserBase<Traits>::ParseFormalParameterList(
3662 FormalParametersT* parameters, ExpressionClassifier* classifier, bool* ok) { 3669 FormalParametersT* parameters, ExpressionClassifier* classifier, bool* ok) {
3663 // FormalParameters[Yield,GeneratorParameter] : 3670 // FormalParameters[Yield,GeneratorParameter] :
3664 // [empty] 3671 // [empty]
3665 // FormalParameterList[?Yield, ?GeneratorParameter] 3672 // FormalParameterList[?Yield, ?GeneratorParameter]
3666 // 3673 //
(...skipping 15 matching lines...) Expand all
3682 ReportMessage(MessageTemplate::kTooManyParameters); 3689 ReportMessage(MessageTemplate::kTooManyParameters);
3683 *ok = false; 3690 *ok = false;
3684 return; 3691 return;
3685 } 3692 }
3686 parameters->has_rest = 3693 parameters->has_rest =
3687 allow_harmony_rest_parameters() && Check(Token::ELLIPSIS); 3694 allow_harmony_rest_parameters() && Check(Token::ELLIPSIS);
3688 ParseFormalParameter(parameters, classifier, ok); 3695 ParseFormalParameter(parameters, classifier, ok);
3689 if (!*ok) return; 3696 if (!*ok) return;
3690 } while (!parameters->has_rest && Check(Token::COMMA)); 3697 } while (!parameters->has_rest && Check(Token::COMMA));
3691 3698
3692 if (parameters->has_rest && peek() == Token::COMMA) { 3699 if (parameters->has_rest) {
3693 ReportMessageAt(scanner()->peek_location(), 3700 parameters->is_simple = false;
3701 if (peek() == Token::COMMA) {
3702 ReportMessageAt(scanner()->peek_location(),
3694 MessageTemplate::kParamAfterRest); 3703 MessageTemplate::kParamAfterRest);
3695 *ok = false; 3704 *ok = false;
3696 return; 3705 return;
3706 }
3697 } 3707 }
3698 } 3708 }
3699 3709
3700 for (int i = 0; i < parameters->Arity(); ++i) { 3710 for (int i = 0; i < parameters->Arity(); ++i) {
3701 auto parameter = parameters->at(i); 3711 auto parameter = parameters->at(i);
3702 Traits::DeclareFormalParameter( 3712 Traits::DeclareFormalParameter(
3703 parameters->scope, parameter, parameters->is_simple, classifier); 3713 parameters->scope, parameter, parameters->is_simple, classifier);
3704 } 3714 }
3705 } 3715 }
3706 3716
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
4036 *ok = false; 4046 *ok = false;
4037 return; 4047 return;
4038 } 4048 }
4039 has_seen_constructor_ = true; 4049 has_seen_constructor_ = true;
4040 return; 4050 return;
4041 } 4051 }
4042 } 4052 }
4043 } } // v8::internal 4053 } } // v8::internal
4044 4054
4045 #endif // V8_PREPARSER_H 4055 #endif // V8_PREPARSER_H
OLDNEW
« src/parser.cc ('K') | « src/parser.cc ('k') | test/mjsunit/harmony/default-parameters.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698