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

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

Issue 2636543002: PreParser scope analysis: sloppy block funcs. (Closed)
Patch Set: proactive code review 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') | src/parsing/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_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 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 PreParserLogger* logger() { return &log_; } 879 PreParserLogger* logger() { return &log_; }
880 880
881 // Pre-parse the program from the character stream; returns true on 881 // Pre-parse the program from the character stream; returns true on
882 // success (even if parsing failed, the pre-parse data successfully 882 // success (even if parsing failed, the pre-parse data successfully
883 // captured the syntax error), and false if a stack-overflow happened 883 // captured the syntax error), and false if a stack-overflow happened
884 // during parsing. 884 // during parsing.
885 PreParseResult PreParseProgram(int* materialized_literals = 0, 885 PreParseResult PreParseProgram(int* materialized_literals = 0,
886 bool is_module = false) { 886 bool is_module = false) {
887 DCHECK_NULL(scope_state_); 887 DCHECK_NULL(scope_state_);
888 DeclarationScope* scope = NewScriptScope(); 888 DeclarationScope* scope = NewScriptScope();
889 #ifdef DEBUG
890 scope->set_is_being_lazily_parsed(true);
891 #endif
889 892
890 // ModuleDeclarationInstantiation for Source Text Module Records creates a 893 // ModuleDeclarationInstantiation for Source Text Module Records creates a
891 // new Module Environment Record whose outer lexical environment record is 894 // new Module Environment Record whose outer lexical environment record is
892 // the global scope. 895 // the global scope.
893 if (is_module) scope = NewModuleScope(scope); 896 if (is_module) scope = NewModuleScope(scope);
894 897
895 FunctionState top_scope(&function_state_, &scope_state_, scope); 898 FunctionState top_scope(&function_state_, &scope_state_, scope);
896 bool ok = true; 899 bool ok = true;
897 int start_position = scanner()->peek_location().beg_pos; 900 int start_position = scanner()->peek_location().beg_pos;
898 parsing_module_ = is_module; 901 parsing_module_ = is_module;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 V8_INLINE PreParserStatement LookupBreakTarget(PreParserIdentifier label, 1085 V8_INLINE PreParserStatement LookupBreakTarget(PreParserIdentifier label,
1083 bool* ok) { 1086 bool* ok) {
1084 return PreParserStatement::Default(); 1087 return PreParserStatement::Default();
1085 } 1088 }
1086 V8_INLINE PreParserStatement LookupContinueTarget(PreParserIdentifier label, 1089 V8_INLINE PreParserStatement LookupContinueTarget(PreParserIdentifier label,
1087 bool* ok) { 1090 bool* ok) {
1088 return PreParserStatement::Default(); 1091 return PreParserStatement::Default();
1089 } 1092 }
1090 1093
1091 V8_INLINE PreParserStatement DeclareFunction( 1094 V8_INLINE PreParserStatement DeclareFunction(
1092 PreParserIdentifier variable_name, PreParserExpression function, int pos, 1095 PreParserIdentifier variable_name, PreParserExpression function,
1093 bool is_generator, bool is_async, ZoneList<const AstRawString*>* names, 1096 VariableMode mode, int pos, bool is_generator, bool is_async,
1097 bool is_sloppy_block_function, ZoneList<const AstRawString*>* names,
1094 bool* ok) { 1098 bool* ok) {
1099 DCHECK_NULL(names);
1100 if (variable_name.string_ != nullptr) {
1101 DCHECK(track_unresolved_variables_);
1102 scope()->DeclareVariableName(variable_name.string_, mode);
1103 if (is_sloppy_block_function) {
1104 GetDeclarationScope()->DeclareSloppyBlockFunction(variable_name.string_,
1105 scope());
1106 }
1107 }
1095 return Statement::Default(); 1108 return Statement::Default();
1096 } 1109 }
1097 1110
1098 V8_INLINE PreParserStatement 1111 V8_INLINE PreParserStatement
1099 DeclareClass(PreParserIdentifier variable_name, PreParserExpression value, 1112 DeclareClass(PreParserIdentifier variable_name, PreParserExpression value,
1100 ZoneList<const AstRawString*>* names, int class_token_pos, 1113 ZoneList<const AstRawString*>* names, int class_token_pos,
1101 int end_pos, bool* ok) { 1114 int end_pos, bool* ok) {
1102 // Preparser shouldn't be used in contexts where we need to track the names. 1115 // Preparser shouldn't be used in contexts where we need to track the names.
1103 DCHECK_NULL(names); 1116 DCHECK_NULL(names);
1104 if (variable_name.string_ != nullptr) { 1117 if (variable_name.string_ != nullptr) {
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 int pos) { 1622 int pos) {
1610 return factory()->NewCallNew(function, args, pos); 1623 return factory()->NewCallNew(function, args, pos);
1611 } 1624 }
1612 1625
1613 PreParserStatementList PreParser::ParseEagerFunctionBody( 1626 PreParserStatementList PreParser::ParseEagerFunctionBody(
1614 PreParserIdentifier function_name, int pos, 1627 PreParserIdentifier function_name, int pos,
1615 const PreParserFormalParameters& parameters, FunctionKind kind, 1628 const PreParserFormalParameters& parameters, FunctionKind kind,
1616 FunctionLiteral::FunctionType function_type, bool* ok) { 1629 FunctionLiteral::FunctionType function_type, bool* ok) {
1617 PreParserStatementList result; 1630 PreParserStatementList result;
1618 1631
1619 Scope* inner_scope = scope(); 1632 DeclarationScope* inner_scope = scope()->AsDeclarationScope();
1620 if (!parameters.is_simple) inner_scope = NewScope(BLOCK_SCOPE); 1633 if (!parameters.is_simple) inner_scope = NewVarblockScope();
1621 1634
1622 { 1635 {
1623 BlockState block_state(&scope_state_, inner_scope); 1636 BlockState block_state(&scope_state_, inner_scope);
1624 ParseStatementList(result, Token::RBRACE, ok); 1637 ParseStatementList(result, Token::RBRACE, ok);
1625 if (!*ok) return PreParserStatementList(); 1638 if (!*ok) return PreParserStatementList();
1626 } 1639 }
1627 1640
1628 Expect(Token::RBRACE, ok); 1641 Expect(Token::RBRACE, ok);
1642
1643 if (is_sloppy(inner_scope->language_mode())) {
1644 inner_scope->HoistSloppyBlockFunctions(nullptr);
1645 }
1629 return result; 1646 return result;
1630 } 1647 }
1631 1648
1632 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state, 1649 PreParserExpression PreParser::CloseTemplateLiteral(TemplateLiteralState* state,
1633 int start, 1650 int start,
1634 PreParserExpression tag) { 1651 PreParserExpression tag) {
1635 if (IsTaggedTemplate(tag)) { 1652 if (IsTaggedTemplate(tag)) {
1636 // Emulate generation of array literals for tag callsite 1653 // Emulate generation of array literals for tag callsite
1637 // 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
1638 function_state_->NextMaterializedLiteralIndex(); 1655 function_state_->NextMaterializedLiteralIndex();
1639 function_state_->NextMaterializedLiteralIndex(); 1656 function_state_->NextMaterializedLiteralIndex();
1640 } 1657 }
1641 return EmptyExpression(); 1658 return EmptyExpression();
1642 } 1659 }
1643 1660
1644 } // namespace internal 1661 } // namespace internal
1645 } // namespace v8 1662 } // namespace v8
1646 1663
1647 #endif // V8_PARSING_PREPARSER_H 1664 #endif // V8_PARSING_PREPARSER_H
OLDNEW
« no previous file with comments | « src/parsing/parser-base.h ('k') | src/parsing/preparser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698