Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: src/ic.h

Issue 430503007: Rename ASSERT* to DCHECK*. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE and fixes Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ia32/stub-cache-ia32.cc ('k') | src/ic.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/macro-assembler.h" 8 #include "src/macro-assembler.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 virtual ~IC() {} 69 virtual ~IC() {}
70 70
71 State state() const { return state_; } 71 State state() const { return state_; }
72 inline Address address() const; 72 inline Address address() const;
73 73
74 // Compute the current IC state based on the target stub, receiver and name. 74 // Compute the current IC state based on the target stub, receiver and name.
75 void UpdateState(Handle<Object> receiver, Handle<Object> name); 75 void UpdateState(Handle<Object> receiver, Handle<Object> name);
76 76
77 bool IsNameCompatibleWithPrototypeFailure(Handle<Object> name); 77 bool IsNameCompatibleWithPrototypeFailure(Handle<Object> name);
78 void MarkPrototypeFailure(Handle<Object> name) { 78 void MarkPrototypeFailure(Handle<Object> name) {
79 ASSERT(IsNameCompatibleWithPrototypeFailure(name)); 79 DCHECK(IsNameCompatibleWithPrototypeFailure(name));
80 state_ = PROTOTYPE_FAILURE; 80 state_ = PROTOTYPE_FAILURE;
81 } 81 }
82 82
83 // If the stub contains weak maps then this function adds the stub to 83 // If the stub contains weak maps then this function adds the stub to
84 // the dependent code array of each weak map. 84 // the dependent code array of each weak map.
85 static void RegisterWeakMapDependency(Handle<Code> stub); 85 static void RegisterWeakMapDependency(Handle<Code> stub);
86 86
87 // This function is called when a weak map in the stub is dying, 87 // This function is called when a weak map in the stub is dying,
88 // invalidates the stub by setting maps in it to undefined. 88 // invalidates the stub by setting maps in it to undefined.
89 static void InvalidateMaps(Code* stub); 89 static void InvalidateMaps(Code* stub);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 void UpdateMonomorphicIC(Handle<Code> handler, Handle<String> name); 205 void UpdateMonomorphicIC(Handle<Code> handler, Handle<String> name);
206 bool UpdatePolymorphicIC(Handle<String> name, Handle<Code> code); 206 bool UpdatePolymorphicIC(Handle<String> name, Handle<Code> code);
207 void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code); 207 void UpdateMegamorphicCache(HeapType* type, Name* name, Code* code);
208 208
209 void CopyICToMegamorphicCache(Handle<String> name); 209 void CopyICToMegamorphicCache(Handle<String> name);
210 bool IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map); 210 bool IsTransitionOfMonomorphicTarget(Map* source_map, Map* target_map);
211 void PatchCache(Handle<String> name, Handle<Code> code); 211 void PatchCache(Handle<String> name, Handle<Code> code);
212 Code::Kind kind() const { return kind_; } 212 Code::Kind kind() const { return kind_; }
213 Code::Kind handler_kind() const { 213 Code::Kind handler_kind() const {
214 if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC; 214 if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC;
215 ASSERT(kind_ == Code::LOAD_IC || kind_ == Code::STORE_IC || 215 DCHECK(kind_ == Code::LOAD_IC || kind_ == Code::STORE_IC ||
216 kind_ == Code::KEYED_STORE_IC); 216 kind_ == Code::KEYED_STORE_IC);
217 return kind_; 217 return kind_;
218 } 218 }
219 virtual Handle<Code> megamorphic_stub() { 219 virtual Handle<Code> megamorphic_stub() {
220 UNREACHABLE(); 220 UNREACHABLE();
221 return Handle<Code>::null(); 221 return Handle<Code>::null();
222 } 222 }
223 223
224 bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, 224 bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver,
225 Handle<String> name); 225 Handle<String> name);
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 static ContextualMode GetContextualMode(ExtraICState state) { 426 static ContextualMode GetContextualMode(ExtraICState state) {
427 return State(state).contextual_mode(); 427 return State(state).contextual_mode();
428 } 428 }
429 429
430 ContextualMode contextual_mode() const { 430 ContextualMode contextual_mode() const {
431 return GetContextualMode(extra_ic_state()); 431 return GetContextualMode(extra_ic_state());
432 } 432 }
433 433
434 explicit LoadIC(FrameDepth depth, Isolate* isolate) 434 explicit LoadIC(FrameDepth depth, Isolate* isolate)
435 : IC(depth, isolate) { 435 : IC(depth, isolate) {
436 ASSERT(IsLoadStub()); 436 DCHECK(IsLoadStub());
437 } 437 }
438 438
439 // Returns if this IC is for contextual (no explicit receiver) 439 // Returns if this IC is for contextual (no explicit receiver)
440 // access to properties. 440 // access to properties.
441 bool IsUndeclaredGlobal(Handle<Object> receiver) { 441 bool IsUndeclaredGlobal(Handle<Object> receiver) {
442 if (receiver->IsGlobalObject()) { 442 if (receiver->IsGlobalObject()) {
443 return contextual_mode() == CONTEXTUAL; 443 return contextual_mode() == CONTEXTUAL;
444 } else { 444 } else {
445 ASSERT(contextual_mode() != CONTEXTUAL); 445 DCHECK(contextual_mode() != CONTEXTUAL);
446 return false; 446 return false;
447 } 447 }
448 } 448 }
449 449
450 // Code generator routines. 450 // Code generator routines.
451 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } 451 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
452 static void GeneratePreMonomorphic(MacroAssembler* masm) { 452 static void GeneratePreMonomorphic(MacroAssembler* masm) {
453 GenerateMiss(masm); 453 GenerateMiss(masm);
454 } 454 }
455 static void GenerateMiss(MacroAssembler* masm); 455 static void GenerateMiss(MacroAssembler* masm);
456 static void GenerateMegamorphic(MacroAssembler* masm); 456 static void GenerateMegamorphic(MacroAssembler* masm);
457 static void GenerateNormal(MacroAssembler* masm); 457 static void GenerateNormal(MacroAssembler* masm);
458 static void GenerateRuntimeGetProperty(MacroAssembler* masm); 458 static void GenerateRuntimeGetProperty(MacroAssembler* masm);
459 459
460 static Handle<Code> initialize_stub(Isolate* isolate, 460 static Handle<Code> initialize_stub(Isolate* isolate,
461 ExtraICState extra_state); 461 ExtraICState extra_state);
462 462
463 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, 463 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object,
464 Handle<String> name); 464 Handle<String> name);
465 465
466 protected: 466 protected:
467 void set_target(Code* code) { 467 void set_target(Code* code) {
468 // The contextual mode must be preserved across IC patching. 468 // The contextual mode must be preserved across IC patching.
469 ASSERT(GetContextualMode(code->extra_ic_state()) == 469 DCHECK(GetContextualMode(code->extra_ic_state()) ==
470 GetContextualMode(target()->extra_ic_state())); 470 GetContextualMode(target()->extra_ic_state()));
471 471
472 IC::set_target(code); 472 IC::set_target(code);
473 } 473 }
474 474
475 Handle<Code> slow_stub() const { 475 Handle<Code> slow_stub() const {
476 if (kind() == Code::LOAD_IC) { 476 if (kind() == Code::LOAD_IC) {
477 return isolate()->builtins()->LoadIC_Slow(); 477 return isolate()->builtins()->LoadIC_Slow();
478 } else { 478 } else {
479 ASSERT_EQ(Code::KEYED_LOAD_IC, kind()); 479 DCHECK_EQ(Code::KEYED_LOAD_IC, kind());
480 return isolate()->builtins()->KeyedLoadIC_Slow(); 480 return isolate()->builtins()->KeyedLoadIC_Slow();
481 } 481 }
482 } 482 }
483 483
484 virtual Handle<Code> megamorphic_stub(); 484 virtual Handle<Code> megamorphic_stub();
485 485
486 // Update the inline cache and the global stub cache based on the 486 // Update the inline cache and the global stub cache based on the
487 // lookup result. 487 // lookup result.
488 void UpdateCaches(LookupIterator* lookup, Handle<Object> object, 488 void UpdateCaches(LookupIterator* lookup, Handle<Object> object,
489 Handle<String> name); 489 Handle<String> name);
(...skipping 17 matching lines...) Expand all
507 ConstantPoolArray* constant_pool); 507 ConstantPoolArray* constant_pool);
508 508
509 friend class IC; 509 friend class IC;
510 }; 510 };
511 511
512 512
513 class KeyedLoadIC: public LoadIC { 513 class KeyedLoadIC: public LoadIC {
514 public: 514 public:
515 explicit KeyedLoadIC(FrameDepth depth, Isolate* isolate) 515 explicit KeyedLoadIC(FrameDepth depth, Isolate* isolate)
516 : LoadIC(depth, isolate) { 516 : LoadIC(depth, isolate) {
517 ASSERT(target()->is_keyed_load_stub()); 517 DCHECK(target()->is_keyed_load_stub());
518 } 518 }
519 519
520 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, 520 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object,
521 Handle<Object> key); 521 Handle<Object> key);
522 522
523 // Code generator routines. 523 // Code generator routines.
524 static void GenerateMiss(MacroAssembler* masm); 524 static void GenerateMiss(MacroAssembler* masm);
525 static void GenerateRuntimeGetProperty(MacroAssembler* masm); 525 static void GenerateRuntimeGetProperty(MacroAssembler* masm);
526 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } 526 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
527 static void GeneratePreMonomorphic(MacroAssembler* masm) { 527 static void GeneratePreMonomorphic(MacroAssembler* masm) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 kNameIndex, 589 kNameIndex,
590 kValueIndex, 590 kValueIndex,
591 kParameterCount 591 kParameterCount
592 }; 592 };
593 static const Register ReceiverRegister(); 593 static const Register ReceiverRegister();
594 static const Register NameRegister(); 594 static const Register NameRegister();
595 static const Register ValueRegister(); 595 static const Register ValueRegister();
596 596
597 StoreIC(FrameDepth depth, Isolate* isolate) 597 StoreIC(FrameDepth depth, Isolate* isolate)
598 : IC(depth, isolate) { 598 : IC(depth, isolate) {
599 ASSERT(IsStoreStub()); 599 DCHECK(IsStoreStub());
600 } 600 }
601 601
602 StrictMode strict_mode() const { 602 StrictMode strict_mode() const {
603 return StrictModeState::decode(extra_ic_state()); 603 return StrictModeState::decode(extra_ic_state());
604 } 604 }
605 605
606 // Code generators for stub routines. Only called once at startup. 606 // Code generators for stub routines. Only called once at startup.
607 static void GenerateSlow(MacroAssembler* masm); 607 static void GenerateSlow(MacroAssembler* masm);
608 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } 608 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
609 static void GeneratePreMonomorphic(MacroAssembler* masm) { 609 static void GeneratePreMonomorphic(MacroAssembler* masm) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 Handle<Object> value); 650 Handle<Object> value);
651 virtual Handle<Code> CompileStoreHandler(LookupResult* lookup, 651 virtual Handle<Code> CompileStoreHandler(LookupResult* lookup,
652 Handle<Object> object, 652 Handle<Object> object,
653 Handle<String> name, 653 Handle<String> name,
654 Handle<Object> value, 654 Handle<Object> value,
655 CacheHolderFlag cache_holder); 655 CacheHolderFlag cache_holder);
656 656
657 private: 657 private:
658 void set_target(Code* code) { 658 void set_target(Code* code) {
659 // Strict mode must be preserved across IC patching. 659 // Strict mode must be preserved across IC patching.
660 ASSERT(GetStrictMode(code->extra_ic_state()) == 660 DCHECK(GetStrictMode(code->extra_ic_state()) ==
661 GetStrictMode(target()->extra_ic_state())); 661 GetStrictMode(target()->extra_ic_state()));
662 IC::set_target(code); 662 IC::set_target(code);
663 } 663 }
664 664
665 static void Clear(Isolate* isolate, 665 static void Clear(Isolate* isolate,
666 Address address, 666 Address address,
667 Code* target, 667 Code* target,
668 ConstantPoolArray* constant_pool); 668 ConstantPoolArray* constant_pool);
669 669
670 friend class IC; 670 friend class IC;
(...skipping 30 matching lines...) Expand all
701 return ExtraICStateKeyedAccessStoreMode::decode(extra_state); 701 return ExtraICStateKeyedAccessStoreMode::decode(extra_state);
702 } 702 }
703 703
704 // The map register isn't part of the normal call specification, but 704 // The map register isn't part of the normal call specification, but
705 // ElementsTransitionAndStoreStub, used in polymorphic keyed store 705 // ElementsTransitionAndStoreStub, used in polymorphic keyed store
706 // stub implementations requires it to be initialized. 706 // stub implementations requires it to be initialized.
707 static const Register MapRegister(); 707 static const Register MapRegister();
708 708
709 KeyedStoreIC(FrameDepth depth, Isolate* isolate) 709 KeyedStoreIC(FrameDepth depth, Isolate* isolate)
710 : StoreIC(depth, isolate) { 710 : StoreIC(depth, isolate) {
711 ASSERT(target()->is_keyed_store_stub()); 711 DCHECK(target()->is_keyed_store_stub());
712 } 712 }
713 713
714 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, 714 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object,
715 Handle<Object> name, 715 Handle<Object> name,
716 Handle<Object> value); 716 Handle<Object> value);
717 717
718 // Code generators for stub routines. Only called once at startup. 718 // Code generators for stub routines. Only called once at startup.
719 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } 719 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); }
720 static void GeneratePreMonomorphic(MacroAssembler* masm) { 720 static void GeneratePreMonomorphic(MacroAssembler* masm) {
721 GenerateMiss(masm); 721 GenerateMiss(masm);
(...skipping 27 matching lines...) Expand all
749 return isolate()->builtins()->KeyedStoreIC_Generic(); 749 return isolate()->builtins()->KeyedStoreIC_Generic();
750 } 750 }
751 } 751 }
752 752
753 Handle<Code> StoreElementStub(Handle<JSObject> receiver, 753 Handle<Code> StoreElementStub(Handle<JSObject> receiver,
754 KeyedAccessStoreMode store_mode); 754 KeyedAccessStoreMode store_mode);
755 755
756 private: 756 private:
757 void set_target(Code* code) { 757 void set_target(Code* code) {
758 // Strict mode must be preserved across IC patching. 758 // Strict mode must be preserved across IC patching.
759 ASSERT(GetStrictMode(code->extra_ic_state()) == strict_mode()); 759 DCHECK(GetStrictMode(code->extra_ic_state()) == strict_mode());
760 IC::set_target(code); 760 IC::set_target(code);
761 } 761 }
762 762
763 // Stub accessors. 763 // Stub accessors.
764 virtual Handle<Code> generic_stub() const { 764 virtual Handle<Code> generic_stub() const {
765 if (strict_mode() == STRICT) { 765 if (strict_mode() == STRICT) {
766 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); 766 return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
767 } else { 767 } else {
768 return isolate()->builtins()->KeyedStoreIC_Generic(); 768 return isolate()->builtins()->KeyedStoreIC_Generic();
769 } 769 }
(...skipping 25 matching lines...) Expand all
795 // Type Recording BinaryOpIC, that records the types of the inputs and outputs. 795 // Type Recording BinaryOpIC, that records the types of the inputs and outputs.
796 class BinaryOpIC: public IC { 796 class BinaryOpIC: public IC {
797 public: 797 public:
798 class State V8_FINAL BASE_EMBEDDED { 798 class State V8_FINAL BASE_EMBEDDED {
799 public: 799 public:
800 State(Isolate* isolate, ExtraICState extra_ic_state); 800 State(Isolate* isolate, ExtraICState extra_ic_state);
801 801
802 State(Isolate* isolate, Token::Value op, OverwriteMode mode) 802 State(Isolate* isolate, Token::Value op, OverwriteMode mode)
803 : op_(op), mode_(mode), left_kind_(NONE), right_kind_(NONE), 803 : op_(op), mode_(mode), left_kind_(NONE), right_kind_(NONE),
804 result_kind_(NONE), isolate_(isolate) { 804 result_kind_(NONE), isolate_(isolate) {
805 ASSERT_LE(FIRST_TOKEN, op); 805 DCHECK_LE(FIRST_TOKEN, op);
806 ASSERT_LE(op, LAST_TOKEN); 806 DCHECK_LE(op, LAST_TOKEN);
807 } 807 }
808 808
809 InlineCacheState GetICState() const { 809 InlineCacheState GetICState() const {
810 if (Max(left_kind_, right_kind_) == NONE) { 810 if (Max(left_kind_, right_kind_) == NONE) {
811 return ::v8::internal::UNINITIALIZED; 811 return ::v8::internal::UNINITIALIZED;
812 } 812 }
813 if (Max(left_kind_, right_kind_) == GENERIC) { 813 if (Max(left_kind_, right_kind_) == GENERIC) {
814 return ::v8::internal::MEGAMORPHIC; 814 return ::v8::internal::MEGAMORPHIC;
815 } 815 }
816 if (Min(left_kind_, right_kind_) == GENERIC) { 816 if (Min(left_kind_, right_kind_) == GENERIC) {
(...skipping 11 matching lines...) Expand all
828 return (result_kind_ > SMI && result_kind_ <= NUMBER) && 828 return (result_kind_ > SMI && result_kind_ <= NUMBER) &&
829 ((mode_ == OVERWRITE_LEFT && 829 ((mode_ == OVERWRITE_LEFT &&
830 left_kind_ > SMI && left_kind_ <= NUMBER) || 830 left_kind_ > SMI && left_kind_ <= NUMBER) ||
831 (mode_ == OVERWRITE_RIGHT && 831 (mode_ == OVERWRITE_RIGHT &&
832 right_kind_ > SMI && right_kind_ <= NUMBER)); 832 right_kind_ > SMI && right_kind_ <= NUMBER));
833 } 833 }
834 834
835 // Returns true if the IC _could_ create allocation mementos. 835 // Returns true if the IC _could_ create allocation mementos.
836 bool CouldCreateAllocationMementos() const { 836 bool CouldCreateAllocationMementos() const {
837 if (left_kind_ == STRING || right_kind_ == STRING) { 837 if (left_kind_ == STRING || right_kind_ == STRING) {
838 ASSERT_EQ(Token::ADD, op_); 838 DCHECK_EQ(Token::ADD, op_);
839 return true; 839 return true;
840 } 840 }
841 return false; 841 return false;
842 } 842 }
843 843
844 // Returns true if the IC _should_ create allocation mementos. 844 // Returns true if the IC _should_ create allocation mementos.
845 bool ShouldCreateAllocationMementos() const { 845 bool ShouldCreateAllocationMementos() const {
846 return FLAG_allocation_site_pretenuring && 846 return FLAG_allocation_site_pretenuring &&
847 CouldCreateAllocationMementos(); 847 CouldCreateAllocationMementos();
848 } 848 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 DECLARE_RUNTIME_FUNCTION(ElementsTransitionAndStoreIC_Miss); 1032 DECLARE_RUNTIME_FUNCTION(ElementsTransitionAndStoreIC_Miss);
1033 DECLARE_RUNTIME_FUNCTION(BinaryOpIC_Miss); 1033 DECLARE_RUNTIME_FUNCTION(BinaryOpIC_Miss);
1034 DECLARE_RUNTIME_FUNCTION(BinaryOpIC_MissWithAllocationSite); 1034 DECLARE_RUNTIME_FUNCTION(BinaryOpIC_MissWithAllocationSite);
1035 DECLARE_RUNTIME_FUNCTION(CompareNilIC_Miss); 1035 DECLARE_RUNTIME_FUNCTION(CompareNilIC_Miss);
1036 DECLARE_RUNTIME_FUNCTION(ToBooleanIC_Miss); 1036 DECLARE_RUNTIME_FUNCTION(ToBooleanIC_Miss);
1037 1037
1038 1038
1039 } } // namespace v8::internal 1039 } } // namespace v8::internal
1040 1040
1041 #endif // V8_IC_H_ 1041 #endif // V8_IC_H_
OLDNEW
« no previous file with comments | « src/ia32/stub-cache-ia32.cc ('k') | src/ic.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698