Revert of Always give class literals a block scope (patchset #2 id:20001 of https://codereview.chromium.org/1413903002/ )

Reason for revert:
[Sheriff] Breaks vector stores:
http://build.chromium.org/p/client.v8/builders/V8%20Linux64%20-%20debug%20-%20vector%20stores/builds/536

Original issue's description:
> Always give class literals a block scope
>
> Class methods always have the class scope on their scope chain in order
> to implement strong mode checks. Previously, that scope wasn't attached
> to the ClassLiteral for anonymous classes (since the scope contained
> no bindings).
>
> This patch simply puts that same scope on the ClassLiteral, anonymous
> or not, which simplifies other code that needs to reason about the scope
> of a class and its methods.
>
> Committed: https://crrev.com/cf13dda1ba25e8293ea143f33c6c5f6233a39c86
> Cr-Commit-Position: refs/heads/master@{#31371}

TBR=mstarzinger@chromium.org,adamk@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1416583002

Cr-Commit-Position: refs/heads/master@{#31373}
This commit is contained in:
machenbach 2015-10-19 05:17:23 -07:00 committed by Commit bot
parent 3791cf9854
commit 8aec6fb047
3 changed files with 20 additions and 11 deletions

View File

@ -1533,15 +1533,20 @@ void AstGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) {
void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) {
// Visit declarations and class literal in a block scope.
if (expr->scope()->ContextLocalCount() > 0) {
Node* context = BuildLocalBlockContext(expr->scope());
ContextScope scope(this, expr->scope(), context);
VisitDeclarations(expr->scope()->declarations());
if (expr->scope() == NULL) {
// Visit class literal in the same scope, no declarations.
VisitClassLiteralContents(expr);
} else {
VisitDeclarations(expr->scope()->declarations());
VisitClassLiteralContents(expr);
// Visit declarations and class literal in a block scope.
if (expr->scope()->ContextLocalCount() > 0) {
Node* context = BuildLocalBlockContext(expr->scope());
ContextScope scope(this, expr->scope(), context);
VisitDeclarations(expr->scope()->declarations());
VisitClassLiteralContents(expr);
} else {
VisitDeclarations(expr->scope()->declarations());
VisitClassLiteralContents(expr);
}
}
}
@ -1639,7 +1644,8 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
literal = NewNode(op, literal, proto);
// Assign to class variable.
if (expr->class_variable_proxy() != nullptr) {
if (expr->scope() != NULL) {
DCHECK_NOT_NULL(expr->class_variable_proxy());
Variable* var = expr->class_variable_proxy()->var();
FrameStateBeforeAndAfter states(this, BailoutId::None());
VectorSlotPair feedback = CreateVectorSlotPair(

View File

@ -1330,7 +1330,8 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) {
EmitClassDefineProperties(lit);
if (lit->class_variable_proxy() != nullptr) {
if (lit->scope() != NULL) {
DCHECK_NOT_NULL(lit->class_variable_proxy());
EmitVariableAssignment(lit->class_variable_proxy()->var(),
Token::INIT_CONST, lit->ProxySlot());
}

View File

@ -4895,13 +4895,15 @@ ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name,
block_scope->language_mode());
}
// Note that we do not finalize this block scope because strong
// mode uses it as a sentinel value indicating an anonymous class.
block_scope->set_end_position(end_pos);
if (name != NULL) {
DCHECK_NOT_NULL(proxy);
proxy->var()->set_initializer_position(end_pos);
} else {
// Unnamed classes should not have scopes (the scope will be empty).
DCHECK_EQ(block_scope->num_var_or_const(), 0);
block_scope = nullptr;
}
return factory()->NewClassLiteral(name, block_scope, proxy, extends,