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

Side by Side Diff: src/parsing/parser.cc

Issue 2267493002: Disallow 'await' in object literal shorthand position (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: More cleanup Created 4 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 #include "src/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast.h" 10 #include "src/ast/ast.h"
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 } 394 }
395 395
396 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const { 396 bool ParserTraits::IsEvalOrArguments(const AstRawString* identifier) const {
397 return IsEval(identifier) || IsArguments(identifier); 397 return IsEval(identifier) || IsArguments(identifier);
398 } 398 }
399 399
400 bool ParserTraits::IsUndefined(const AstRawString* identifier) const { 400 bool ParserTraits::IsUndefined(const AstRawString* identifier) const {
401 return identifier == parser_->ast_value_factory()->undefined_string(); 401 return identifier == parser_->ast_value_factory()->undefined_string();
402 } 402 }
403 403
404 bool ParserTraits::IsAwait(const AstRawString* identifier) const {
405 return identifier == parser_->ast_value_factory()->await_string();
406 }
407
408 bool ParserTraits::IsPrototype(const AstRawString* identifier) const { 404 bool ParserTraits::IsPrototype(const AstRawString* identifier) const {
409 return identifier == parser_->ast_value_factory()->prototype_string(); 405 return identifier == parser_->ast_value_factory()->prototype_string();
410 } 406 }
411 407
412 408
413 bool ParserTraits::IsConstructor(const AstRawString* identifier) const { 409 bool ParserTraits::IsConstructor(const AstRawString* identifier) const {
414 return identifier == parser_->ast_value_factory()->constructor_string(); 410 return identifier == parser_->ast_value_factory()->constructor_string();
415 } 411 }
416 412
417 413
(...skipping 1754 matching lines...) Expand 10 before | Expand all | Expand 10 after
2172 name_validity = kSkipFunctionNameCheck; 2168 name_validity = kSkipFunctionNameCheck;
2173 variable_name = ast_value_factory()->star_default_star_string(); 2169 variable_name = ast_value_factory()->star_default_star_string();
2174 } else { 2170 } else {
2175 bool is_strict_reserved; 2171 bool is_strict_reserved;
2176 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 2172 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
2177 name_validity = is_strict_reserved ? kFunctionNameIsStrictReserved 2173 name_validity = is_strict_reserved ? kFunctionNameIsStrictReserved
2178 : kFunctionNameValidityUnknown; 2174 : kFunctionNameValidityUnknown;
2179 variable_name = name; 2175 variable_name = name;
2180 } 2176 }
2181 2177
2182 if (V8_UNLIKELY(is_async_function() && this->IsAwait(name))) {
2183 ReportMessageAt(scanner()->location(),
2184 MessageTemplate::kAwaitBindingIdentifier);
2185 *ok = false;
2186 return nullptr;
2187 }
2188
2189 FuncNameInferrer::State fni_state(fni_); 2178 FuncNameInferrer::State fni_state(fni_);
2190 if (fni_ != NULL) fni_->PushEnclosingName(name); 2179 if (fni_ != NULL) fni_->PushEnclosingName(name);
2191 FunctionLiteral* fun = ParseFunctionLiteral( 2180 FunctionLiteral* fun = ParseFunctionLiteral(
2192 name, scanner()->location(), name_validity, 2181 name, scanner()->location(), name_validity,
2193 is_generator ? FunctionKind::kGeneratorFunction 2182 is_generator ? FunctionKind::kGeneratorFunction
2194 : is_async ? FunctionKind::kAsyncFunction 2183 : is_async ? FunctionKind::kAsyncFunction
2195 : FunctionKind::kNormalFunction, 2184 : FunctionKind::kNormalFunction,
2196 pos, FunctionLiteral::kDeclaration, language_mode(), CHECK_OK); 2185 pos, FunctionLiteral::kDeclaration, language_mode(), CHECK_OK);
2197 2186
2198 // In ES6, a function behaves as a lexical binding, except in 2187 // In ES6, a function behaves as a lexical binding, except in
(...skipping 2284 matching lines...) Expand 10 before | Expand all | Expand 10 after
4483 // ( FormalParameters[Await] ) { AsyncFunctionBody } 4472 // ( FormalParameters[Await] ) { AsyncFunctionBody }
4484 DCHECK_EQ(scanner()->current_token(), Token::ASYNC); 4473 DCHECK_EQ(scanner()->current_token(), Token::ASYNC);
4485 int pos = position(); 4474 int pos = position();
4486 Expect(Token::FUNCTION, CHECK_OK); 4475 Expect(Token::FUNCTION, CHECK_OK);
4487 bool is_strict_reserved = false; 4476 bool is_strict_reserved = false;
4488 const AstRawString* name = nullptr; 4477 const AstRawString* name = nullptr;
4489 FunctionLiteral::FunctionType type = FunctionLiteral::kAnonymousExpression; 4478 FunctionLiteral::FunctionType type = FunctionLiteral::kAnonymousExpression;
4490 4479
4491 if (peek_any_identifier()) { 4480 if (peek_any_identifier()) {
4492 type = FunctionLiteral::kNamedExpression; 4481 type = FunctionLiteral::kNamedExpression;
4493 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 4482 name = ParseIdentifierOrStrictReservedWord(FunctionKind::kAsyncFunction,
4494 if (this->IsAwait(name)) { 4483 &is_strict_reserved, CHECK_OK);
4495 ReportMessageAt(scanner()->location(),
4496 MessageTemplate::kAwaitBindingIdentifier);
4497 *ok = false;
4498 return nullptr;
4499 }
4500 } 4484 }
4501 return ParseFunctionLiteral(name, scanner()->location(), 4485 return ParseFunctionLiteral(name, scanner()->location(),
4502 is_strict_reserved ? kFunctionNameIsStrictReserved 4486 is_strict_reserved ? kFunctionNameIsStrictReserved
4503 : kFunctionNameValidityUnknown, 4487 : kFunctionNameValidityUnknown,
4504 FunctionKind::kAsyncFunction, pos, type, 4488 FunctionKind::kAsyncFunction, pos, type,
4505 language_mode(), CHECK_OK); 4489 language_mode(), CHECK_OK);
4506 } 4490 }
4507 4491
4508 void Parser::SkipLazyFunctionBody(int* materialized_literal_count, 4492 void Parser::SkipLazyFunctionBody(int* materialized_literal_count,
4509 int* expected_property_count, bool* ok, 4493 int* expected_property_count, bool* ok,
(...skipping 2512 matching lines...) Expand 10 before | Expand all | Expand 10 after
7022 node->Print(Isolate::Current()); 7006 node->Print(Isolate::Current());
7023 } 7007 }
7024 #endif // DEBUG 7008 #endif // DEBUG
7025 7009
7026 #undef CHECK_OK 7010 #undef CHECK_OK
7027 #undef CHECK_OK_VOID 7011 #undef CHECK_OK_VOID
7028 #undef CHECK_FAILED 7012 #undef CHECK_FAILED
7029 7013
7030 } // namespace internal 7014 } // namespace internal
7031 } // namespace v8 7015 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | src/parsing/parser-base.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698