| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 // code for security check in case of global object holders. Helps to make | 454 // code for security check in case of global object holders. Helps to make |
| 455 // sure that the current IC is still valid. | 455 // sure that the current IC is still valid. |
| 456 // | 456 // |
| 457 // The scratch and holder registers are always clobbered, but the object | 457 // The scratch and holder registers are always clobbered, but the object |
| 458 // register is only clobbered if it the same as the holder register. The | 458 // register is only clobbered if it the same as the holder register. The |
| 459 // function returns a register containing the holder - either object_reg or | 459 // function returns a register containing the holder - either object_reg or |
| 460 // holder_reg. | 460 // holder_reg. |
| 461 // The function can optionally (when save_at_depth != | 461 // The function can optionally (when save_at_depth != |
| 462 // kInvalidProtoDepth) save the object at the given depth by moving | 462 // kInvalidProtoDepth) save the object at the given depth by moving |
| 463 // it to [esp + kPointerSize]. | 463 // it to [esp + kPointerSize]. |
| 464 Register CheckPrototypes(Handle<Type> type, | 464 Register CheckPrototypes(Handle<HeapType> type, |
| 465 Register object_reg, | 465 Register object_reg, |
| 466 Handle<JSObject> holder, | 466 Handle<JSObject> holder, |
| 467 Register holder_reg, | 467 Register holder_reg, |
| 468 Register scratch1, | 468 Register scratch1, |
| 469 Register scratch2, | 469 Register scratch2, |
| 470 Handle<Name> name, | 470 Handle<Name> name, |
| 471 Label* miss, | 471 Label* miss, |
| 472 PrototypeCheckType check = CHECK_ALL_MAPS) { | 472 PrototypeCheckType check = CHECK_ALL_MAPS) { |
| 473 return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1, | 473 return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1, |
| 474 scratch2, name, kInvalidProtoDepth, miss, check); | 474 scratch2, name, kInvalidProtoDepth, miss, check); |
| 475 } | 475 } |
| 476 | 476 |
| 477 Register CheckPrototypes(Handle<Type> type, | 477 Register CheckPrototypes(Handle<HeapType> type, |
| 478 Register object_reg, | 478 Register object_reg, |
| 479 Handle<JSObject> holder, | 479 Handle<JSObject> holder, |
| 480 Register holder_reg, | 480 Register holder_reg, |
| 481 Register scratch1, | 481 Register scratch1, |
| 482 Register scratch2, | 482 Register scratch2, |
| 483 Handle<Name> name, | 483 Handle<Name> name, |
| 484 int save_at_depth, | 484 int save_at_depth, |
| 485 Label* miss, | 485 Label* miss, |
| 486 PrototypeCheckType check = CHECK_ALL_MAPS); | 486 PrototypeCheckType check = CHECK_ALL_MAPS); |
| 487 | 487 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 Code::Kind kind, | 523 Code::Kind kind, |
| 524 ExtraICState extra_ic_state = kNoExtraICState, | 524 ExtraICState extra_ic_state = kNoExtraICState, |
| 525 InlineCacheHolderFlag cache_holder = OWN_MAP) | 525 InlineCacheHolderFlag cache_holder = OWN_MAP) |
| 526 : StubCompiler(isolate, extra_ic_state), | 526 : StubCompiler(isolate, extra_ic_state), |
| 527 kind_(kind), | 527 kind_(kind), |
| 528 cache_holder_(cache_holder) { | 528 cache_holder_(cache_holder) { |
| 529 InitializeRegisters(); | 529 InitializeRegisters(); |
| 530 } | 530 } |
| 531 virtual ~BaseLoadStoreStubCompiler() { } | 531 virtual ~BaseLoadStoreStubCompiler() { } |
| 532 | 532 |
| 533 Handle<Code> CompileMonomorphicIC(Handle<Type> type, | 533 Handle<Code> CompileMonomorphicIC(Handle<HeapType> type, |
| 534 Handle<Code> handler, | 534 Handle<Code> handler, |
| 535 Handle<Name> name); | 535 Handle<Name> name); |
| 536 | 536 |
| 537 Handle<Code> CompilePolymorphicIC(TypeHandleList* types, | 537 Handle<Code> CompilePolymorphicIC(TypeHandleList* types, |
| 538 CodeHandleList* handlers, | 538 CodeHandleList* handlers, |
| 539 Handle<Name> name, | 539 Handle<Name> name, |
| 540 Code::StubType type, | 540 Code::StubType type, |
| 541 IcCheckType check); | 541 IcCheckType check); |
| 542 | 542 |
| 543 virtual void GenerateNameCheck(Handle<Name> name, | 543 virtual void GenerateNameCheck(Handle<Name> name, |
| 544 Register name_reg, | 544 Register name_reg, |
| 545 Label* miss) { } | 545 Label* miss) { } |
| 546 | 546 |
| 547 static Builtins::Name MissBuiltin(Code::Kind kind) { | 547 static Builtins::Name MissBuiltin(Code::Kind kind) { |
| 548 switch (kind) { | 548 switch (kind) { |
| 549 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; | 549 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; |
| 550 case Code::STORE_IC: return Builtins::kStoreIC_Miss; | 550 case Code::STORE_IC: return Builtins::kStoreIC_Miss; |
| 551 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; | 551 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; |
| 552 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; | 552 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; |
| 553 default: UNREACHABLE(); | 553 default: UNREACHABLE(); |
| 554 } | 554 } |
| 555 return Builtins::kLoadIC_Miss; | 555 return Builtins::kLoadIC_Miss; |
| 556 } | 556 } |
| 557 | 557 |
| 558 protected: | 558 protected: |
| 559 virtual Register HandlerFrontendHeader(Handle<Type> type, | 559 virtual Register HandlerFrontendHeader(Handle<HeapType> type, |
| 560 Register object_reg, | 560 Register object_reg, |
| 561 Handle<JSObject> holder, | 561 Handle<JSObject> holder, |
| 562 Handle<Name> name, | 562 Handle<Name> name, |
| 563 Label* miss) = 0; | 563 Label* miss) = 0; |
| 564 | 564 |
| 565 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; | 565 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; |
| 566 | 566 |
| 567 Register HandlerFrontend(Handle<Type> type, | 567 Register HandlerFrontend(Handle<HeapType> type, |
| 568 Register object_reg, | 568 Register object_reg, |
| 569 Handle<JSObject> holder, | 569 Handle<JSObject> holder, |
| 570 Handle<Name> name); | 570 Handle<Name> name); |
| 571 | 571 |
| 572 Handle<Code> GetCode(Code::Kind kind, | 572 Handle<Code> GetCode(Code::Kind kind, |
| 573 Code::StubType type, | 573 Code::StubType type, |
| 574 Handle<Name> name); | 574 Handle<Name> name); |
| 575 | 575 |
| 576 Handle<Code> GetICCode(Code::Kind kind, | 576 Handle<Code> GetICCode(Code::Kind kind, |
| 577 Code::StubType type, | 577 Code::StubType type, |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 class LoadStubCompiler: public BaseLoadStoreStubCompiler { | 616 class LoadStubCompiler: public BaseLoadStoreStubCompiler { |
| 617 public: | 617 public: |
| 618 LoadStubCompiler(Isolate* isolate, | 618 LoadStubCompiler(Isolate* isolate, |
| 619 ExtraICState extra_ic_state = kNoExtraICState, | 619 ExtraICState extra_ic_state = kNoExtraICState, |
| 620 InlineCacheHolderFlag cache_holder = OWN_MAP, | 620 InlineCacheHolderFlag cache_holder = OWN_MAP, |
| 621 Code::Kind kind = Code::LOAD_IC) | 621 Code::Kind kind = Code::LOAD_IC) |
| 622 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state, | 622 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state, |
| 623 cache_holder) { } | 623 cache_holder) { } |
| 624 virtual ~LoadStubCompiler() { } | 624 virtual ~LoadStubCompiler() { } |
| 625 | 625 |
| 626 Handle<Code> CompileLoadField(Handle<Type> type, | 626 Handle<Code> CompileLoadField(Handle<HeapType> type, |
| 627 Handle<JSObject> holder, | 627 Handle<JSObject> holder, |
| 628 Handle<Name> name, | 628 Handle<Name> name, |
| 629 PropertyIndex index, | 629 PropertyIndex index, |
| 630 Representation representation); | 630 Representation representation); |
| 631 | 631 |
| 632 Handle<Code> CompileLoadCallback(Handle<Type> type, | 632 Handle<Code> CompileLoadCallback(Handle<HeapType> type, |
| 633 Handle<JSObject> holder, | 633 Handle<JSObject> holder, |
| 634 Handle<Name> name, | 634 Handle<Name> name, |
| 635 Handle<ExecutableAccessorInfo> callback); | 635 Handle<ExecutableAccessorInfo> callback); |
| 636 | 636 |
| 637 Handle<Code> CompileLoadCallback(Handle<Type> type, | 637 Handle<Code> CompileLoadCallback(Handle<HeapType> type, |
| 638 Handle<JSObject> holder, | 638 Handle<JSObject> holder, |
| 639 Handle<Name> name, | 639 Handle<Name> name, |
| 640 const CallOptimization& call_optimization); | 640 const CallOptimization& call_optimization); |
| 641 | 641 |
| 642 Handle<Code> CompileLoadConstant(Handle<Type> type, | 642 Handle<Code> CompileLoadConstant(Handle<HeapType> type, |
| 643 Handle<JSObject> holder, | 643 Handle<JSObject> holder, |
| 644 Handle<Name> name, | 644 Handle<Name> name, |
| 645 Handle<Object> value); | 645 Handle<Object> value); |
| 646 | 646 |
| 647 Handle<Code> CompileLoadInterceptor(Handle<Type> type, | 647 Handle<Code> CompileLoadInterceptor(Handle<HeapType> type, |
| 648 Handle<JSObject> holder, | 648 Handle<JSObject> holder, |
| 649 Handle<Name> name); | 649 Handle<Name> name); |
| 650 | 650 |
| 651 Handle<Code> CompileLoadViaGetter(Handle<Type> type, | 651 Handle<Code> CompileLoadViaGetter(Handle<HeapType> type, |
| 652 Handle<JSObject> holder, | 652 Handle<JSObject> holder, |
| 653 Handle<Name> name, | 653 Handle<Name> name, |
| 654 Handle<JSFunction> getter); | 654 Handle<JSFunction> getter); |
| 655 | 655 |
| 656 static void GenerateLoadViaGetter(MacroAssembler* masm, | 656 static void GenerateLoadViaGetter(MacroAssembler* masm, |
| 657 Register receiver, | 657 Register receiver, |
| 658 Handle<JSFunction> getter); | 658 Handle<JSFunction> getter); |
| 659 | 659 |
| 660 Handle<Code> CompileLoadNonexistent(Handle<Type> type, | 660 Handle<Code> CompileLoadNonexistent(Handle<HeapType> type, |
| 661 Handle<JSObject> last, | 661 Handle<JSObject> last, |
| 662 Handle<Name> name); | 662 Handle<Name> name); |
| 663 | 663 |
| 664 Handle<Code> CompileLoadGlobal(Handle<Type> type, | 664 Handle<Code> CompileLoadGlobal(Handle<HeapType> type, |
| 665 Handle<GlobalObject> holder, | 665 Handle<GlobalObject> holder, |
| 666 Handle<PropertyCell> cell, | 666 Handle<PropertyCell> cell, |
| 667 Handle<Name> name, | 667 Handle<Name> name, |
| 668 bool is_dont_delete); | 668 bool is_dont_delete); |
| 669 | 669 |
| 670 static Register* registers(); | 670 static Register* registers(); |
| 671 | 671 |
| 672 protected: | 672 protected: |
| 673 virtual Register HandlerFrontendHeader(Handle<Type> type, | 673 virtual Register HandlerFrontendHeader(Handle<HeapType> type, |
| 674 Register object_reg, | 674 Register object_reg, |
| 675 Handle<JSObject> holder, | 675 Handle<JSObject> holder, |
| 676 Handle<Name> name, | 676 Handle<Name> name, |
| 677 Label* miss); | 677 Label* miss); |
| 678 | 678 |
| 679 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); | 679 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); |
| 680 | 680 |
| 681 Register CallbackHandlerFrontend(Handle<Type> type, | 681 Register CallbackHandlerFrontend(Handle<HeapType> type, |
| 682 Register object_reg, | 682 Register object_reg, |
| 683 Handle<JSObject> holder, | 683 Handle<JSObject> holder, |
| 684 Handle<Name> name, | 684 Handle<Name> name, |
| 685 Handle<Object> callback); | 685 Handle<Object> callback); |
| 686 void NonexistentHandlerFrontend(Handle<Type> type, | 686 void NonexistentHandlerFrontend(Handle<HeapType> type, |
| 687 Handle<JSObject> last, | 687 Handle<JSObject> last, |
| 688 Handle<Name> name); | 688 Handle<Name> name); |
| 689 | 689 |
| 690 void GenerateLoadField(Register reg, | 690 void GenerateLoadField(Register reg, |
| 691 Handle<JSObject> holder, | 691 Handle<JSObject> holder, |
| 692 PropertyIndex field, | 692 PropertyIndex field, |
| 693 Representation representation); | 693 Representation representation); |
| 694 void GenerateLoadConstant(Handle<Object> value); | 694 void GenerateLoadConstant(Handle<Object> value); |
| 695 void GenerateLoadCallback(Register reg, | 695 void GenerateLoadCallback(Register reg, |
| 696 Handle<ExecutableAccessorInfo> callback); | 696 Handle<ExecutableAccessorInfo> callback); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 812 static Builtins::Name SlowBuiltin(Code::Kind kind) { | 812 static Builtins::Name SlowBuiltin(Code::Kind kind) { |
| 813 switch (kind) { | 813 switch (kind) { |
| 814 case Code::STORE_IC: return Builtins::kStoreIC_Slow; | 814 case Code::STORE_IC: return Builtins::kStoreIC_Slow; |
| 815 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; | 815 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; |
| 816 default: UNREACHABLE(); | 816 default: UNREACHABLE(); |
| 817 } | 817 } |
| 818 return Builtins::kStoreIC_Slow; | 818 return Builtins::kStoreIC_Slow; |
| 819 } | 819 } |
| 820 | 820 |
| 821 protected: | 821 protected: |
| 822 virtual Register HandlerFrontendHeader(Handle<Type> type, | 822 virtual Register HandlerFrontendHeader(Handle<HeapType> type, |
| 823 Register object_reg, | 823 Register object_reg, |
| 824 Handle<JSObject> holder, | 824 Handle<JSObject> holder, |
| 825 Handle<Name> name, | 825 Handle<Name> name, |
| 826 Label* miss); | 826 Label* miss); |
| 827 | 827 |
| 828 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); | 828 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); |
| 829 void GenerateRestoreName(MacroAssembler* masm, | 829 void GenerateRestoreName(MacroAssembler* masm, |
| 830 Label* label, | 830 Label* label, |
| 831 Handle<Name> name); | 831 Handle<Name> name); |
| 832 | 832 |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 Handle<JSFunction> constant_function_; | 1058 Handle<JSFunction> constant_function_; |
| 1059 bool is_simple_api_call_; | 1059 bool is_simple_api_call_; |
| 1060 Handle<FunctionTemplateInfo> expected_receiver_type_; | 1060 Handle<FunctionTemplateInfo> expected_receiver_type_; |
| 1061 Handle<CallHandlerInfo> api_call_info_; | 1061 Handle<CallHandlerInfo> api_call_info_; |
| 1062 }; | 1062 }; |
| 1063 | 1063 |
| 1064 | 1064 |
| 1065 } } // namespace v8::internal | 1065 } } // namespace v8::internal |
| 1066 | 1066 |
| 1067 #endif // V8_STUB_CACHE_H_ | 1067 #endif // V8_STUB_CACHE_H_ |
| OLD | NEW |