| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 7cde43797dd0618c83b0e19a90aa43945f3ee5fd..3b68c1c1c01b69d2ec89d07e5494459aa633f8ca 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -2480,7 +2480,7 @@ HGraph* HGraphBuilder::CreateGraph() {
|
| // Handle implicit declaration of the function name in named function
|
| // expressions before other declarations.
|
| if (scope->is_function_scope() && scope->function() != NULL) {
|
| - HandleDeclaration(scope->function(), CONST, NULL, NULL);
|
| + VisitVariableDeclaration(scope->function());
|
| }
|
| VisitDeclarations(scope->declarations());
|
| AddSimulate(AstNode::kDeclarationsId);
|
| @@ -6910,20 +6910,15 @@ void HGraphBuilder::VisitThisFunction(ThisFunction* expr) {
|
|
|
| void HGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) {
|
| int length = declarations->length();
|
| - int global_count = 0;
|
| - for (int i = 0; i < declarations->length(); i++) {
|
| - Declaration* decl = declarations->at(i);
|
| - FunctionDeclaration* fun_decl = decl->AsFunctionDeclaration();
|
| - HandleDeclaration(decl->proxy(),
|
| - decl->mode(),
|
| - fun_decl != NULL ? fun_decl->fun() : NULL,
|
| - &global_count);
|
| - }
|
| + int save_global_count = global_count_;
|
| + global_count_ = 0;
|
| +
|
| + AstVisitor::VisitDeclarations(declarations);
|
|
|
| // Batch declare global functions and variables.
|
| - if (global_count > 0) {
|
| + if (global_count_ > 0) {
|
| Handle<FixedArray> array =
|
| - isolate()->factory()->NewFixedArray(2 * global_count, TENURED);
|
| + isolate()->factory()->NewFixedArray(2 * global_count_, TENURED);
|
| for (int j = 0, i = 0; i < length; i++) {
|
| Declaration* decl = declarations->at(i);
|
| Variable* var = decl->proxy()->var();
|
| @@ -6959,40 +6954,35 @@ void HGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) {
|
| flags);
|
| AddInstruction(result);
|
| }
|
| +
|
| + global_count_ = save_global_count;
|
| }
|
|
|
|
|
| -void HGraphBuilder::HandleDeclaration(VariableProxy* proxy,
|
| - VariableMode mode,
|
| - FunctionLiteral* function,
|
| - int* global_count) {
|
| +void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* declaration) {
|
| + VariableProxy* proxy = declaration->proxy();
|
| + VariableMode mode = declaration->mode();
|
| Variable* var = proxy->var();
|
| - bool binding_needs_init =
|
| - (mode == CONST || mode == CONST_HARMONY || mode == LET);
|
| + bool hole_init = mode == CONST || mode == CONST_HARMONY || mode == LET;
|
| switch (var->location()) {
|
| case Variable::UNALLOCATED:
|
| - ++(*global_count);
|
| + ++global_count_;
|
| return;
|
| case Variable::PARAMETER:
|
| case Variable::LOCAL:
|
| + if (hole_init) {
|
| + HValue* value = graph()->GetConstantHole();
|
| + environment()->Bind(var, value);
|
| + }
|
| + break;
|
| case Variable::CONTEXT:
|
| - if (binding_needs_init || function != NULL) {
|
| - HValue* value = NULL;
|
| - if (function != NULL) {
|
| - CHECK_ALIVE(VisitForValue(function));
|
| - value = Pop();
|
| - } else {
|
| - value = graph()->GetConstantHole();
|
| - }
|
| - if (var->IsContextSlot()) {
|
| - HValue* context = environment()->LookupContext();
|
| - HStoreContextSlot* store = new HStoreContextSlot(
|
| - context, var->index(), HStoreContextSlot::kNoCheck, value);
|
| - AddInstruction(store);
|
| - if (store->HasObservableSideEffects()) AddSimulate(proxy->id());
|
| - } else {
|
| - environment()->Bind(var, value);
|
| - }
|
| + if (hole_init) {
|
| + HValue* value = graph()->GetConstantHole();
|
| + HValue* context = environment()->LookupContext();
|
| + HStoreContextSlot* store = new HStoreContextSlot(
|
| + context, var->index(), HStoreContextSlot::kNoCheck, value);
|
| + AddInstruction(store);
|
| + if (store->HasObservableSideEffects()) AddSimulate(proxy->id());
|
| }
|
| break;
|
| case Variable::LOOKUP:
|
| @@ -7001,28 +6991,76 @@ void HGraphBuilder::HandleDeclaration(VariableProxy* proxy,
|
| }
|
|
|
|
|
| -void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* decl) {
|
| - UNREACHABLE();
|
| -}
|
| -
|
| -
|
| -void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* decl) {
|
| - UNREACHABLE();
|
| +void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* declaration) {
|
| + VariableProxy* proxy = declaration->proxy();
|
| + Variable* var = proxy->var();
|
| + switch (var->location()) {
|
| + case Variable::UNALLOCATED:
|
| + ++global_count_;
|
| + return;
|
| + case Variable::PARAMETER:
|
| + case Variable::LOCAL: {
|
| + CHECK_ALIVE(VisitForValue(declaration->fun()));
|
| + HValue* value = Pop();
|
| + environment()->Bind(var, value);
|
| + break;
|
| + }
|
| + case Variable::CONTEXT: {
|
| + CHECK_ALIVE(VisitForValue(declaration->fun()));
|
| + HValue* value = Pop();
|
| + HValue* context = environment()->LookupContext();
|
| + HStoreContextSlot* store = new HStoreContextSlot(
|
| + context, var->index(), HStoreContextSlot::kNoCheck, value);
|
| + AddInstruction(store);
|
| + if (store->HasObservableSideEffects()) AddSimulate(proxy->id());
|
| + break;
|
| + }
|
| + case Variable::LOOKUP:
|
| + return Bailout("unsupported lookup slot in declaration");
|
| + }
|
| }
|
|
|
|
|
| -void HGraphBuilder::VisitModuleDeclaration(ModuleDeclaration* decl) {
|
| - UNREACHABLE();
|
| +void HGraphBuilder::VisitModuleDeclaration(ModuleDeclaration* declaration) {
|
| + VariableProxy* proxy = declaration->proxy();
|
| + Variable* var = proxy->var();
|
| + switch (var->location()) {
|
| + case Variable::UNALLOCATED:
|
| + ++global_count_;
|
| + return;
|
| + case Variable::CONTEXT: {
|
| + // TODO(rossberg)
|
| + break;
|
| + }
|
| + case Variable::PARAMETER:
|
| + case Variable::LOCAL:
|
| + case Variable::LOOKUP:
|
| + UNREACHABLE();
|
| + }
|
| }
|
|
|
|
|
| -void HGraphBuilder::VisitImportDeclaration(ImportDeclaration* decl) {
|
| - UNREACHABLE();
|
| +void HGraphBuilder::VisitImportDeclaration(ImportDeclaration* declaration) {
|
| + VariableProxy* proxy = declaration->proxy();
|
| + Variable* var = proxy->var();
|
| + switch (var->location()) {
|
| + case Variable::UNALLOCATED:
|
| + ++global_count_;
|
| + return;
|
| + case Variable::CONTEXT: {
|
| + // TODO(rossberg)
|
| + break;
|
| + }
|
| + case Variable::PARAMETER:
|
| + case Variable::LOCAL:
|
| + case Variable::LOOKUP:
|
| + UNREACHABLE();
|
| + }
|
| }
|
|
|
|
|
| -void HGraphBuilder::VisitExportDeclaration(ExportDeclaration* decl) {
|
| - UNREACHABLE();
|
| +void HGraphBuilder::VisitExportDeclaration(ExportDeclaration* declaration) {
|
| + // TODO(rossberg)
|
| }
|
|
|
|
|
|
|