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 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 // AsyncFunctionDeclaration :: | 126 // AsyncFunctionDeclaration :: |
127 // async [no LineTerminator here] function BindingIdentifier[Await] | 127 // async [no LineTerminator here] function BindingIdentifier[Await] |
128 // ( FormalParameters[Await] ) { AsyncFunctionBody } | 128 // ( FormalParameters[Await] ) { AsyncFunctionBody } |
129 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); | 129 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); |
130 int pos = position(); | 130 int pos = position(); |
131 Expect(Token::FUNCTION, CHECK_OK); | 131 Expect(Token::FUNCTION, CHECK_OK); |
132 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync; | 132 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync; |
133 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); | 133 return ParseHoistableDeclaration(pos, flags, names, default_export, ok); |
134 } | 134 } |
135 | 135 |
136 PreParser::Statement PreParser::ParseClassDeclaration( | |
137 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) { | |
138 int pos = position(); | |
139 bool is_strict_reserved = false; | |
140 Identifier name = | |
141 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | |
142 ExpressionClassifier no_classifier(this); | |
143 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, | |
144 CHECK_OK); | |
145 return Statement::Default(); | |
146 } | |
147 | |
148 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { | 136 PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) { |
149 Consume(Token::FUNCTION); | 137 Consume(Token::FUNCTION); |
150 int pos = position(); | 138 int pos = position(); |
151 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; | 139 ParseFunctionFlags flags = ParseFunctionFlags::kIsNormal; |
152 if (Check(Token::MUL)) { | 140 if (Check(Token::MUL)) { |
153 flags |= ParseFunctionFlags::kIsGenerator; | 141 flags |= ParseFunctionFlags::kIsGenerator; |
154 if (allow_harmony_restrictive_declarations()) { | 142 if (allow_harmony_restrictive_declarations()) { |
155 ReportMessageAt(scanner()->location(), | 143 ReportMessageAt(scanner()->location(), |
156 MessageTemplate::kGeneratorInLegacyContext); | 144 MessageTemplate::kGeneratorInLegacyContext); |
157 *ok = false; | 145 *ok = false; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 int body_end = scanner()->peek_location().end_pos; | 258 int body_end = scanner()->peek_location().end_pos; |
271 DeclarationScope* scope = this->scope()->AsDeclarationScope(); | 259 DeclarationScope* scope = this->scope()->AsDeclarationScope(); |
272 DCHECK(scope->is_function_scope()); | 260 DCHECK(scope->is_function_scope()); |
273 log_->LogFunction(body_start, body_end, | 261 log_->LogFunction(body_start, body_end, |
274 function_state_->materialized_literal_count(), | 262 function_state_->materialized_literal_count(), |
275 function_state_->expected_property_count(), language_mode(), | 263 function_state_->expected_property_count(), language_mode(), |
276 scope->uses_super_property(), scope->calls_eval()); | 264 scope->uses_super_property(), scope->calls_eval()); |
277 return kLazyParsingComplete; | 265 return kLazyParsingComplete; |
278 } | 266 } |
279 | 267 |
280 PreParserExpression PreParser::ParseClassLiteral( | |
281 PreParserIdentifier name, Scanner::Location class_name_location, | |
282 bool name_is_strict_reserved, int pos, bool* ok) { | |
283 // All parts of a ClassDeclaration and ClassExpression are strict code. | |
284 if (name_is_strict_reserved) { | |
285 ReportMessageAt(class_name_location, | |
286 MessageTemplate::kUnexpectedStrictReserved); | |
287 *ok = false; | |
288 return EmptyExpression(); | |
289 } | |
290 if (IsEvalOrArguments(name)) { | |
291 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | |
292 *ok = false; | |
293 return EmptyExpression(); | |
294 } | |
295 | |
296 LanguageMode class_language_mode = language_mode(); | |
297 BlockState block_state(&scope_state_); | |
298 scope()->SetLanguageMode( | |
299 static_cast<LanguageMode>(class_language_mode | STRICT)); | |
300 // TODO(marja): Make PreParser use scope names too. | |
301 // this->scope()->SetScopeName(name); | |
302 | |
303 bool has_extends = Check(Token::EXTENDS); | |
304 if (has_extends) { | |
305 ExpressionClassifier extends_classifier(this); | |
306 ParseLeftHandSideExpression(CHECK_OK); | |
307 CheckNoTailCallExpressions(CHECK_OK); | |
308 ValidateExpression(CHECK_OK); | |
309 impl()->AccumulateFormalParameterContainmentErrors(); | |
310 } | |
311 | |
312 ClassLiteralChecker checker(this); | |
313 bool has_seen_constructor = false; | |
314 | |
315 Expect(Token::LBRACE, CHECK_OK); | |
316 while (peek() != Token::RBRACE) { | |
317 if (Check(Token::SEMICOLON)) continue; | |
318 bool is_computed_name = false; // Classes do not care about computed | |
319 // property names here. | |
320 ExpressionClassifier property_classifier(this); | |
321 ParseClassPropertyDefinition(&checker, has_extends, &is_computed_name, | |
322 &has_seen_constructor, CHECK_OK); | |
323 ValidateExpression(CHECK_OK); | |
324 impl()->AccumulateFormalParameterContainmentErrors(); | |
325 } | |
326 | |
327 Expect(Token::RBRACE, CHECK_OK); | |
328 | |
329 return Expression::Default(); | |
330 } | |
331 | |
332 void PreParser::ParseAsyncArrowSingleExpressionBody(PreParserStatementList body, | 268 void PreParser::ParseAsyncArrowSingleExpressionBody(PreParserStatementList body, |
333 bool accept_IN, int pos, | 269 bool accept_IN, int pos, |
334 bool* ok) { | 270 bool* ok) { |
335 scope()->ForceContextAllocation(); | 271 scope()->ForceContextAllocation(); |
336 | 272 |
337 PreParserExpression return_value = | 273 PreParserExpression return_value = |
338 ParseAssignmentExpression(accept_IN, CHECK_OK_VOID); | 274 ParseAssignmentExpression(accept_IN, CHECK_OK_VOID); |
339 | 275 |
340 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); | 276 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); |
341 } | 277 } |
342 | 278 |
343 #undef CHECK_OK | 279 #undef CHECK_OK |
344 #undef CHECK_OK_CUSTOM | 280 #undef CHECK_OK_CUSTOM |
345 | 281 |
346 | 282 |
347 } // namespace internal | 283 } // namespace internal |
348 } // namespace v8 | 284 } // namespace v8 |
OLD | NEW |