Chromium Code Reviews| Index: src/code-stubs.cc |
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
| index 276c87ebd00a227f162ed93cf81770ddcce05830..c284ea72f8e896404ae3c0bd68e52cd50db33898 100644 |
| --- a/src/code-stubs.cc |
| +++ b/src/code-stubs.cc |
| @@ -48,20 +48,6 @@ 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, |
| @@ -72,8 +58,7 @@ SmartArrayPointer<const char> CodeStub::GetName() { |
| } |
| -void CodeStub::RecordCodeGeneration(Code* code, MacroAssembler* masm) { |
| - Isolate* isolate = masm->isolate(); |
| +void CodeStub::RecordCodeGeneration(Code* code, Isolate* isolate) { |
| SmartArrayPointer<const char> name = GetName(); |
| PROFILE(isolate, CodeCreateEvent(Logger::STUB_TAG, code, *name)); |
| GDBJIT(AddCode(GDBJITInterface::STUB, *name, code)); |
| @@ -87,6 +72,40 @@ 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()); |
|
Jakob Kummerow
2012/11/28 16:28:22
nit: fits on previous line?
danno
2012/11/30 16:23:24
Done.
|
| + 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(); |
| @@ -102,23 +121,10 @@ Handle<Code> CodeStub::GetCode() { |
| { |
| HandleScope scope(isolate); |
| - // 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()); |
| + Handle<Code> new_object = GenerateCode(); |
| new_object->set_major_key(MajorKey()); |
| FinishCode(new_object); |
| - RecordCodeGeneration(*new_object, &masm); |
| + RecordCodeGeneration(*new_object, isolate); |
| #ifdef ENABLE_DISASSEMBLER |
| if (FLAG_print_code_stubs) { |
| @@ -416,36 +422,8 @@ void JSEntryStub::FinishCode(Handle<Code> code) { |
| } |
| -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; |
| - } |
| +void KeyedLoadDictionaryElementStub::Generate(MacroAssembler* masm) { |
| + KeyedLoadStubCompiler::GenerateLoadDictionaryElement(masm); |
| } |