OLD | NEW |
---|---|
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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
67 class StubCache { | 67 class StubCache { |
68 public: | 68 public: |
69 struct Entry { | 69 struct Entry { |
70 String* key; | 70 String* key; |
71 Code* value; | 71 Code* value; |
72 Map* map; | 72 Map* map; |
73 }; | 73 }; |
74 | 74 |
75 void Initialize(); | 75 void Initialize(); |
76 | 76 |
77 Handle<JSObject> StubHolder(Handle<JSObject> receiver, | |
78 Handle<JSObject> holder); | |
79 | |
80 Handle<Code> FindStub(Handle<String> name, | |
81 Handle<JSObject> stub_holder, | |
82 Code::Kind kind, | |
83 Code::StubType type, | |
84 Code::IcFragment fragment); | |
85 | |
86 Handle<Code> FindHandler(Handle<String> name, | |
87 Handle<JSObject> stub_holder, | |
88 Code::Kind kind, | |
89 Code::StubType type); | |
90 | |
91 Handle<Code> ComputeMonomorphicIC(Handle<JSObject> receiver, | |
92 Handle<Code> handler, | |
93 Handle<String> name); | |
94 Handle<Code> ComputeKeyedMonomorphicIC(Handle<JSObject> receiver, | |
95 Handle<Code> handler, | |
96 Handle<String> name); | |
77 | 97 |
78 // Computes the right stub matching. Inserts the result in the | 98 // Computes the right stub matching. Inserts the result in the |
79 // cache before returning. This might compile a stub if needed. | 99 // cache before returning. This might compile a stub if needed. |
80 Handle<Code> ComputeLoadNonexistent(Handle<String> name, | 100 Handle<Code> ComputeLoadNonexistent(Handle<String> name, |
81 Handle<JSObject> object); | 101 Handle<JSObject> object); |
82 | 102 |
83 Handle<Code> ComputeLoadField(Handle<String> name, | 103 Handle<Code> ComputeLoadField(Handle<String> name, |
84 Handle<JSObject> object, | 104 Handle<JSObject> object, |
85 Handle<JSObject> holder, | 105 Handle<JSObject> holder, |
86 PropertyIndex field_index); | 106 PropertyIndex field_index); |
(...skipping 10 matching lines...) Expand all Loading... | |
97 | 117 |
98 Handle<Code> ComputeLoadConstant(Handle<String> name, | 118 Handle<Code> ComputeLoadConstant(Handle<String> name, |
99 Handle<JSObject> object, | 119 Handle<JSObject> object, |
100 Handle<JSObject> holder, | 120 Handle<JSObject> holder, |
101 Handle<JSFunction> value); | 121 Handle<JSFunction> value); |
102 | 122 |
103 Handle<Code> ComputeLoadInterceptor(Handle<String> name, | 123 Handle<Code> ComputeLoadInterceptor(Handle<String> name, |
104 Handle<JSObject> object, | 124 Handle<JSObject> object, |
105 Handle<JSObject> holder); | 125 Handle<JSObject> holder); |
106 | 126 |
107 Handle<Code> ComputeLoadNormal(); | 127 Handle<Code> ComputeLoadNormal(Handle<String> name, |
128 Handle<JSObject> object); | |
108 | 129 |
109 Handle<Code> ComputeLoadGlobal(Handle<String> name, | 130 Handle<Code> ComputeLoadGlobal(Handle<String> name, |
110 Handle<JSObject> object, | 131 Handle<JSObject> object, |
111 Handle<GlobalObject> holder, | 132 Handle<GlobalObject> holder, |
112 Handle<JSGlobalPropertyCell> cell, | 133 Handle<JSGlobalPropertyCell> cell, |
113 bool is_dont_delete); | 134 bool is_dont_delete); |
114 | 135 |
115 // --- | 136 // --- |
116 | 137 |
117 Handle<Code> ComputeKeyedLoadField(Handle<String> name, | 138 Handle<Code> ComputeKeyedLoadField(Handle<String> name, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
238 Code::Kind kind, | 259 Code::Kind kind, |
239 Code::ExtraICState state); | 260 Code::ExtraICState state); |
240 | 261 |
241 // --- | 262 // --- |
242 | 263 |
243 Handle<Code> ComputeLoadElementPolymorphic(MapHandleList* receiver_maps); | 264 Handle<Code> ComputeLoadElementPolymorphic(MapHandleList* receiver_maps); |
244 Handle<Code> ComputeStoreElementPolymorphic(MapHandleList* receiver_maps, | 265 Handle<Code> ComputeStoreElementPolymorphic(MapHandleList* receiver_maps, |
245 KeyedAccessGrowMode grow_mode, | 266 KeyedAccessGrowMode grow_mode, |
246 StrictModeFlag strict_mode); | 267 StrictModeFlag strict_mode); |
247 | 268 |
269 Handle<Code> ComputePolymorphicIC(MapHandleList* receiver_maps, | |
270 CodeHandleList* handlers, | |
271 Handle<String> name); | |
272 | |
248 // Finds the Code object stored in the Heap::non_monomorphic_cache(). | 273 // Finds the Code object stored in the Heap::non_monomorphic_cache(). |
249 Code* FindCallInitialize(int argc, RelocInfo::Mode mode, Code::Kind kind); | 274 Code* FindCallInitialize(int argc, RelocInfo::Mode mode, Code::Kind kind); |
250 | 275 |
251 #ifdef ENABLE_DEBUGGER_SUPPORT | 276 #ifdef ENABLE_DEBUGGER_SUPPORT |
252 Handle<Code> ComputeCallDebugBreak(int argc, Code::Kind kind); | 277 Handle<Code> ComputeCallDebugBreak(int argc, Code::Kind kind); |
253 | 278 |
254 Handle<Code> ComputeCallDebugPrepareStepIn(int argc, Code::Kind kind); | 279 Handle<Code> ComputeCallDebugPrepareStepIn(int argc, Code::Kind kind); |
255 #endif | 280 #endif |
256 | 281 |
257 // Update cache for entry hash(name, map). | 282 // Update cache for entry hash(name, map). |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
407 | 432 |
408 // Support functions for IC stubs for interceptors. | 433 // Support functions for IC stubs for interceptors. |
409 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorOnly); | 434 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorOnly); |
410 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad); | 435 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad); |
411 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall); | 436 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall); |
412 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty); | 437 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty); |
413 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty); | 438 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty); |
414 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); | 439 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); |
415 | 440 |
416 | 441 |
442 enum PrototypeCheckType { CHECK_ALL_MAPS, SKIP_RECEIVER }; | |
443 enum IcCheckType { ELEMENT, PROPERTY }; | |
444 | |
445 | |
417 // The stub compilers compile stubs for the stub cache. | 446 // The stub compilers compile stubs for the stub cache. |
418 class StubCompiler BASE_EMBEDDED { | 447 class StubCompiler BASE_EMBEDDED { |
419 public: | 448 public: |
420 explicit StubCompiler(Isolate* isolate) | 449 explicit StubCompiler(Isolate* isolate) |
421 : isolate_(isolate), masm_(isolate, NULL, 256), failure_(NULL) { } | 450 : isolate_(isolate), masm_(isolate, NULL, 256), failure_(NULL) { } |
422 | 451 |
423 // Functions to compile either CallIC or KeyedCallIC. The specific kind | 452 // Functions to compile either CallIC or KeyedCallIC. The specific kind |
424 // is extracted from the code flags. | 453 // is extracted from the code flags. |
425 Handle<Code> CompileCallInitialize(Code::Flags flags); | 454 Handle<Code> CompileCallInitialize(Code::Flags flags); |
426 Handle<Code> CompileCallPreMonomorphic(Code::Flags flags); | 455 Handle<Code> CompileCallPreMonomorphic(Code::Flags flags); |
(...skipping 21 matching lines...) Expand all Loading... | |
448 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm, | 477 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm, |
449 int index, | 478 int index, |
450 Register prototype, | 479 Register prototype, |
451 Label* miss); | 480 Label* miss); |
452 | 481 |
453 static void GenerateFastPropertyLoad(MacroAssembler* masm, | 482 static void GenerateFastPropertyLoad(MacroAssembler* masm, |
454 Register dst, | 483 Register dst, |
455 Register src, | 484 Register src, |
456 Handle<JSObject> holder, | 485 Handle<JSObject> holder, |
457 PropertyIndex index); | 486 PropertyIndex index); |
487 static void DoGenerateFastPropertyLoad(MacroAssembler* masm, | |
488 Register dst, | |
489 Register src, | |
490 bool inobject, | |
491 int index); | |
458 | 492 |
459 static void GenerateLoadArrayLength(MacroAssembler* masm, | 493 static void GenerateLoadArrayLength(MacroAssembler* masm, |
460 Register receiver, | 494 Register receiver, |
461 Register scratch, | 495 Register scratch, |
462 Label* miss_label); | 496 Label* miss_label); |
463 | 497 |
464 static void GenerateLoadStringLength(MacroAssembler* masm, | 498 static void GenerateLoadStringLength(MacroAssembler* masm, |
465 Register receiver, | 499 Register receiver, |
466 Register scratch1, | 500 Register scratch1, |
467 Register scratch2, | 501 Register scratch2, |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
505 // The function can optionally (when save_at_depth != | 539 // The function can optionally (when save_at_depth != |
506 // kInvalidProtoDepth) save the object at the given depth by moving | 540 // kInvalidProtoDepth) save the object at the given depth by moving |
507 // it to [esp + kPointerSize]. | 541 // it to [esp + kPointerSize]. |
508 Register CheckPrototypes(Handle<JSObject> object, | 542 Register CheckPrototypes(Handle<JSObject> object, |
509 Register object_reg, | 543 Register object_reg, |
510 Handle<JSObject> holder, | 544 Handle<JSObject> holder, |
511 Register holder_reg, | 545 Register holder_reg, |
512 Register scratch1, | 546 Register scratch1, |
513 Register scratch2, | 547 Register scratch2, |
514 Handle<String> name, | 548 Handle<String> name, |
515 Label* miss) { | 549 Label* miss, |
550 PrototypeCheckType check = CHECK_ALL_MAPS) { | |
516 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, | 551 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, |
517 scratch2, name, kInvalidProtoDepth, miss); | 552 scratch2, name, kInvalidProtoDepth, miss, check); |
518 } | 553 } |
519 | 554 |
520 Register CheckPrototypes(Handle<JSObject> object, | 555 Register CheckPrototypes(Handle<JSObject> object, |
521 Register object_reg, | 556 Register object_reg, |
522 Handle<JSObject> holder, | 557 Handle<JSObject> holder, |
523 Register holder_reg, | 558 Register holder_reg, |
524 Register scratch1, | 559 Register scratch1, |
525 Register scratch2, | 560 Register scratch2, |
526 Handle<String> name, | 561 Handle<String> name, |
527 int save_at_depth, | 562 int save_at_depth, |
528 Label* miss); | 563 Label* miss, |
564 PrototypeCheckType check = CHECK_ALL_MAPS); | |
529 | 565 |
530 | 566 |
531 protected: | 567 protected: |
532 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); | 568 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); |
533 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<String> name); | 569 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<String> name); |
534 | 570 |
535 MacroAssembler* masm() { return &masm_; } | 571 MacroAssembler* masm() { return &masm_; } |
536 void set_failure(Failure* failure) { failure_ = failure; } | 572 void set_failure(Failure* failure) { failure_ = failure; } |
537 | 573 |
538 static void LookupPostInterceptor(Handle<JSObject> holder, | 574 static void LookupPostInterceptor(Handle<JSObject> holder, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
571 | 607 |
572 Handle<Code> CompileLoadConstant(Handle<JSObject> object, | 608 Handle<Code> CompileLoadConstant(Handle<JSObject> object, |
573 Handle<JSObject> holder, | 609 Handle<JSObject> holder, |
574 Handle<String> name, | 610 Handle<String> name, |
575 Handle<JSFunction> value); | 611 Handle<JSFunction> value); |
576 | 612 |
577 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, | 613 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, |
578 Handle<JSObject> holder, | 614 Handle<JSObject> holder, |
579 Handle<String> name); | 615 Handle<String> name); |
580 | 616 |
617 Handle<Code> CompileMonomorphicIC(Handle<Map> receiver_map, | |
618 Handle<Code> handler, | |
619 Handle<String> name); | |
620 Handle<Code> CompilePolymorphicIC(MapHandleList* receiver_maps, | |
621 CodeHandleList* handlers, | |
622 Handle<String> name, | |
623 Code::StubType type, | |
624 IcCheckType check); | |
625 | |
581 protected: | 626 protected: |
582 Register HandlerFrontendHeader(Handle<JSObject> object, | 627 Register HandlerFrontendHeader( |
583 Register object_reg, | 628 Handle<JSObject> object, |
Jakob Kummerow
2013/03/01 22:21:04
Why this reformatting?
Toon Verwaest
2013/03/04 10:54:08
Done.
| |
584 Handle<JSObject> holder, | 629 Register object_reg, |
585 Handle<String> name, | 630 Handle<JSObject> holder, |
586 Label* success, | 631 Handle<String> name, |
587 FrontendCheckType check); | 632 Label* success); |
588 void HandlerFrontendFooter(Label* success, Label* miss); | 633 void HandlerFrontendFooter(Label* success, Label* miss); |
589 | 634 |
590 Register HandlerFrontend(Handle<JSObject> object, | 635 Register HandlerFrontend(Handle<JSObject> object, |
591 Register object_reg, | 636 Register object_reg, |
592 Handle<JSObject> holder, | 637 Handle<JSObject> holder, |
593 Handle<String> name, | 638 Handle<String> name, |
594 Label* success, | 639 Label* success); |
595 FrontendCheckType check); | 640 Register CallbackHandlerFrontend( |
596 Register CallbackHandlerFrontend(Handle<JSObject> object, | 641 Handle<JSObject> object, |
Jakob Kummerow
2013/03/01 22:21:04
Why this reformatting?
Toon Verwaest
2013/03/04 10:54:08
Done.
| |
597 Register object_reg, | 642 Register object_reg, |
598 Handle<JSObject> holder, | 643 Handle<JSObject> holder, |
599 Handle<String> name, | 644 Handle<String> name, |
600 Label* success, | 645 Label* success, |
601 FrontendCheckType check, | 646 Handle<ExecutableAccessorInfo> callback); |
602 Handle<ExecutableAccessorInfo> callback); | |
603 void NonexistentHandlerFrontend(Handle<JSObject> object, | 647 void NonexistentHandlerFrontend(Handle<JSObject> object, |
604 Handle<JSObject> last, | 648 Handle<JSObject> last, |
605 Handle<String> name, | 649 Handle<String> name, |
606 Label* success, | 650 Label* success, |
607 Handle<GlobalObject> global); | 651 Handle<GlobalObject> global); |
608 | 652 |
609 void GenerateLoadField(Register reg, | 653 void GenerateLoadField(Register reg, |
610 Handle<JSObject> holder, | 654 Handle<JSObject> holder, |
611 PropertyIndex index); | 655 PropertyIndex index); |
612 void GenerateLoadConstant(Handle<JSFunction> value); | 656 void GenerateLoadConstant(Handle<JSFunction> value); |
613 void GenerateLoadCallback(Register reg, | 657 void GenerateLoadCallback(Register reg, |
614 Handle<ExecutableAccessorInfo> callback); | 658 Handle<ExecutableAccessorInfo> callback); |
615 void GenerateLoadInterceptor(Register holder_reg, | 659 void GenerateLoadInterceptor(Register holder_reg, |
616 Handle<JSObject> object, | 660 Handle<JSObject> object, |
617 Handle<JSObject> holder, | 661 Handle<JSObject> holder, |
618 LookupResult* lookup, | 662 LookupResult* lookup, |
619 Handle<String> name); | 663 Handle<String> name); |
620 void GenerateLoadPostInterceptor(Register reg, | 664 void GenerateLoadPostInterceptor(Register reg, |
621 Handle<JSObject> interceptor_holder, | 665 Handle<JSObject> interceptor_holder, |
622 Handle<String> name, | 666 Handle<String> name, |
623 LookupResult* lookup); | 667 LookupResult* lookup); |
624 | 668 |
669 Handle<Code> GetCode(Code::IcFragment fragment, | |
670 Code::StubType type, | |
671 Handle<String> name, | |
672 InlineCacheState state = MONOMORPHIC); | |
625 | 673 |
626 Register receiver() { return registers_[0]; } | 674 Register receiver() { return registers_[0]; } |
627 Register name() { return registers_[1]; } | 675 Register name() { return registers_[1]; } |
628 Register scratch1() { return registers_[2]; } | 676 Register scratch1() { return registers_[2]; } |
629 Register scratch2() { return registers_[3]; } | 677 Register scratch2() { return registers_[3]; } |
630 Register scratch3() { return registers_[4]; } | 678 Register scratch3() { return registers_[4]; } |
631 Register scratch4() { return registers_[5]; } | 679 Register scratch4() { return registers_[5]; } |
632 | 680 |
633 private: | 681 private: |
634 virtual Code::Kind kind() = 0; | 682 virtual Code::Kind kind() = 0; |
683 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) = 0; | |
684 virtual void JitEvent(Handle<String> name, Handle<Code> code) = 0; | |
635 virtual void GenerateNameCheck(Handle<String> name, | 685 virtual void GenerateNameCheck(Handle<String> name, |
636 Register name_reg, | 686 Register name_reg, |
637 Label* miss) { } | 687 Label* miss) { } |
638 virtual Handle<Code> GetCode(Code::StubType type, | |
639 Handle<String> name, | |
640 InlineCacheState state = MONOMORPHIC) = 0; | |
641 Register* registers_; | 688 Register* registers_; |
642 }; | 689 }; |
643 | 690 |
644 | 691 |
645 class LoadStubCompiler: public BaseLoadStubCompiler { | 692 class LoadStubCompiler: public BaseLoadStubCompiler { |
646 public: | 693 public: |
647 explicit LoadStubCompiler(Isolate* isolate) | 694 explicit LoadStubCompiler(Isolate* isolate) |
648 : BaseLoadStubCompiler(isolate, registers()) { } | 695 : BaseLoadStubCompiler(isolate, registers()) { } |
649 | 696 |
650 Handle<Code> CompileLoadNonexistent(Handle<JSObject> object, | 697 Handle<Code> CompileLoadNonexistent(Handle<JSObject> object, |
651 Handle<JSObject> last, | 698 Handle<JSObject> last, |
652 Handle<String> name, | 699 Handle<String> name, |
653 Handle<GlobalObject> global); | 700 Handle<GlobalObject> global); |
654 | 701 |
655 static void GenerateLoadViaGetter(MacroAssembler* masm, | 702 static void GenerateLoadViaGetter(MacroAssembler* masm, |
656 Handle<JSFunction> getter); | 703 Handle<JSFunction> getter); |
657 | 704 |
658 Handle<Code> CompileLoadViaGetter(Handle<JSObject> object, | 705 Handle<Code> CompileLoadViaGetter(Handle<JSObject> object, |
659 Handle<JSObject> holder, | 706 Handle<JSObject> holder, |
660 Handle<String> name, | 707 Handle<String> name, |
661 Handle<JSFunction> getter); | 708 Handle<JSFunction> getter); |
662 | 709 |
663 Handle<Code> CompileLoadGlobal(Handle<JSObject> object, | 710 Handle<Code> CompileLoadGlobal(Handle<JSObject> object, |
664 Handle<GlobalObject> holder, | 711 Handle<GlobalObject> holder, |
665 Handle<JSGlobalPropertyCell> cell, | 712 Handle<JSGlobalPropertyCell> cell, |
666 Handle<String> name, | 713 Handle<String> name, |
667 bool is_dont_delete); | 714 bool is_dont_delete); |
668 | 715 |
716 static Register receiver() { return registers()[0]; } | |
717 | |
669 private: | 718 private: |
670 Register* registers(); | 719 static Register* registers(); |
671 virtual Code::Kind kind() { return Code::LOAD_IC; } | 720 virtual Code::Kind kind() { return Code::LOAD_IC; } |
672 virtual Handle<Code> GetCode(Code::StubType type, | 721 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
673 Handle<String> name, | 722 return code->ic_state() == MONOMORPHIC |
674 InlineCacheState state = MONOMORPHIC); | 723 ? Logger::LOAD_IC_TAG : Logger::LOAD_POLYMORPHIC_IC_TAG; |
724 } | |
725 virtual void JitEvent(Handle<String> name, Handle<Code> code); | |
675 }; | 726 }; |
676 | 727 |
677 | 728 |
678 class KeyedLoadStubCompiler: public BaseLoadStubCompiler { | 729 class KeyedLoadStubCompiler: public BaseLoadStubCompiler { |
679 public: | 730 public: |
680 explicit KeyedLoadStubCompiler(Isolate* isolate) | 731 explicit KeyedLoadStubCompiler(Isolate* isolate) |
681 : BaseLoadStubCompiler(isolate, registers()) { } | 732 : BaseLoadStubCompiler(isolate, registers()) { } |
682 | 733 |
683 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); | 734 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); |
684 | 735 |
685 Handle<Code> CompileLoadPolymorphic(MapHandleList* receiver_maps, | 736 void CompileElementHandlers(MapHandleList* receiver_maps, |
686 CodeHandleList* handler_ics); | 737 CodeHandleList* handlers); |
687 | 738 |
688 Handle<Code> CompileLoadElementPolymorphic(MapHandleList* receiver_maps); | 739 Handle<Code> CompileLoadElementPolymorphic(MapHandleList* receiver_maps); |
689 | 740 |
690 static void GenerateLoadDictionaryElement(MacroAssembler* masm); | 741 static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
691 | 742 |
743 static Register receiver() { return registers()[0]; } | |
744 | |
692 private: | 745 private: |
693 Register* registers(); | 746 static Register* registers(); |
694 virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; } | 747 virtual Code::Kind kind() { return Code::KEYED_LOAD_IC; } |
695 virtual Handle<Code> GetCode(Code::StubType type, | 748 virtual Logger::LogEventsAndTags log_kind(Handle<Code> code) { |
696 Handle<String> name, | 749 return code->ic_state() == MONOMORPHIC |
697 InlineCacheState state = MONOMORPHIC); | 750 ? Logger::KEYED_LOAD_IC_TAG : Logger::KEYED_LOAD_POLYMORPHIC_IC_TAG; |
751 } | |
752 virtual void JitEvent(Handle<String> name, Handle<Code> code); | |
698 virtual void GenerateNameCheck(Handle<String> name, | 753 virtual void GenerateNameCheck(Handle<String> name, |
699 Register name_reg, | 754 Register name_reg, |
700 Label* miss); | 755 Label* miss); |
701 }; | 756 }; |
702 | 757 |
703 | 758 |
704 class StoreStubCompiler: public StubCompiler { | 759 class StoreStubCompiler: public StubCompiler { |
705 public: | 760 public: |
706 StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) | 761 StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
707 : StubCompiler(isolate), strict_mode_(strict_mode) { } | 762 : StubCompiler(isolate), strict_mode_(strict_mode) { } |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
948 Handle<JSFunction> constant_function_; | 1003 Handle<JSFunction> constant_function_; |
949 bool is_simple_api_call_; | 1004 bool is_simple_api_call_; |
950 Handle<FunctionTemplateInfo> expected_receiver_type_; | 1005 Handle<FunctionTemplateInfo> expected_receiver_type_; |
951 Handle<CallHandlerInfo> api_call_info_; | 1006 Handle<CallHandlerInfo> api_call_info_; |
952 }; | 1007 }; |
953 | 1008 |
954 | 1009 |
955 } } // namespace v8::internal | 1010 } } // namespace v8::internal |
956 | 1011 |
957 #endif // V8_STUB_CACHE_H_ | 1012 #endif // V8_STUB_CACHE_H_ |
OLD | NEW |