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

Side by Side Diff: src/parser.cc

Issue 1024703004: Cleanups needed for this-scoping in arrow functions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Removed codegen bits and Scope::has_this_declaration() Created 5 years, 9 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.cc ('k') | src/scopes.h » ('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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 int end_position, 785 int end_position,
786 Scope* scope, 786 Scope* scope,
787 AstNodeFactory* factory) { 787 AstNodeFactory* factory) {
788 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name); 788 if (parser_->fni_ != NULL) parser_->fni_->PushVariableName(name);
789 789
790 // Arrow function parameters are parsed as an expression. When 790 // Arrow function parameters are parsed as an expression. When
791 // parsing lazily, it is enough to create a VariableProxy in order 791 // parsing lazily, it is enough to create a VariableProxy in order
792 // for Traits::DeclareArrowParametersFromExpression() to be able to 792 // for Traits::DeclareArrowParametersFromExpression() to be able to
793 // pick the names of the parameters. 793 // pick the names of the parameters.
794 return parser_->parsing_lazy_arrow_parameters_ 794 return parser_->parsing_lazy_arrow_parameters_
795 ? factory->NewVariableProxy(name, false, start_position, 795 ? factory->NewVariableProxy(name, Variable::NORMAL, start_position,
796 end_position) 796 end_position)
797 : scope->NewUnresolved(factory, name, start_position, 797 : scope->NewUnresolved(factory, name, start_position,
798 end_position); 798 end_position);
799 } 799 }
800 800
801 801
802 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner, 802 Expression* ParserTraits::ExpressionFromString(int pos, Scanner* scanner,
803 AstNodeFactory* factory) { 803 AstNodeFactory* factory) {
804 const AstRawString* symbol = GetSymbol(scanner); 804 const AstRawString* symbol = GetSymbol(scanner);
805 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); 805 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol);
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1970 // same variable if it is declared several times. This is not a 1970 // same variable if it is declared several times. This is not a
1971 // semantic issue as long as we keep the source order, but it may be 1971 // semantic issue as long as we keep the source order, but it may be
1972 // a performance issue since it may lead to repeated 1972 // a performance issue since it may lead to repeated
1973 // RuntimeHidden_DeclareLookupSlot calls. 1973 // RuntimeHidden_DeclareLookupSlot calls.
1974 declaration_scope->AddDeclaration(declaration); 1974 declaration_scope->AddDeclaration(declaration);
1975 1975
1976 if (mode == CONST_LEGACY && declaration_scope->is_script_scope()) { 1976 if (mode == CONST_LEGACY && declaration_scope->is_script_scope()) {
1977 // For global const variables we bind the proxy to a variable. 1977 // For global const variables we bind the proxy to a variable.
1978 DCHECK(resolve); // should be set by all callers 1978 DCHECK(resolve); // should be set by all callers
1979 Variable::Kind kind = Variable::NORMAL; 1979 Variable::Kind kind = Variable::NORMAL;
1980 var = new (zone()) Variable(declaration_scope, name, mode, true, kind, 1980 var = new (zone()) Variable(declaration_scope, name, mode, kind,
1981 kNeedsInitialization, kNotAssigned); 1981 kNeedsInitialization, kNotAssigned);
1982 } else if (declaration_scope->is_eval_scope() && 1982 } else if (declaration_scope->is_eval_scope() &&
1983 is_sloppy(declaration_scope->language_mode())) { 1983 is_sloppy(declaration_scope->language_mode())) {
1984 // For variable declarations in a sloppy eval scope the proxy is bound 1984 // For variable declarations in a sloppy eval scope the proxy is bound
1985 // to a lookup variable to force a dynamic declaration using the 1985 // to a lookup variable to force a dynamic declaration using the
1986 // DeclareLookupSlot runtime function. 1986 // DeclareLookupSlot runtime function.
1987 Variable::Kind kind = Variable::NORMAL; 1987 Variable::Kind kind = Variable::NORMAL;
1988 // TODO(sigurds) figure out if kNotAssigned is OK here 1988 // TODO(sigurds) figure out if kNotAssigned is OK here
1989 var = new (zone()) Variable(declaration_scope, name, mode, true, kind, 1989 var = new (zone()) Variable(declaration_scope, name, mode, kind,
1990 declaration->initialization(), kNotAssigned); 1990 declaration->initialization(), kNotAssigned);
1991 var->AllocateTo(Variable::LOOKUP, -1); 1991 var->AllocateTo(Variable::LOOKUP, -1);
1992 resolve = true; 1992 resolve = true;
1993 } 1993 }
1994 1994
1995 // If requested and we have a local variable, bind the proxy to the variable 1995 // If requested and we have a local variable, bind the proxy to the variable
1996 // at parse-time. This is used for functions (and consts) declared inside 1996 // at parse-time. This is used for functions (and consts) declared inside
1997 // statements: the corresponding function (or const) variable must be in the 1997 // statements: the corresponding function (or const) variable must be in the
1998 // function scope and not a statement-local scope, e.g. as provided with a 1998 // function scope and not a statement-local scope, e.g. as provided with a
1999 // 'with' statement: 1999 // 'with' statement:
(...skipping 1878 matching lines...) Expand 10 before | Expand all | Expand 10 after
3878 Variable* fvar = NULL; 3878 Variable* fvar = NULL;
3879 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY; 3879 Token::Value fvar_init_op = Token::INIT_CONST_LEGACY;
3880 if (function_type == FunctionLiteral::NAMED_EXPRESSION) { 3880 if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
3881 if (is_strict(language_mode())) { 3881 if (is_strict(language_mode())) {
3882 fvar_init_op = Token::INIT_CONST; 3882 fvar_init_op = Token::INIT_CONST;
3883 } 3883 }
3884 VariableMode fvar_mode = 3884 VariableMode fvar_mode =
3885 is_strict(language_mode()) ? CONST : CONST_LEGACY; 3885 is_strict(language_mode()) ? CONST : CONST_LEGACY;
3886 DCHECK(function_name != NULL); 3886 DCHECK(function_name != NULL);
3887 fvar = new (zone()) 3887 fvar = new (zone())
3888 Variable(scope_, function_name, fvar_mode, true /* is valid LHS */, 3888 Variable(scope_, function_name, fvar_mode, Variable::NORMAL,
3889 Variable::NORMAL, kCreatedInitialized, kNotAssigned); 3889 kCreatedInitialized, kNotAssigned);
3890 VariableProxy* proxy = factory()->NewVariableProxy(fvar); 3890 VariableProxy* proxy = factory()->NewVariableProxy(fvar);
3891 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration( 3891 VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration(
3892 proxy, fvar_mode, scope_, RelocInfo::kNoPosition); 3892 proxy, fvar_mode, scope_, RelocInfo::kNoPosition);
3893 scope_->DeclareFunctionVar(fvar_declaration); 3893 scope_->DeclareFunctionVar(fvar_declaration);
3894 } 3894 }
3895 3895
3896 // Determine if the function can be parsed lazily. Lazy parsing is different 3896 // Determine if the function can be parsed lazily. Lazy parsing is different
3897 // from lazy compilation; we need to parse more eagerly than we compile. 3897 // from lazy compilation; we need to parse more eagerly than we compile.
3898 3898
3899 // We can only parse lazily if we also compile lazily. The heuristics for 3899 // We can only parse lazily if we also compile lazily. The heuristics for
(...skipping 1658 matching lines...) Expand 10 before | Expand all | Expand 10 after
5558 } else { 5558 } else {
5559 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5559 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5560 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5560 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5561 raw_string->length()); 5561 raw_string->length());
5562 } 5562 }
5563 } 5563 }
5564 5564
5565 return running_hash; 5565 return running_hash;
5566 } 5566 }
5567 } } // namespace v8::internal 5567 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ast.cc ('k') | src/scopes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698