| Index: src/gdb-jit.cc | 
| diff --git a/src/gdb-jit.cc b/src/gdb-jit.cc | 
| index d3cd44707c59150aaf261e519abb792b43d64f54..74845b4822c659b1c4b810fc7862df1283f1fe7b 100644 | 
| --- a/src/gdb-jit.cc | 
| +++ b/src/gdb-jit.cc | 
| @@ -31,11 +31,13 @@ | 
|  | 
| #include "bootstrapper.h" | 
| #include "compiler.h" | 
| +#include "frames.h" | 
| +#include "frames-inl.h" | 
| #include "global-handles.h" | 
| #include "messages.h" | 
| -#include "platform.h" | 
| #include "natives.h" | 
| -#include "scopeinfo.h" | 
| +#include "platform.h" | 
| +#include "scopes.h" | 
|  | 
| namespace v8 { | 
| namespace internal { | 
| @@ -194,7 +196,7 @@ class DebugSectionBase : public ZoneObject { | 
|  | 
| virtual void WriteBody(Writer::Slot<THeader> header, Writer* writer) { | 
| uintptr_t start = writer->position(); | 
| -    if (WriteBody(writer)) { | 
| +    if (WriteBodyInternal(writer)) { | 
| uintptr_t end = writer->position(); | 
| header->offset = start; | 
| #if defined(__MACH_O) | 
| @@ -204,7 +206,7 @@ class DebugSectionBase : public ZoneObject { | 
| } | 
| } | 
|  | 
| -  virtual bool WriteBody(Writer* writer) { | 
| +  virtual bool WriteBodyInternal(Writer* writer) { | 
| return false; | 
| } | 
|  | 
| @@ -340,14 +342,14 @@ class ELFSection : public DebugSectionBase<ELFSectionHeader> { | 
|  | 
| virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { | 
| uintptr_t start = w->position(); | 
| -    if (WriteBody(w)) { | 
| +    if (WriteBodyInternal(w)) { | 
| uintptr_t end = w->position(); | 
| header->offset = start; | 
| header->size = end - start; | 
| } | 
| } | 
|  | 
| -  virtual bool WriteBody(Writer* w) { | 
| +  virtual bool WriteBodyInternal(Writer* w) { | 
| return false; | 
| } | 
|  | 
| @@ -627,9 +629,9 @@ class MachO BASE_EMBEDDED { | 
| #if defined(__ELF) | 
| class ELF BASE_EMBEDDED { | 
| public: | 
| -  ELF() : sections_(6) { | 
| -    sections_.Add(new ELFSection("", ELFSection::TYPE_NULL, 0)); | 
| -    sections_.Add(new StringTable(".shstrtab")); | 
| +  ELF(Zone* zone) : sections_(6, zone) { | 
| +    sections_.Add(new(zone) ELFSection("", ELFSection::TYPE_NULL, 0), zone); | 
| +    sections_.Add(new(zone) StringTable(".shstrtab"), zone); | 
| } | 
|  | 
| void Write(Writer* w) { | 
| @@ -642,8 +644,8 @@ class ELF BASE_EMBEDDED { | 
| return sections_[index]; | 
| } | 
|  | 
| -  uint32_t AddSection(ELFSection* section) { | 
| -    sections_.Add(section); | 
| +  uint32_t AddSection(ELFSection* section, Zone* zone) { | 
| +    sections_.Add(section, zone); | 
| section->set_index(sections_.length() - 1); | 
| return sections_.length() - 1; | 
| } | 
| @@ -852,10 +854,10 @@ class ELFSymbol BASE_EMBEDDED { | 
|  | 
| class ELFSymbolTable : public ELFSection { | 
| public: | 
| -  explicit ELFSymbolTable(const char* name) | 
| +  ELFSymbolTable(const char* name, Zone* zone) | 
| : ELFSection(name, TYPE_SYMTAB, sizeof(uintptr_t)), | 
| -        locals_(1), | 
| -        globals_(1) { | 
| +        locals_(1, zone), | 
| +        globals_(1, zone) { | 
| } | 
|  | 
| virtual void WriteBody(Writer::Slot<Header> header, Writer* w) { | 
| @@ -883,11 +885,11 @@ class ELFSymbolTable : public ELFSection { | 
| strtab->DetachWriter(); | 
| } | 
|  | 
| -  void Add(const ELFSymbol& symbol) { | 
| +  void Add(const ELFSymbol& symbol, Zone* zone) { | 
| if (symbol.binding() == ELFSymbol::BIND_LOCAL) { | 
| -      locals_.Add(symbol); | 
| +      locals_.Add(symbol, zone); | 
| } else { | 
| -      globals_.Add(symbol); | 
| +      globals_.Add(symbol, zone); | 
| } | 
| } | 
|  | 
| @@ -1019,26 +1021,29 @@ class CodeDescription BASE_EMBEDDED { | 
| static void CreateSymbolsTable(CodeDescription* desc, | 
| ELF* elf, | 
| int text_section_index) { | 
| -  ELFSymbolTable* symtab = new ELFSymbolTable(".symtab"); | 
| -  StringTable* strtab = new StringTable(".strtab"); | 
| +  Zone* zone = desc->info()->zone(); | 
| +  ELFSymbolTable* symtab = new(zone) ELFSymbolTable(".symtab", zone); | 
| +  StringTable* strtab = new(zone) StringTable(".strtab"); | 
|  | 
| // Symbol table should be followed by the linked string table. | 
| -  elf->AddSection(symtab); | 
| -  elf->AddSection(strtab); | 
| +  elf->AddSection(symtab, zone); | 
| +  elf->AddSection(strtab, zone); | 
|  | 
| symtab->Add(ELFSymbol("V8 Code", | 
| 0, | 
| 0, | 
| ELFSymbol::BIND_LOCAL, | 
| ELFSymbol::TYPE_FILE, | 
| -                        ELFSection::INDEX_ABSOLUTE)); | 
| +                        ELFSection::INDEX_ABSOLUTE), | 
| +              zone); | 
|  | 
| symtab->Add(ELFSymbol(desc->name(), | 
| 0, | 
| desc->CodeSize(), | 
| ELFSymbol::BIND_GLOBAL, | 
| ELFSymbol::TYPE_FUNC, | 
| -                        text_section_index)); | 
| +                        text_section_index), | 
| +              zone); | 
| } | 
| #endif  // defined(__ELF) | 
|  | 
| @@ -1074,7 +1079,7 @@ class DebugInfoSection : public DebugSection { | 
| DW_ATE_SIGNED = 0x5 | 
| }; | 
|  | 
| -  bool WriteBody(Writer* w) { | 
| +  bool WriteBodyInternal(Writer* w) { | 
| uintptr_t cu_start = w->position(); | 
| Writer::Slot<uint32_t> size = w->CreateSlotHere<uint32_t>(); | 
| uintptr_t start = w->position(); | 
| @@ -1094,8 +1099,7 @@ class DebugInfoSection : public DebugSection { | 
| w->WriteString("v8value"); | 
|  | 
| if (desc_->IsInfoAvailable()) { | 
| -      CompilationInfo* info = desc_->info(); | 
| -      ScopeInfo<FreeStoreAllocationPolicy> scope_info(info->scope()); | 
| +      Scope* scope = desc_->info()->scope(); | 
| w->WriteULEB128(2); | 
| w->WriteString(desc_->name()); | 
| w->Write<intptr_t>(desc_->CodeStart()); | 
| @@ -1111,18 +1115,18 @@ class DebugInfoSection : public DebugSection { | 
| #endif | 
| fb_block_size.set(static_cast<uint32_t>(w->position() - fb_block_start)); | 
|  | 
| -      int params = scope_info.number_of_parameters(); | 
| -      int slots = scope_info.number_of_stack_slots(); | 
| -      int context_slots = scope_info.number_of_context_slots(); | 
| +      int params = scope->num_parameters(); | 
| +      int slots = scope->num_stack_slots(); | 
| +      int context_slots = scope->ContextLocalCount(); | 
| // The real slot ID is internal_slots + context_slot_id. | 
| int internal_slots = Context::MIN_CONTEXT_SLOTS; | 
| -      int locals = scope_info.LocalCount(); | 
| +      int locals = scope->StackLocalCount(); | 
| int current_abbreviation = 4; | 
|  | 
| for (int param = 0; param < params; ++param) { | 
| w->WriteULEB128(current_abbreviation++); | 
| w->WriteString( | 
| -            *scope_info.ParameterName(param)->ToCString(DISALLOW_NULLS)); | 
| +            *scope->parameter(param)->name()->ToCString(DISALLOW_NULLS)); | 
| w->Write<uint32_t>(ty_offset); | 
| Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>(); | 
| uintptr_t block_start = w->position(); | 
| @@ -1148,7 +1152,7 @@ class DebugInfoSection : public DebugSection { | 
| ASSERT(Context::CLOSURE_INDEX == 0); | 
| ASSERT(Context::PREVIOUS_INDEX == 1); | 
| ASSERT(Context::EXTENSION_INDEX == 2); | 
| -      ASSERT(Context::GLOBAL_INDEX == 3); | 
| +      ASSERT(Context::GLOBAL_OBJECT_INDEX == 3); | 
| w->WriteULEB128(current_abbreviation++); | 
| w->WriteString(".closure"); | 
| w->WriteULEB128(current_abbreviation++); | 
| @@ -1167,10 +1171,13 @@ class DebugInfoSection : public DebugSection { | 
| w->WriteString(builder.Finalize()); | 
| } | 
|  | 
| +      ZoneList<Variable*> stack_locals(locals, scope->zone()); | 
| +      ZoneList<Variable*> context_locals(context_slots, scope->zone()); | 
| +      scope->CollectStackAndContextLocals(&stack_locals, &context_locals); | 
| for (int local = 0; local < locals; ++local) { | 
| w->WriteULEB128(current_abbreviation++); | 
| w->WriteString( | 
| -            *scope_info.LocalName(local)->ToCString(DISALLOW_NULLS)); | 
| +            *stack_locals[local]->name()->ToCString(DISALLOW_NULLS)); | 
| w->Write<uint32_t>(ty_offset); | 
| Writer::Slot<uint32_t> block_size = w->CreateSlotHere<uint32_t>(); | 
| uintptr_t block_start = w->position(); | 
| @@ -1287,7 +1294,7 @@ class DebugAbbrevSection : public DebugSection { | 
| w->WriteULEB128(0); | 
| } | 
|  | 
| -  bool WriteBody(Writer* w) { | 
| +  bool WriteBodyInternal(Writer* w) { | 
| int current_abbreviation = 1; | 
| bool extra_info = desc_->IsInfoAvailable(); | 
| ASSERT(desc_->IsLineInfoAvailable()); | 
| @@ -1306,14 +1313,13 @@ class DebugAbbrevSection : public DebugSection { | 
| w->WriteULEB128(0); | 
|  | 
| if (extra_info) { | 
| -      CompilationInfo* info = desc_->info(); | 
| -      ScopeInfo<FreeStoreAllocationPolicy> scope_info(info->scope()); | 
| -      int params = scope_info.number_of_parameters(); | 
| -      int slots = scope_info.number_of_stack_slots(); | 
| -      int context_slots = scope_info.number_of_context_slots(); | 
| +      Scope* scope = desc_->info()->scope(); | 
| +      int params = scope->num_parameters(); | 
| +      int slots = scope->num_stack_slots(); | 
| +      int context_slots = scope->ContextLocalCount(); | 
| // The real slot ID is internal_slots + context_slot_id. | 
| int internal_slots = Context::MIN_CONTEXT_SLOTS; | 
| -      int locals = scope_info.LocalCount(); | 
| +      int locals = scope->StackLocalCount(); | 
| int total_children = | 
| params + slots + context_slots + internal_slots + locals + 2; | 
|  | 
| @@ -1418,7 +1424,7 @@ class DebugLineSection : public DebugSection { | 
| DW_LNE_DEFINE_FILE = 3 | 
| }; | 
|  | 
| -  bool WriteBody(Writer* w) { | 
| +  bool WriteBodyInternal(Writer* w) { | 
| // Write prologue. | 
| Writer::Slot<uint32_t> total_length = w->CreateSlotHere<uint32_t>(); | 
| uintptr_t start = w->position(); | 
| @@ -1558,7 +1564,7 @@ class DebugLineSection : public DebugSection { | 
| class UnwindInfoSection : public DebugSection { | 
| public: | 
| explicit UnwindInfoSection(CodeDescription* desc); | 
| -  virtual bool WriteBody(Writer* w); | 
| +  virtual bool WriteBodyInternal(Writer* w); | 
|  | 
| int WriteCIE(Writer* w); | 
| void WriteFDE(Writer* w, int); | 
| @@ -1770,7 +1776,7 @@ void UnwindInfoSection::WriteFDEStateAfterRBPPop(Writer* w) { | 
| } | 
|  | 
|  | 
| -bool UnwindInfoSection::WriteBody(Writer* w) { | 
| +bool UnwindInfoSection::WriteBodyInternal(Writer* w) { | 
| uint32_t cie_position = WriteCIE(w); | 
| WriteFDE(w, cie_position); | 
| return true; | 
| @@ -1780,13 +1786,14 @@ bool UnwindInfoSection::WriteBody(Writer* w) { | 
| #endif  // V8_TARGET_ARCH_X64 | 
|  | 
| static void CreateDWARFSections(CodeDescription* desc, DebugObject* obj) { | 
| +  Zone* zone = desc->info()->zone(); | 
| if (desc->IsLineInfoAvailable()) { | 
| -    obj->AddSection(new DebugInfoSection(desc)); | 
| -    obj->AddSection(new DebugAbbrevSection(desc)); | 
| -    obj->AddSection(new DebugLineSection(desc)); | 
| +    obj->AddSection(new(zone) DebugInfoSection(desc), zone); | 
| +    obj->AddSection(new(zone) DebugAbbrevSection(desc), zone); | 
| +    obj->AddSection(new(zone) DebugLineSection(desc), zone); | 
| } | 
| #ifdef V8_TARGET_ARCH_X64 | 
| -  obj->AddSection(new UnwindInfoSection(desc)); | 
| +  obj->AddSection(new(zone) UnwindInfoSection(desc), zone); | 
| #endif | 
| } | 
|  | 
| @@ -1905,7 +1912,8 @@ static void UnregisterCodeEntry(JITCodeEntry* entry) { | 
|  | 
|  | 
| static JITCodeEntry* CreateELFObject(CodeDescription* desc) { | 
| -  ZoneScope zone_scope(Isolate::Current(), DELETE_ON_EXIT); | 
| +  Zone* zone = desc->info()->zone(); | 
| +  ZoneScope zone_scope(zone, DELETE_ON_EXIT); | 
| #ifdef __MACH_O | 
| MachO mach_o; | 
| Writer w(&mach_o); | 
| @@ -1918,17 +1926,19 @@ static JITCodeEntry* CreateELFObject(CodeDescription* desc) { | 
|  | 
| mach_o.Write(&w, desc->CodeStart(), desc->CodeSize()); | 
| #else | 
| -  ELF elf; | 
| +  ELF elf(zone); | 
| Writer w(&elf); | 
|  | 
| int text_section_index = elf.AddSection( | 
| -      new FullHeaderELFSection(".text", | 
| -                               ELFSection::TYPE_NOBITS, | 
| -                               kCodeAlignment, | 
| -                               desc->CodeStart(), | 
| -                               0, | 
| -                               desc->CodeSize(), | 
| -                               ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC)); | 
| +      new(zone) FullHeaderELFSection( | 
| +          ".text", | 
| +          ELFSection::TYPE_NOBITS, | 
| +          kCodeAlignment, | 
| +          desc->CodeStart(), | 
| +          0, | 
| +          desc->CodeSize(), | 
| +          ELFSection::FLAG_ALLOC | ELFSection::FLAG_EXEC), | 
| +      zone); | 
|  | 
| CreateSymbolsTable(desc, &elf, text_section_index); | 
|  | 
|  |