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

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

Issue 2349193002: Don't make immediately resolved proxies unresolved (Closed)
Patch Set: Created 4 years, 3 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/ast/scopes.cc ('k') | src/parsing/pattern-rewriter.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 #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-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 1467 matching lines...) Expand 10 before | Expand all | Expand 10 after
1478 Declaration* Parser::DeclareVariable(const AstRawString* name, 1478 Declaration* Parser::DeclareVariable(const AstRawString* name,
1479 VariableMode mode, int pos, bool* ok) { 1479 VariableMode mode, int pos, bool* ok) {
1480 return DeclareVariable(name, mode, Variable::DefaultInitializationFlag(mode), 1480 return DeclareVariable(name, mode, Variable::DefaultInitializationFlag(mode),
1481 pos, ok); 1481 pos, ok);
1482 } 1482 }
1483 1483
1484 Declaration* Parser::DeclareVariable(const AstRawString* name, 1484 Declaration* Parser::DeclareVariable(const AstRawString* name,
1485 VariableMode mode, InitializationFlag init, 1485 VariableMode mode, InitializationFlag init,
1486 int pos, bool* ok) { 1486 int pos, bool* ok) {
1487 DCHECK_NOT_NULL(name); 1487 DCHECK_NOT_NULL(name);
1488 Scope* scope = 1488 VariableProxy* proxy = factory()->NewVariableProxy(
1489 IsLexicalVariableMode(mode) ? this->scope() : GetDeclarationScope(); 1489 name, NORMAL_VARIABLE, scanner()->location().beg_pos,
1490 VariableProxy* proxy = 1490 scanner()->location().end_pos);
1491 scope->NewUnresolved(factory(), name, scanner()->location().beg_pos,
1492 scanner()->location().end_pos);
1493 Declaration* declaration = 1491 Declaration* declaration =
1494 factory()->NewVariableDeclaration(proxy, this->scope(), pos); 1492 factory()->NewVariableDeclaration(proxy, this->scope(), pos);
1495 Declare(declaration, DeclarationDescriptor::NORMAL, mode, init, CHECK_OK); 1493 Declare(declaration, DeclarationDescriptor::NORMAL, mode, init, CHECK_OK);
1496 return declaration; 1494 return declaration;
1497 } 1495 }
1498 1496
1499 Variable* Parser::Declare(Declaration* declaration, 1497 Variable* Parser::Declare(Declaration* declaration,
1500 DeclarationDescriptor::Kind declaration_kind, 1498 DeclarationDescriptor::Kind declaration_kind,
1501 VariableMode mode, InitializationFlag init, bool* ok, 1499 VariableMode mode, InitializationFlag init, bool* ok,
1502 Scope* scope) { 1500 Scope* scope) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1649 Statement* Parser::DeclareFunction(const AstRawString* variable_name, 1647 Statement* Parser::DeclareFunction(const AstRawString* variable_name,
1650 FunctionLiteral* function, int pos, 1648 FunctionLiteral* function, int pos,
1651 bool is_generator, bool is_async, 1649 bool is_generator, bool is_async,
1652 ZoneList<const AstRawString*>* names, 1650 ZoneList<const AstRawString*>* names,
1653 bool* ok) { 1651 bool* ok) {
1654 // In ES6, a function behaves as a lexical binding, except in 1652 // In ES6, a function behaves as a lexical binding, except in
1655 // a script scope, or the initial scope of eval or another function. 1653 // a script scope, or the initial scope of eval or another function.
1656 VariableMode mode = 1654 VariableMode mode =
1657 (!scope()->is_declaration_scope() || scope()->is_module_scope()) ? LET 1655 (!scope()->is_declaration_scope() || scope()->is_module_scope()) ? LET
1658 : VAR; 1656 : VAR;
1659 VariableProxy* proxy = NewUnresolved(variable_name); 1657 VariableProxy* proxy =
1658 factory()->NewVariableProxy(variable_name, NORMAL_VARIABLE);
1660 Declaration* declaration = 1659 Declaration* declaration =
1661 factory()->NewFunctionDeclaration(proxy, function, scope(), pos); 1660 factory()->NewFunctionDeclaration(proxy, function, scope(), pos);
1662 Declare(declaration, DeclarationDescriptor::NORMAL, mode, kCreatedInitialized, 1661 Declare(declaration, DeclarationDescriptor::NORMAL, mode, kCreatedInitialized,
1663 CHECK_OK); 1662 CHECK_OK);
1664 if (names) names->Add(variable_name, zone()); 1663 if (names) names->Add(variable_name, zone());
1665 // Async functions don't undergo sloppy mode block scoped hoisting, and don't 1664 // Async functions don't undergo sloppy mode block scoped hoisting, and don't
1666 // allow duplicates in a block. Both are represented by the 1665 // allow duplicates in a block. Both are represented by the
1667 // sloppy_block_function_map. Don't add them to the map for async functions. 1666 // sloppy_block_function_map. Don't add them to the map for async functions.
1668 // Generators are also supposed to be prohibited; currently doing this behind 1667 // Generators are also supposed to be prohibited; currently doing this behind
1669 // a flag and UseCounting violations to assess web compatibility. 1668 // a flag and UseCounting violations to assess web compatibility.
(...skipping 2180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3850 } 3849 }
3851 3850
3852 BlockState block_state(&scope_state_); 3851 BlockState block_state(&scope_state_);
3853 RaiseLanguageMode(STRICT); 3852 RaiseLanguageMode(STRICT);
3854 #ifdef DEBUG 3853 #ifdef DEBUG
3855 scope()->SetScopeName(name); 3854 scope()->SetScopeName(name);
3856 #endif 3855 #endif
3857 3856
3858 VariableProxy* proxy = nullptr; 3857 VariableProxy* proxy = nullptr;
3859 if (name != nullptr) { 3858 if (name != nullptr) {
3860 proxy = NewUnresolved(name); 3859 proxy = factory()->NewVariableProxy(name, NORMAL_VARIABLE);
3861 // TODO(verwaest): declare via block_state. 3860 // TODO(verwaest): declare via block_state.
3862 Declaration* declaration = 3861 Declaration* declaration =
3863 factory()->NewVariableDeclaration(proxy, block_state.scope(), pos); 3862 factory()->NewVariableDeclaration(proxy, block_state.scope(), pos);
3864 Declare(declaration, DeclarationDescriptor::NORMAL, CONST, 3863 Declare(declaration, DeclarationDescriptor::NORMAL, CONST,
3865 Variable::DefaultInitializationFlag(CONST), CHECK_OK); 3864 Variable::DefaultInitializationFlag(CONST), CHECK_OK);
3866 } 3865 }
3867 3866
3868 Expression* extends = nullptr; 3867 Expression* extends = nullptr;
3869 if (Check(Token::EXTENDS)) { 3868 if (Check(Token::EXTENDS)) {
3870 block_state.set_start_position(scanner()->location().end_pos); 3869 block_state.set_start_position(scanner()->location().end_pos);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3934 // if (is_computed_name) { // TODO(bakkot) figure out why this is 3933 // if (is_computed_name) { // TODO(bakkot) figure out why this is
3935 // necessary for non-computed names in full-codegen 3934 // necessary for non-computed names in full-codegen
3936 ZoneList<Expression*>* to_name_args = 3935 ZoneList<Expression*>* to_name_args =
3937 new (zone()) ZoneList<Expression*>(1, zone()); 3936 new (zone()) ZoneList<Expression*>(1, zone());
3938 to_name_args->Add(property->key(), zone()); 3937 to_name_args->Add(property->key(), zone());
3939 property->set_key(factory()->NewCallRuntime( 3938 property->set_key(factory()->NewCallRuntime(
3940 Runtime::kToName, to_name_args, kNoSourcePosition)); 3939 Runtime::kToName, to_name_args, kNoSourcePosition));
3941 //} 3940 //}
3942 const AstRawString* name = ClassFieldVariableName( 3941 const AstRawString* name = ClassFieldVariableName(
3943 true, ast_value_factory(), instance_field_initializers->length()); 3942 true, ast_value_factory(), instance_field_initializers->length());
3944 VariableProxy* name_proxy = NewUnresolved(name); 3943 VariableProxy* name_proxy =
3944 factory()->NewVariableProxy(name, NORMAL_VARIABLE);
3945 Declaration* name_declaration = factory()->NewVariableDeclaration( 3945 Declaration* name_declaration = factory()->NewVariableDeclaration(
3946 name_proxy, scope(), kNoSourcePosition); 3946 name_proxy, scope(), kNoSourcePosition);
3947 Variable* name_var = 3947 Variable* name_var =
3948 Declare(name_declaration, DeclarationDescriptor::NORMAL, CONST, 3948 Declare(name_declaration, DeclarationDescriptor::NORMAL, CONST,
3949 kNeedsInitialization, ok, scope()); 3949 kNeedsInitialization, ok, scope());
3950 DCHECK(ok); 3950 DCHECK(ok);
3951 if (!ok) return nullptr; 3951 if (!ok) return nullptr;
3952 instance_field_initializers->Add(property->value(), zone()); 3952 instance_field_initializers->Add(property->value(), zone());
3953 property->set_value(factory()->NewVariableProxy(name_var)); 3953 property->set_value(factory()->NewVariableProxy(name_var));
3954 } 3954 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
4015 Assignment* assignment = factory()->NewAssignment( 4015 Assignment* assignment = factory()->NewAssignment(
4016 Token::INIT, factory()->NewVariableProxy(init_fn_var), initializer, 4016 Token::INIT, factory()->NewVariableProxy(init_fn_var), initializer,
4017 kNoSourcePosition); 4017 kNoSourcePosition);
4018 do_block->statements()->Add( 4018 do_block->statements()->Add(
4019 factory()->NewExpressionStatement(assignment, kNoSourcePosition), 4019 factory()->NewExpressionStatement(assignment, kNoSourcePosition),
4020 zone()); 4020 zone());
4021 } 4021 }
4022 for (int i = 0; i < instance_field_initializers->length(); ++i) { 4022 for (int i = 0; i < instance_field_initializers->length(); ++i) {
4023 const AstRawString* function_name = 4023 const AstRawString* function_name =
4024 ClassFieldVariableName(false, ast_value_factory(), i); 4024 ClassFieldVariableName(false, ast_value_factory(), i);
4025 VariableProxy* function_proxy = NewUnresolved(function_name); 4025 VariableProxy* function_proxy =
4026 factory()->NewVariableProxy(function_name, NORMAL_VARIABLE);
4026 Declaration* function_declaration = factory()->NewVariableDeclaration( 4027 Declaration* function_declaration = factory()->NewVariableDeclaration(
4027 function_proxy, scope(), kNoSourcePosition); 4028 function_proxy, scope(), kNoSourcePosition);
4028 Variable* function_var = 4029 Variable* function_var =
4029 Declare(function_declaration, DeclarationDescriptor::NORMAL, CONST, 4030 Declare(function_declaration, DeclarationDescriptor::NORMAL, CONST,
4030 kNeedsInitialization, ok, scope()); 4031 kNeedsInitialization, ok, scope());
4031 DCHECK(ok); 4032 DCHECK(ok);
4032 if (!ok) return nullptr; 4033 if (!ok) return nullptr;
4033 Property* prototype_property = factory()->NewProperty( 4034 Property* prototype_property = factory()->NewProperty(
4034 factory()->NewVariableProxy(result_var), 4035 factory()->NewVariableProxy(result_var),
4035 factory()->NewStringLiteral(ast_value_factory()->prototype_string(), 4036 factory()->NewStringLiteral(ast_value_factory()->prototype_string(),
(...skipping 1772 matching lines...) Expand 10 before | Expand all | Expand 10 after
5808 node->Print(Isolate::Current()); 5809 node->Print(Isolate::Current());
5809 } 5810 }
5810 #endif // DEBUG 5811 #endif // DEBUG
5811 5812
5812 #undef CHECK_OK 5813 #undef CHECK_OK
5813 #undef CHECK_OK_VOID 5814 #undef CHECK_OK_VOID
5814 #undef CHECK_FAILED 5815 #undef CHECK_FAILED
5815 5816
5816 } // namespace internal 5817 } // namespace internal
5817 } // namespace v8 5818 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast/scopes.cc ('k') | src/parsing/pattern-rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698