| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_IC_H_ | 5 #ifndef V8_IC_H_ |
| 6 #define V8_IC_H_ | 6 #define V8_IC_H_ |
| 7 | 7 |
| 8 #include "src/ic/ic-state.h" | 8 #include "src/ic/ic-state.h" |
| 9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
| 10 | 10 |
| (...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 private: | 513 private: |
| 514 static void Clear(Isolate* isolate, Address address, Code* target, | 514 static void Clear(Isolate* isolate, Address address, Code* target, |
| 515 ConstantPoolArray* constant_pool); | 515 ConstantPoolArray* constant_pool); |
| 516 | 516 |
| 517 friend class IC; | 517 friend class IC; |
| 518 }; | 518 }; |
| 519 | 519 |
| 520 | 520 |
| 521 class StoreIC : public IC { | 521 class StoreIC : public IC { |
| 522 public: | 522 public: |
| 523 class StrictModeState : public BitField<StrictMode, 1, 1> {}; | 523 STATIC_ASSERT(i::LANGUAGE_END == 2); |
| 524 static ExtraICState ComputeExtraICState(StrictMode flag) { | 524 class LanguageModeState : public BitField<LanguageMode, 1, 1> {}; |
| 525 return StrictModeState::encode(flag); | 525 static ExtraICState ComputeExtraICState(LanguageMode flag) { |
| 526 return LanguageModeState::encode(flag); |
| 526 } | 527 } |
| 527 static StrictMode GetStrictMode(ExtraICState state) { | 528 static LanguageMode GetLanguageMode(ExtraICState state) { |
| 528 return StrictModeState::decode(state); | 529 return LanguageModeState::decode(state); |
| 529 } | 530 } |
| 530 | 531 |
| 531 // For convenience, a statically declared encoding of strict mode extra | 532 // For convenience, a statically declared encoding of strict mode extra |
| 532 // IC state. | 533 // IC state. |
| 533 static const ExtraICState kStrictModeState = 1 << StrictModeState::kShift; | 534 static const ExtraICState kStrictModeState = STRICT |
| 535 << LanguageModeState::kShift; |
| 534 | 536 |
| 535 StoreIC(FrameDepth depth, Isolate* isolate) : IC(depth, isolate) { | 537 StoreIC(FrameDepth depth, Isolate* isolate) : IC(depth, isolate) { |
| 536 DCHECK(IsStoreStub()); | 538 DCHECK(IsStoreStub()); |
| 537 } | 539 } |
| 538 | 540 |
| 539 StrictMode strict_mode() const { | 541 LanguageMode language_mode() const { |
| 540 return StrictModeState::decode(extra_ic_state()); | 542 return LanguageModeState::decode(extra_ic_state()); |
| 541 } | 543 } |
| 542 | 544 |
| 543 // Code generators for stub routines. Only called once at startup. | 545 // Code generators for stub routines. Only called once at startup. |
| 544 static void GenerateSlow(MacroAssembler* masm); | 546 static void GenerateSlow(MacroAssembler* masm); |
| 545 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | 547 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
| 546 static void GeneratePreMonomorphic(MacroAssembler* masm) { | 548 static void GeneratePreMonomorphic(MacroAssembler* masm) { |
| 547 GenerateMiss(masm); | 549 GenerateMiss(masm); |
| 548 } | 550 } |
| 549 static void GenerateMiss(MacroAssembler* masm); | 551 static void GenerateMiss(MacroAssembler* masm); |
| 550 static void GenerateMegamorphic(MacroAssembler* masm); | 552 static void GenerateMegamorphic(MacroAssembler* masm); |
| 551 static void GenerateNormal(MacroAssembler* masm); | 553 static void GenerateNormal(MacroAssembler* masm); |
| 552 static void GenerateRuntimeSetProperty(MacroAssembler* masm, | 554 static void GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 553 StrictMode strict_mode); | 555 LanguageMode language_mode); |
| 554 | 556 |
| 555 static Handle<Code> initialize_stub(Isolate* isolate, StrictMode strict_mode); | 557 static Handle<Code> initialize_stub(Isolate* isolate, |
| 558 LanguageMode language_mode); |
| 556 | 559 |
| 557 MUST_USE_RESULT MaybeHandle<Object> Store( | 560 MUST_USE_RESULT MaybeHandle<Object> Store( |
| 558 Handle<Object> object, Handle<Name> name, Handle<Object> value, | 561 Handle<Object> object, Handle<Name> name, Handle<Object> value, |
| 559 JSReceiver::StoreFromKeyed store_mode = | 562 JSReceiver::StoreFromKeyed store_mode = |
| 560 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); | 563 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); |
| 561 | 564 |
| 562 bool LookupForWrite(LookupIterator* it, Handle<Object> value, | 565 bool LookupForWrite(LookupIterator* it, Handle<Object> value, |
| 563 JSReceiver::StoreFromKeyed store_mode); | 566 JSReceiver::StoreFromKeyed store_mode); |
| 564 | 567 |
| 565 protected: | 568 protected: |
| 566 // Stub accessors. | 569 // Stub accessors. |
| 567 Handle<Code> megamorphic_stub() OVERRIDE; | 570 Handle<Code> megamorphic_stub() OVERRIDE; |
| 568 Handle<Code> slow_stub() const; | 571 Handle<Code> slow_stub() const; |
| 569 | 572 |
| 570 virtual Handle<Code> pre_monomorphic_stub() const { | 573 virtual Handle<Code> pre_monomorphic_stub() const { |
| 571 return pre_monomorphic_stub(isolate(), strict_mode()); | 574 return pre_monomorphic_stub(isolate(), language_mode()); |
| 572 } | 575 } |
| 573 | 576 |
| 574 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | 577 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
| 575 StrictMode strict_mode); | 578 LanguageMode language_mode); |
| 576 | 579 |
| 577 // Update the inline cache and the global stub cache based on the | 580 // Update the inline cache and the global stub cache based on the |
| 578 // lookup result. | 581 // lookup result. |
| 579 void UpdateCaches(LookupIterator* lookup, Handle<Object> value, | 582 void UpdateCaches(LookupIterator* lookup, Handle<Object> value, |
| 580 JSReceiver::StoreFromKeyed store_mode); | 583 JSReceiver::StoreFromKeyed store_mode); |
| 581 virtual Handle<Code> CompileHandler(LookupIterator* lookup, | 584 virtual Handle<Code> CompileHandler(LookupIterator* lookup, |
| 582 Handle<Object> value, | 585 Handle<Object> value, |
| 583 CacheHolderFlag cache_holder) OVERRIDE; | 586 CacheHolderFlag cache_holder) OVERRIDE; |
| 584 | 587 |
| 585 private: | 588 private: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 600 | 603 |
| 601 class KeyedStoreIC : public StoreIC { | 604 class KeyedStoreIC : public StoreIC { |
| 602 public: | 605 public: |
| 603 // ExtraICState bits (building on IC) | 606 // ExtraICState bits (building on IC) |
| 604 // ExtraICState bits | 607 // ExtraICState bits |
| 605 class ExtraICStateKeyedAccessStoreMode | 608 class ExtraICStateKeyedAccessStoreMode |
| 606 : public BitField<KeyedAccessStoreMode, 2, 4> {}; // NOLINT | 609 : public BitField<KeyedAccessStoreMode, 2, 4> {}; // NOLINT |
| 607 | 610 |
| 608 class IcCheckTypeField : public BitField<IcCheckType, 6, 1> {}; | 611 class IcCheckTypeField : public BitField<IcCheckType, 6, 1> {}; |
| 609 | 612 |
| 610 static ExtraICState ComputeExtraICState(StrictMode flag, | 613 static ExtraICState ComputeExtraICState(LanguageMode flag, |
| 611 KeyedAccessStoreMode mode) { | 614 KeyedAccessStoreMode mode) { |
| 612 return StrictModeState::encode(flag) | | 615 return LanguageModeState::encode(flag) | |
| 613 ExtraICStateKeyedAccessStoreMode::encode(mode) | | 616 ExtraICStateKeyedAccessStoreMode::encode(mode) | |
| 614 IcCheckTypeField::encode(ELEMENT); | 617 IcCheckTypeField::encode(ELEMENT); |
| 615 } | 618 } |
| 616 | 619 |
| 617 static KeyedAccessStoreMode GetKeyedAccessStoreMode( | 620 static KeyedAccessStoreMode GetKeyedAccessStoreMode( |
| 618 ExtraICState extra_state) { | 621 ExtraICState extra_state) { |
| 619 return ExtraICStateKeyedAccessStoreMode::decode(extra_state); | 622 return ExtraICStateKeyedAccessStoreMode::decode(extra_state); |
| 620 } | 623 } |
| 621 | 624 |
| 622 static IcCheckType GetKeyType(ExtraICState extra_state) { | 625 static IcCheckType GetKeyType(ExtraICState extra_state) { |
| 623 return IcCheckTypeField::decode(extra_state); | 626 return IcCheckTypeField::decode(extra_state); |
| 624 } | 627 } |
| 625 | 628 |
| 626 KeyedStoreIC(FrameDepth depth, Isolate* isolate) : StoreIC(depth, isolate) { | 629 KeyedStoreIC(FrameDepth depth, Isolate* isolate) : StoreIC(depth, isolate) { |
| 627 DCHECK(target()->is_keyed_store_stub()); | 630 DCHECK(target()->is_keyed_store_stub()); |
| 628 } | 631 } |
| 629 | 632 |
| 630 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, | 633 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, |
| 631 Handle<Object> name, | 634 Handle<Object> name, |
| 632 Handle<Object> value); | 635 Handle<Object> value); |
| 633 | 636 |
| 634 // Code generators for stub routines. Only called once at startup. | 637 // Code generators for stub routines. Only called once at startup. |
| 635 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | 638 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } |
| 636 static void GeneratePreMonomorphic(MacroAssembler* masm) { | 639 static void GeneratePreMonomorphic(MacroAssembler* masm) { |
| 637 GenerateMiss(masm); | 640 GenerateMiss(masm); |
| 638 } | 641 } |
| 639 static void GenerateMiss(MacroAssembler* masm); | 642 static void GenerateMiss(MacroAssembler* masm); |
| 640 static void GenerateSlow(MacroAssembler* masm); | 643 static void GenerateSlow(MacroAssembler* masm); |
| 641 static void GenerateMegamorphic(MacroAssembler* masm, StrictMode strict_mode); | 644 static void GenerateMegamorphic(MacroAssembler* masm, |
| 645 LanguageMode language_mode); |
| 642 static void GenerateSloppyArguments(MacroAssembler* masm); | 646 static void GenerateSloppyArguments(MacroAssembler* masm); |
| 643 | 647 |
| 644 protected: | 648 protected: |
| 645 virtual Handle<Code> pre_monomorphic_stub() const { | 649 virtual Handle<Code> pre_monomorphic_stub() const { |
| 646 return pre_monomorphic_stub(isolate(), strict_mode()); | 650 return pre_monomorphic_stub(isolate(), language_mode()); |
| 647 } | 651 } |
| 648 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | 652 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, |
| 649 StrictMode strict_mode) { | 653 LanguageMode language_mode) { |
| 650 if (strict_mode == STRICT) { | 654 if (is_strict(language_mode)) { |
| 651 return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); | 655 return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); |
| 652 } else { | 656 } else { |
| 653 return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); | 657 return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); |
| 654 } | 658 } |
| 655 } | 659 } |
| 656 | 660 |
| 657 Handle<Code> StoreElementStub(Handle<JSObject> receiver, | 661 Handle<Code> StoreElementStub(Handle<JSObject> receiver, |
| 658 KeyedAccessStoreMode store_mode); | 662 KeyedAccessStoreMode store_mode); |
| 659 | 663 |
| 660 private: | 664 private: |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 | 770 |
| 767 // Support functions for interceptor handlers. | 771 // Support functions for interceptor handlers. |
| 768 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly); | 772 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptorOnly); |
| 769 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptor); | 773 DECLARE_RUNTIME_FUNCTION(LoadPropertyWithInterceptor); |
| 770 DECLARE_RUNTIME_FUNCTION(LoadElementWithInterceptor); | 774 DECLARE_RUNTIME_FUNCTION(LoadElementWithInterceptor); |
| 771 DECLARE_RUNTIME_FUNCTION(StorePropertyWithInterceptor); | 775 DECLARE_RUNTIME_FUNCTION(StorePropertyWithInterceptor); |
| 772 } | 776 } |
| 773 } // namespace v8::internal | 777 } // namespace v8::internal |
| 774 | 778 |
| 775 #endif // V8_IC_H_ | 779 #endif // V8_IC_H_ |
| OLD | NEW |