| 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 | 
|---|