Chromium Code Reviews| Index: src/full-codegen.cc |
| diff --git a/src/full-codegen.cc b/src/full-codegen.cc |
| index e399a3496c342f536e92fc0d4aee84a5d83270a2..6945e302d84b6dfe56e62fe8e4cb1f0b4eaa80ec 100644 |
| --- a/src/full-codegen.cc |
| +++ b/src/full-codegen.cc |
| @@ -1605,6 +1605,25 @@ void FullCodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) { |
| void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) { |
| Comment cmnt(masm_, "[ ClassLiteral"); |
| + Scope* saved_scope = scope(); |
| + if (lit->scope() != NULL) { |
| + scope_ = lit->scope(); |
| + DCHECK(scope_->is_block_scope()); |
| + { |
| + Comment cmnt(masm_, "[ Extend block context"); |
|
Dmitry Lomov (no reviews)
2014/11/13 11:17:37
Please share code with VisitBlock here (add an Ent
arv (Not doing code reviews)
2014/11/13 20:47:49
Done.
|
| + __ Push(scope_->GetScopeInfo()); |
| + PushFunctionArgumentForContextAllocation(); |
| + __ CallRuntime(Runtime::kPushBlockContext, 2); |
| + StoreToFrameField(StandardFrameConstants::kContextOffset, |
| + context_register()); |
| + } |
| + { |
| + Comment cmnt(masm_, "[ Declarations"); |
| + DCHECK_EQ(1, scope_->declarations()->length()); |
| + VisitDeclarations(scope_->declarations()); |
| + } |
| + } |
| + |
| if (lit->raw_name() != NULL) { |
| __ Push(lit->name()); |
| } else { |
| @@ -1626,6 +1645,15 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) { |
| __ CallRuntime(Runtime::kDefineClass, 6); |
| EmitClassDefineProperties(lit); |
| + if (lit->scope() != NULL) { |
| + DCHECK_NOT_NULL(lit->proxy()); |
| + EmitVariableAssignment(lit->proxy()->var(), Token::INIT_CONST); |
| + LoadContextField(context_register(), Context::PREVIOUS_INDEX); |
|
Dmitry Lomov (no reviews)
2014/11/13 11:17:37
Please share code with VisitBlock here (add an Exi
arv (Not doing code reviews)
2014/11/13 20:47:49
Done.
|
| + StoreToFrameField(StandardFrameConstants::kContextOffset, |
| + context_register()); |
| + } |
| + |
| + scope_ = saved_scope; |
| context()->Plug(result_register()); |
| } |