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

Unified Diff: src/ast/scopes.cc

Issue 2232633002: Function name variable does not need a VariableDeclaration (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebased 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ast/scopes.h ('k') | src/parsing/parser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast/scopes.cc
diff --git a/src/ast/scopes.cc b/src/ast/scopes.cc
index 9dc1f422ec0c9c9f3023b566163d174c1cc34679..c49d60400a168ea1167b1114e86da003cbe47764 100644
--- a/src/ast/scopes.cc
+++ b/src/ast/scopes.cc
@@ -333,18 +333,13 @@ void Scope::DeserializeScopeInfo(Isolate* isolate,
// Internalize function proxy for this scope.
if (scope_info_->HasFunctionName()) {
- AstNodeFactory factory(ast_value_factory);
Handle<String> name_handle(scope_info_->FunctionName(), isolate);
const AstRawString* name = ast_value_factory->GetString(name_handle);
VariableMode mode;
int index = scope_info_->FunctionContextSlotIndex(*name_handle, &mode);
if (index >= 0) {
- Variable* result = new (zone())
- Variable(this, name, mode, Variable::NORMAL, kCreatedInitialized);
- VariableProxy* proxy = factory.NewVariableProxy(result);
- VariableDeclaration* declaration =
- factory.NewVariableDeclaration(proxy, this, kNoSourcePosition);
- AsDeclarationScope()->DeclareFunctionVar(declaration);
+ Variable* result = AsDeclarationScope()->DeclareFunctionVar(name);
+ DCHECK_EQ(mode, result->mode());
result->AllocateTo(VariableLocation::CONTEXT, index);
}
}
@@ -430,6 +425,14 @@ void DeclarationScope::DeclareDefaultFunctionVariables(
}
}
+Variable* DeclarationScope::DeclareFunctionVar(const AstRawString* name) {
+ DCHECK(is_function_scope());
+ DCHECK_NULL(function_);
+ VariableMode mode = is_strict(language_mode()) ? CONST : CONST_LEGACY;
+ function_ = new (zone())
+ Variable(this, name, mode, Variable::NORMAL, kCreatedInitialized);
+ return function_;
+}
Scope* Scope::FinalizeBlockScope() {
DCHECK(is_block_scope());
@@ -597,27 +600,20 @@ Variable* Scope::LookupLocal(const AstRawString* name) {
return var;
}
-Variable* DeclarationScope::LookupFunctionVar(const AstRawString* name,
- AstNodeFactory* factory) {
- if (function_ != NULL && function_->proxy()->raw_name() == name) {
- return function_->proxy()->var();
+Variable* DeclarationScope::LookupFunctionVar(const AstRawString* name) {
+ if (function_ != nullptr && function_->raw_name() == name) {
+ return function_;
} else if (!scope_info_.is_null()) {
// If we are backed by a scope info, try to lookup the variable there.
VariableMode mode;
int index = scope_info_->FunctionContextSlotIndex(*(name->string()), &mode);
- if (index < 0) return NULL;
- Variable* var = new (zone())
- Variable(this, name, mode, Variable::NORMAL, kCreatedInitialized);
- DCHECK_NOT_NULL(factory);
- VariableProxy* proxy = factory->NewVariableProxy(var);
- VariableDeclaration* declaration =
- factory->NewVariableDeclaration(proxy, this, kNoSourcePosition);
- DCHECK_EQ(factory->zone(), zone());
- DeclareFunctionVar(declaration);
+ if (index < 0) return nullptr;
+ Variable* var = DeclareFunctionVar(name);
+ DCHECK_EQ(mode, var->mode());
var->AllocateTo(VariableLocation::CONTEXT, index);
return var;
} else {
- return NULL;
+ return nullptr;
}
}
@@ -745,11 +741,6 @@ Declaration* Scope::CheckConflictingVarDeclarations() {
for (int i = 0; i < length; i++) {
Declaration* decl = decls_[i];
VariableMode mode = decl->proxy()->var()->mode();
- // We don't create a separate scope to hold the function name of a function
- // expression, so we have to make sure not to consider it when checking for
- // conflicts (since it's conceptually "outside" the declaration scope).
- if (is_function_scope() && decl == AsDeclarationScope()->function())
- continue;
if (IsLexicalVariableMode(mode) && !is_block_scope()) continue;
// Iterate through all scopes until and including the declaration scope.
@@ -1146,10 +1137,10 @@ void Scope::Print(int n) {
}
// Print parameters, if any.
- VariableDeclaration* function = nullptr;
+ Variable* function = nullptr;
if (is_function_scope()) {
AsDeclarationScope()->PrintParameters();
- function = AsDeclarationScope()->function();
+ function = AsDeclarationScope()->function_var();
}
PrintF(" { // (%d, %d)\n", start_position(), end_position());
@@ -1157,7 +1148,7 @@ void Scope::Print(int n) {
// Function name, if any (named function literals, only).
if (function != nullptr) {
Indent(n1, "// (local) function name: ");
- PrintName(function->proxy()->raw_name());
+ PrintName(function->raw_name());
PrintF("\n");
}
@@ -1191,7 +1182,7 @@ void Scope::Print(int n) {
// Print locals.
if (function != nullptr) {
Indent(n1, "// function var:\n");
- PrintVar(n1, function->proxy()->var());
+ PrintVar(n1, function);
}
if (is_declaration_scope()) {
@@ -1293,10 +1284,9 @@ Variable* Scope::LookupRecursive(VariableProxy* proxy,
// We did not find a variable locally. Check against the function variable, if
// any.
*binding_kind = UNBOUND;
- var =
- is_function_scope()
- ? AsDeclarationScope()->LookupFunctionVar(proxy->raw_name(), factory)
- : nullptr;
+ var = is_function_scope()
+ ? AsDeclarationScope()->LookupFunctionVar(proxy->raw_name())
+ : nullptr;
if (var != NULL) {
*binding_kind = BOUND;
} else if (outer_scope_ != nullptr && this != max_outer_scope) {
@@ -1697,7 +1687,7 @@ void DeclarationScope::AllocateLocals(AstValueFactory* ast_value_factory) {
// because of the current ScopeInfo implementation (see
// ScopeInfo::ScopeInfo(FunctionScope* scope) constructor).
if (function_ != nullptr) {
- AllocateNonParameterLocal(function_->proxy()->var(), ast_value_factory);
+ AllocateNonParameterLocal(function_, ast_value_factory);
}
if (rest_parameter_ != nullptr) {
@@ -1776,19 +1766,19 @@ void Scope::AllocateVariablesRecursively(AstValueFactory* ast_value_factory) {
int Scope::StackLocalCount() const {
- VariableDeclaration* function =
- is_function_scope() ? AsDeclarationScope()->function() : nullptr;
+ Variable* function =
+ is_function_scope() ? AsDeclarationScope()->function_var() : nullptr;
return num_stack_slots() -
- (function != NULL && function->proxy()->var()->IsStackLocal() ? 1 : 0);
+ (function != nullptr && function->IsStackLocal() ? 1 : 0);
}
int Scope::ContextLocalCount() const {
if (num_heap_slots() == 0) return 0;
- VariableDeclaration* function =
- is_function_scope() ? AsDeclarationScope()->function() : nullptr;
+ Variable* function =
+ is_function_scope() ? AsDeclarationScope()->function_var() : nullptr;
bool is_function_var_in_context =
- function != NULL && function->proxy()->var()->IsContextSlot();
+ function != nullptr && function->IsContextSlot();
return num_heap_slots() - Context::MIN_CONTEXT_SLOTS - num_global_slots() -
(is_function_var_in_context ? 1 : 0);
}
« no previous file with comments | « src/ast/scopes.h ('k') | src/parsing/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698