Chromium Code Reviews| Index: src/hydrogen.cc |
| =================================================================== |
| --- src/hydrogen.cc (revision 9109) |
| +++ src/hydrogen.cc (working copy) |
| @@ -2298,11 +2298,7 @@ |
| // Handle implicit declaration of the function name in named function |
| // expressions before other declarations. |
| if (scope->is_function_scope() && scope->function() != NULL) { |
| - if (!scope->function()->IsStackAllocated()) { |
| - Bailout("unsupported declaration"); |
| - return NULL; |
| - } |
| - environment()->Bind(scope->function(), graph()->GetConstantHole()); |
| + EmitDeclaration(scope->function(), Variable::CONST, NULL); |
| } |
| VisitDeclarations(scope->declarations()); |
| AddSimulate(AstNode::kDeclarationsId); |
| @@ -5822,20 +5818,52 @@ |
| void HGraphBuilder::VisitDeclaration(Declaration* decl) { |
| - // We support only declarations that do not require code generation. |
| - Variable* var = decl->proxy()->var(); |
| - if (!var->IsStackAllocated() || |
| - decl->mode() == Variable::LET) { |
| - return Bailout("unsupported declaration"); |
| - } |
| + EmitDeclaration(decl->proxy(), decl->mode(), decl->fun()); |
| +} |
| - if (decl->mode() == Variable::CONST) { |
| - ASSERT(var->IsStackAllocated()); |
| - environment()->Bind(var, graph()->GetConstantHole()); |
| - } else if (decl->fun() != NULL) { |
| - VisitForValue(decl->fun()); |
| - HValue* function = Pop(); |
| - environment()->Bind(var, function); |
| + |
| +void HGraphBuilder::EmitDeclaration(VariableProxy* proxy, |
| + Variable::Mode mode, |
| + FunctionLiteral* function) { |
| + if (mode == Variable::LET) return Bailout("unsupported let declaration"); |
| + Variable* var = proxy->var(); |
| + Slot* slot = var->AsSlot(); |
| + ASSERT(slot != NULL); |
| + switch (slot->type()) { |
| + case Slot::PARAMETER: |
| + case Slot::LOCAL: |
| + if (mode == Variable::CONST) { |
| + ASSERT(var->IsStackAllocated()); |
|
Kevin Millikin (Chromium)
2011/09/01 15:40:58
This ASSERT is trivially true, because it's in the
fschneider
2011/09/01 16:28:21
Done.
|
| + environment()->Bind(var, graph()->GetConstantHole()); |
| + } else if (function != NULL) { |
| + VisitForValue(function); |
| + HValue* function_value = Pop(); |
| + environment()->Bind(var, function_value); |
| + } |
| + break; |
| + case Slot::CONTEXT: { |
| + HValue* context = environment()->LookupContext(); |
| + if (mode == Variable::CONST) { |
| + HStoreContextSlot* store = |
| + new HStoreContextSlot(context, |
| + slot->index(), |
| + graph()->GetConstantHole()); |
| + AddInstruction(store); |
| + if (store->HasSideEffects()) AddSimulate(proxy->id()); |
| + } else if (function != NULL) { |
| + VisitForValue(function); |
| + HValue* function_value = Pop(); |
| + HStoreContextSlot* store = |
| + new HStoreContextSlot(context, |
| + slot->index(), |
| + function_value); |
| + AddInstruction(store); |
| + if (store->HasSideEffects()) AddSimulate(proxy->id()); |
| + } |
| + break; |
| + } |
| + case Slot::LOOKUP: |
| + return Bailout("unsupported lookup slot in declaration"); |
| } |
| } |