| 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 #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 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 zone_(zone), | 106 zone_(zone), |
| 107 scanner_(scanner), | 107 scanner_(scanner), |
| 108 stack_overflow_(false), | 108 stack_overflow_(false), |
| 109 allow_lazy_(false), | 109 allow_lazy_(false), |
| 110 allow_natives_(false), | 110 allow_natives_(false), |
| 111 allow_harmony_sloppy_(false), | 111 allow_harmony_sloppy_(false), |
| 112 allow_harmony_sloppy_function_(false), | 112 allow_harmony_sloppy_function_(false), |
| 113 allow_harmony_sloppy_let_(false), | 113 allow_harmony_sloppy_let_(false), |
| 114 allow_harmony_rest_parameters_(false), | 114 allow_harmony_rest_parameters_(false), |
| 115 allow_harmony_default_parameters_(false), | 115 allow_harmony_default_parameters_(false), |
| 116 allow_harmony_destructuring_(false), | 116 allow_harmony_destructuring_bind_(false), |
| 117 allow_strong_mode_(false), | 117 allow_strong_mode_(false), |
| 118 allow_legacy_const_(true), | 118 allow_legacy_const_(true), |
| 119 allow_harmony_do_expressions_(false) {} | 119 allow_harmony_do_expressions_(false) {} |
| 120 | 120 |
| 121 #define ALLOW_ACCESSORS(name) \ | 121 #define ALLOW_ACCESSORS(name) \ |
| 122 bool allow_##name() const { return allow_##name##_; } \ | 122 bool allow_##name() const { return allow_##name##_; } \ |
| 123 void set_allow_##name(bool allow) { allow_##name##_ = allow; } | 123 void set_allow_##name(bool allow) { allow_##name##_ = allow; } |
| 124 | 124 |
| 125 ALLOW_ACCESSORS(lazy); | 125 ALLOW_ACCESSORS(lazy); |
| 126 ALLOW_ACCESSORS(natives); | 126 ALLOW_ACCESSORS(natives); |
| 127 ALLOW_ACCESSORS(harmony_sloppy); | 127 ALLOW_ACCESSORS(harmony_sloppy); |
| 128 ALLOW_ACCESSORS(harmony_sloppy_function); | 128 ALLOW_ACCESSORS(harmony_sloppy_function); |
| 129 ALLOW_ACCESSORS(harmony_sloppy_let); | 129 ALLOW_ACCESSORS(harmony_sloppy_let); |
| 130 ALLOW_ACCESSORS(harmony_rest_parameters); | 130 ALLOW_ACCESSORS(harmony_rest_parameters); |
| 131 ALLOW_ACCESSORS(harmony_default_parameters); | 131 ALLOW_ACCESSORS(harmony_default_parameters); |
| 132 ALLOW_ACCESSORS(harmony_destructuring); | 132 ALLOW_ACCESSORS(harmony_destructuring_bind); |
| 133 ALLOW_ACCESSORS(strong_mode); | 133 ALLOW_ACCESSORS(strong_mode); |
| 134 ALLOW_ACCESSORS(legacy_const); | 134 ALLOW_ACCESSORS(legacy_const); |
| 135 ALLOW_ACCESSORS(harmony_do_expressions); | 135 ALLOW_ACCESSORS(harmony_do_expressions); |
| 136 #undef ALLOW_ACCESSORS | 136 #undef ALLOW_ACCESSORS |
| 137 | 137 |
| 138 uintptr_t stack_limit() const { return stack_limit_; } | 138 uintptr_t stack_limit() const { return stack_limit_; } |
| 139 | 139 |
| 140 protected: | 140 protected: |
| 141 enum AllowRestrictedIdentifiers { | 141 enum AllowRestrictedIdentifiers { |
| 142 kAllowRestrictedIdentifiers, | 142 kAllowRestrictedIdentifiers, |
| (...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 Scanner* scanner_; | 827 Scanner* scanner_; |
| 828 bool stack_overflow_; | 828 bool stack_overflow_; |
| 829 | 829 |
| 830 bool allow_lazy_; | 830 bool allow_lazy_; |
| 831 bool allow_natives_; | 831 bool allow_natives_; |
| 832 bool allow_harmony_sloppy_; | 832 bool allow_harmony_sloppy_; |
| 833 bool allow_harmony_sloppy_function_; | 833 bool allow_harmony_sloppy_function_; |
| 834 bool allow_harmony_sloppy_let_; | 834 bool allow_harmony_sloppy_let_; |
| 835 bool allow_harmony_rest_parameters_; | 835 bool allow_harmony_rest_parameters_; |
| 836 bool allow_harmony_default_parameters_; | 836 bool allow_harmony_default_parameters_; |
| 837 bool allow_harmony_destructuring_; | 837 bool allow_harmony_destructuring_bind_; |
| 838 bool allow_strong_mode_; | 838 bool allow_strong_mode_; |
| 839 bool allow_legacy_const_; | 839 bool allow_legacy_const_; |
| 840 bool allow_harmony_do_expressions_; | 840 bool allow_harmony_do_expressions_; |
| 841 }; | 841 }; |
| 842 | 842 |
| 843 | 843 |
| 844 class PreParserIdentifier { | 844 class PreParserIdentifier { |
| 845 public: | 845 public: |
| 846 PreParserIdentifier() : type_(kUnknownIdentifier) {} | 846 PreParserIdentifier() : type_(kUnknownIdentifier) {} |
| 847 static PreParserIdentifier Default() { | 847 static PreParserIdentifier Default() { |
| (...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2296 classifier->RecordBindingPatternError( | 2296 classifier->RecordBindingPatternError( |
| 2297 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 2297 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); |
| 2298 return this->ParseRegExpLiteral(true, classifier, ok); | 2298 return this->ParseRegExpLiteral(true, classifier, ok); |
| 2299 | 2299 |
| 2300 case Token::DIV: | 2300 case Token::DIV: |
| 2301 classifier->RecordBindingPatternError( | 2301 classifier->RecordBindingPatternError( |
| 2302 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); | 2302 scanner()->peek_location(), MessageTemplate::kUnexpectedTokenRegExp); |
| 2303 return this->ParseRegExpLiteral(false, classifier, ok); | 2303 return this->ParseRegExpLiteral(false, classifier, ok); |
| 2304 | 2304 |
| 2305 case Token::LBRACK: | 2305 case Token::LBRACK: |
| 2306 if (!allow_harmony_destructuring()) { | 2306 if (!allow_harmony_destructuring_bind()) { |
| 2307 BindingPatternUnexpectedToken(classifier); | 2307 BindingPatternUnexpectedToken(classifier); |
| 2308 } | 2308 } |
| 2309 return this->ParseArrayLiteral(classifier, ok); | 2309 return this->ParseArrayLiteral(classifier, ok); |
| 2310 | 2310 |
| 2311 case Token::LBRACE: | 2311 case Token::LBRACE: |
| 2312 if (!allow_harmony_destructuring()) { | 2312 if (!allow_harmony_destructuring_bind()) { |
| 2313 BindingPatternUnexpectedToken(classifier); | 2313 BindingPatternUnexpectedToken(classifier); |
| 2314 } | 2314 } |
| 2315 return this->ParseObjectLiteral(classifier, ok); | 2315 return this->ParseObjectLiteral(classifier, ok); |
| 2316 | 2316 |
| 2317 case Token::LPAREN: { | 2317 case Token::LPAREN: { |
| 2318 // Arrow function formal parameters are either a single identifier or a | 2318 // Arrow function formal parameters are either a single identifier or a |
| 2319 // list of BindingPattern productions enclosed in parentheses. | 2319 // list of BindingPattern productions enclosed in parentheses. |
| 2320 // Parentheses are not valid on the LHS of a BindingPattern, so we use the | 2320 // Parentheses are not valid on the LHS of a BindingPattern, so we use the |
| 2321 // is_valid_binding_pattern() check to detect multiple levels of | 2321 // is_valid_binding_pattern() check to detect multiple levels of |
| 2322 // parenthesization. | 2322 // parenthesization. |
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2968 classifier->Accumulate(arrow_formals_classifier, | 2968 classifier->Accumulate(arrow_formals_classifier, |
| 2969 ExpressionClassifier::StandardProductions | | 2969 ExpressionClassifier::StandardProductions | |
| 2970 ExpressionClassifier::FormalParametersProductions); | 2970 ExpressionClassifier::FormalParametersProductions); |
| 2971 | 2971 |
| 2972 if (!Token::IsAssignmentOp(peek())) { | 2972 if (!Token::IsAssignmentOp(peek())) { |
| 2973 if (fni_ != NULL) fni_->Leave(); | 2973 if (fni_ != NULL) fni_->Leave(); |
| 2974 // Parsed conditional expression only (no assignment). | 2974 // Parsed conditional expression only (no assignment). |
| 2975 return expression; | 2975 return expression; |
| 2976 } | 2976 } |
| 2977 | 2977 |
| 2978 if (!(allow_harmony_destructuring() || allow_harmony_default_parameters())) { | 2978 if (!(allow_harmony_destructuring_bind() || |
| 2979 allow_harmony_default_parameters())) { |
| 2979 BindingPatternUnexpectedToken(classifier); | 2980 BindingPatternUnexpectedToken(classifier); |
| 2980 } | 2981 } |
| 2981 | 2982 |
| 2982 expression = this->CheckAndRewriteReferenceExpression( | 2983 expression = this->CheckAndRewriteReferenceExpression( |
| 2983 expression, lhs_beg_pos, scanner()->location().end_pos, | 2984 expression, lhs_beg_pos, scanner()->location().end_pos, |
| 2984 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); | 2985 MessageTemplate::kInvalidLhsInAssignment, CHECK_OK); |
| 2985 expression = this->MarkExpressionAsAssigned(expression); | 2986 expression = this->MarkExpressionAsAssigned(expression); |
| 2986 | 2987 |
| 2987 Token::Value op = Next(); // Get assignment operator. | 2988 Token::Value op = Next(); // Get assignment operator. |
| 2988 if (op != Token::ASSIGN) { | 2989 if (op != Token::ASSIGN) { |
| (...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3748 bool is_rest = parameters->has_rest; | 3749 bool is_rest = parameters->has_rest; |
| 3749 | 3750 |
| 3750 Token::Value next = peek(); | 3751 Token::Value next = peek(); |
| 3751 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); | 3752 ExpressionT pattern = ParsePrimaryExpression(classifier, ok); |
| 3752 if (!*ok) return; | 3753 if (!*ok) return; |
| 3753 | 3754 |
| 3754 ValidateBindingPattern(classifier, ok); | 3755 ValidateBindingPattern(classifier, ok); |
| 3755 if (!*ok) return; | 3756 if (!*ok) return; |
| 3756 | 3757 |
| 3757 if (!Traits::IsIdentifier(pattern)) { | 3758 if (!Traits::IsIdentifier(pattern)) { |
| 3758 if (is_rest || !allow_harmony_destructuring()) { | 3759 if (is_rest || !allow_harmony_destructuring_bind()) { |
| 3759 ReportUnexpectedToken(next); | 3760 ReportUnexpectedToken(next); |
| 3760 *ok = false; | 3761 *ok = false; |
| 3761 return; | 3762 return; |
| 3762 } | 3763 } |
| 3763 parameters->is_simple = false; | 3764 parameters->is_simple = false; |
| 3764 ValidateFormalParameterInitializer(classifier, ok); | 3765 ValidateFormalParameterInitializer(classifier, ok); |
| 3765 if (!*ok) return; | 3766 if (!*ok) return; |
| 3766 classifier->RecordNonSimpleParameter(); | 3767 classifier->RecordNonSimpleParameter(); |
| 3767 } | 3768 } |
| 3768 | 3769 |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4197 return; | 4198 return; |
| 4198 } | 4199 } |
| 4199 has_seen_constructor_ = true; | 4200 has_seen_constructor_ = true; |
| 4200 return; | 4201 return; |
| 4201 } | 4202 } |
| 4202 } | 4203 } |
| 4203 } // namespace internal | 4204 } // namespace internal |
| 4204 } // namespace v8 | 4205 } // namespace v8 |
| 4205 | 4206 |
| 4206 #endif // V8_PREPARSER_H | 4207 #endif // V8_PREPARSER_H |
| OLD | NEW |