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

Side by Side Diff: src/parsing/preparser.h

Issue 2638333002: Parsing:Create the same scopes for non-simple params in PreParser & Parser. (Closed)
Patch Set: rest of the impl Created 3 years, 11 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
« no previous file with comments | « src/parsing/parser-base.h ('k') | no next file » | 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_PARSING_PREPARSER_H 5 #ifndef V8_PARSING_PREPARSER_H
6 #define V8_PARSING_PREPARSER_H 6 #define V8_PARSING_PREPARSER_H
7 7
8 #include "src/ast/ast.h" 8 #include "src/ast/ast.h"
9 #include "src/ast/scopes.h" 9 #include "src/ast/scopes.h"
10 #include "src/parsing/parser-base.h" 10 #include "src/parsing/parser-base.h"
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 407
408 // The pre-parser doesn't need to build lists of expressions, identifiers, or 408 // The pre-parser doesn't need to build lists of expressions, identifiers, or
409 // the like. If the PreParser is used in variable tracking mode, it needs to 409 // the like. If the PreParser is used in variable tracking mode, it needs to
410 // build lists of variables though. 410 // build lists of variables though.
411 template <typename T> 411 template <typename T>
412 class PreParserList { 412 class PreParserList {
413 public: 413 public:
414 // These functions make list->Add(some_expression) work (and do nothing). 414 // These functions make list->Add(some_expression) work (and do nothing).
415 PreParserList() : length_(0), variables_(nullptr) {} 415 PreParserList() : length_(0), variables_(nullptr) {}
416 PreParserList* operator->() { return this; } 416 PreParserList* operator->() { return this; }
417 void Add(T, Zone* zone); 417 void Add(const T& element, Zone* zone);
418 int length() const { return length_; } 418 int length() const { return length_; }
419 static PreParserList Null() { return PreParserList(-1); } 419 static PreParserList Null() { return PreParserList(-1); }
420 bool IsNull() const { return length_ == -1; } 420 bool IsNull() const { return length_ == -1; }
421 void Set(int index, const T& element) {}
421 422
422 private: 423 private:
423 explicit PreParserList(int n) : length_(n), variables_(nullptr) {} 424 explicit PreParserList(int n) : length_(n), variables_(nullptr) {}
424 int length_; 425 int length_;
425 ZoneList<VariableProxy*>* variables_; 426 ZoneList<VariableProxy*>* variables_;
426 427
427 friend class PreParser; 428 friend class PreParser;
428 friend class PreParserFactory; 429 friend class PreParserFactory;
429 }; 430 };
430 431
431 template <> 432 template <>
432 inline void PreParserList<PreParserExpression>::Add( 433 inline void PreParserList<PreParserExpression>::Add(
433 PreParserExpression expression, Zone* zone) { 434 const PreParserExpression& expression, Zone* zone) {
434 if (expression.variables_ != nullptr) { 435 if (expression.variables_ != nullptr) {
435 DCHECK(FLAG_lazy_inner_functions); 436 DCHECK(FLAG_lazy_inner_functions);
436 DCHECK(zone != nullptr); 437 DCHECK(zone != nullptr);
437 if (variables_ == nullptr) { 438 if (variables_ == nullptr) {
438 variables_ = new (zone) ZoneList<VariableProxy*>(1, zone); 439 variables_ = new (zone) ZoneList<VariableProxy*>(1, zone);
439 } 440 }
440 for (auto identifier : (*expression.variables_)) { 441 for (auto identifier : (*expression.variables_)) {
441 variables_->Add(identifier, zone); 442 variables_->Add(identifier, zone);
442 } 443 }
443 } 444 }
444 ++length_; 445 ++length_;
445 } 446 }
446 447
447 template <typename T> 448 template <typename T>
448 void PreParserList<T>::Add(T, Zone* zone) { 449 void PreParserList<T>::Add(const T& element, Zone* zone) {
449 ++length_; 450 ++length_;
450 } 451 }
451 452
452 typedef PreParserList<PreParserExpression> PreParserExpressionList; 453 typedef PreParserList<PreParserExpression> PreParserExpressionList;
453 454
454 class PreParserStatement; 455 class PreParserStatement;
455 typedef PreParserList<PreParserStatement> PreParserStatementList; 456 typedef PreParserList<PreParserStatement> PreParserStatementList;
456 457
457 class PreParserStatement { 458 class PreParserStatement {
458 public: 459 public:
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 // These types form an algebra over syntactic categories that is just 933 // These types form an algebra over syntactic categories that is just
933 // rich enough to let us recognize and propagate the constructs that 934 // rich enough to let us recognize and propagate the constructs that
934 // are either being counted in the preparser data, or is important 935 // are either being counted in the preparser data, or is important
935 // to throw the correct syntax error exceptions. 936 // to throw the correct syntax error exceptions.
936 937
937 // All ParseXXX functions take as the last argument an *ok parameter 938 // All ParseXXX functions take as the last argument an *ok parameter
938 // which is set to false if parsing failed; it is unchanged otherwise. 939 // which is set to false if parsing failed; it is unchanged otherwise.
939 // By making the 'exception handling' explicit, we are forced to check 940 // By making the 'exception handling' explicit, we are forced to check
940 // for failure at the call sites. 941 // for failure at the call sites.
941 942
942 V8_INLINE PreParserStatementList ParseEagerFunctionBody(
943 PreParserIdentifier function_name, int pos,
944 const PreParserFormalParameters& parameters, FunctionKind kind,
945 FunctionLiteral::FunctionType function_type, bool* ok);
946
947 // Indicates that we won't switch from the preparser to the preparser; we'll 943 // Indicates that we won't switch from the preparser to the preparser; we'll
948 // just stay where we are. 944 // just stay where we are.
949 bool AllowsLazyParsingWithoutUnresolvedVariables() const { return false; } 945 bool AllowsLazyParsingWithoutUnresolvedVariables() const { return false; }
950 bool parse_lazily() const { return false; } 946 bool parse_lazily() const { return false; }
951 947
952 V8_INLINE LazyParsingResult SkipFunction( 948 V8_INLINE LazyParsingResult SkipFunction(
953 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters, 949 FunctionKind kind, DeclarationScope* function_scope, int* num_parameters,
954 int* function_length, bool* has_duplicate_parameters, 950 int* function_length, bool* has_duplicate_parameters,
955 int* materialized_literal_count, int* expected_property_count, 951 int* materialized_literal_count, int* expected_property_count,
956 bool is_inner_function, bool may_abort, bool* ok) { 952 bool is_inner_function, bool may_abort, bool* ok) {
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 } 1064 }
1069 } 1065 }
1070 1066
1071 V8_INLINE void ValidateCatchBlock(const CatchInfo& catch_info, bool* ok) {} 1067 V8_INLINE void ValidateCatchBlock(const CatchInfo& catch_info, bool* ok) {}
1072 V8_INLINE PreParserStatement RewriteTryStatement( 1068 V8_INLINE PreParserStatement RewriteTryStatement(
1073 PreParserStatement try_block, PreParserStatement catch_block, 1069 PreParserStatement try_block, PreParserStatement catch_block,
1074 PreParserStatement finally_block, const CatchInfo& catch_info, int pos) { 1070 PreParserStatement finally_block, const CatchInfo& catch_info, int pos) {
1075 return PreParserStatement::Default(); 1071 return PreParserStatement::Default();
1076 } 1072 }
1077 1073
1074 V8_INLINE void ParseAndRewriteGeneratorFunctionBody(
1075 int pos, FunctionKind kind, PreParserStatementList body, bool* ok) {
1076 ParseStatementList(body, Token::RBRACE, ok);
1077 }
1078 V8_INLINE void CreateFunctionNameAssignment(
1079 PreParserIdentifier function_name, int pos,
1080 FunctionLiteral::FunctionType function_type,
1081 DeclarationScope* function_scope, PreParserStatementList result,
1082 int index) {}
1083
1078 V8_INLINE PreParserExpression RewriteDoExpression(PreParserStatement body, 1084 V8_INLINE PreParserExpression RewriteDoExpression(PreParserStatement body,
1079 int pos, bool* ok) { 1085 int pos, bool* ok) {
1080 return PreParserExpression::Default(); 1086 return PreParserExpression::Default();
1081 } 1087 }
1082 1088
1083 // TODO(nikolaos): The preparser currently does not keep track of labels 1089 // TODO(nikolaos): The preparser currently does not keep track of labels
1084 // and targets. 1090 // and targets.
1085 V8_INLINE PreParserStatement LookupBreakTarget(PreParserIdentifier label, 1091 V8_INLINE PreParserStatement LookupBreakTarget(PreParserIdentifier label,
1086 bool* ok) { 1092 bool* ok) {
1087 return PreParserStatement::Default(); 1093 return PreParserStatement::Default();
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 } 1327 }
1322 1328
1323 V8_INLINE StatementT DesugarLexicalBindingsInForStatement( 1329 V8_INLINE StatementT DesugarLexicalBindingsInForStatement(
1324 PreParserStatement loop, PreParserStatement init, 1330 PreParserStatement loop, PreParserStatement init,
1325 PreParserExpression cond, PreParserStatement next, 1331 PreParserExpression cond, PreParserStatement next,
1326 PreParserStatement body, Scope* inner_scope, const ForInfo& for_info, 1332 PreParserStatement body, Scope* inner_scope, const ForInfo& for_info,
1327 bool* ok) { 1333 bool* ok) {
1328 return loop; 1334 return loop;
1329 } 1335 }
1330 1336
1337 V8_INLINE PreParserStatement BuildParameterInitializationBlock(
1338 const PreParserFormalParameters& parameters, bool* ok) {
1339 return PreParserStatement::Default();
1340 }
1341
1342 V8_INLINE PreParserStatement
1343 BuildRejectPromiseOnException(PreParserStatement init_block) {
1344 return PreParserStatement::Default();
1345 }
1346
1347 V8_INLINE void InsertSloppyBlockFunctionVarBindings(DeclarationScope* scope) {
1348 scope->HoistSloppyBlockFunctions(nullptr);
1349 }
1350
1351 V8_INLINE void InsertShadowingVarBindingInitializers(
1352 PreParserStatement block) {}
1353
1331 V8_INLINE PreParserExpression 1354 V8_INLINE PreParserExpression
1332 NewThrowReferenceError(MessageTemplate::Template message, int pos) { 1355 NewThrowReferenceError(MessageTemplate::Template message, int pos) {
1333 return PreParserExpression::Default(); 1356 return PreParserExpression::Default();
1334 } 1357 }
1335 1358
1336 V8_INLINE PreParserExpression NewThrowSyntaxError( 1359 V8_INLINE PreParserExpression NewThrowSyntaxError(
1337 MessageTemplate::Template message, PreParserIdentifier arg, int pos) { 1360 MessageTemplate::Template message, PreParserIdentifier arg, int pos) {
1338 return PreParserExpression::Default(); 1361 return PreParserExpression::Default();
1339 } 1362 }
1340 1363
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 int pos) { 1639 int pos) {
1617 return factory()->NewCall(function, args, pos); 1640 return factory()->NewCall(function, args, pos);
1618 } 1641 }
1619 1642
1620 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function, 1643 PreParserExpression PreParser::SpreadCallNew(PreParserExpression function,
1621 PreParserExpressionList args, 1644 PreParserExpressionList args,
1622 int pos) { 1645 int pos) {
1623 return factory()->NewCallNew(function, args, pos); 1646 return factory()->NewCallNew(function, args, pos);
1624 } 1647 }
1625 1648
1626 PreParserStatementList PreParser::ParseEagerFunctionBody(
1627 PreParserIdentifier function_name, int pos,
1628 const PreParserFormalParameters& parameters, FunctionKind kind,
1629 FunctionLiteral::FunctionType function_type, bool* ok) {
1630 PreParserStatementList result;
1631
1632 DeclarationScope* inner_scope = scope()->AsDeclarationScope();
1633 if (!parameters.is_simple) inner_scope = NewVarblockScope();
1634
1635 {
1636 BlockState block_state(&scope_state_, inner_scope);
1637 ParseStatementList(result, Token::RBRACE, ok);
1638 if (!*ok) return PreParserStatementList();
1639 }
1640
1641 Expect(Token::RBRACE, ok);
1642
1643 if (is_sloppy(inner_scope->language_mode())) {
1644 inner_scope->HoistSloppyBlockFunctions(nullptr);
1645 }
1646 return result;
1647 }
1648
1649 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state, 1649 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state,
1650 int start, 1650 int start,
1651 PreParserExpression tag) { 1651 PreParserExpression tag) {
1652 if (IsTaggedTemplate(tag)) { 1652 if (IsTaggedTemplate(tag)) {
1653 // Emulate generation of array literals for tag callsite 1653 // Emulate generation of array literals for tag callsite
1654 // 1st is array of cooked strings, second is array of raw strings 1654 // 1st is array of cooked strings, second is array of raw strings
1655 function_state_->NextMaterializedLiteralIndex(); 1655 function_state_->NextMaterializedLiteralIndex();
1656 function_state_->NextMaterializedLiteralIndex(); 1656 function_state_->NextMaterializedLiteralIndex();
1657 } 1657 }
1658 return EmptyExpression(); 1658 return EmptyExpression();
1659 } 1659 }
1660 1660
1661 } // namespace internal 1661 } // namespace internal
1662 } // namespace v8 1662 } // namespace v8
1663 1663
1664 #endif // V8_PARSING_PREPARSER_H 1664 #endif // V8_PARSING_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parsing/parser-base.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698