OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 struct Entry { | 69 struct Entry { |
70 String* key; | 70 String* key; |
71 Code* value; | 71 Code* value; |
72 }; | 72 }; |
73 | 73 |
74 void Initialize(bool create_heap_objects); | 74 void Initialize(bool create_heap_objects); |
75 | 75 |
76 | 76 |
77 // Computes the right stub matching. Inserts the result in the | 77 // Computes the right stub matching. Inserts the result in the |
78 // cache before returning. This might compile a stub if needed. | 78 // cache before returning. This might compile a stub if needed. |
79 MUST_USE_RESULT MaybeObject* ComputeLoadNonexistent( | 79 Handle<Code> ComputeLoadNonexistent(Handle<String> name, |
80 String* name, | 80 Handle<JSObject> receiver); |
81 JSObject* receiver); | |
82 | 81 |
83 MUST_USE_RESULT MaybeObject* ComputeLoadField(String* name, | 82 Handle<Code> ComputeLoadField(Handle<String> name, |
84 JSObject* receiver, | 83 Handle<JSObject> receiver, |
85 JSObject* holder, | 84 Handle<JSObject> holder, |
86 int field_index); | 85 int field_index); |
87 | 86 |
88 MUST_USE_RESULT MaybeObject* ComputeLoadCallback( | 87 Handle<Code> ComputeLoadCallback(Handle<String> name, |
89 String* name, | 88 Handle<JSObject> receiver, |
90 JSObject* receiver, | 89 Handle<JSObject> holder, |
91 JSObject* holder, | 90 Handle<AccessorInfo> callback); |
92 AccessorInfo* callback); | |
93 | 91 |
94 MUST_USE_RESULT MaybeObject* ComputeLoadConstant(String* name, | 92 Handle<Code> ComputeLoadConstant(Handle<String> name, |
95 JSObject* receiver, | 93 Handle<JSObject> receiver, |
96 JSObject* holder, | 94 Handle<JSObject> holder, |
97 Object* value); | 95 Handle<Object> value); |
98 | 96 |
99 MUST_USE_RESULT MaybeObject* ComputeLoadInterceptor( | 97 Handle<Code> ComputeLoadInterceptor(Handle<String> name, |
100 String* name, | 98 Handle<JSObject> receiver, |
101 JSObject* receiver, | 99 Handle<JSObject> holder); |
102 JSObject* holder); | |
103 | 100 |
104 MUST_USE_RESULT MaybeObject* ComputeLoadNormal(); | 101 Handle<Code> ComputeLoadNormal(); |
105 | 102 |
106 | 103 Handle<Code> ComputeLoadGlobal(Handle<String> name, |
107 MUST_USE_RESULT MaybeObject* ComputeLoadGlobal( | 104 Handle<JSObject> receiver, |
108 String* name, | 105 Handle<GlobalObject> holder, |
109 JSObject* receiver, | 106 Handle<JSGlobalPropertyCell> cell, |
110 GlobalObject* holder, | 107 bool is_dont_delete); |
111 JSGlobalPropertyCell* cell, | |
112 bool is_dont_delete); | |
113 | |
114 | 108 |
115 // --- | 109 // --- |
116 | 110 |
117 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadField(String* name, | 111 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadField(String* name, |
118 JSObject* receiver, | 112 JSObject* receiver, |
119 JSObject* holder, | 113 JSObject* holder, |
120 int field_index); | 114 int field_index); |
121 | 115 |
122 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadCallback( | 116 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadCallback( |
123 String* name, | 117 String* name, |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
323 switch (table) { | 317 switch (table) { |
324 case StubCache::kPrimary: return StubCache::primary_; | 318 case StubCache::kPrimary: return StubCache::primary_; |
325 case StubCache::kSecondary: return StubCache::secondary_; | 319 case StubCache::kSecondary: return StubCache::secondary_; |
326 } | 320 } |
327 UNREACHABLE(); | 321 UNREACHABLE(); |
328 return NULL; | 322 return NULL; |
329 } | 323 } |
330 | 324 |
331 Isolate* isolate() { return isolate_; } | 325 Isolate* isolate() { return isolate_; } |
332 Heap* heap() { return isolate()->heap(); } | 326 Heap* heap() { return isolate()->heap(); } |
327 Factory* factory() { return isolate()->factory(); } | |
333 | 328 |
334 private: | 329 private: |
335 explicit StubCache(Isolate* isolate); | 330 explicit StubCache(Isolate* isolate); |
336 | 331 |
337 friend class Isolate; | 332 friend class Isolate; |
338 friend class SCTableReference; | 333 friend class SCTableReference; |
339 static const int kPrimaryTableSize = 2048; | 334 static const int kPrimaryTableSize = 2048; |
340 static const int kSecondaryTableSize = 512; | 335 static const int kSecondaryTableSize = 512; |
341 Entry primary_[kPrimaryTableSize]; | 336 Entry primary_[kPrimaryTableSize]; |
342 Entry secondary_[kSecondaryTableSize]; | 337 Entry secondary_[kSecondaryTableSize]; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
403 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad); | 398 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad); |
404 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall); | 399 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall); |
405 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty); | 400 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty); |
406 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty); | 401 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty); |
407 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); | 402 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); |
408 | 403 |
409 | 404 |
410 // The stub compiler compiles stubs for the stub cache. | 405 // The stub compiler compiles stubs for the stub cache. |
411 class StubCompiler BASE_EMBEDDED { | 406 class StubCompiler BASE_EMBEDDED { |
412 public: | 407 public: |
413 StubCompiler() | 408 explicit StubCompiler(Isolate* isolate) |
414 : scope_(), masm_(Isolate::Current(), NULL, 256), failure_(NULL) { } | 409 : isolate_(isolate), masm_(isolate, NULL, 256), failure_(NULL) { } |
415 | 410 |
416 MUST_USE_RESULT MaybeObject* CompileCallInitialize(Code::Flags flags); | 411 MUST_USE_RESULT MaybeObject* CompileCallInitialize(Code::Flags flags); |
417 MUST_USE_RESULT MaybeObject* CompileCallPreMonomorphic(Code::Flags flags); | 412 MUST_USE_RESULT MaybeObject* CompileCallPreMonomorphic(Code::Flags flags); |
418 MUST_USE_RESULT MaybeObject* CompileCallNormal(Code::Flags flags); | 413 MUST_USE_RESULT MaybeObject* CompileCallNormal(Code::Flags flags); |
419 MUST_USE_RESULT MaybeObject* CompileCallMegamorphic(Code::Flags flags); | 414 MUST_USE_RESULT MaybeObject* CompileCallMegamorphic(Code::Flags flags); |
420 MUST_USE_RESULT MaybeObject* CompileCallArguments(Code::Flags flags); | 415 MUST_USE_RESULT MaybeObject* CompileCallArguments(Code::Flags flags); |
421 MUST_USE_RESULT MaybeObject* CompileCallMiss(Code::Flags flags); | 416 MUST_USE_RESULT MaybeObject* CompileCallMiss(Code::Flags flags); |
422 #ifdef ENABLE_DEBUGGER_SUPPORT | 417 #ifdef ENABLE_DEBUGGER_SUPPORT |
423 MUST_USE_RESULT MaybeObject* CompileCallDebugBreak(Code::Flags flags); | 418 MUST_USE_RESULT MaybeObject* CompileCallDebugBreak(Code::Flags flags); |
424 MUST_USE_RESULT MaybeObject* CompileCallDebugPrepareStepIn(Code::Flags flags); | 419 MUST_USE_RESULT MaybeObject* CompileCallDebugPrepareStepIn(Code::Flags flags); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
560 Register scratch1, | 555 Register scratch1, |
561 Register scratch2, | 556 Register scratch2, |
562 Register scratch3, | 557 Register scratch3, |
563 String* name, | 558 String* name, |
564 Label* miss); | 559 Label* miss); |
565 | 560 |
566 static void LookupPostInterceptor(JSObject* holder, | 561 static void LookupPostInterceptor(JSObject* holder, |
567 String* name, | 562 String* name, |
568 LookupResult* lookup); | 563 LookupResult* lookup); |
569 | 564 |
570 Isolate* isolate() { return scope_.isolate(); } | 565 Isolate* isolate() { return isolate_; } |
571 Heap* heap() { return isolate()->heap(); } | 566 Heap* heap() { return isolate()->heap(); } |
572 Factory* factory() { return isolate()->factory(); } | 567 Factory* factory() { return isolate()->factory(); } |
573 | 568 |
574 private: | 569 private: |
575 HandleScope scope_; | 570 Isolate* isolate_; |
576 MacroAssembler masm_; | 571 MacroAssembler masm_; |
577 Failure* failure_; | 572 Failure* failure_; |
578 }; | 573 }; |
579 | 574 |
580 | 575 |
581 class LoadStubCompiler: public StubCompiler { | 576 class LoadStubCompiler: public StubCompiler { |
582 public: | 577 public: |
578 explicit LoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } | |
579 | |
580 Handle<Code> CompileLoadNonexistent(Handle<String> name, | |
581 Handle<JSObject> object, | |
582 Handle<JSObject> last); | |
583 | |
583 MUST_USE_RESULT MaybeObject* CompileLoadNonexistent(String* name, | 584 MUST_USE_RESULT MaybeObject* CompileLoadNonexistent(String* name, |
584 JSObject* object, | 585 JSObject* object, |
585 JSObject* last); | 586 JSObject* last); |
586 | 587 |
588 Handle<Code> CompileLoadField(Handle<JSObject> object, | |
589 Handle<JSObject> holder, | |
590 int index, | |
591 Handle<String> name); | |
592 | |
587 MUST_USE_RESULT MaybeObject* CompileLoadField(JSObject* object, | 593 MUST_USE_RESULT MaybeObject* CompileLoadField(JSObject* object, |
588 JSObject* holder, | 594 JSObject* holder, |
589 int index, | 595 int index, |
590 String* name); | 596 String* name); |
591 | 597 |
598 Handle<Code> CompileLoadCallback(Handle<String> name, | |
599 Handle<JSObject> object, | |
600 Handle<JSObject> holder, | |
601 Handle<AccessorInfo> callback); | |
602 | |
592 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, | 603 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, |
593 JSObject* object, | 604 JSObject* object, |
594 JSObject* holder, | 605 JSObject* holder, |
595 AccessorInfo* callback); | 606 AccessorInfo* callback); |
596 | 607 |
608 Handle<Code> CompileLoadConstant(Handle<JSObject> object, | |
609 Handle<JSObject> holder, | |
610 Handle<Object> value, | |
611 Handle<String> name); | |
612 | |
597 MUST_USE_RESULT MaybeObject* CompileLoadConstant(JSObject* object, | 613 MUST_USE_RESULT MaybeObject* CompileLoadConstant(JSObject* object, |
598 JSObject* holder, | 614 JSObject* holder, |
599 Object* value, | 615 Object* value, |
600 String* name); | 616 String* name); |
601 | 617 |
618 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, | |
619 Handle<JSObject> holder, | |
620 Handle<String> name); | |
621 | |
602 MUST_USE_RESULT MaybeObject* CompileLoadInterceptor(JSObject* object, | 622 MUST_USE_RESULT MaybeObject* CompileLoadInterceptor(JSObject* object, |
603 JSObject* holder, | 623 JSObject* holder, |
604 String* name); | 624 String* name); |
605 | 625 |
626 Handle<Code> CompileLoadGlobal(Handle<JSObject> object, | |
627 Handle<GlobalObject> holder, | |
628 Handle<JSGlobalPropertyCell> cell, | |
629 Handle<String> name, | |
630 bool is_dont_delete); | |
631 | |
606 MUST_USE_RESULT MaybeObject* CompileLoadGlobal(JSObject* object, | 632 MUST_USE_RESULT MaybeObject* CompileLoadGlobal(JSObject* object, |
607 GlobalObject* holder, | 633 GlobalObject* holder, |
608 JSGlobalPropertyCell* cell, | 634 JSGlobalPropertyCell* cell, |
609 String* name, | 635 String* name, |
610 bool is_dont_delete); | 636 bool is_dont_delete); |
611 | 637 |
612 private: | 638 private: |
613 MUST_USE_RESULT MaybeObject* GetCode(PropertyType type, String* name); | 639 MUST_USE_RESULT MaybeObject* GetCode(PropertyType type, String* name); |
614 }; | 640 }; |
615 | 641 |
616 | 642 |
617 class KeyedLoadStubCompiler: public StubCompiler { | 643 class KeyedLoadStubCompiler: public StubCompiler { |
618 public: | 644 public: |
645 explicit KeyedLoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } | |
619 MUST_USE_RESULT MaybeObject* CompileLoadField(String* name, | 646 MUST_USE_RESULT MaybeObject* CompileLoadField(String* name, |
620 JSObject* object, | 647 JSObject* object, |
621 JSObject* holder, | 648 JSObject* holder, |
622 int index); | 649 int index); |
623 | 650 |
624 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, | 651 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, |
625 JSObject* object, | 652 JSObject* object, |
626 JSObject* holder, | 653 JSObject* holder, |
627 AccessorInfo* callback); | 654 AccessorInfo* callback); |
628 | 655 |
(...skipping 27 matching lines...) Expand all Loading... | |
656 | 683 |
657 private: | 684 private: |
658 MaybeObject* GetCode(PropertyType type, | 685 MaybeObject* GetCode(PropertyType type, |
659 String* name, | 686 String* name, |
660 InlineCacheState state = MONOMORPHIC); | 687 InlineCacheState state = MONOMORPHIC); |
661 }; | 688 }; |
662 | 689 |
663 | 690 |
664 class StoreStubCompiler: public StubCompiler { | 691 class StoreStubCompiler: public StubCompiler { |
665 public: | 692 public: |
666 explicit StoreStubCompiler(StrictModeFlag strict_mode) | 693 explicit StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
Kevin Millikin (Chromium)
2011/10/18 08:46:47
No need to explicit for two-argument constructors.
ulan
2011/10/18 09:31:00
Done.
| |
667 : strict_mode_(strict_mode) { } | 694 : StubCompiler(isolate), strict_mode_(strict_mode) { } |
668 | 695 |
669 MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, | 696 MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, |
670 int index, | 697 int index, |
671 Map* transition, | 698 Map* transition, |
672 String* name); | 699 String* name); |
673 | 700 |
674 MUST_USE_RESULT MaybeObject* CompileStoreCallback(JSObject* object, | 701 MUST_USE_RESULT MaybeObject* CompileStoreCallback(JSObject* object, |
675 AccessorInfo* callbacks, | 702 AccessorInfo* callbacks, |
676 String* name); | 703 String* name); |
677 MUST_USE_RESULT MaybeObject* CompileStoreInterceptor(JSObject* object, | 704 MUST_USE_RESULT MaybeObject* CompileStoreInterceptor(JSObject* object, |
678 String* name); | 705 String* name); |
679 MUST_USE_RESULT MaybeObject* CompileStoreGlobal(GlobalObject* object, | 706 MUST_USE_RESULT MaybeObject* CompileStoreGlobal(GlobalObject* object, |
680 JSGlobalPropertyCell* holder, | 707 JSGlobalPropertyCell* holder, |
681 String* name); | 708 String* name); |
682 | 709 |
683 | 710 |
684 private: | 711 private: |
685 MaybeObject* GetCode(PropertyType type, String* name); | 712 MaybeObject* GetCode(PropertyType type, String* name); |
686 | 713 |
687 StrictModeFlag strict_mode_; | 714 StrictModeFlag strict_mode_; |
688 }; | 715 }; |
689 | 716 |
690 | 717 |
691 class KeyedStoreStubCompiler: public StubCompiler { | 718 class KeyedStoreStubCompiler: public StubCompiler { |
692 public: | 719 public: |
693 explicit KeyedStoreStubCompiler(StrictModeFlag strict_mode) | 720 explicit KeyedStoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
Kevin Millikin (Chromium)
2011/10/18 08:46:47
Same, you can drop explicit.
ulan
2011/10/18 09:31:00
Done.
| |
694 : strict_mode_(strict_mode) { } | 721 : StubCompiler(isolate), strict_mode_(strict_mode) { } |
695 | 722 |
696 MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, | 723 MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, |
697 int index, | 724 int index, |
698 Map* transition, | 725 Map* transition, |
699 String* name); | 726 String* name); |
700 | 727 |
701 MUST_USE_RESULT MaybeObject* CompileStoreElement(Map* receiver_map); | 728 MUST_USE_RESULT MaybeObject* CompileStoreElement(Map* receiver_map); |
702 | 729 |
703 MUST_USE_RESULT MaybeObject* CompileStorePolymorphic( | 730 MUST_USE_RESULT MaybeObject* CompileStorePolymorphic( |
704 MapList* receiver_maps, | 731 MapList* receiver_maps, |
(...skipping 30 matching lines...) Expand all Loading... | |
735 V(StringCharAt) \ | 762 V(StringCharAt) \ |
736 V(StringFromCharCode) \ | 763 V(StringFromCharCode) \ |
737 V(MathFloor) \ | 764 V(MathFloor) \ |
738 V(MathAbs) | 765 V(MathAbs) |
739 | 766 |
740 | 767 |
741 class CallOptimization; | 768 class CallOptimization; |
742 | 769 |
743 class CallStubCompiler: public StubCompiler { | 770 class CallStubCompiler: public StubCompiler { |
744 public: | 771 public: |
745 CallStubCompiler(int argc, | 772 CallStubCompiler(Isolate* isolate, |
773 int argc, | |
746 Code::Kind kind, | 774 Code::Kind kind, |
747 Code::ExtraICState extra_ic_state, | 775 Code::ExtraICState extra_ic_state, |
748 InlineCacheHolderFlag cache_holder); | 776 InlineCacheHolderFlag cache_holder); |
749 | 777 |
750 MUST_USE_RESULT MaybeObject* CompileCallField( | 778 MUST_USE_RESULT MaybeObject* CompileCallField( |
751 JSObject* object, | 779 JSObject* object, |
752 JSObject* holder, | 780 JSObject* holder, |
753 int index, | 781 int index, |
754 String* name); | 782 String* name); |
755 | 783 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
828 Label* miss); | 856 Label* miss); |
829 | 857 |
830 // Generates a jump to CallIC miss stub. Returns Failure if the jump cannot | 858 // Generates a jump to CallIC miss stub. Returns Failure if the jump cannot |
831 // be generated. | 859 // be generated. |
832 MUST_USE_RESULT MaybeObject* GenerateMissBranch(); | 860 MUST_USE_RESULT MaybeObject* GenerateMissBranch(); |
833 }; | 861 }; |
834 | 862 |
835 | 863 |
836 class ConstructStubCompiler: public StubCompiler { | 864 class ConstructStubCompiler: public StubCompiler { |
837 public: | 865 public: |
838 explicit ConstructStubCompiler() {} | 866 explicit ConstructStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } |
839 | 867 |
840 MUST_USE_RESULT MaybeObject* CompileConstructStub(JSFunction* function); | 868 MUST_USE_RESULT MaybeObject* CompileConstructStub(JSFunction* function); |
841 | 869 |
842 private: | 870 private: |
843 MaybeObject* GetCode(); | 871 MaybeObject* GetCode(); |
844 }; | 872 }; |
845 | 873 |
846 | 874 |
847 // Holds information about possible function call optimizations. | 875 // Holds information about possible function call optimizations. |
848 class CallOptimization BASE_EMBEDDED { | 876 class CallOptimization BASE_EMBEDDED { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
889 JSFunction* constant_function_; | 917 JSFunction* constant_function_; |
890 bool is_simple_api_call_; | 918 bool is_simple_api_call_; |
891 FunctionTemplateInfo* expected_receiver_type_; | 919 FunctionTemplateInfo* expected_receiver_type_; |
892 CallHandlerInfo* api_call_info_; | 920 CallHandlerInfo* api_call_info_; |
893 }; | 921 }; |
894 | 922 |
895 | 923 |
896 } } // namespace v8::internal | 924 } } // namespace v8::internal |
897 | 925 |
898 #endif // V8_STUB_CACHE_H_ | 926 #endif // V8_STUB_CACHE_H_ |
OLD | NEW |