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; |
+ } |
} |