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 |