| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 UnseededNumberDictionary* stubs = isolate->heap()->code_stubs(); | 41 UnseededNumberDictionary* stubs = isolate->heap()->code_stubs(); |
| 42 int index = stubs->FindEntry(GetKey()); | 42 int index = stubs->FindEntry(GetKey()); |
| 43 if (index != UnseededNumberDictionary::kNotFound) { | 43 if (index != UnseededNumberDictionary::kNotFound) { |
| 44 *code_out = Code::cast(stubs->ValueAt(index)); | 44 *code_out = Code::cast(stubs->ValueAt(index)); |
| 45 return true; | 45 return true; |
| 46 } | 46 } |
| 47 return false; | 47 return false; |
| 48 } | 48 } |
| 49 | 49 |
| 50 | 50 |
| 51 void CodeStub::GenerateCode(MacroAssembler* masm) { |
| 52 // Update the static counter each time a new code stub is generated. |
| 53 masm->isolate()->counters()->code_stubs()->Increment(); |
| 54 |
| 55 // Nested stubs are not allowed for leaves. |
| 56 AllowStubCallsScope allow_scope(masm, false); |
| 57 |
| 58 // Generate the code for the stub. |
| 59 masm->set_generating_stub(true); |
| 60 NoCurrentFrameScope scope(masm); |
| 61 Generate(masm); |
| 62 } |
| 63 |
| 64 |
| 51 SmartArrayPointer<const char> CodeStub::GetName() { | 65 SmartArrayPointer<const char> CodeStub::GetName() { |
| 52 char buffer[100]; | 66 char buffer[100]; |
| 53 NoAllocationStringAllocator allocator(buffer, | 67 NoAllocationStringAllocator allocator(buffer, |
| 54 static_cast<unsigned>(sizeof(buffer))); | 68 static_cast<unsigned>(sizeof(buffer))); |
| 55 StringStream stream(&allocator); | 69 StringStream stream(&allocator); |
| 56 PrintName(&stream); | 70 PrintName(&stream); |
| 57 return stream.ToCString(); | 71 return stream.ToCString(); |
| 58 } | 72 } |
| 59 | 73 |
| 60 | 74 |
| 61 void CodeStub::RecordCodeGeneration(Code* code, Isolate* isolate) { | 75 void CodeStub::RecordCodeGeneration(Code* code, MacroAssembler* masm) { |
| 76 Isolate* isolate = masm->isolate(); |
| 62 SmartArrayPointer<const char> name = GetName(); | 77 SmartArrayPointer<const char> name = GetName(); |
| 63 PROFILE(isolate, CodeCreateEvent(Logger::STUB_TAG, code, *name)); | 78 PROFILE(isolate, CodeCreateEvent(Logger::STUB_TAG, code, *name)); |
| 64 GDBJIT(AddCode(GDBJITInterface::STUB, *name, code)); | 79 GDBJIT(AddCode(GDBJITInterface::STUB, *name, code)); |
| 65 Counters* counters = isolate->counters(); | 80 Counters* counters = isolate->counters(); |
| 66 counters->total_stubs_code_size()->Increment(code->instruction_size()); | 81 counters->total_stubs_code_size()->Increment(code->instruction_size()); |
| 67 } | 82 } |
| 68 | 83 |
| 69 | 84 |
| 70 int CodeStub::GetCodeKind() { | 85 int CodeStub::GetCodeKind() { |
| 71 return Code::STUB; | 86 return Code::STUB; |
| 72 } | 87 } |
| 73 | 88 |
| 74 | 89 |
| 75 Handle<Code> PlatformCodeStub::GenerateCode() { | |
| 76 Isolate* isolate = Isolate::Current(); | |
| 77 Factory* factory = isolate->factory(); | |
| 78 | |
| 79 // Generate the new code. | |
| 80 MacroAssembler masm(isolate, NULL, 256); | |
| 81 | |
| 82 { | |
| 83 // Update the static counter each time a new code stub is generated. | |
| 84 isolate->counters()->code_stubs()->Increment(); | |
| 85 | |
| 86 // Nested stubs are not allowed for leaves. | |
| 87 AllowStubCallsScope allow_scope(&masm, false); | |
| 88 | |
| 89 // Generate the code for the stub. | |
| 90 masm.set_generating_stub(true); | |
| 91 NoCurrentFrameScope scope(&masm); | |
| 92 Generate(&masm); | |
| 93 } | |
| 94 | |
| 95 // Create the code object. | |
| 96 CodeDesc desc; | |
| 97 masm.GetCode(&desc); | |
| 98 | |
| 99 // Copy the generated code into a heap object. | |
| 100 Code::Flags flags = Code::ComputeFlags( | |
| 101 static_cast<Code::Kind>(GetCodeKind()), GetICState()); | |
| 102 Handle<Code> new_object = factory->NewCode( | |
| 103 desc, flags, masm.CodeObject(), NeedsImmovableCode()); | |
| 104 return new_object; | |
| 105 } | |
| 106 | |
| 107 | |
| 108 Handle<Code> CodeStub::GetCode() { | 90 Handle<Code> CodeStub::GetCode() { |
| 109 Isolate* isolate = Isolate::Current(); | 91 Isolate* isolate = Isolate::Current(); |
| 110 Factory* factory = isolate->factory(); | 92 Factory* factory = isolate->factory(); |
| 111 Heap* heap = isolate->heap(); | 93 Heap* heap = isolate->heap(); |
| 112 Code* code; | 94 Code* code; |
| 113 if (UseSpecialCache() | 95 if (UseSpecialCache() |
| 114 ? FindCodeInSpecialCache(&code, isolate) | 96 ? FindCodeInSpecialCache(&code, isolate) |
| 115 : FindCodeInCache(&code, isolate)) { | 97 : FindCodeInCache(&code, isolate)) { |
| 116 ASSERT(IsPregenerated() == code->is_pregenerated()); | 98 ASSERT(IsPregenerated() == code->is_pregenerated()); |
| 117 return Handle<Code>(code); | 99 return Handle<Code>(code); |
| 118 } | 100 } |
| 119 | 101 |
| 120 { | 102 { |
| 121 HandleScope scope(isolate); | 103 HandleScope scope(isolate); |
| 122 | 104 |
| 123 Handle<Code> new_object = GenerateCode(); | 105 // Generate the new code. |
| 106 MacroAssembler masm(isolate, NULL, 256); |
| 107 GenerateCode(&masm); |
| 108 |
| 109 // Create the code object. |
| 110 CodeDesc desc; |
| 111 masm.GetCode(&desc); |
| 112 |
| 113 // Copy the generated code into a heap object. |
| 114 Code::Flags flags = Code::ComputeFlags( |
| 115 static_cast<Code::Kind>(GetCodeKind()), |
| 116 GetICState()); |
| 117 Handle<Code> new_object = factory->NewCode( |
| 118 desc, flags, masm.CodeObject(), NeedsImmovableCode()); |
| 124 new_object->set_major_key(MajorKey()); | 119 new_object->set_major_key(MajorKey()); |
| 125 FinishCode(new_object); | 120 FinishCode(new_object); |
| 126 RecordCodeGeneration(*new_object, isolate); | 121 RecordCodeGeneration(*new_object, &masm); |
| 127 | 122 |
| 128 #ifdef ENABLE_DISASSEMBLER | 123 #ifdef ENABLE_DISASSEMBLER |
| 129 if (FLAG_print_code_stubs) { | 124 if (FLAG_print_code_stubs) { |
| 130 new_object->Disassemble(*GetName()); | 125 new_object->Disassemble(*GetName()); |
| 131 PrintF("\n"); | 126 PrintF("\n"); |
| 132 } | 127 } |
| 133 #endif | 128 #endif |
| 134 | 129 |
| 135 if (UseSpecialCache()) { | 130 if (UseSpecialCache()) { |
| 136 AddToSpecialCache(new_object); | 131 AddToSpecialCache(new_object); |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 | 409 |
| 415 | 410 |
| 416 void JSEntryStub::FinishCode(Handle<Code> code) { | 411 void JSEntryStub::FinishCode(Handle<Code> code) { |
| 417 Handle<FixedArray> handler_table = | 412 Handle<FixedArray> handler_table = |
| 418 code->GetIsolate()->factory()->NewFixedArray(1, TENURED); | 413 code->GetIsolate()->factory()->NewFixedArray(1, TENURED); |
| 419 handler_table->set(0, Smi::FromInt(handler_offset_)); | 414 handler_table->set(0, Smi::FromInt(handler_offset_)); |
| 420 code->set_handler_table(*handler_table); | 415 code->set_handler_table(*handler_table); |
| 421 } | 416 } |
| 422 | 417 |
| 423 | 418 |
| 424 void KeyedLoadDictionaryElementStub::Generate(MacroAssembler* masm) { | 419 void KeyedLoadElementStub::Generate(MacroAssembler* masm) { |
| 425 KeyedLoadStubCompiler::GenerateLoadDictionaryElement(masm); | 420 switch (elements_kind_) { |
| 421 case FAST_ELEMENTS: |
| 422 case FAST_HOLEY_ELEMENTS: |
| 423 case FAST_SMI_ELEMENTS: |
| 424 case FAST_HOLEY_SMI_ELEMENTS: |
| 425 KeyedLoadStubCompiler::GenerateLoadFastElement(masm); |
| 426 break; |
| 427 case FAST_DOUBLE_ELEMENTS: |
| 428 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 429 KeyedLoadStubCompiler::GenerateLoadFastDoubleElement(masm); |
| 430 break; |
| 431 case EXTERNAL_BYTE_ELEMENTS: |
| 432 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: |
| 433 case EXTERNAL_SHORT_ELEMENTS: |
| 434 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: |
| 435 case EXTERNAL_INT_ELEMENTS: |
| 436 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
| 437 case EXTERNAL_FLOAT_ELEMENTS: |
| 438 case EXTERNAL_DOUBLE_ELEMENTS: |
| 439 case EXTERNAL_PIXEL_ELEMENTS: |
| 440 KeyedLoadStubCompiler::GenerateLoadExternalArray(masm, elements_kind_); |
| 441 break; |
| 442 case DICTIONARY_ELEMENTS: |
| 443 KeyedLoadStubCompiler::GenerateLoadDictionaryElement(masm); |
| 444 break; |
| 445 case NON_STRICT_ARGUMENTS_ELEMENTS: |
| 446 UNREACHABLE(); |
| 447 break; |
| 448 } |
| 426 } | 449 } |
| 427 | 450 |
| 428 | 451 |
| 429 void KeyedStoreElementStub::Generate(MacroAssembler* masm) { | 452 void KeyedStoreElementStub::Generate(MacroAssembler* masm) { |
| 430 switch (elements_kind_) { | 453 switch (elements_kind_) { |
| 431 case FAST_ELEMENTS: | 454 case FAST_ELEMENTS: |
| 432 case FAST_HOLEY_ELEMENTS: | 455 case FAST_HOLEY_ELEMENTS: |
| 433 case FAST_SMI_ELEMENTS: | 456 case FAST_SMI_ELEMENTS: |
| 434 case FAST_HOLEY_SMI_ELEMENTS: { | 457 case FAST_HOLEY_SMI_ELEMENTS: { |
| 435 KeyedStoreStubCompiler::GenerateStoreFastElement(masm, | 458 KeyedStoreStubCompiler::GenerateStoreFastElement(masm, |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 620 // already active, as the hooks won't stack. | 643 // already active, as the hooks won't stack. |
| 621 if (entry_hook != 0 && entry_hook_ != 0) | 644 if (entry_hook != 0 && entry_hook_ != 0) |
| 622 return false; | 645 return false; |
| 623 | 646 |
| 624 entry_hook_ = entry_hook; | 647 entry_hook_ = entry_hook; |
| 625 return true; | 648 return true; |
| 626 } | 649 } |
| 627 | 650 |
| 628 | 651 |
| 629 } } // namespace v8::internal | 652 } } // namespace v8::internal |
| OLD | NEW |