| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 <cmath> | 5 #include <cmath> |
| 6 | 6 |
| 7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
| 8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
| 9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
| 10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) { | 125 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) { |
| 126 if (is_strict(language_mode()) || peek() != Token::FUNCTION || | 126 if (is_strict(language_mode()) || peek() != Token::FUNCTION || |
| 127 (legacy && allow_harmony_restrictive_declarations())) { | 127 (legacy && allow_harmony_restrictive_declarations())) { |
| 128 return ParseStatement(nullptr, kDisallowLabelledFunctionStatement, ok); | 128 return ParseStatement(nullptr, kDisallowLabelledFunctionStatement, ok); |
| 129 } else { | 129 } else { |
| 130 BlockState block_state(&scope_state_); | 130 BlockState block_state(&scope_state_); |
| 131 return ParseFunctionDeclaration(ok); | 131 return ParseFunctionDeclaration(ok); |
| 132 } | 132 } |
| 133 } | 133 } |
| 134 | 134 |
| 135 PreParser::Statement PreParser::ParseHoistableDeclaration( | |
| 136 int pos, ParseFunctionFlags flags, ZoneList<const AstRawString*>* names, | |
| 137 bool default_export, bool* ok) { | |
| 138 const bool is_generator = flags & ParseFunctionFlags::kIsGenerator; | |
| 139 const bool is_async = flags & ParseFunctionFlags::kIsAsync; | |
| 140 DCHECK(!is_generator || !is_async); | |
| 141 | |
| 142 bool is_strict_reserved = false; | |
| 143 Identifier name = ParseIdentifierOrStrictReservedWord( | |
| 144 &is_strict_reserved, CHECK_OK); | |
| 145 | |
| 146 ParseFunctionLiteral(name, scanner()->location(), | |
| 147 is_strict_reserved ? kFunctionNameIsStrictReserved | |
| 148 : kFunctionNameValidityUnknown, | |
| 149 is_generator ? FunctionKind::kGeneratorFunction | |
| 150 : is_async ? FunctionKind::kAsyncFunction | |
| 151 : FunctionKind::kNormalFunction, | |
| 152 pos, FunctionLiteral::kDeclaration, language_mode(), | |
| 153 CHECK_OK); | |
| 154 return Statement::FunctionDeclaration(); | |
| 155 } | |
| 156 | |
| 157 PreParser::Statement PreParser::ParseAsyncFunctionDeclaration( | 135 PreParser::Statement PreParser::ParseAsyncFunctionDeclaration( |
| 158 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | 136 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { |
| 159 // AsyncFunctionDeclaration :: | 137 // AsyncFunctionDeclaration :: |
| 160 // async [no LineTerminator here] function BindingIdentifier[Await] | 138 // async [no LineTerminator here] function BindingIdentifier[Await] |
| 161 // ( FormalParameters[Await] ) { AsyncFunctionBody } | 139 // ( FormalParameters[Await] ) { AsyncFunctionBody } |
| 162 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); | 140 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); |
| 163 int pos = position(); | 141 int pos = position(); |
| 164 Expect(Token::FUNCTION, CHECK_OK); | 142 Expect(Token::FUNCTION, CHECK_OK); |
| 165 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync; | 143 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync; |
| 166 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); | 144 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); |
| 167 } | 145 } |
| 168 | 146 |
| 169 PreParser::Statement PreParser::ParseHoistableDeclaration( | |
| 170 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | |
| 171 // FunctionDeclaration :: | |
| 172 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | |
| 173 // GeneratorDeclaration :: | |
| 174 // 'function' '*' Identifier '(' FormalParameterListopt ')' | |
| 175 // '{' FunctionBody '}' | |
| 176 | |
| 177 Expect(Token::FUNCTION, CHECK_OK); | |
| 178 int pos = position(); | |
| 179 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; | |
| 180 if (Check(Token::MUL)) { | |
| 181 flags |= ParseFunctionFlags::kIsGenerator; | |
| 182 } | |
| 183 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); | |
| 184 } | |
| 185 | |
| 186 PreParser::Statement PreParser::ParseClassDeclaration( | 147 PreParser::Statement PreParser::ParseClassDeclaration( |
| 187 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | 148 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { |
| 188 int pos = position(); | 149 int pos = position(); |
| 189 bool is_strict_reserved = false; | 150 bool is_strict_reserved = false; |
| 190 Identifier name = | 151 Identifier name = |
| 191 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 152 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
| 192 ExpressionClassifier no_classifier(this); | 153 ExpressionClassifier no_classifier(this); |
| 193 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, | 154 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, |
| 194 CHECK_OK); | 155 CHECK_OK); |
| 195 return Statement::Default(); | 156 return Statement::Default(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; | 191 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; |
| 231 if (Check(Token::MUL)) { | 192 if (Check(Token::MUL)) { |
| 232 flags |= ParseFunctionFlags::kIsGenerator; | 193 flags |= ParseFunctionFlags::kIsGenerator; |
| 233 if (allow_harmony_restrictive_declarations()) { | 194 if (allow_harmony_restrictive_declarations()) { |
| 234 ReportMessageAt(scanner()->location(), | 195 ReportMessageAt(scanner()->location(), |
| 235 MessageTemplate::kGeneratorInLegacyContext); | 196 MessageTemplate::kGeneratorInLegacyContext); |
| 236 *ok = false; | 197 *ok = false; |
| 237 return Statement::Default(); | 198 return Statement::Default(); |
| 238 } | 199 } |
| 239 } | 200 } |
| 201 // PreParser is not able to parse "export default" yet (since PreParser is |
| 202 // at the moment only used for functions, and it cannot occur |
| 203 // there). TODO(marja): update this when it is. |
| 240 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok); | 204 return ParseHoistableDeclaration(pos, flags, nullptr, false, ok); |
| 241 } | 205 } |
| 242 | 206 |
| 243 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement( | 207 PreParser::Statement PreParser::ParseExpressionOrLabelledStatement( |
| 244 ZoneList<const AstRawString*>* names, | 208 ZoneList<const AstRawString*>* names, |
| 245 AllowLabelledFunctionStatement allow_function, bool* ok) { | 209 AllowLabelledFunctionStatement allow_function, bool* ok) { |
| 246 // ExpressionStatement | LabelledStatement :: | 210 // ExpressionStatement | LabelledStatement :: |
| 247 // Expression ';' | 211 // Expression ';' |
| 248 // Identifier ':' Statement | 212 // Identifier ':' Statement |
| 249 | 213 |
| (...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 | 878 |
| 915 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); | 879 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); |
| 916 } | 880 } |
| 917 | 881 |
| 918 #undef CHECK_OK | 882 #undef CHECK_OK |
| 919 #undef CHECK_OK_CUSTOM | 883 #undef CHECK_OK_CUSTOM |
| 920 | 884 |
| 921 | 885 |
| 922 } // namespace internal | 886 } // namespace internal |
| 923 } // namespace v8 | 887 } // namespace v8 |
| OLD | NEW |