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

Side by Side Diff: src/stub-cache.h

Issue 143633007: A64: Synchronize with r18764. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 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/string.js ('k') | src/stub-cache.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 // 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 Code::Kind kind, 85 Code::Kind kind,
86 ExtraICState extra_state = kNoExtraICState, 86 ExtraICState extra_state = kNoExtraICState,
87 InlineCacheHolderFlag cache_holder = OWN_MAP); 87 InlineCacheHolderFlag cache_holder = OWN_MAP);
88 88
89 Handle<Code> FindHandler(Handle<Name> name, 89 Handle<Code> FindHandler(Handle<Name> name,
90 Handle<Map> map, 90 Handle<Map> map,
91 Code::Kind kind, 91 Code::Kind kind,
92 InlineCacheHolderFlag cache_holder = OWN_MAP); 92 InlineCacheHolderFlag cache_holder = OWN_MAP);
93 93
94 Handle<Code> ComputeMonomorphicIC(Handle<Name> name, 94 Handle<Code> ComputeMonomorphicIC(Handle<Name> name,
95 Handle<Type> type, 95 Handle<HeapType> type,
96 Handle<Code> handler, 96 Handle<Code> handler,
97 ExtraICState extra_ic_state); 97 ExtraICState extra_ic_state);
98 98
99 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Type> type); 99 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<HeapType> type);
100 100
101 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); 101 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map);
102 102
103 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, 103 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map,
104 StrictModeFlag strict_mode, 104 StrictModeFlag strict_mode,
105 KeyedAccessStoreMode store_mode); 105 KeyedAccessStoreMode store_mode);
106 106
107 Handle<Code> ComputeCallField(int argc, 107 Handle<Code> ComputeCallField(int argc,
108 Code::Kind, 108 Code::Kind,
109 ExtraICState extra_state, 109 ExtraICState extra_state,
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 // objects or doing negative lookup for slow objects, ensures that the 465 // objects or doing negative lookup for slow objects, ensures that the
466 // property cells for global objects are still empty) and checks that the map 466 // property cells for global objects are still empty) and checks that the map
467 // of the holder has not changed. If necessary the function also generates 467 // of the holder has not changed. If necessary the function also generates
468 // code for security check in case of global object holders. Helps to make 468 // code for security check in case of global object holders. Helps to make
469 // sure that the current IC is still valid. 469 // sure that the current IC is still valid.
470 // 470 //
471 // The scratch and holder registers are always clobbered, but the object 471 // The scratch and holder registers are always clobbered, but the object
472 // register is only clobbered if it the same as the holder register. The 472 // register is only clobbered if it the same as the holder register. The
473 // function returns a register containing the holder - either object_reg or 473 // function returns a register containing the holder - either object_reg or
474 // holder_reg. 474 // holder_reg.
475 // The function can optionally (when save_at_depth != 475 Register CheckPrototypes(Handle<HeapType> type,
476 // kInvalidProtoDepth) save the object at the given depth by moving
477 // it to [esp + kPointerSize].
478 Register CheckPrototypes(Handle<Type> type,
479 Register object_reg, 476 Register object_reg,
480 Handle<JSObject> holder, 477 Handle<JSObject> holder,
481 Register holder_reg, 478 Register holder_reg,
482 Register scratch1, 479 Register scratch1,
483 Register scratch2, 480 Register scratch2,
484 Handle<Name> name, 481 Handle<Name> name,
485 Label* miss, 482 Label* miss,
486 PrototypeCheckType check = CHECK_ALL_MAPS) {
487 return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1,
488 scratch2, name, kInvalidProtoDepth, miss, check);
489 }
490
491 Register CheckPrototypes(Handle<Type> type,
492 Register object_reg,
493 Handle<JSObject> holder,
494 Register holder_reg,
495 Register scratch1,
496 Register scratch2,
497 Handle<Name> name,
498 int save_at_depth,
499 Label* miss,
500 PrototypeCheckType check = CHECK_ALL_MAPS); 483 PrototypeCheckType check = CHECK_ALL_MAPS);
501 484
502 void GenerateBooleanCheck(Register object, Label* miss); 485 void GenerateBooleanCheck(Register object, Label* miss);
503 486
504 protected: 487 protected:
505 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); 488 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name);
506 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name); 489 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name);
507 490
508 ExtraICState extra_state() { return extra_ic_state_; } 491 ExtraICState extra_state() { return extra_ic_state_; }
509 492
510 MacroAssembler* masm() { return &masm_; } 493 MacroAssembler* masm() { return &masm_; }
511 void set_failure(Failure* failure) { failure_ = failure; } 494 void set_failure(Failure* failure) { failure_ = failure; }
512 495
513 static void LookupPostInterceptor(Handle<JSObject> holder, 496 static void LookupPostInterceptor(Handle<JSObject> holder,
514 Handle<Name> name, 497 Handle<Name> name,
515 LookupResult* lookup); 498 LookupResult* lookup);
516 499
517 Isolate* isolate() { return isolate_; } 500 Isolate* isolate() { return isolate_; }
518 Heap* heap() { return isolate()->heap(); } 501 Heap* heap() { return isolate()->heap(); }
519 Factory* factory() { return isolate()->factory(); } 502 Factory* factory() { return isolate()->factory(); }
520 ContextualMode contextual_mode() {
521 return IC::GetContextualMode(extra_state());
522 }
523 503
524 static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); 504 static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code);
525 505
526 private: 506 private:
527 Isolate* isolate_; 507 Isolate* isolate_;
528 const ExtraICState extra_ic_state_; 508 const ExtraICState extra_ic_state_;
529 MacroAssembler masm_; 509 MacroAssembler masm_;
530 Failure* failure_; 510 Failure* failure_;
531 }; 511 };
532 512
533 513
534 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS }; 514 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS };
535 515
536 516
537 class BaseLoadStoreStubCompiler: public StubCompiler { 517 class BaseLoadStoreStubCompiler: public StubCompiler {
538 public: 518 public:
539 BaseLoadStoreStubCompiler(Isolate* isolate, 519 BaseLoadStoreStubCompiler(Isolate* isolate,
540 Code::Kind kind, 520 Code::Kind kind,
541 ExtraICState extra_ic_state = kNoExtraICState, 521 ExtraICState extra_ic_state = kNoExtraICState,
542 InlineCacheHolderFlag cache_holder = OWN_MAP) 522 InlineCacheHolderFlag cache_holder = OWN_MAP)
543 : StubCompiler(isolate, extra_ic_state), 523 : StubCompiler(isolate, extra_ic_state),
544 kind_(kind), 524 kind_(kind),
545 cache_holder_(cache_holder) { 525 cache_holder_(cache_holder) {
546 InitializeRegisters(); 526 InitializeRegisters();
547 } 527 }
548 virtual ~BaseLoadStoreStubCompiler() { } 528 virtual ~BaseLoadStoreStubCompiler() { }
549 529
550 Handle<Code> CompileMonomorphicIC(Handle<Type> type, 530 Handle<Code> CompileMonomorphicIC(Handle<HeapType> type,
551 Handle<Code> handler, 531 Handle<Code> handler,
552 Handle<Name> name); 532 Handle<Name> name);
553 533
554 Handle<Code> CompilePolymorphicIC(TypeHandleList* types, 534 Handle<Code> CompilePolymorphicIC(TypeHandleList* types,
555 CodeHandleList* handlers, 535 CodeHandleList* handlers,
556 Handle<Name> name, 536 Handle<Name> name,
557 Code::StubType type, 537 Code::StubType type,
558 IcCheckType check); 538 IcCheckType check);
559 539
560 virtual void GenerateNameCheck(Handle<Name> name,
561 Register name_reg,
562 Label* miss) { }
563
564 static Builtins::Name MissBuiltin(Code::Kind kind) { 540 static Builtins::Name MissBuiltin(Code::Kind kind) {
565 switch (kind) { 541 switch (kind) {
566 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; 542 case Code::LOAD_IC: return Builtins::kLoadIC_Miss;
567 case Code::STORE_IC: return Builtins::kStoreIC_Miss; 543 case Code::STORE_IC: return Builtins::kStoreIC_Miss;
568 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; 544 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss;
569 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; 545 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss;
570 default: UNREACHABLE(); 546 default: UNREACHABLE();
571 } 547 }
572 return Builtins::kLoadIC_Miss; 548 return Builtins::kLoadIC_Miss;
573 } 549 }
574 550
575 protected: 551 protected:
576 virtual Register HandlerFrontendHeader(Handle<Type> type, 552 virtual Register HandlerFrontendHeader(Handle<HeapType> type,
577 Register object_reg, 553 Register object_reg,
578 Handle<JSObject> holder, 554 Handle<JSObject> holder,
579 Handle<Name> name, 555 Handle<Name> name,
580 Label* miss) = 0; 556 Label* miss) = 0;
581 557
582 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; 558 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0;
583 559
584 Register HandlerFrontend(Handle<Type> type, 560 Register HandlerFrontend(Handle<HeapType> type,
585 Register object_reg, 561 Register object_reg,
586 Handle<JSObject> holder, 562 Handle<JSObject> holder,
587 Handle<Name> name); 563 Handle<Name> name);
588 564
589 Handle<Code> GetCode(Code::Kind kind, 565 Handle<Code> GetCode(Code::Kind kind,
590 Code::StubType type, 566 Code::StubType type,
591 Handle<Name> name); 567 Handle<Name> name);
592 568
593 Handle<Code> GetICCode(Code::Kind kind, 569 Handle<Code> GetICCode(Code::Kind kind,
594 Code::StubType type, 570 Code::StubType type,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 class LoadStubCompiler: public BaseLoadStoreStubCompiler { 609 class LoadStubCompiler: public BaseLoadStoreStubCompiler {
634 public: 610 public:
635 LoadStubCompiler(Isolate* isolate, 611 LoadStubCompiler(Isolate* isolate,
636 ExtraICState extra_ic_state = kNoExtraICState, 612 ExtraICState extra_ic_state = kNoExtraICState,
637 InlineCacheHolderFlag cache_holder = OWN_MAP, 613 InlineCacheHolderFlag cache_holder = OWN_MAP,
638 Code::Kind kind = Code::LOAD_IC) 614 Code::Kind kind = Code::LOAD_IC)
639 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state, 615 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state,
640 cache_holder) { } 616 cache_holder) { }
641 virtual ~LoadStubCompiler() { } 617 virtual ~LoadStubCompiler() { }
642 618
643 Handle<Code> CompileLoadField(Handle<Type> type, 619 Handle<Code> CompileLoadField(Handle<HeapType> type,
644 Handle<JSObject> holder, 620 Handle<JSObject> holder,
645 Handle<Name> name, 621 Handle<Name> name,
646 PropertyIndex index, 622 PropertyIndex index,
647 Representation representation); 623 Representation representation);
648 624
649 Handle<Code> CompileLoadCallback(Handle<Type> type, 625 Handle<Code> CompileLoadCallback(Handle<HeapType> type,
650 Handle<JSObject> holder, 626 Handle<JSObject> holder,
651 Handle<Name> name, 627 Handle<Name> name,
652 Handle<ExecutableAccessorInfo> callback); 628 Handle<ExecutableAccessorInfo> callback);
653 629
654 Handle<Code> CompileLoadCallback(Handle<Type> type, 630 Handle<Code> CompileLoadCallback(Handle<HeapType> type,
655 Handle<JSObject> holder, 631 Handle<JSObject> holder,
656 Handle<Name> name, 632 Handle<Name> name,
657 const CallOptimization& call_optimization); 633 const CallOptimization& call_optimization);
658 634
659 Handle<Code> CompileLoadConstant(Handle<Type> type, 635 Handle<Code> CompileLoadConstant(Handle<HeapType> type,
660 Handle<JSObject> holder, 636 Handle<JSObject> holder,
661 Handle<Name> name, 637 Handle<Name> name,
662 Handle<Object> value); 638 Handle<Object> value);
663 639
664 Handle<Code> CompileLoadInterceptor(Handle<Type> type, 640 Handle<Code> CompileLoadInterceptor(Handle<HeapType> type,
665 Handle<JSObject> holder, 641 Handle<JSObject> holder,
666 Handle<Name> name); 642 Handle<Name> name);
667 643
668 Handle<Code> CompileLoadViaGetter(Handle<Type> type, 644 Handle<Code> CompileLoadViaGetter(Handle<HeapType> type,
669 Handle<JSObject> holder, 645 Handle<JSObject> holder,
670 Handle<Name> name, 646 Handle<Name> name,
671 Handle<JSFunction> getter); 647 Handle<JSFunction> getter);
672 648
673 static void GenerateLoadViaGetter(MacroAssembler* masm, 649 static void GenerateLoadViaGetter(MacroAssembler* masm,
674 Register receiver, 650 Register receiver,
675 Handle<JSFunction> getter); 651 Handle<JSFunction> getter);
676 652
677 Handle<Code> CompileLoadNonexistent(Handle<Type> type, 653 Handle<Code> CompileLoadNonexistent(Handle<HeapType> type,
678 Handle<JSObject> last, 654 Handle<JSObject> last,
679 Handle<Name> name); 655 Handle<Name> name);
680 656
681 Handle<Code> CompileLoadGlobal(Handle<Type> type, 657 Handle<Code> CompileLoadGlobal(Handle<HeapType> type,
682 Handle<GlobalObject> holder, 658 Handle<GlobalObject> holder,
683 Handle<PropertyCell> cell, 659 Handle<PropertyCell> cell,
684 Handle<Name> name, 660 Handle<Name> name,
685 bool is_dont_delete); 661 bool is_dont_delete);
686 662
687 static Register* registers(); 663 static Register* registers();
688 664
689 protected: 665 protected:
690 virtual Register HandlerFrontendHeader(Handle<Type> type, 666 ContextualMode contextual_mode() {
667 return LoadIC::GetContextualMode(extra_state());
668 }
669
670 virtual Register HandlerFrontendHeader(Handle<HeapType> type,
691 Register object_reg, 671 Register object_reg,
692 Handle<JSObject> holder, 672 Handle<JSObject> holder,
693 Handle<Name> name, 673 Handle<Name> name,
694 Label* miss); 674 Label* miss);
695 675
696 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); 676 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss);
697 677
698 Register CallbackHandlerFrontend(Handle<Type> type, 678 Register CallbackHandlerFrontend(Handle<HeapType> type,
699 Register object_reg, 679 Register object_reg,
700 Handle<JSObject> holder, 680 Handle<JSObject> holder,
701 Handle<Name> name, 681 Handle<Name> name,
702 Handle<Object> callback); 682 Handle<Object> callback);
703 void NonexistentHandlerFrontend(Handle<Type> type, 683 void NonexistentHandlerFrontend(Handle<HeapType> type,
704 Handle<JSObject> last, 684 Handle<JSObject> last,
705 Handle<Name> name); 685 Handle<Name> name);
706 686
707 void GenerateLoadField(Register reg, 687 void GenerateLoadField(Register reg,
708 Handle<JSObject> holder, 688 Handle<JSObject> holder,
709 PropertyIndex field, 689 PropertyIndex field,
710 Representation representation); 690 Representation representation);
711 void GenerateLoadConstant(Handle<Object> value); 691 void GenerateLoadConstant(Handle<Object> value);
712 void GenerateLoadCallback(Register reg, 692 void GenerateLoadCallback(Register reg,
713 Handle<ExecutableAccessorInfo> callback); 693 Handle<ExecutableAccessorInfo> callback);
(...skipping 25 matching lines...) Expand all
739 : LoadStubCompiler(isolate, extra_ic_state, cache_holder, 719 : LoadStubCompiler(isolate, extra_ic_state, cache_holder,
740 Code::KEYED_LOAD_IC) { } 720 Code::KEYED_LOAD_IC) { }
741 721
742 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); 722 Handle<Code> CompileLoadElement(Handle<Map> receiver_map);
743 723
744 void CompileElementHandlers(MapHandleList* receiver_maps, 724 void CompileElementHandlers(MapHandleList* receiver_maps,
745 CodeHandleList* handlers); 725 CodeHandleList* handlers);
746 726
747 static void GenerateLoadDictionaryElement(MacroAssembler* masm); 727 static void GenerateLoadDictionaryElement(MacroAssembler* masm);
748 728
749 protected: 729 private:
750 static Register* registers(); 730 static Register* registers();
751
752 private:
753 virtual void GenerateNameCheck(Handle<Name> name,
754 Register name_reg,
755 Label* miss);
756 friend class BaseLoadStoreStubCompiler; 731 friend class BaseLoadStoreStubCompiler;
757 }; 732 };
758 733
759 734
760 class StoreStubCompiler: public BaseLoadStoreStubCompiler { 735 class StoreStubCompiler: public BaseLoadStoreStubCompiler {
761 public: 736 public:
762 StoreStubCompiler(Isolate* isolate, 737 StoreStubCompiler(Isolate* isolate,
763 ExtraICState extra_ic_state, 738 ExtraICState extra_ic_state,
764 Code::Kind kind = Code::STORE_IC) 739 Code::Kind kind = Code::STORE_IC)
765 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state) {} 740 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state) {}
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
829 static Builtins::Name SlowBuiltin(Code::Kind kind) { 804 static Builtins::Name SlowBuiltin(Code::Kind kind) {
830 switch (kind) { 805 switch (kind) {
831 case Code::STORE_IC: return Builtins::kStoreIC_Slow; 806 case Code::STORE_IC: return Builtins::kStoreIC_Slow;
832 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; 807 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow;
833 default: UNREACHABLE(); 808 default: UNREACHABLE();
834 } 809 }
835 return Builtins::kStoreIC_Slow; 810 return Builtins::kStoreIC_Slow;
836 } 811 }
837 812
838 protected: 813 protected:
839 virtual Register HandlerFrontendHeader(Handle<Type> type, 814 virtual Register HandlerFrontendHeader(Handle<HeapType> type,
840 Register object_reg, 815 Register object_reg,
841 Handle<JSObject> holder, 816 Handle<JSObject> holder,
842 Handle<Name> name, 817 Handle<Name> name,
843 Label* miss); 818 Label* miss);
844 819
845 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); 820 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss);
846 void GenerateRestoreName(MacroAssembler* masm, 821 void GenerateRestoreName(MacroAssembler* masm,
847 Label* label, 822 Label* label,
848 Handle<Name> name); 823 Handle<Name> name);
849 824
(...skipping 21 matching lines...) Expand all
871 Handle<Code> CompileStoreElement(Handle<Map> receiver_map); 846 Handle<Code> CompileStoreElement(Handle<Map> receiver_map);
872 847
873 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps, 848 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps,
874 CodeHandleList* handler_stubs, 849 CodeHandleList* handler_stubs,
875 MapHandleList* transitioned_maps); 850 MapHandleList* transitioned_maps);
876 851
877 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps); 852 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps);
878 853
879 static void GenerateStoreDictionaryElement(MacroAssembler* masm); 854 static void GenerateStoreDictionaryElement(MacroAssembler* masm);
880 855
881 protected: 856 private:
882 static Register* registers(); 857 static Register* registers();
883 858
884 KeyedAccessStoreMode store_mode() { 859 KeyedAccessStoreMode store_mode() {
885 return KeyedStoreIC::GetKeyedAccessStoreMode(extra_state()); 860 return KeyedStoreIC::GetKeyedAccessStoreMode(extra_state());
886 } 861 }
887 862
888 private:
889 Register transition_map() { 863 Register transition_map() {
890 return registers()[3]; 864 return registers()[3];
891 } 865 }
892 866
893 virtual void GenerateNameCheck(Handle<Name> name,
894 Register name_reg,
895 Label* miss);
896 friend class BaseLoadStoreStubCompiler; 867 friend class BaseLoadStoreStubCompiler;
897 }; 868 };
898 869
899 870
900 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call 871 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call
901 // IC stubs. 872 // IC stubs.
902 #define CUSTOM_CALL_IC_GENERATORS(V) \ 873 #define CUSTOM_CALL_IC_GENERATORS(V) \
903 V(ArrayPush) \ 874 V(ArrayPush)
904 V(ArrayPop) \
905 V(StringCharCodeAt) \
906 V(StringCharAt) \
907 V(StringFromCharCode) \
908 V(MathFloor) \
909 V(MathAbs) \
910 V(ArrayCode)
911
912
913 #define SITE_SPECIFIC_CALL_GENERATORS(V) \
914 V(ArrayCode)
915 875
916 876
917 class CallStubCompiler: public StubCompiler { 877 class CallStubCompiler: public StubCompiler {
918 public: 878 public:
919 CallStubCompiler(Isolate* isolate, 879 CallStubCompiler(Isolate* isolate,
920 int argc, 880 int argc,
921 Code::Kind kind, 881 Code::Kind kind,
922 ExtraICState extra_state, 882 ExtraICState extra_state,
923 InlineCacheHolderFlag cache_holder = OWN_MAP); 883 InlineCacheHolderFlag cache_holder = OWN_MAP);
924 884
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 Handle<JSObject> holder, 921 Handle<JSObject> holder,
962 Handle<Name> name); 922 Handle<Name> name);
963 923
964 Handle<Code> CompileCallGlobal(Handle<JSObject> object, 924 Handle<Code> CompileCallGlobal(Handle<JSObject> object,
965 Handle<GlobalObject> holder, 925 Handle<GlobalObject> holder,
966 Handle<PropertyCell> cell, 926 Handle<PropertyCell> cell,
967 Handle<JSFunction> function, 927 Handle<JSFunction> function,
968 Handle<Name> name); 928 Handle<Name> name);
969 929
970 static bool HasCustomCallGenerator(Handle<JSFunction> function); 930 static bool HasCustomCallGenerator(Handle<JSFunction> function);
971 static bool CanBeCached(Handle<JSFunction> function);
972 931
973 private: 932 private:
974 // Compiles a custom call constant/global IC. For constant calls cell is 933 // Compiles a custom call constant/global IC. For constant calls cell is
975 // NULL. Returns an empty handle if there is no custom call code for the 934 // NULL. Returns an empty handle if there is no custom call code for the
976 // given function. 935 // given function.
977 Handle<Code> CompileCustomCall(Handle<Object> object, 936 Handle<Code> CompileCustomCall(Handle<Object> object,
978 Handle<JSObject> holder, 937 Handle<JSObject> holder,
979 Handle<Cell> cell, 938 Handle<Cell> cell,
980 Handle<JSFunction> function, 939 Handle<JSFunction> function,
981 Handle<String> name, 940 Handle<String> name,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 Handle<FunctionTemplateInfo> expected_receiver_type() const { 1004 Handle<FunctionTemplateInfo> expected_receiver_type() const {
1046 ASSERT(is_simple_api_call()); 1005 ASSERT(is_simple_api_call());
1047 return expected_receiver_type_; 1006 return expected_receiver_type_;
1048 } 1007 }
1049 1008
1050 Handle<CallHandlerInfo> api_call_info() const { 1009 Handle<CallHandlerInfo> api_call_info() const {
1051 ASSERT(is_simple_api_call()); 1010 ASSERT(is_simple_api_call());
1052 return api_call_info_; 1011 return api_call_info_;
1053 } 1012 }
1054 1013
1055 // Returns the depth of the object having the expected type in the 1014 enum HolderLookup {
1056 // prototype chain between the two arguments. 1015 kHolderNotFound,
1057 int GetPrototypeDepthOfExpectedType(Handle<JSObject> object, 1016 kHolderIsReceiver,
1058 Handle<JSObject> holder) const; 1017 kHolderIsPrototypeOfMap
1018 };
1019 // Returns a map whose prototype has the expected type in the
1020 // prototype chain between the two arguments
1021 // null will be returned if the first argument has that property
1022 // lookup will be set accordingly
1023 Handle<Map> LookupHolderOfExpectedType(Handle<JSObject> receiver,
1024 Handle<JSObject> object,
1025 Handle<JSObject> holder,
1026 HolderLookup* holder_lookup) const;
1059 1027
1060 bool IsCompatibleReceiver(Object* receiver) { 1028 bool IsCompatibleReceiver(Object* receiver) {
1061 ASSERT(is_simple_api_call()); 1029 ASSERT(is_simple_api_call());
1062 if (expected_receiver_type_.is_null()) return true; 1030 if (expected_receiver_type_.is_null()) return true;
1063 return expected_receiver_type_->IsTemplateFor(receiver); 1031 return expected_receiver_type_->IsTemplateFor(receiver);
1064 } 1032 }
1065 1033
1066 private: 1034 private:
1067 void Initialize(Handle<JSFunction> function); 1035 void Initialize(Handle<JSFunction> function);
1068 1036
1069 // Determines whether the given function can be called using the 1037 // Determines whether the given function can be called using the
1070 // fast api call builtin. 1038 // fast api call builtin.
1071 void AnalyzePossibleApiFunction(Handle<JSFunction> function); 1039 void AnalyzePossibleApiFunction(Handle<JSFunction> function);
1072 1040
1073 Handle<JSFunction> constant_function_; 1041 Handle<JSFunction> constant_function_;
1074 bool is_simple_api_call_; 1042 bool is_simple_api_call_;
1075 Handle<FunctionTemplateInfo> expected_receiver_type_; 1043 Handle<FunctionTemplateInfo> expected_receiver_type_;
1076 Handle<CallHandlerInfo> api_call_info_; 1044 Handle<CallHandlerInfo> api_call_info_;
1077 }; 1045 };
1078 1046
1079 1047
1080 } } // namespace v8::internal 1048 } } // namespace v8::internal
1081 1049
1082 #endif // V8_STUB_CACHE_H_ 1050 #endif // V8_STUB_CACHE_H_
OLDNEW
« no previous file with comments | « src/string.js ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698