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

Side by Side Diff: src/preparser.h

Issue 722203006: Disable classes in sloppy mode unless --harmony-sloppy is set (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Comments Created 6 years, 1 month 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
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 scope_(NULL), 76 scope_(NULL),
77 function_state_(NULL), 77 function_state_(NULL),
78 extension_(extension), 78 extension_(extension),
79 fni_(NULL), 79 fni_(NULL),
80 log_(log), 80 log_(log),
81 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly. 81 mode_(PARSE_EAGERLY), // Lazy mode must be set explicitly.
82 stack_limit_(stack_limit), 82 stack_limit_(stack_limit),
83 scanner_(scanner), 83 scanner_(scanner),
84 stack_overflow_(false), 84 stack_overflow_(false),
85 allow_lazy_(false), 85 allow_lazy_(false),
86 allow_natives_syntax_(false), 86 allow_natives_(false),
87 allow_arrow_functions_(false), 87 allow_harmony_arrow_functions_(false),
88 allow_harmony_object_literals_(false), 88 allow_harmony_object_literals_(false),
89 allow_harmony_sloppy_(false),
89 zone_(zone) {} 90 zone_(zone) {}
90 91
91 // Getters that indicate whether certain syntactical constructs are 92 // Getters that indicate whether certain syntactical constructs are
92 // allowed to be parsed by this instance of the parser. 93 // allowed to be parsed by this instance of the parser.
93 bool allow_lazy() const { return allow_lazy_; } 94 bool allow_lazy() const { return allow_lazy_; }
94 bool allow_natives_syntax() const { return allow_natives_syntax_; } 95 bool allow_natives() const { return allow_natives_; }
95 bool allow_arrow_functions() const { return allow_arrow_functions_; } 96 bool allow_harmony_arrow_functions() const {
96 bool allow_modules() const { return scanner()->HarmonyModules(); } 97 return allow_harmony_arrow_functions_;
98 }
99 bool allow_harmony_modules() const { return scanner()->HarmonyModules(); }
97 bool allow_harmony_scoping() const { return scanner()->HarmonyScoping(); } 100 bool allow_harmony_scoping() const { return scanner()->HarmonyScoping(); }
98 bool allow_harmony_numeric_literals() const { 101 bool allow_harmony_numeric_literals() const {
99 return scanner()->HarmonyNumericLiterals(); 102 return scanner()->HarmonyNumericLiterals();
100 } 103 }
101 bool allow_classes() const { return scanner()->HarmonyClasses(); } 104 bool allow_harmony_classes() const { return scanner()->HarmonyClasses(); }
102 bool allow_harmony_object_literals() const { 105 bool allow_harmony_object_literals() const {
103 return allow_harmony_object_literals_; 106 return allow_harmony_object_literals_;
104 } 107 }
105 bool allow_harmony_templates() const { return scanner()->HarmonyTemplates(); } 108 bool allow_harmony_templates() const { return scanner()->HarmonyTemplates(); }
109 bool allow_harmony_sloppy() const { return allow_harmony_sloppy_; }
106 110
107 // Setters that determine whether certain syntactical constructs are 111 // Setters that determine whether certain syntactical constructs are
108 // allowed to be parsed by this instance of the parser. 112 // allowed to be parsed by this instance of the parser.
109 void set_allow_lazy(bool allow) { allow_lazy_ = allow; } 113 void set_allow_lazy(bool allow) { allow_lazy_ = allow; }
110 void set_allow_natives_syntax(bool allow) { allow_natives_syntax_ = allow; } 114 void set_allow_natives(bool allow) { allow_natives_ = allow; }
111 void set_allow_arrow_functions(bool allow) { allow_arrow_functions_ = allow; } 115 void set_allow_harmony_arrow_functions(bool allow) {
112 void set_allow_modules(bool allow) { scanner()->SetHarmonyModules(allow); } 116 allow_harmony_arrow_functions_ = allow;
117 }
118 void set_allow_harmony_modules(bool allow) {
119 scanner()->SetHarmonyModules(allow);
120 }
113 void set_allow_harmony_scoping(bool allow) { 121 void set_allow_harmony_scoping(bool allow) {
114 scanner()->SetHarmonyScoping(allow); 122 scanner()->SetHarmonyScoping(allow);
115 } 123 }
116 void set_allow_harmony_numeric_literals(bool allow) { 124 void set_allow_harmony_numeric_literals(bool allow) {
117 scanner()->SetHarmonyNumericLiterals(allow); 125 scanner()->SetHarmonyNumericLiterals(allow);
118 } 126 }
119 void set_allow_classes(bool allow) { scanner()->SetHarmonyClasses(allow); } 127 void set_allow_harmony_classes(bool allow) {
128 scanner()->SetHarmonyClasses(allow);
129 }
120 void set_allow_harmony_object_literals(bool allow) { 130 void set_allow_harmony_object_literals(bool allow) {
121 allow_harmony_object_literals_ = allow; 131 allow_harmony_object_literals_ = allow;
122 } 132 }
123 void set_allow_harmony_templates(bool allow) { 133 void set_allow_harmony_templates(bool allow) {
124 scanner()->SetHarmonyTemplates(allow); 134 scanner()->SetHarmonyTemplates(allow);
125 } 135 }
136 void set_allow_harmony_sloppy(bool allow) {
137 allow_harmony_sloppy_ = allow;
138 }
126 139
127 protected: 140 protected:
128 enum AllowEvalOrArgumentsAsIdentifier { 141 enum AllowEvalOrArgumentsAsIdentifier {
129 kAllowEvalOrArguments, 142 kAllowEvalOrArguments,
130 kDontAllowEvalOrArguments 143 kDontAllowEvalOrArguments
131 }; 144 };
132 145
133 enum Mode { 146 enum Mode {
134 PARSE_LAZILY, 147 PARSE_LAZILY,
135 PARSE_EAGERLY 148 PARSE_EAGERLY
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 FuncNameInferrer* fni_; 583 FuncNameInferrer* fni_;
571 ParserRecorder* log_; 584 ParserRecorder* log_;
572 Mode mode_; 585 Mode mode_;
573 uintptr_t stack_limit_; 586 uintptr_t stack_limit_;
574 587
575 private: 588 private:
576 Scanner* scanner_; 589 Scanner* scanner_;
577 bool stack_overflow_; 590 bool stack_overflow_;
578 591
579 bool allow_lazy_; 592 bool allow_lazy_;
580 bool allow_natives_syntax_; 593 bool allow_natives_;
581 bool allow_arrow_functions_; 594 bool allow_harmony_arrow_functions_;
582 bool allow_harmony_object_literals_; 595 bool allow_harmony_object_literals_;
596 bool allow_harmony_sloppy_;
583 597
584 typename Traits::Type::Zone* zone_; // Only used by Parser. 598 typename Traits::Type::Zone* zone_; // Only used by Parser.
585 }; 599 };
586 600
587 601
588 class PreParserIdentifier { 602 class PreParserIdentifier {
589 public: 603 public:
590 PreParserIdentifier() : type_(kUnknownIdentifier) {} 604 PreParserIdentifier() : type_(kUnknownIdentifier) {}
591 static PreParserIdentifier Default() { 605 static PreParserIdentifier Default() {
592 return PreParserIdentifier(kUnknownIdentifier); 606 return PreParserIdentifier(kUnknownIdentifier);
(...skipping 1223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 case Token::LBRACK: 1830 case Token::LBRACK:
1817 result = this->ParseArrayLiteral(CHECK_OK); 1831 result = this->ParseArrayLiteral(CHECK_OK);
1818 break; 1832 break;
1819 1833
1820 case Token::LBRACE: 1834 case Token::LBRACE:
1821 result = this->ParseObjectLiteral(CHECK_OK); 1835 result = this->ParseObjectLiteral(CHECK_OK);
1822 break; 1836 break;
1823 1837
1824 case Token::LPAREN: 1838 case Token::LPAREN:
1825 Consume(Token::LPAREN); 1839 Consume(Token::LPAREN);
1826 if (allow_arrow_functions() && peek() == Token::RPAREN) { 1840 if (allow_harmony_arrow_functions() && peek() == Token::RPAREN) {
1827 // Arrow functions are the only expression type constructions 1841 // Arrow functions are the only expression type constructions
1828 // for which an empty parameter list "()" is valid input. 1842 // for which an empty parameter list "()" is valid input.
1829 Consume(Token::RPAREN); 1843 Consume(Token::RPAREN);
1830 result = this->ParseArrowFunctionLiteral( 1844 result = this->ParseArrowFunctionLiteral(
1831 pos, this->EmptyArrowParamList(), CHECK_OK); 1845 pos, this->EmptyArrowParamList(), CHECK_OK);
1832 } else { 1846 } else {
1833 // Heuristically try to detect immediately called functions before 1847 // Heuristically try to detect immediately called functions before
1834 // seeing the call parentheses. 1848 // seeing the call parentheses.
1835 parenthesized_function_ = (peek() == Token::FUNCTION); 1849 parenthesized_function_ = (peek() == Token::FUNCTION);
1836 result = this->ParseExpression(true, CHECK_OK); 1850 result = this->ParseExpression(true, CHECK_OK);
1837 result->increase_parenthesization_level(); 1851 result->increase_parenthesization_level();
1838 Expect(Token::RPAREN, CHECK_OK); 1852 Expect(Token::RPAREN, CHECK_OK);
1839 } 1853 }
1840 break; 1854 break;
1841 1855
1842 case Token::CLASS: { 1856 case Token::CLASS: {
1843 Consume(Token::CLASS); 1857 Consume(Token::CLASS);
1858 if (!allow_harmony_sloppy() && strict_mode() == SLOPPY) {
1859 ReportMessage("sloppy_lexical", NULL);
1860 *ok = false;
1861 break;
1862 }
1844 int class_token_position = position(); 1863 int class_token_position = position();
1845 IdentifierT name = this->EmptyIdentifier(); 1864 IdentifierT name = this->EmptyIdentifier();
1846 bool is_strict_reserved_name = false; 1865 bool is_strict_reserved_name = false;
1847 Scanner::Location class_name_location = Scanner::Location::invalid(); 1866 Scanner::Location class_name_location = Scanner::Location::invalid();
1848 if (peek_any_identifier()) { 1867 if (peek_any_identifier()) {
1849 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, 1868 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
1850 CHECK_OK); 1869 CHECK_OK);
1851 class_name_location = scanner()->location(); 1870 class_name_location = scanner()->location();
1852 } 1871 }
1853 result = this->ParseClassLiteral(name, class_name_location, 1872 result = this->ParseClassLiteral(name, class_name_location,
1854 is_strict_reserved_name, 1873 is_strict_reserved_name,
1855 class_token_position, CHECK_OK); 1874 class_token_position, CHECK_OK);
1856 break; 1875 break;
1857 } 1876 }
1858 1877
1859 case Token::TEMPLATE_SPAN: 1878 case Token::TEMPLATE_SPAN:
1860 case Token::TEMPLATE_TAIL: 1879 case Token::TEMPLATE_TAIL:
1861 result = 1880 result =
1862 this->ParseTemplateLiteral(Traits::NoTemplateTag(), pos, CHECK_OK); 1881 this->ParseTemplateLiteral(Traits::NoTemplateTag(), pos, CHECK_OK);
1863 break; 1882 break;
1864 1883
1865 case Token::MOD: 1884 case Token::MOD:
1866 if (allow_natives_syntax() || extension_ != NULL) { 1885 if (allow_natives() || extension_ != NULL) {
1867 result = this->ParseV8Intrinsic(CHECK_OK); 1886 result = this->ParseV8Intrinsic(CHECK_OK);
1868 break; 1887 break;
1869 } 1888 }
1870 // If we're not allowing special syntax we fall-through to the 1889 // If we're not allowing special syntax we fall-through to the
1871 // default case. 1890 // default case.
1872 1891
1873 default: { 1892 default: {
1874 Next(); 1893 Next();
1875 ReportUnexpectedToken(token); 1894 ReportUnexpectedToken(token);
1876 *ok = false; 1895 *ok = false;
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2184 2203
2185 if (peek() == Token::YIELD && is_generator()) { 2204 if (peek() == Token::YIELD && is_generator()) {
2186 return this->ParseYieldExpression(ok); 2205 return this->ParseYieldExpression(ok);
2187 } 2206 }
2188 2207
2189 if (fni_ != NULL) fni_->Enter(); 2208 if (fni_ != NULL) fni_->Enter();
2190 ParserBase<Traits>::Checkpoint checkpoint(this); 2209 ParserBase<Traits>::Checkpoint checkpoint(this);
2191 ExpressionT expression = 2210 ExpressionT expression =
2192 this->ParseConditionalExpression(accept_IN, CHECK_OK); 2211 this->ParseConditionalExpression(accept_IN, CHECK_OK);
2193 2212
2194 if (allow_arrow_functions() && peek() == Token::ARROW) { 2213 if (allow_harmony_arrow_functions() && peek() == Token::ARROW) {
2195 checkpoint.Restore(); 2214 checkpoint.Restore();
2196 expression = this->ParseArrowFunctionLiteral(lhs_location.beg_pos, 2215 expression = this->ParseArrowFunctionLiteral(lhs_location.beg_pos,
2197 expression, CHECK_OK); 2216 expression, CHECK_OK);
2198 return expression; 2217 return expression;
2199 } 2218 }
2200 2219
2201 if (!Token::IsAssignmentOp(peek())) { 2220 if (!Token::IsAssignmentOp(peek())) {
2202 if (fni_ != NULL) fni_->Leave(); 2221 if (fni_ != NULL) fni_->Leave();
2203 // Parsed conditional expression only (no assignment). 2222 // Parsed conditional expression only (no assignment).
2204 return expression; 2223 return expression;
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
2897 DCHECK(IsAccessorAccessorConflict(old_type, type)); 2916 DCHECK(IsAccessorAccessorConflict(old_type, type));
2898 // Both accessors of the same type. 2917 // Both accessors of the same type.
2899 parser()->ReportMessage("accessor_get_set"); 2918 parser()->ReportMessage("accessor_get_set");
2900 } 2919 }
2901 *ok = false; 2920 *ok = false;
2902 } 2921 }
2903 } 2922 }
2904 } } // v8::internal 2923 } } // v8::internal
2905 2924
2906 #endif // V8_PREPARSER_H 2925 #endif // V8_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parser.cc ('k') | src/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698