| Index: src/code-stubs.cc
 | 
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
 | 
| index c7d4c805d0c87824ecd1cbdb23afc49dfa710f02..276c87ebd00a227f162ed93cf81770ddcce05830 100644
 | 
| --- a/src/code-stubs.cc
 | 
| +++ b/src/code-stubs.cc
 | 
| @@ -48,6 +48,20 @@ bool CodeStub::FindCodeInCache(Code** code_out, Isolate* isolate) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void CodeStub::GenerateCode(MacroAssembler* masm) {
 | 
| +  // Update the static counter each time a new code stub is generated.
 | 
| +  masm->isolate()->counters()->code_stubs()->Increment();
 | 
| +
 | 
| +  // Nested stubs are not allowed for leaves.
 | 
| +  AllowStubCallsScope allow_scope(masm, false);
 | 
| +
 | 
| +  // Generate the code for the stub.
 | 
| +  masm->set_generating_stub(true);
 | 
| +  NoCurrentFrameScope scope(masm);
 | 
| +  Generate(masm);
 | 
| +}
 | 
| +
 | 
| +
 | 
|  SmartArrayPointer<const char> CodeStub::GetName() {
 | 
|    char buffer[100];
 | 
|    NoAllocationStringAllocator allocator(buffer,
 | 
| @@ -58,7 +72,8 @@ SmartArrayPointer<const char> CodeStub::GetName() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void CodeStub::RecordCodeGeneration(Code* code, Isolate* isolate) {
 | 
| +void CodeStub::RecordCodeGeneration(Code* code, MacroAssembler* masm) {
 | 
| +  Isolate* isolate = masm->isolate();
 | 
|    SmartArrayPointer<const char> name = GetName();
 | 
|    PROFILE(isolate, CodeCreateEvent(Logger::STUB_TAG, code, *name));
 | 
|    GDBJIT(AddCode(GDBJITInterface::STUB, *name, code));
 | 
| @@ -72,39 +87,6 @@ int CodeStub::GetCodeKind() {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -Handle<Code> PlatformCodeStub::GenerateCode() {
 | 
| -  Isolate* isolate = Isolate::Current();
 | 
| -  Factory* factory = isolate->factory();
 | 
| -
 | 
| -  // Generate the new code.
 | 
| -  MacroAssembler masm(isolate, NULL, 256);
 | 
| -
 | 
| -  {
 | 
| -    // Update the static counter each time a new code stub is generated.
 | 
| -    isolate->counters()->code_stubs()->Increment();
 | 
| -
 | 
| -    // Nested stubs are not allowed for leaves.
 | 
| -    AllowStubCallsScope allow_scope(&masm, false);
 | 
| -
 | 
| -    // Generate the code for the stub.
 | 
| -    masm.set_generating_stub(true);
 | 
| -    NoCurrentFrameScope scope(&masm);
 | 
| -    Generate(&masm);
 | 
| -  }
 | 
| -
 | 
| -  // Create the code object.
 | 
| -  CodeDesc desc;
 | 
| -  masm.GetCode(&desc);
 | 
| -
 | 
| -  // Copy the generated code into a heap object.
 | 
| -  Code::Flags flags = Code::ComputeFlags(
 | 
| -      static_cast<Code::Kind>(GetCodeKind()), GetICState());
 | 
| -  Handle<Code> new_object = factory->NewCode(
 | 
| -      desc, flags, masm.CodeObject(), NeedsImmovableCode());
 | 
| -  return new_object;
 | 
| -}
 | 
| -
 | 
| -
 | 
|  Handle<Code> CodeStub::GetCode() {
 | 
|    Isolate* isolate = Isolate::Current();
 | 
|    Factory* factory = isolate->factory();
 | 
| @@ -120,10 +102,23 @@ Handle<Code> CodeStub::GetCode() {
 | 
|    {
 | 
|      HandleScope scope(isolate);
 | 
|  
 | 
| -    Handle<Code> new_object = GenerateCode();
 | 
| +    // Generate the new code.
 | 
| +    MacroAssembler masm(isolate, NULL, 256);
 | 
| +    GenerateCode(&masm);
 | 
| +
 | 
| +    // Create the code object.
 | 
| +    CodeDesc desc;
 | 
| +    masm.GetCode(&desc);
 | 
| +
 | 
| +    // Copy the generated code into a heap object.
 | 
| +    Code::Flags flags = Code::ComputeFlags(
 | 
| +        static_cast<Code::Kind>(GetCodeKind()),
 | 
| +        GetICState());
 | 
| +    Handle<Code> new_object = factory->NewCode(
 | 
| +        desc, flags, masm.CodeObject(), NeedsImmovableCode());
 | 
|      new_object->set_major_key(MajorKey());
 | 
|      FinishCode(new_object);
 | 
| -    RecordCodeGeneration(*new_object, isolate);
 | 
| +    RecordCodeGeneration(*new_object, &masm);
 | 
|  
 | 
|  #ifdef ENABLE_DISASSEMBLER
 | 
|      if (FLAG_print_code_stubs) {
 | 
| @@ -421,8 +416,36 @@ void JSEntryStub::FinishCode(Handle<Code> code) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void KeyedLoadDictionaryElementStub::Generate(MacroAssembler* masm) {
 | 
| -  KeyedLoadStubCompiler::GenerateLoadDictionaryElement(masm);
 | 
| +void KeyedLoadElementStub::Generate(MacroAssembler* masm) {
 | 
| +  switch (elements_kind_) {
 | 
| +    case FAST_ELEMENTS:
 | 
| +    case FAST_HOLEY_ELEMENTS:
 | 
| +    case FAST_SMI_ELEMENTS:
 | 
| +    case FAST_HOLEY_SMI_ELEMENTS:
 | 
| +      KeyedLoadStubCompiler::GenerateLoadFastElement(masm);
 | 
| +      break;
 | 
| +    case FAST_DOUBLE_ELEMENTS:
 | 
| +    case FAST_HOLEY_DOUBLE_ELEMENTS:
 | 
| +      KeyedLoadStubCompiler::GenerateLoadFastDoubleElement(masm);
 | 
| +      break;
 | 
| +    case EXTERNAL_BYTE_ELEMENTS:
 | 
| +    case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
 | 
| +    case EXTERNAL_SHORT_ELEMENTS:
 | 
| +    case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
 | 
| +    case EXTERNAL_INT_ELEMENTS:
 | 
| +    case EXTERNAL_UNSIGNED_INT_ELEMENTS:
 | 
| +    case EXTERNAL_FLOAT_ELEMENTS:
 | 
| +    case EXTERNAL_DOUBLE_ELEMENTS:
 | 
| +    case EXTERNAL_PIXEL_ELEMENTS:
 | 
| +      KeyedLoadStubCompiler::GenerateLoadExternalArray(masm, elements_kind_);
 | 
| +      break;
 | 
| +    case DICTIONARY_ELEMENTS:
 | 
| +      KeyedLoadStubCompiler::GenerateLoadDictionaryElement(masm);
 | 
| +      break;
 | 
| +    case NON_STRICT_ARGUMENTS_ELEMENTS:
 | 
| +      UNREACHABLE();
 | 
| +      break;
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |