| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 | 441 |
| 442 | 442 |
| 443 #undef __ | 443 #undef __ |
| 444 | 444 |
| 445 #define __ masm()-> | 445 #define __ masm()-> |
| 446 | 446 |
| 447 | 447 |
| 448 // TODO(1241006): Avoid having lazy compile stubs specialized by the | 448 // TODO(1241006): Avoid having lazy compile stubs specialized by the |
| 449 // number of arguments. It is not needed anymore. | 449 // number of arguments. It is not needed anymore. |
| 450 Object* StubCompiler::CompileLazyCompile(Code::Flags flags) { | 450 Object* StubCompiler::CompileLazyCompile(Code::Flags flags) { |
| 451 HandleScope scope; | |
| 452 | |
| 453 // Enter an internal frame. | 451 // Enter an internal frame. |
| 454 __ EnterInternalFrame(); | 452 __ EnterInternalFrame(); |
| 455 | 453 |
| 456 // Push a copy of the function onto the stack. | 454 // Push a copy of the function onto the stack. |
| 457 __ push(edi); | 455 __ push(edi); |
| 458 | 456 |
| 459 __ push(edi); // function is also the parameter to the runtime call | 457 __ push(edi); // function is also the parameter to the runtime call |
| 460 __ CallRuntime(Runtime::kLazyCompile, 1); | 458 __ CallRuntime(Runtime::kLazyCompile, 1); |
| 461 __ pop(edi); | 459 __ pop(edi); |
| 462 | 460 |
| 463 // Tear down temporary frame. | 461 // Tear down temporary frame. |
| 464 __ LeaveInternalFrame(); | 462 __ LeaveInternalFrame(); |
| 465 | 463 |
| 466 // Do a tail-call of the compiled function. | 464 // Do a tail-call of the compiled function. |
| 467 __ lea(ecx, FieldOperand(eax, Code::kHeaderSize)); | 465 __ lea(ecx, FieldOperand(eax, Code::kHeaderSize)); |
| 468 __ jmp(Operand(ecx)); | 466 __ jmp(Operand(ecx)); |
| 469 | 467 |
| 470 return GetCodeWithFlags(flags); | 468 return GetCodeWithFlags(flags); |
| 471 } | 469 } |
| 472 | 470 |
| 473 | 471 |
| 474 Object* CallStubCompiler::CompileCallField(Object* object, | 472 Object* CallStubCompiler::CompileCallField(Object* object, |
| 475 JSObject* holder, | 473 JSObject* holder, |
| 476 int index) { | 474 int index) { |
| 477 // ----------- S t a t e ------------- | 475 // ----------- S t a t e ------------- |
| 478 // ----------------------------------- | 476 // ----------------------------------- |
| 479 | |
| 480 HandleScope scope; | |
| 481 Label miss; | 477 Label miss; |
| 482 | 478 |
| 483 // Get the receiver from the stack. | 479 // Get the receiver from the stack. |
| 484 const int argc = arguments().immediate(); | 480 const int argc = arguments().immediate(); |
| 485 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 481 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 486 | 482 |
| 487 // Check that the receiver isn't a smi. | 483 // Check that the receiver isn't a smi. |
| 488 __ test(edx, Immediate(kSmiTagMask)); | 484 __ test(edx, Immediate(kSmiTagMask)); |
| 489 __ j(zero, &miss, not_taken); | 485 __ j(zero, &miss, not_taken); |
| 490 | 486 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 521 return GetCode(FIELD); | 517 return GetCode(FIELD); |
| 522 } | 518 } |
| 523 | 519 |
| 524 | 520 |
| 525 Object* CallStubCompiler::CompileCallConstant(Object* object, | 521 Object* CallStubCompiler::CompileCallConstant(Object* object, |
| 526 JSObject* holder, | 522 JSObject* holder, |
| 527 JSFunction* function, | 523 JSFunction* function, |
| 528 CheckType check) { | 524 CheckType check) { |
| 529 // ----------- S t a t e ------------- | 525 // ----------- S t a t e ------------- |
| 530 // ----------------------------------- | 526 // ----------------------------------- |
| 531 | |
| 532 HandleScope scope; | |
| 533 Label miss; | 527 Label miss; |
| 534 | 528 |
| 535 // Get the receiver from the stack. | 529 // Get the receiver from the stack. |
| 536 const int argc = arguments().immediate(); | 530 const int argc = arguments().immediate(); |
| 537 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 531 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 538 | 532 |
| 539 // Check that the receiver isn't a smi. | 533 // Check that the receiver isn't a smi. |
| 540 if (check != NUMBER_CHECK) { | 534 if (check != NUMBER_CHECK) { |
| 541 __ test(edx, Immediate(kSmiTagMask)); | 535 __ test(edx, Immediate(kSmiTagMask)); |
| 542 __ j(zero, &miss, not_taken); | 536 __ j(zero, &miss, not_taken); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 // Return the generated code. | 636 // Return the generated code. |
| 643 return GetCode(CONSTANT_FUNCTION); | 637 return GetCode(CONSTANT_FUNCTION); |
| 644 } | 638 } |
| 645 | 639 |
| 646 | 640 |
| 647 Object* CallStubCompiler::CompileCallInterceptor(Object* object, | 641 Object* CallStubCompiler::CompileCallInterceptor(Object* object, |
| 648 JSObject* holder, | 642 JSObject* holder, |
| 649 String* name) { | 643 String* name) { |
| 650 // ----------- S t a t e ------------- | 644 // ----------- S t a t e ------------- |
| 651 // ----------------------------------- | 645 // ----------------------------------- |
| 652 | |
| 653 HandleScope scope; | |
| 654 Label miss; | 646 Label miss; |
| 655 | 647 |
| 656 // Get the number of arguments. | 648 // Get the number of arguments. |
| 657 const int argc = arguments().immediate(); | 649 const int argc = arguments().immediate(); |
| 658 | 650 |
| 659 // Get the receiver from the stack. | 651 // Get the receiver from the stack. |
| 660 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 652 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
| 661 | 653 |
| 662 // Check that the receiver isn't a smi. | 654 // Check that the receiver isn't a smi. |
| 663 __ test(edx, Immediate(kSmiTagMask)); | 655 __ test(edx, Immediate(kSmiTagMask)); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 Object* StoreStubCompiler::CompileStoreField(JSObject* object, | 714 Object* StoreStubCompiler::CompileStoreField(JSObject* object, |
| 723 int index, | 715 int index, |
| 724 Map* transition, | 716 Map* transition, |
| 725 String* name) { | 717 String* name) { |
| 726 // ----------- S t a t e ------------- | 718 // ----------- S t a t e ------------- |
| 727 // -- eax : value | 719 // -- eax : value |
| 728 // -- ecx : name | 720 // -- ecx : name |
| 729 // -- esp[0] : return address | 721 // -- esp[0] : return address |
| 730 // -- esp[4] : receiver | 722 // -- esp[4] : receiver |
| 731 // ----------------------------------- | 723 // ----------------------------------- |
| 732 | |
| 733 HandleScope scope; | |
| 734 Label miss; | 724 Label miss; |
| 735 | 725 |
| 736 // Get the object from the stack. | 726 // Get the object from the stack. |
| 737 __ mov(ebx, Operand(esp, 1 * kPointerSize)); | 727 __ mov(ebx, Operand(esp, 1 * kPointerSize)); |
| 738 | 728 |
| 739 // Generate store field code. Trashes the name register. | 729 // Generate store field code. Trashes the name register. |
| 740 GenerateStoreField(masm(), | 730 GenerateStoreField(masm(), |
| 741 Builtins::StoreIC_ExtendStorage, | 731 Builtins::StoreIC_ExtendStorage, |
| 742 object, | 732 object, |
| 743 index, | 733 index, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 758 | 748 |
| 759 Object* StoreStubCompiler::CompileStoreCallback(JSObject* object, | 749 Object* StoreStubCompiler::CompileStoreCallback(JSObject* object, |
| 760 AccessorInfo* callback, | 750 AccessorInfo* callback, |
| 761 String* name) { | 751 String* name) { |
| 762 // ----------- S t a t e ------------- | 752 // ----------- S t a t e ------------- |
| 763 // -- eax : value | 753 // -- eax : value |
| 764 // -- ecx : name | 754 // -- ecx : name |
| 765 // -- esp[0] : return address | 755 // -- esp[0] : return address |
| 766 // -- esp[4] : receiver | 756 // -- esp[4] : receiver |
| 767 // ----------------------------------- | 757 // ----------------------------------- |
| 768 | |
| 769 HandleScope scope; | |
| 770 Label miss; | 758 Label miss; |
| 771 | 759 |
| 772 // Get the object from the stack. | 760 // Get the object from the stack. |
| 773 __ mov(ebx, Operand(esp, 1 * kPointerSize)); | 761 __ mov(ebx, Operand(esp, 1 * kPointerSize)); |
| 774 | 762 |
| 775 // Check that the object isn't a smi. | 763 // Check that the object isn't a smi. |
| 776 __ test(ebx, Immediate(kSmiTagMask)); | 764 __ test(ebx, Immediate(kSmiTagMask)); |
| 777 __ j(zero, &miss, not_taken); | 765 __ j(zero, &miss, not_taken); |
| 778 | 766 |
| 779 // Check that the map of the object hasn't changed. | 767 // Check that the map of the object hasn't changed. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 | 802 |
| 815 | 803 |
| 816 Object* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, | 804 Object* StoreStubCompiler::CompileStoreInterceptor(JSObject* receiver, |
| 817 String* name) { | 805 String* name) { |
| 818 // ----------- S t a t e ------------- | 806 // ----------- S t a t e ------------- |
| 819 // -- eax : value | 807 // -- eax : value |
| 820 // -- ecx : name | 808 // -- ecx : name |
| 821 // -- esp[0] : return address | 809 // -- esp[0] : return address |
| 822 // -- esp[4] : receiver | 810 // -- esp[4] : receiver |
| 823 // ----------------------------------- | 811 // ----------------------------------- |
| 824 | |
| 825 HandleScope scope; | |
| 826 Label miss; | 812 Label miss; |
| 827 | 813 |
| 828 // Get the object from the stack. | 814 // Get the object from the stack. |
| 829 __ mov(ebx, Operand(esp, 1 * kPointerSize)); | 815 __ mov(ebx, Operand(esp, 1 * kPointerSize)); |
| 830 | 816 |
| 831 // Check that the object isn't a smi. | 817 // Check that the object isn't a smi. |
| 832 __ test(ebx, Immediate(kSmiTagMask)); | 818 __ test(ebx, Immediate(kSmiTagMask)); |
| 833 __ j(zero, &miss, not_taken); | 819 __ j(zero, &miss, not_taken); |
| 834 | 820 |
| 835 // Check that the map of the object hasn't changed. | 821 // Check that the map of the object hasn't changed. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 871 Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, | 857 Object* KeyedStoreStubCompiler::CompileStoreField(JSObject* object, |
| 872 int index, | 858 int index, |
| 873 Map* transition, | 859 Map* transition, |
| 874 String* name) { | 860 String* name) { |
| 875 // ----------- S t a t e ------------- | 861 // ----------- S t a t e ------------- |
| 876 // -- eax : value | 862 // -- eax : value |
| 877 // -- esp[0] : return address | 863 // -- esp[0] : return address |
| 878 // -- esp[4] : key | 864 // -- esp[4] : key |
| 879 // -- esp[8] : receiver | 865 // -- esp[8] : receiver |
| 880 // ----------------------------------- | 866 // ----------------------------------- |
| 881 HandleScope scope; | |
| 882 Label miss; | 867 Label miss; |
| 883 | 868 |
| 884 __ IncrementCounter(&Counters::keyed_store_field, 1); | 869 __ IncrementCounter(&Counters::keyed_store_field, 1); |
| 885 | 870 |
| 886 // Get the name from the stack. | 871 // Get the name from the stack. |
| 887 __ mov(ecx, Operand(esp, 1 * kPointerSize)); | 872 __ mov(ecx, Operand(esp, 1 * kPointerSize)); |
| 888 // Check that the name has not changed. | 873 // Check that the name has not changed. |
| 889 __ cmp(Operand(ecx), Immediate(Handle<String>(name))); | 874 __ cmp(Operand(ecx), Immediate(Handle<String>(name))); |
| 890 __ j(not_equal, &miss, not_taken); | 875 __ j(not_equal, &miss, not_taken); |
| 891 | 876 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 913 | 898 |
| 914 | 899 |
| 915 Object* LoadStubCompiler::CompileLoadField(JSObject* object, | 900 Object* LoadStubCompiler::CompileLoadField(JSObject* object, |
| 916 JSObject* holder, | 901 JSObject* holder, |
| 917 int index) { | 902 int index) { |
| 918 // ----------- S t a t e ------------- | 903 // ----------- S t a t e ------------- |
| 919 // -- ecx : name | 904 // -- ecx : name |
| 920 // -- esp[0] : return address | 905 // -- esp[0] : return address |
| 921 // -- esp[4] : receiver | 906 // -- esp[4] : receiver |
| 922 // ----------------------------------- | 907 // ----------------------------------- |
| 923 | |
| 924 HandleScope scope; | |
| 925 Label miss; | 908 Label miss; |
| 926 | 909 |
| 927 __ mov(eax, (Operand(esp, kPointerSize))); | 910 __ mov(eax, (Operand(esp, kPointerSize))); |
| 928 GenerateLoadField(masm(), object, holder, eax, ebx, edx, index, &miss); | 911 GenerateLoadField(masm(), object, holder, eax, ebx, edx, index, &miss); |
| 929 __ bind(&miss); | 912 __ bind(&miss); |
| 930 GenerateLoadMiss(masm(), Code::LOAD_IC); | 913 GenerateLoadMiss(masm(), Code::LOAD_IC); |
| 931 | 914 |
| 932 // Return the generated code. | 915 // Return the generated code. |
| 933 return GetCode(FIELD); | 916 return GetCode(FIELD); |
| 934 } | 917 } |
| 935 | 918 |
| 936 | 919 |
| 937 Object* LoadStubCompiler::CompileLoadCallback(JSObject* object, | 920 Object* LoadStubCompiler::CompileLoadCallback(JSObject* object, |
| 938 JSObject* holder, | 921 JSObject* holder, |
| 939 AccessorInfo* callback) { | 922 AccessorInfo* callback) { |
| 940 // ----------- S t a t e ------------- | 923 // ----------- S t a t e ------------- |
| 941 // -- ecx : name | 924 // -- ecx : name |
| 942 // -- esp[0] : return address | 925 // -- esp[0] : return address |
| 943 // -- esp[4] : receiver | 926 // -- esp[4] : receiver |
| 944 // ----------------------------------- | 927 // ----------------------------------- |
| 945 | |
| 946 HandleScope scope; | |
| 947 Label miss; | 928 Label miss; |
| 948 | 929 |
| 949 __ mov(eax, (Operand(esp, kPointerSize))); | 930 __ mov(eax, (Operand(esp, kPointerSize))); |
| 950 GenerateLoadCallback(masm(), object, holder, eax, ecx, ebx, | 931 GenerateLoadCallback(masm(), object, holder, eax, ecx, ebx, |
| 951 edx, callback, &miss); | 932 edx, callback, &miss); |
| 952 __ bind(&miss); | 933 __ bind(&miss); |
| 953 GenerateLoadMiss(masm(), Code::LOAD_IC); | 934 GenerateLoadMiss(masm(), Code::LOAD_IC); |
| 954 | 935 |
| 955 // Return the generated code. | 936 // Return the generated code. |
| 956 return GetCode(CALLBACKS); | 937 return GetCode(CALLBACKS); |
| 957 } | 938 } |
| 958 | 939 |
| 959 | 940 |
| 960 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, | 941 Object* LoadStubCompiler::CompileLoadConstant(JSObject* object, |
| 961 JSObject* holder, | 942 JSObject* holder, |
| 962 Object* value) { | 943 Object* value) { |
| 963 // ----------- S t a t e ------------- | 944 // ----------- S t a t e ------------- |
| 964 // -- ecx : name | 945 // -- ecx : name |
| 965 // -- esp[0] : return address | 946 // -- esp[0] : return address |
| 966 // -- esp[4] : receiver | 947 // -- esp[4] : receiver |
| 967 // ----------------------------------- | 948 // ----------------------------------- |
| 968 | |
| 969 HandleScope scope; | |
| 970 Label miss; | 949 Label miss; |
| 971 | 950 |
| 972 __ mov(eax, (Operand(esp, kPointerSize))); | 951 __ mov(eax, (Operand(esp, kPointerSize))); |
| 973 GenerateLoadConstant(masm(), object, holder, eax, ebx, edx, value, &miss); | 952 GenerateLoadConstant(masm(), object, holder, eax, ebx, edx, value, &miss); |
| 974 __ bind(&miss); | 953 __ bind(&miss); |
| 975 GenerateLoadMiss(masm(), Code::LOAD_IC); | 954 GenerateLoadMiss(masm(), Code::LOAD_IC); |
| 976 | 955 |
| 977 // Return the generated code. | 956 // Return the generated code. |
| 978 return GetCode(CONSTANT_FUNCTION); | 957 return GetCode(CONSTANT_FUNCTION); |
| 979 } | 958 } |
| 980 | 959 |
| 981 | 960 |
| 982 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, | 961 Object* LoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, |
| 983 JSObject* holder, | 962 JSObject* holder, |
| 984 String* name) { | 963 String* name) { |
| 985 // ----------- S t a t e ------------- | 964 // ----------- S t a t e ------------- |
| 986 // -- ecx : name | 965 // -- ecx : name |
| 987 // -- esp[0] : return address | 966 // -- esp[0] : return address |
| 988 // -- esp[4] : receiver | 967 // -- esp[4] : receiver |
| 989 // ----------------------------------- | 968 // ----------------------------------- |
| 990 HandleScope scope; | |
| 991 Label miss; | 969 Label miss; |
| 992 | 970 |
| 993 __ mov(eax, (Operand(esp, kPointerSize))); | 971 __ mov(eax, (Operand(esp, kPointerSize))); |
| 994 GenerateLoadInterceptor(masm(), receiver, holder, eax, ecx, edx, ebx, &miss); | 972 GenerateLoadInterceptor(masm(), receiver, holder, eax, ecx, edx, ebx, &miss); |
| 995 __ bind(&miss); | 973 __ bind(&miss); |
| 996 GenerateLoadMiss(masm(), Code::LOAD_IC); | 974 GenerateLoadMiss(masm(), Code::LOAD_IC); |
| 997 | 975 |
| 998 // Return the generated code. | 976 // Return the generated code. |
| 999 return GetCode(INTERCEPTOR); | 977 return GetCode(INTERCEPTOR); |
| 1000 } | 978 } |
| 1001 | 979 |
| 1002 | 980 |
| 1003 Object* KeyedLoadStubCompiler::CompileLoadField(String* name, | 981 Object* KeyedLoadStubCompiler::CompileLoadField(String* name, |
| 1004 JSObject* receiver, | 982 JSObject* receiver, |
| 1005 JSObject* holder, | 983 JSObject* holder, |
| 1006 int index) { | 984 int index) { |
| 1007 // ----------- S t a t e ------------- | 985 // ----------- S t a t e ------------- |
| 1008 // -- esp[0] : return address | 986 // -- esp[0] : return address |
| 1009 // -- esp[4] : name | 987 // -- esp[4] : name |
| 1010 // -- esp[8] : receiver | 988 // -- esp[8] : receiver |
| 1011 // ----------------------------------- | 989 // ----------------------------------- |
| 1012 HandleScope scope; | |
| 1013 Label miss; | 990 Label miss; |
| 1014 | 991 |
| 1015 __ mov(eax, (Operand(esp, kPointerSize))); | 992 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1016 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 993 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1017 __ IncrementCounter(&Counters::keyed_load_field, 1); | 994 __ IncrementCounter(&Counters::keyed_load_field, 1); |
| 1018 | 995 |
| 1019 // Check that the name has not changed. | 996 // Check that the name has not changed. |
| 1020 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 997 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1021 __ j(not_equal, &miss, not_taken); | 998 __ j(not_equal, &miss, not_taken); |
| 1022 | 999 |
| 1023 GenerateLoadField(masm(), receiver, holder, ecx, ebx, edx, index, &miss); | 1000 GenerateLoadField(masm(), receiver, holder, ecx, ebx, edx, index, &miss); |
| 1024 __ bind(&miss); | 1001 __ bind(&miss); |
| 1025 __ DecrementCounter(&Counters::keyed_load_field, 1); | 1002 __ DecrementCounter(&Counters::keyed_load_field, 1); |
| 1026 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 1003 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1027 | 1004 |
| 1028 // Return the generated code. | 1005 // Return the generated code. |
| 1029 return GetCode(FIELD); | 1006 return GetCode(FIELD); |
| 1030 } | 1007 } |
| 1031 | 1008 |
| 1032 | 1009 |
| 1033 Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name, | 1010 Object* KeyedLoadStubCompiler::CompileLoadCallback(String* name, |
| 1034 JSObject* receiver, | 1011 JSObject* receiver, |
| 1035 JSObject* holder, | 1012 JSObject* holder, |
| 1036 AccessorInfo* callback) { | 1013 AccessorInfo* callback) { |
| 1037 // ----------- S t a t e ------------- | 1014 // ----------- S t a t e ------------- |
| 1038 // -- esp[0] : return address | 1015 // -- esp[0] : return address |
| 1039 // -- esp[4] : name | 1016 // -- esp[4] : name |
| 1040 // -- esp[8] : receiver | 1017 // -- esp[8] : receiver |
| 1041 // ----------------------------------- | 1018 // ----------------------------------- |
| 1042 HandleScope scope; | |
| 1043 Label miss; | 1019 Label miss; |
| 1044 | 1020 |
| 1045 __ mov(eax, (Operand(esp, kPointerSize))); | 1021 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1046 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 1022 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1047 __ IncrementCounter(&Counters::keyed_load_callback, 1); | 1023 __ IncrementCounter(&Counters::keyed_load_callback, 1); |
| 1048 | 1024 |
| 1049 // Check that the name has not changed. | 1025 // Check that the name has not changed. |
| 1050 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 1026 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1051 __ j(not_equal, &miss, not_taken); | 1027 __ j(not_equal, &miss, not_taken); |
| 1052 | 1028 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1063 | 1039 |
| 1064 Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name, | 1040 Object* KeyedLoadStubCompiler::CompileLoadConstant(String* name, |
| 1065 JSObject* receiver, | 1041 JSObject* receiver, |
| 1066 JSObject* holder, | 1042 JSObject* holder, |
| 1067 Object* value) { | 1043 Object* value) { |
| 1068 // ----------- S t a t e ------------- | 1044 // ----------- S t a t e ------------- |
| 1069 // -- esp[0] : return address | 1045 // -- esp[0] : return address |
| 1070 // -- esp[4] : name | 1046 // -- esp[4] : name |
| 1071 // -- esp[8] : receiver | 1047 // -- esp[8] : receiver |
| 1072 // ----------------------------------- | 1048 // ----------------------------------- |
| 1073 HandleScope scope; | |
| 1074 Label miss; | 1049 Label miss; |
| 1075 | 1050 |
| 1076 __ mov(eax, (Operand(esp, kPointerSize))); | 1051 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1077 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 1052 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1078 __ IncrementCounter(&Counters::keyed_load_constant_function, 1); | 1053 __ IncrementCounter(&Counters::keyed_load_constant_function, 1); |
| 1079 | 1054 |
| 1080 // Check that the name has not changed. | 1055 // Check that the name has not changed. |
| 1081 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 1056 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1082 __ j(not_equal, &miss, not_taken); | 1057 __ j(not_equal, &miss, not_taken); |
| 1083 | 1058 |
| 1084 GenerateLoadConstant(masm(), receiver, holder, ecx, ebx, edx, value, &miss); | 1059 GenerateLoadConstant(masm(), receiver, holder, ecx, ebx, edx, value, &miss); |
| 1085 __ bind(&miss); | 1060 __ bind(&miss); |
| 1086 __ DecrementCounter(&Counters::keyed_load_constant_function, 1); | 1061 __ DecrementCounter(&Counters::keyed_load_constant_function, 1); |
| 1087 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 1062 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1088 | 1063 |
| 1089 // Return the generated code. | 1064 // Return the generated code. |
| 1090 return GetCode(CONSTANT_FUNCTION); | 1065 return GetCode(CONSTANT_FUNCTION); |
| 1091 } | 1066 } |
| 1092 | 1067 |
| 1093 | 1068 |
| 1094 Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, | 1069 Object* KeyedLoadStubCompiler::CompileLoadInterceptor(JSObject* receiver, |
| 1095 JSObject* holder, | 1070 JSObject* holder, |
| 1096 String* name) { | 1071 String* name) { |
| 1097 // ----------- S t a t e ------------- | 1072 // ----------- S t a t e ------------- |
| 1098 // -- esp[0] : return address | 1073 // -- esp[0] : return address |
| 1099 // -- esp[4] : name | 1074 // -- esp[4] : name |
| 1100 // -- esp[8] : receiver | 1075 // -- esp[8] : receiver |
| 1101 // ----------------------------------- | 1076 // ----------------------------------- |
| 1102 HandleScope scope; | |
| 1103 Label miss; | 1077 Label miss; |
| 1104 | 1078 |
| 1105 __ mov(eax, (Operand(esp, kPointerSize))); | 1079 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1106 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 1080 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1107 __ IncrementCounter(&Counters::keyed_load_interceptor, 1); | 1081 __ IncrementCounter(&Counters::keyed_load_interceptor, 1); |
| 1108 | 1082 |
| 1109 // Check that the name has not changed. | 1083 // Check that the name has not changed. |
| 1110 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 1084 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1111 __ j(not_equal, &miss, not_taken); | 1085 __ j(not_equal, &miss, not_taken); |
| 1112 | 1086 |
| 1113 GenerateLoadInterceptor(masm(), receiver, holder, ecx, eax, edx, ebx, &miss); | 1087 GenerateLoadInterceptor(masm(), receiver, holder, ecx, eax, edx, ebx, &miss); |
| 1114 __ bind(&miss); | 1088 __ bind(&miss); |
| 1115 __ DecrementCounter(&Counters::keyed_load_interceptor, 1); | 1089 __ DecrementCounter(&Counters::keyed_load_interceptor, 1); |
| 1116 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 1090 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1117 | 1091 |
| 1118 // Return the generated code. | 1092 // Return the generated code. |
| 1119 return GetCode(INTERCEPTOR); | 1093 return GetCode(INTERCEPTOR); |
| 1120 } | 1094 } |
| 1121 | 1095 |
| 1122 | 1096 |
| 1123 | 1097 |
| 1124 | 1098 |
| 1125 Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { | 1099 Object* KeyedLoadStubCompiler::CompileLoadArrayLength(String* name) { |
| 1126 // ----------- S t a t e ------------- | 1100 // ----------- S t a t e ------------- |
| 1127 // -- esp[0] : return address | 1101 // -- esp[0] : return address |
| 1128 // -- esp[4] : name | 1102 // -- esp[4] : name |
| 1129 // -- esp[8] : receiver | 1103 // -- esp[8] : receiver |
| 1130 // ----------------------------------- | 1104 // ----------------------------------- |
| 1131 HandleScope scope; | |
| 1132 Label miss; | 1105 Label miss; |
| 1133 | 1106 |
| 1134 __ mov(eax, (Operand(esp, kPointerSize))); | 1107 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1135 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 1108 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1136 __ IncrementCounter(&Counters::keyed_load_array_length, 1); | 1109 __ IncrementCounter(&Counters::keyed_load_array_length, 1); |
| 1137 | 1110 |
| 1138 // Check that the name has not changed. | 1111 // Check that the name has not changed. |
| 1139 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 1112 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1140 __ j(not_equal, &miss, not_taken); | 1113 __ j(not_equal, &miss, not_taken); |
| 1141 | 1114 |
| 1142 GenerateLoadArrayLength(masm(), ecx, edx, &miss); | 1115 GenerateLoadArrayLength(masm(), ecx, edx, &miss); |
| 1143 __ bind(&miss); | 1116 __ bind(&miss); |
| 1144 __ DecrementCounter(&Counters::keyed_load_array_length, 1); | 1117 __ DecrementCounter(&Counters::keyed_load_array_length, 1); |
| 1145 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 1118 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1146 | 1119 |
| 1147 // Return the generated code. | 1120 // Return the generated code. |
| 1148 return GetCode(CALLBACKS); | 1121 return GetCode(CALLBACKS); |
| 1149 } | 1122 } |
| 1150 | 1123 |
| 1151 | 1124 |
| 1152 Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) { | 1125 Object* KeyedLoadStubCompiler::CompileLoadStringLength(String* name) { |
| 1153 // ----------- S t a t e ------------- | 1126 // ----------- S t a t e ------------- |
| 1154 // -- esp[0] : return address | 1127 // -- esp[0] : return address |
| 1155 // -- esp[4] : name | 1128 // -- esp[4] : name |
| 1156 // -- esp[8] : receiver | 1129 // -- esp[8] : receiver |
| 1157 // ----------------------------------- | 1130 // ----------------------------------- |
| 1158 HandleScope scope; | |
| 1159 Label miss; | 1131 Label miss; |
| 1160 | 1132 |
| 1161 __ mov(eax, (Operand(esp, kPointerSize))); | 1133 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1162 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 1134 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1163 __ IncrementCounter(&Counters::keyed_load_string_length, 1); | 1135 __ IncrementCounter(&Counters::keyed_load_string_length, 1); |
| 1164 | 1136 |
| 1165 // Check that the name has not changed. | 1137 // Check that the name has not changed. |
| 1166 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 1138 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1167 __ j(not_equal, &miss, not_taken); | 1139 __ j(not_equal, &miss, not_taken); |
| 1168 | 1140 |
| 1169 GenerateLoadStringLength(masm(), ecx, edx, &miss); | 1141 GenerateLoadStringLength(masm(), ecx, edx, &miss); |
| 1170 __ bind(&miss); | 1142 __ bind(&miss); |
| 1171 __ DecrementCounter(&Counters::keyed_load_string_length, 1); | 1143 __ DecrementCounter(&Counters::keyed_load_string_length, 1); |
| 1172 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 1144 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1173 | 1145 |
| 1174 // Return the generated code. | 1146 // Return the generated code. |
| 1175 return GetCode(CALLBACKS); | 1147 return GetCode(CALLBACKS); |
| 1176 } | 1148 } |
| 1177 | 1149 |
| 1178 | 1150 |
| 1179 Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { | 1151 Object* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) { |
| 1180 // ----------- S t a t e ------------- | 1152 // ----------- S t a t e ------------- |
| 1181 // -- esp[0] : return address | 1153 // -- esp[0] : return address |
| 1182 // -- esp[4] : name | 1154 // -- esp[4] : name |
| 1183 // -- esp[8] : receiver | 1155 // -- esp[8] : receiver |
| 1184 // ----------------------------------- | 1156 // ----------------------------------- |
| 1185 HandleScope scope; | |
| 1186 Label miss; | 1157 Label miss; |
| 1187 | 1158 |
| 1188 __ mov(eax, (Operand(esp, kPointerSize))); | 1159 __ mov(eax, (Operand(esp, kPointerSize))); |
| 1189 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); | 1160 __ mov(ecx, (Operand(esp, 2 * kPointerSize))); |
| 1190 __ IncrementCounter(&Counters::keyed_load_function_prototype, 1); | 1161 __ IncrementCounter(&Counters::keyed_load_function_prototype, 1); |
| 1191 | 1162 |
| 1192 // Check that the name has not changed. | 1163 // Check that the name has not changed. |
| 1193 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 1164 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
| 1194 __ j(not_equal, &miss, not_taken); | 1165 __ j(not_equal, &miss, not_taken); |
| 1195 | 1166 |
| 1196 GenerateLoadFunctionPrototype(masm(), ecx, edx, ebx, &miss); | 1167 GenerateLoadFunctionPrototype(masm(), ecx, edx, ebx, &miss); |
| 1197 __ bind(&miss); | 1168 __ bind(&miss); |
| 1198 __ DecrementCounter(&Counters::keyed_load_function_prototype, 1); | 1169 __ DecrementCounter(&Counters::keyed_load_function_prototype, 1); |
| 1199 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 1170 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 1200 | 1171 |
| 1201 // Return the generated code. | 1172 // Return the generated code. |
| 1202 return GetCode(CALLBACKS); | 1173 return GetCode(CALLBACKS); |
| 1203 } | 1174 } |
| 1204 | 1175 |
| 1205 | 1176 |
| 1206 #undef __ | 1177 #undef __ |
| 1207 | 1178 |
| 1208 } } // namespace v8::internal | 1179 } } // namespace v8::internal |
| OLD | NEW |