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

Side by Side Diff: src/code-stubs.cc

Issue 2395453002: [stubs] Add String and JSReceiver instance type predicates (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/code-stubs.h" 5 #include "src/code-stubs.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/ast/ast.h" 9 #include "src/ast/ast.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 } 742 }
743 743
744 assembler->Bind(&if_rhsisnotnumber); 744 assembler->Bind(&if_rhsisnotnumber);
745 { 745 {
746 // Load the instance type of {rhs}. 746 // Load the instance type of {rhs}.
747 Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map); 747 Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map);
748 748
749 // Check if the {rhs} is a String. 749 // Check if the {rhs} is a String.
750 Label if_rhsisstring(assembler, Label::kDeferred), 750 Label if_rhsisstring(assembler, Label::kDeferred),
751 if_rhsisnotstring(assembler, Label::kDeferred); 751 if_rhsisnotstring(assembler, Label::kDeferred);
752 assembler->Branch(assembler->Int32LessThan( 752 assembler->Branch(assembler->IsStringInstanceType(rhs_instance_type),
753 rhs_instance_type,
754 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
755 &if_rhsisstring, &if_rhsisnotstring); 753 &if_rhsisstring, &if_rhsisnotstring);
756 754
757 assembler->Bind(&if_rhsisstring); 755 assembler->Bind(&if_rhsisstring);
758 { 756 {
759 var_lhs.Bind(lhs); 757 var_lhs.Bind(lhs);
760 var_rhs.Bind(rhs); 758 var_rhs.Bind(rhs);
761 assembler->Goto(&string_add_convert_left); 759 assembler->Goto(&string_add_convert_left);
762 } 760 }
763 761
764 assembler->Bind(&if_rhsisnotstring); 762 assembler->Bind(&if_rhsisnotstring);
765 { 763 {
766 // Check if {rhs} is a JSReceiver. 764 // Check if {rhs} is a JSReceiver.
767 Label if_rhsisreceiver(assembler, Label::kDeferred), 765 Label if_rhsisreceiver(assembler, Label::kDeferred),
768 if_rhsisnotreceiver(assembler, Label::kDeferred); 766 if_rhsisnotreceiver(assembler, Label::kDeferred);
769 assembler->Branch( 767 assembler->Branch(
770 assembler->Int32LessThanOrEqual( 768 assembler->IsJSReceiverInstanceType(rhs_instance_type),
jgruber 2016/10/04 13:35:54 This is an (oft-repeated) example of previously br
Igor Sheludko 2016/10/05 08:02:27 The old logic is also ok, it's just the order of a
jgruber 2016/10/05 08:39:38 Ah, right - that makes more sense.
771 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
772 rhs_instance_type),
773 &if_rhsisreceiver, &if_rhsisnotreceiver); 769 &if_rhsisreceiver, &if_rhsisnotreceiver);
774 770
775 assembler->Bind(&if_rhsisreceiver); 771 assembler->Bind(&if_rhsisreceiver);
776 { 772 {
777 // Convert {rhs} to a primitive first passing no hint. 773 // Convert {rhs} to a primitive first passing no hint.
778 Callable callable = 774 Callable callable =
779 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); 775 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate());
780 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); 776 var_rhs.Bind(assembler->CallStub(callable, context, rhs));
781 assembler->Goto(&loop); 777 assembler->Goto(&loop);
782 } 778 }
(...skipping 11 matching lines...) Expand all
794 } 790 }
795 } 791 }
796 792
797 assembler->Bind(&if_lhsisnotsmi); 793 assembler->Bind(&if_lhsisnotsmi);
798 { 794 {
799 // Load the map and instance type of {lhs}. 795 // Load the map and instance type of {lhs}.
800 Node* lhs_instance_type = assembler->LoadInstanceType(lhs); 796 Node* lhs_instance_type = assembler->LoadInstanceType(lhs);
801 797
802 // Check if {lhs} is a String. 798 // Check if {lhs} is a String.
803 Label if_lhsisstring(assembler), if_lhsisnotstring(assembler); 799 Label if_lhsisstring(assembler), if_lhsisnotstring(assembler);
804 assembler->Branch(assembler->Int32LessThan( 800 assembler->Branch(assembler->IsStringInstanceType(lhs_instance_type),
805 lhs_instance_type,
806 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
807 &if_lhsisstring, &if_lhsisnotstring); 801 &if_lhsisstring, &if_lhsisnotstring);
808 802
809 assembler->Bind(&if_lhsisstring); 803 assembler->Bind(&if_lhsisstring);
810 { 804 {
811 var_lhs.Bind(lhs); 805 var_lhs.Bind(lhs);
812 var_rhs.Bind(rhs); 806 var_rhs.Bind(rhs);
813 assembler->Goto(&string_add_convert_right); 807 assembler->Goto(&string_add_convert_right);
814 } 808 }
815 809
816 assembler->Bind(&if_lhsisnotstring); 810 assembler->Bind(&if_lhsisnotstring);
(...skipping 21 matching lines...) Expand all
838 assembler->Goto(&do_fadd); 832 assembler->Goto(&do_fadd);
839 } 833 }
840 834
841 assembler->Bind(&if_lhsisnotnumber); 835 assembler->Bind(&if_lhsisnotnumber);
842 { 836 {
843 // The {lhs} is neither a Number nor a String, and the {rhs} is a 837 // The {lhs} is neither a Number nor a String, and the {rhs} is a
844 // Smi. 838 // Smi.
845 Label if_lhsisreceiver(assembler, Label::kDeferred), 839 Label if_lhsisreceiver(assembler, Label::kDeferred),
846 if_lhsisnotreceiver(assembler, Label::kDeferred); 840 if_lhsisnotreceiver(assembler, Label::kDeferred);
847 assembler->Branch( 841 assembler->Branch(
848 assembler->Int32LessThanOrEqual( 842 assembler->IsJSReceiverInstanceType(lhs_instance_type),
849 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
850 lhs_instance_type),
851 &if_lhsisreceiver, &if_lhsisnotreceiver); 843 &if_lhsisreceiver, &if_lhsisnotreceiver);
852 844
853 assembler->Bind(&if_lhsisreceiver); 845 assembler->Bind(&if_lhsisreceiver);
854 { 846 {
855 // Convert {lhs} to a primitive first passing no hint. 847 // Convert {lhs} to a primitive first passing no hint.
856 Callable callable = 848 Callable callable =
857 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); 849 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate());
858 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); 850 var_lhs.Bind(assembler->CallStub(callable, context, lhs));
859 assembler->Goto(&loop); 851 assembler->Goto(&loop);
860 } 852 }
861 853
862 assembler->Bind(&if_lhsisnotreceiver); 854 assembler->Bind(&if_lhsisnotreceiver);
863 { 855 {
864 // Convert {lhs} to a Number first. 856 // Convert {lhs} to a Number first.
865 Callable callable = 857 Callable callable =
866 CodeFactory::NonNumberToNumber(assembler->isolate()); 858 CodeFactory::NonNumberToNumber(assembler->isolate());
867 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); 859 var_lhs.Bind(assembler->CallStub(callable, context, lhs));
868 assembler->Goto(&loop); 860 assembler->Goto(&loop);
869 } 861 }
870 } 862 }
871 } 863 }
872 864
873 assembler->Bind(&if_rhsisnotsmi); 865 assembler->Bind(&if_rhsisnotsmi);
874 { 866 {
875 // Load the instance type of {rhs}. 867 // Load the instance type of {rhs}.
876 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); 868 Node* rhs_instance_type = assembler->LoadInstanceType(rhs);
877 869
878 // Check if {rhs} is a String. 870 // Check if {rhs} is a String.
879 Label if_rhsisstring(assembler), if_rhsisnotstring(assembler); 871 Label if_rhsisstring(assembler), if_rhsisnotstring(assembler);
880 assembler->Branch(assembler->Int32LessThan( 872 assembler->Branch(assembler->IsStringInstanceType(rhs_instance_type),
881 rhs_instance_type,
882 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
883 &if_rhsisstring, &if_rhsisnotstring); 873 &if_rhsisstring, &if_rhsisnotstring);
884 874
885 assembler->Bind(&if_rhsisstring); 875 assembler->Bind(&if_rhsisstring);
886 { 876 {
887 var_lhs.Bind(lhs); 877 var_lhs.Bind(lhs);
888 var_rhs.Bind(rhs); 878 var_rhs.Bind(rhs);
889 assembler->Goto(&string_add_convert_left); 879 assembler->Goto(&string_add_convert_left);
890 } 880 }
891 881
892 assembler->Bind(&if_rhsisnotstring); 882 assembler->Bind(&if_rhsisnotstring);
(...skipping 22 matching lines...) Expand all
915 var_fadd_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); 905 var_fadd_rhs.Bind(assembler->LoadHeapNumberValue(rhs));
916 assembler->Goto(&do_fadd); 906 assembler->Goto(&do_fadd);
917 } 907 }
918 908
919 assembler->Bind(&if_rhsisnotnumber); 909 assembler->Bind(&if_rhsisnotnumber);
920 { 910 {
921 // Check if {rhs} is a JSReceiver. 911 // Check if {rhs} is a JSReceiver.
922 Label if_rhsisreceiver(assembler, Label::kDeferred), 912 Label if_rhsisreceiver(assembler, Label::kDeferred),
923 if_rhsisnotreceiver(assembler, Label::kDeferred); 913 if_rhsisnotreceiver(assembler, Label::kDeferred);
924 assembler->Branch( 914 assembler->Branch(
925 assembler->Int32LessThanOrEqual( 915 assembler->IsJSReceiverInstanceType(rhs_instance_type),
926 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
927 rhs_instance_type),
928 &if_rhsisreceiver, &if_rhsisnotreceiver); 916 &if_rhsisreceiver, &if_rhsisnotreceiver);
929 917
930 assembler->Bind(&if_rhsisreceiver); 918 assembler->Bind(&if_rhsisreceiver);
931 { 919 {
932 // Convert {rhs} to a primitive first passing no hint. 920 // Convert {rhs} to a primitive first passing no hint.
933 Callable callable = CodeFactory::NonPrimitiveToPrimitive( 921 Callable callable = CodeFactory::NonPrimitiveToPrimitive(
934 assembler->isolate()); 922 assembler->isolate());
935 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); 923 var_rhs.Bind(assembler->CallStub(callable, context, rhs));
936 assembler->Goto(&loop); 924 assembler->Goto(&loop);
937 } 925 }
938 926
939 assembler->Bind(&if_rhsisnotreceiver); 927 assembler->Bind(&if_rhsisnotreceiver);
940 { 928 {
941 // Convert {rhs} to a Number first. 929 // Convert {rhs} to a Number first.
942 Callable callable = 930 Callable callable =
943 CodeFactory::NonNumberToNumber(assembler->isolate()); 931 CodeFactory::NonNumberToNumber(assembler->isolate());
944 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); 932 var_rhs.Bind(assembler->CallStub(callable, context, rhs));
945 assembler->Goto(&loop); 933 assembler->Goto(&loop);
946 } 934 }
947 } 935 }
948 } 936 }
949 937
950 assembler->Bind(&if_lhsisnotnumber); 938 assembler->Bind(&if_lhsisnotnumber);
951 { 939 {
952 // Check if {lhs} is a JSReceiver. 940 // Check if {lhs} is a JSReceiver.
953 Label if_lhsisreceiver(assembler, Label::kDeferred), 941 Label if_lhsisreceiver(assembler, Label::kDeferred),
954 if_lhsisnotreceiver(assembler); 942 if_lhsisnotreceiver(assembler);
955 assembler->Branch( 943 assembler->Branch(
956 assembler->Int32LessThanOrEqual( 944 assembler->IsJSReceiverInstanceType(lhs_instance_type),
957 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
958 lhs_instance_type),
959 &if_lhsisreceiver, &if_lhsisnotreceiver); 945 &if_lhsisreceiver, &if_lhsisnotreceiver);
960 946
961 assembler->Bind(&if_lhsisreceiver); 947 assembler->Bind(&if_lhsisreceiver);
962 { 948 {
963 // Convert {lhs} to a primitive first passing no hint. 949 // Convert {lhs} to a primitive first passing no hint.
964 Callable callable = 950 Callable callable =
965 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate()); 951 CodeFactory::NonPrimitiveToPrimitive(assembler->isolate());
966 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); 952 var_lhs.Bind(assembler->CallStub(callable, context, lhs));
967 assembler->Goto(&loop); 953 assembler->Goto(&loop);
968 } 954 }
969 955
970 assembler->Bind(&if_lhsisnotreceiver); 956 assembler->Bind(&if_lhsisnotreceiver);
971 { 957 {
972 // Check if {rhs} is a JSReceiver. 958 // Check if {rhs} is a JSReceiver.
973 Label if_rhsisreceiver(assembler, Label::kDeferred), 959 Label if_rhsisreceiver(assembler, Label::kDeferred),
974 if_rhsisnotreceiver(assembler, Label::kDeferred); 960 if_rhsisnotreceiver(assembler, Label::kDeferred);
975 assembler->Branch( 961 assembler->Branch(
976 assembler->Int32LessThanOrEqual( 962 assembler->IsJSReceiverInstanceType(rhs_instance_type),
977 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
978 rhs_instance_type),
979 &if_rhsisreceiver, &if_rhsisnotreceiver); 963 &if_rhsisreceiver, &if_rhsisnotreceiver);
980 964
981 assembler->Bind(&if_rhsisreceiver); 965 assembler->Bind(&if_rhsisreceiver);
982 { 966 {
983 // Convert {rhs} to a primitive first passing no hint. 967 // Convert {rhs} to a primitive first passing no hint.
984 Callable callable = CodeFactory::NonPrimitiveToPrimitive( 968 Callable callable = CodeFactory::NonPrimitiveToPrimitive(
985 assembler->isolate()); 969 assembler->isolate());
986 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); 970 var_rhs.Bind(assembler->CallStub(callable, context, rhs));
987 assembler->Goto(&loop); 971 assembler->Goto(&loop);
988 } 972 }
(...skipping 1745 matching lines...) Expand 10 before | Expand all | Expand 10 after
2734 MachineType::PointerRepresentation()); 2718 MachineType::PointerRepresentation());
2735 2719
2736 assembler->Branch(assembler->WordIsSmi(object), &if_number, &if_notsmi); 2720 assembler->Branch(assembler->WordIsSmi(object), &if_number, &if_notsmi);
2737 2721
2738 assembler->Bind(&if_notsmi); 2722 assembler->Bind(&if_notsmi);
2739 Node* map = assembler->LoadMap(object); 2723 Node* map = assembler->LoadMap(object);
2740 2724
2741 assembler->GotoIf(assembler->IsHeapNumberMap(map), &if_number); 2725 assembler->GotoIf(assembler->IsHeapNumberMap(map), &if_number);
2742 2726
2743 Node* instance_type = assembler->LoadMapInstanceType(map); 2727 Node* instance_type = assembler->LoadMapInstanceType(map);
2744 assembler->GotoIf( 2728 assembler->GotoIf(assembler->IsJSReceiverInstanceType(instance_type),
2745 assembler->Int32GreaterThanOrEqual( 2729 &if_jsreceiver);
2746 instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)),
2747 &if_jsreceiver);
2748 2730
2749 Node* constructor_function_index = 2731 Node* constructor_function_index =
2750 assembler->LoadMapConstructorFunctionIndex(map); 2732 assembler->LoadMapConstructorFunctionIndex(map);
2751 assembler->GotoIf(assembler->WordEqual(constructor_function_index, 2733 assembler->GotoIf(assembler->WordEqual(constructor_function_index,
2752 assembler->IntPtrConstant( 2734 assembler->IntPtrConstant(
2753 Map::kNoConstructorFunctionIndex)), 2735 Map::kNoConstructorFunctionIndex)),
2754 &if_noconstructor); 2736 &if_noconstructor);
2755 constructor_function_index_var.Bind(constructor_function_index); 2737 constructor_function_index_var.Bind(constructor_function_index);
2756 assembler->Goto(&if_wrapjsvalue); 2738 assembler->Goto(&if_wrapjsvalue);
2757 2739
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
2821 2803
2822 assembler->GotoIf( 2804 assembler->GotoIf(
2823 assembler->Word32Equal(callable_or_undetectable_mask, 2805 assembler->Word32Equal(callable_or_undetectable_mask,
2824 assembler->Int32Constant(1 << Map::kIsCallable)), 2806 assembler->Int32Constant(1 << Map::kIsCallable)),
2825 &return_function); 2807 &return_function);
2826 2808
2827 assembler->GotoUnless(assembler->Word32Equal(callable_or_undetectable_mask, 2809 assembler->GotoUnless(assembler->Word32Equal(callable_or_undetectable_mask,
2828 assembler->Int32Constant(0)), 2810 assembler->Int32Constant(0)),
2829 &return_undefined); 2811 &return_undefined);
2830 2812
2831 assembler->GotoIf( 2813 assembler->GotoIf(assembler->IsJSReceiverInstanceType(instance_type),
2832 assembler->Int32GreaterThanOrEqual( 2814 &return_object);
2833 instance_type, assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE)),
2834 &return_object);
2835 2815
2836 assembler->GotoIf( 2816 assembler->GotoIf(assembler->IsStringInstanceType(instance_type),
2837 assembler->Int32LessThan(instance_type, 2817 &return_string);
2838 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
2839 &return_string);
2840 2818
2841 #define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \ 2819 #define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \
2842 Label return_##type(assembler); \ 2820 Label return_##type(assembler); \
2843 Node* type##_map = \ 2821 Node* type##_map = \
2844 assembler->HeapConstant(assembler->factory()->type##_map()); \ 2822 assembler->HeapConstant(assembler->factory()->type##_map()); \
2845 assembler->GotoIf(assembler->WordEqual(map, type##_map), &return_##type); 2823 assembler->GotoIf(assembler->WordEqual(map, type##_map), &return_##type);
2846 SIMD128_TYPES(SIMD128_BRANCH) 2824 SIMD128_TYPES(SIMD128_BRANCH)
2847 #undef SIMD128_BRANCH 2825 #undef SIMD128_BRANCH
2848 2826
2849 assembler->Assert(assembler->Word32Equal( 2827 assembler->Assert(assembler->Word32Equal(
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
3145 } 3123 }
3146 3124
3147 assembler->Bind(&if_lhsisnotnumber); 3125 assembler->Bind(&if_lhsisnotnumber);
3148 { 3126 {
3149 // Load the instance type of {lhs}. 3127 // Load the instance type of {lhs}.
3150 Node* lhs_instance_type = assembler->LoadMapInstanceType(lhs_map); 3128 Node* lhs_instance_type = assembler->LoadMapInstanceType(lhs_map);
3151 3129
3152 // Check if {lhs} is a String. 3130 // Check if {lhs} is a String.
3153 Label if_lhsisstring(assembler), 3131 Label if_lhsisstring(assembler),
3154 if_lhsisnotstring(assembler, Label::kDeferred); 3132 if_lhsisnotstring(assembler, Label::kDeferred);
3155 assembler->Branch(assembler->Int32LessThan( 3133 assembler->Branch(assembler->IsStringInstanceType(lhs_instance_type),
3156 lhs_instance_type,
3157 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
3158 &if_lhsisstring, &if_lhsisnotstring); 3134 &if_lhsisstring, &if_lhsisnotstring);
3159 3135
3160 assembler->Bind(&if_lhsisstring); 3136 assembler->Bind(&if_lhsisstring);
3161 { 3137 {
3162 // Load the instance type of {rhs}. 3138 // Load the instance type of {rhs}.
3163 Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map); 3139 Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map);
3164 3140
3165 // Check if {rhs} is also a String. 3141 // Check if {rhs} is also a String.
3166 Label if_rhsisstring(assembler, Label::kDeferred), 3142 Label if_rhsisstring(assembler, Label::kDeferred),
3167 if_rhsisnotstring(assembler, Label::kDeferred); 3143 if_rhsisnotstring(assembler, Label::kDeferred);
3168 assembler->Branch(assembler->Int32LessThan( 3144 assembler->Branch(
3169 rhs_instance_type, assembler->Int32Constant( 3145 assembler->IsStringInstanceType(rhs_instance_type),
3170 FIRST_NONSTRING_TYPE)), 3146 &if_rhsisstring, &if_rhsisnotstring);
3171 &if_rhsisstring, &if_rhsisnotstring);
3172 3147
3173 assembler->Bind(&if_rhsisstring); 3148 assembler->Bind(&if_rhsisstring);
3174 { 3149 {
3175 // Both {lhs} and {rhs} are strings. 3150 // Both {lhs} and {rhs} are strings.
3176 switch (mode) { 3151 switch (mode) {
3177 case kLessThan: 3152 case kLessThan:
3178 result.Bind(assembler->CallStub( 3153 result.Bind(assembler->CallStub(
3179 CodeFactory::StringLessThan(assembler->isolate()), 3154 CodeFactory::StringLessThan(assembler->isolate()),
3180 context, lhs, rhs)); 3155 context, lhs, rhs));
3181 assembler->Goto(&end); 3156 assembler->Goto(&end);
(...skipping 23 matching lines...) Expand all
3205 assembler->Bind(&if_rhsisnotstring); 3180 assembler->Bind(&if_rhsisnotstring);
3206 { 3181 {
3207 // The {lhs} is a String, while {rhs} is neither a Number nor a 3182 // The {lhs} is a String, while {rhs} is neither a Number nor a
3208 // String, so we need to call ToPrimitive(rhs, hint Number) if 3183 // String, so we need to call ToPrimitive(rhs, hint Number) if
3209 // {rhs} is a receiver or ToNumber(lhs) and ToNumber(rhs) in the 3184 // {rhs} is a receiver or ToNumber(lhs) and ToNumber(rhs) in the
3210 // other cases. 3185 // other cases.
3211 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); 3186 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
3212 Label if_rhsisreceiver(assembler, Label::kDeferred), 3187 Label if_rhsisreceiver(assembler, Label::kDeferred),
3213 if_rhsisnotreceiver(assembler, Label::kDeferred); 3188 if_rhsisnotreceiver(assembler, Label::kDeferred);
3214 assembler->Branch( 3189 assembler->Branch(
3215 assembler->Int32LessThanOrEqual( 3190 assembler->IsJSReceiverInstanceType(rhs_instance_type),
3216 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3217 rhs_instance_type),
3218 &if_rhsisreceiver, &if_rhsisnotreceiver); 3191 &if_rhsisreceiver, &if_rhsisnotreceiver);
3219 3192
3220 assembler->Bind(&if_rhsisreceiver); 3193 assembler->Bind(&if_rhsisreceiver);
3221 { 3194 {
3222 // Convert {rhs} to a primitive first passing Number hint. 3195 // Convert {rhs} to a primitive first passing Number hint.
3223 Callable callable = CodeFactory::NonPrimitiveToPrimitive( 3196 Callable callable = CodeFactory::NonPrimitiveToPrimitive(
3224 assembler->isolate(), ToPrimitiveHint::kNumber); 3197 assembler->isolate(), ToPrimitiveHint::kNumber);
3225 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); 3198 var_rhs.Bind(assembler->CallStub(callable, context, rhs));
3226 assembler->Goto(&loop); 3199 assembler->Goto(&loop);
3227 } 3200 }
(...skipping 11 matching lines...) Expand all
3239 3212
3240 assembler->Bind(&if_lhsisnotstring); 3213 assembler->Bind(&if_lhsisnotstring);
3241 { 3214 {
3242 // The {lhs} is neither a Number nor a String, so we need to call 3215 // The {lhs} is neither a Number nor a String, so we need to call
3243 // ToPrimitive(lhs, hint Number) if {lhs} is a receiver or 3216 // ToPrimitive(lhs, hint Number) if {lhs} is a receiver or
3244 // ToNumber(lhs) and ToNumber(rhs) in the other cases. 3217 // ToNumber(lhs) and ToNumber(rhs) in the other cases.
3245 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); 3218 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
3246 Label if_lhsisreceiver(assembler, Label::kDeferred), 3219 Label if_lhsisreceiver(assembler, Label::kDeferred),
3247 if_lhsisnotreceiver(assembler, Label::kDeferred); 3220 if_lhsisnotreceiver(assembler, Label::kDeferred);
3248 assembler->Branch( 3221 assembler->Branch(
3249 assembler->Int32LessThanOrEqual( 3222 assembler->IsJSReceiverInstanceType(lhs_instance_type),
3250 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3251 lhs_instance_type),
3252 &if_lhsisreceiver, &if_lhsisnotreceiver); 3223 &if_lhsisreceiver, &if_lhsisnotreceiver);
3253 3224
3254 assembler->Bind(&if_lhsisreceiver); 3225 assembler->Bind(&if_lhsisreceiver);
3255 { 3226 {
3256 // Convert {lhs} to a primitive first passing Number hint. 3227 // Convert {lhs} to a primitive first passing Number hint.
3257 Callable callable = CodeFactory::NonPrimitiveToPrimitive( 3228 Callable callable = CodeFactory::NonPrimitiveToPrimitive(
3258 assembler->isolate(), ToPrimitiveHint::kNumber); 3229 assembler->isolate(), ToPrimitiveHint::kNumber);
3259 var_lhs.Bind(assembler->CallStub(callable, context, lhs)); 3230 var_lhs.Bind(assembler->CallStub(callable, context, lhs));
3260 assembler->Goto(&loop); 3231 assembler->Goto(&loop);
3261 } 3232 }
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
3458 } 3429 }
3459 3430
3460 assembler->Bind(&if_rhsisnotnumber); 3431 assembler->Bind(&if_rhsisnotnumber);
3461 { 3432 {
3462 // Load the instance type of the {rhs}. 3433 // Load the instance type of the {rhs}.
3463 Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map); 3434 Node* rhs_instance_type = assembler->LoadMapInstanceType(rhs_map);
3464 3435
3465 // Check if the {rhs} is a String. 3436 // Check if the {rhs} is a String.
3466 Label if_rhsisstring(assembler, Label::kDeferred), 3437 Label if_rhsisstring(assembler, Label::kDeferred),
3467 if_rhsisnotstring(assembler); 3438 if_rhsisnotstring(assembler);
3468 assembler->Branch(assembler->Int32LessThan( 3439 assembler->Branch(
3469 rhs_instance_type, assembler->Int32Constant( 3440 assembler->IsStringInstanceType(rhs_instance_type),
3470 FIRST_NONSTRING_TYPE)), 3441 &if_rhsisstring, &if_rhsisnotstring);
3471 &if_rhsisstring, &if_rhsisnotstring);
3472 3442
3473 assembler->Bind(&if_rhsisstring); 3443 assembler->Bind(&if_rhsisstring);
3474 { 3444 {
3475 // The {rhs} is a String and the {lhs} is a Smi; we need 3445 // The {rhs} is a String and the {lhs} is a Smi; we need
3476 // to convert the {rhs} to a Number and compare the output to 3446 // to convert the {rhs} to a Number and compare the output to
3477 // the Number on the {lhs}. 3447 // the Number on the {lhs}.
3478 assembler->Goto(&do_rhsstringtonumber); 3448 assembler->Goto(&do_rhsstringtonumber);
3479 } 3449 }
3480 3450
3481 assembler->Bind(&if_rhsisnotstring); 3451 assembler->Bind(&if_rhsisnotstring);
(...skipping 11 matching lines...) Expand all
3493 assembler->Goto(&loop); 3463 assembler->Goto(&loop);
3494 } 3464 }
3495 3465
3496 assembler->Bind(&if_rhsisnotboolean); 3466 assembler->Bind(&if_rhsisnotboolean);
3497 { 3467 {
3498 // Check if the {rhs} is a Receiver. 3468 // Check if the {rhs} is a Receiver.
3499 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); 3469 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
3500 Label if_rhsisreceiver(assembler, Label::kDeferred), 3470 Label if_rhsisreceiver(assembler, Label::kDeferred),
3501 if_rhsisnotreceiver(assembler); 3471 if_rhsisnotreceiver(assembler);
3502 assembler->Branch( 3472 assembler->Branch(
3503 assembler->Int32LessThanOrEqual( 3473 assembler->IsJSReceiverInstanceType(rhs_instance_type),
3504 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3505 rhs_instance_type),
3506 &if_rhsisreceiver, &if_rhsisnotreceiver); 3474 &if_rhsisreceiver, &if_rhsisnotreceiver);
3507 3475
3508 assembler->Bind(&if_rhsisreceiver); 3476 assembler->Bind(&if_rhsisreceiver);
3509 { 3477 {
3510 // Convert {rhs} to a primitive first (passing no hint). 3478 // Convert {rhs} to a primitive first (passing no hint).
3511 Callable callable = CodeFactory::NonPrimitiveToPrimitive( 3479 Callable callable = CodeFactory::NonPrimitiveToPrimitive(
3512 assembler->isolate()); 3480 assembler->isolate());
3513 var_rhs.Bind(assembler->CallStub(callable, context, rhs)); 3481 var_rhs.Bind(assembler->CallStub(callable, context, rhs));
3514 assembler->Goto(&loop); 3482 assembler->Goto(&loop);
3515 } 3483 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
3577 assembler->Bind(case_labels[i]); 3545 assembler->Bind(case_labels[i]);
3578 assembler->Goto(&if_lhsisstring); 3546 assembler->Goto(&if_lhsisstring);
3579 delete case_labels[i]; 3547 delete case_labels[i];
3580 } 3548 }
3581 3549
3582 assembler->Bind(&if_lhsisstring); 3550 assembler->Bind(&if_lhsisstring);
3583 { 3551 {
3584 // Check if {rhs} is also a String. 3552 // Check if {rhs} is also a String.
3585 Label if_rhsisstring(assembler, Label::kDeferred), 3553 Label if_rhsisstring(assembler, Label::kDeferred),
3586 if_rhsisnotstring(assembler); 3554 if_rhsisnotstring(assembler);
3587 assembler->Branch(assembler->Int32LessThan( 3555 assembler->Branch(
3588 rhs_instance_type, assembler->Int32Constant( 3556 assembler->IsStringInstanceType(rhs_instance_type),
3589 FIRST_NONSTRING_TYPE)), 3557 &if_rhsisstring, &if_rhsisnotstring);
3590 &if_rhsisstring, &if_rhsisnotstring);
3591 3558
3592 assembler->Bind(&if_rhsisstring); 3559 assembler->Bind(&if_rhsisstring);
3593 { 3560 {
3594 // Both {lhs} and {rhs} are of type String, just do the 3561 // Both {lhs} and {rhs} are of type String, just do the
3595 // string comparison then. 3562 // string comparison then.
3596 Callable callable = 3563 Callable callable =
3597 (mode == kDontNegateResult) 3564 (mode == kDontNegateResult)
3598 ? CodeFactory::StringEqual(assembler->isolate()) 3565 ? CodeFactory::StringEqual(assembler->isolate())
3599 : CodeFactory::StringNotEqual(assembler->isolate()); 3566 : CodeFactory::StringNotEqual(assembler->isolate());
3600 result.Bind(assembler->CallStub(callable, context, lhs, rhs)); 3567 result.Bind(assembler->CallStub(callable, context, lhs, rhs));
(...skipping 28 matching lines...) Expand all
3629 var_fcmp_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); 3596 var_fcmp_rhs.Bind(assembler->LoadHeapNumberValue(rhs));
3630 assembler->Goto(&do_fcmp); 3597 assembler->Goto(&do_fcmp);
3631 } 3598 }
3632 3599
3633 assembler->Bind(&if_rhsisnotnumber); 3600 assembler->Bind(&if_rhsisnotnumber);
3634 { 3601 {
3635 // The {lhs} is a Number, the {rhs} is some other HeapObject. 3602 // The {lhs} is a Number, the {rhs} is some other HeapObject.
3636 Label if_rhsisstring(assembler, Label::kDeferred), 3603 Label if_rhsisstring(assembler, Label::kDeferred),
3637 if_rhsisnotstring(assembler); 3604 if_rhsisnotstring(assembler);
3638 assembler->Branch( 3605 assembler->Branch(
3639 assembler->Int32LessThan( 3606 assembler->IsStringInstanceType(rhs_instance_type),
3640 rhs_instance_type,
3641 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
3642 &if_rhsisstring, &if_rhsisnotstring); 3607 &if_rhsisstring, &if_rhsisnotstring);
3643 3608
3644 assembler->Bind(&if_rhsisstring); 3609 assembler->Bind(&if_rhsisstring);
3645 { 3610 {
3646 // The {rhs} is a String and the {lhs} is a HeapNumber; we need 3611 // The {rhs} is a String and the {lhs} is a HeapNumber; we need
3647 // to convert the {rhs} to a Number and compare the output to 3612 // to convert the {rhs} to a Number and compare the output to
3648 // the Number on the {lhs}. 3613 // the Number on the {lhs}.
3649 assembler->Goto(&do_rhsstringtonumber); 3614 assembler->Goto(&do_rhsstringtonumber);
3650 } 3615 }
3651 3616
3652 assembler->Bind(&if_rhsisnotstring); 3617 assembler->Bind(&if_rhsisnotstring);
3653 { 3618 {
3654 // Check if the {rhs} is a JSReceiver. 3619 // Check if the {rhs} is a JSReceiver.
3655 Label if_rhsisreceiver(assembler), 3620 Label if_rhsisreceiver(assembler),
3656 if_rhsisnotreceiver(assembler); 3621 if_rhsisnotreceiver(assembler);
3657 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); 3622 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
3658 assembler->Branch( 3623 assembler->Branch(
3659 assembler->Int32LessThanOrEqual( 3624 assembler->IsJSReceiverInstanceType(rhs_instance_type),
3660 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3661 rhs_instance_type),
3662 &if_rhsisreceiver, &if_rhsisnotreceiver); 3625 &if_rhsisreceiver, &if_rhsisnotreceiver);
3663 3626
3664 assembler->Bind(&if_rhsisreceiver); 3627 assembler->Bind(&if_rhsisreceiver);
3665 { 3628 {
3666 // The {lhs} is a Primitive and the {rhs} is a JSReceiver. 3629 // The {lhs} is a Primitive and the {rhs} is a JSReceiver.
3667 // Swapping {lhs} and {rhs} is not observable and doesn't 3630 // Swapping {lhs} and {rhs} is not observable and doesn't
3668 // matter for the result, so we can just swap them and use 3631 // matter for the result, so we can just swap them and use
3669 // the JSReceiver handling below (for {lhs} being a 3632 // the JSReceiver handling below (for {lhs} being a
3670 // JSReceiver). 3633 // JSReceiver).
3671 var_lhs.Bind(rhs); 3634 var_lhs.Bind(rhs);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
3739 assembler->Int32Constant(0), &if_notequal, &if_equal); 3702 assembler->Int32Constant(0), &if_notequal, &if_equal);
3740 } 3703 }
3741 } 3704 }
3742 3705
3743 assembler->Bind(&if_lhsissymbol); 3706 assembler->Bind(&if_lhsissymbol);
3744 { 3707 {
3745 // Check if the {rhs} is a JSReceiver. 3708 // Check if the {rhs} is a JSReceiver.
3746 Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); 3709 Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler);
3747 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); 3710 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
3748 assembler->Branch( 3711 assembler->Branch(
3749 assembler->Int32LessThanOrEqual( 3712 assembler->IsJSReceiverInstanceType(rhs_instance_type),
3750 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3751 rhs_instance_type),
3752 &if_rhsisreceiver, &if_rhsisnotreceiver); 3713 &if_rhsisreceiver, &if_rhsisnotreceiver);
3753 3714
3754 assembler->Bind(&if_rhsisreceiver); 3715 assembler->Bind(&if_rhsisreceiver);
3755 { 3716 {
3756 // The {lhs} is a Primitive and the {rhs} is a JSReceiver. 3717 // The {lhs} is a Primitive and the {rhs} is a JSReceiver.
3757 // Swapping {lhs} and {rhs} is not observable and doesn't 3718 // Swapping {lhs} and {rhs} is not observable and doesn't
3758 // matter for the result, so we can just swap them and use 3719 // matter for the result, so we can just swap them and use
3759 // the JSReceiver handling below (for {lhs} being a JSReceiver). 3720 // the JSReceiver handling below (for {lhs} being a JSReceiver).
3760 var_lhs.Bind(rhs); 3721 var_lhs.Bind(rhs);
3761 var_rhs.Bind(lhs); 3722 var_rhs.Bind(lhs);
(...skipping 24 matching lines...) Expand all
3786 rhs, rhs_map, &if_equal, 3747 rhs, rhs_map, &if_equal,
3787 &if_notequal); 3748 &if_notequal);
3788 } 3749 }
3789 3750
3790 assembler->Bind(&if_rhsisnotsimd128value); 3751 assembler->Bind(&if_rhsisnotsimd128value);
3791 { 3752 {
3792 // Check if the {rhs} is a JSReceiver. 3753 // Check if the {rhs} is a JSReceiver.
3793 Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); 3754 Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler);
3794 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); 3755 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
3795 assembler->Branch( 3756 assembler->Branch(
3796 assembler->Int32LessThanOrEqual( 3757 assembler->IsJSReceiverInstanceType(rhs_instance_type),
3797 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3798 rhs_instance_type),
3799 &if_rhsisreceiver, &if_rhsisnotreceiver); 3758 &if_rhsisreceiver, &if_rhsisnotreceiver);
3800 3759
3801 assembler->Bind(&if_rhsisreceiver); 3760 assembler->Bind(&if_rhsisreceiver);
3802 { 3761 {
3803 // The {lhs} is a Primitive and the {rhs} is a JSReceiver. 3762 // The {lhs} is a Primitive and the {rhs} is a JSReceiver.
3804 // Swapping {lhs} and {rhs} is not observable and doesn't 3763 // Swapping {lhs} and {rhs} is not observable and doesn't
3805 // matter for the result, so we can just swap them and use 3764 // matter for the result, so we can just swap them and use
3806 // the JSReceiver handling below (for {lhs} being a JSReceiver). 3765 // the JSReceiver handling below (for {lhs} being a JSReceiver).
3807 var_lhs.Bind(rhs); 3766 var_lhs.Bind(rhs);
3808 var_rhs.Bind(lhs); 3767 var_rhs.Bind(lhs);
3809 assembler->Goto(&loop); 3768 assembler->Goto(&loop);
3810 } 3769 }
3811 3770
3812 assembler->Bind(&if_rhsisnotreceiver); 3771 assembler->Bind(&if_rhsisnotreceiver);
3813 { 3772 {
3814 // The {rhs} is some other Primitive. 3773 // The {rhs} is some other Primitive.
3815 assembler->Goto(&if_notequal); 3774 assembler->Goto(&if_notequal);
3816 } 3775 }
3817 } 3776 }
3818 } 3777 }
3819 3778
3820 assembler->Bind(&if_lhsisreceiver); 3779 assembler->Bind(&if_lhsisreceiver);
3821 { 3780 {
3822 // Check if the {rhs} is also a JSReceiver. 3781 // Check if the {rhs} is also a JSReceiver.
3823 Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler); 3782 Label if_rhsisreceiver(assembler), if_rhsisnotreceiver(assembler);
3824 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); 3783 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE);
3825 assembler->Branch( 3784 assembler->Branch(
3826 assembler->Int32LessThanOrEqual( 3785 assembler->IsJSReceiverInstanceType(rhs_instance_type),
3827 assembler->Int32Constant(FIRST_JS_RECEIVER_TYPE),
3828 rhs_instance_type),
3829 &if_rhsisreceiver, &if_rhsisnotreceiver); 3786 &if_rhsisreceiver, &if_rhsisnotreceiver);
3830 3787
3831 assembler->Bind(&if_rhsisreceiver); 3788 assembler->Bind(&if_rhsisreceiver);
3832 { 3789 {
3833 // Both {lhs} and {rhs} are different JSReceiver references, so 3790 // Both {lhs} and {rhs} are different JSReceiver references, so
3834 // this cannot be considered equal. 3791 // this cannot be considered equal.
3835 assembler->Goto(&if_notequal); 3792 assembler->Goto(&if_notequal);
3836 } 3793 }
3837 3794
3838 assembler->Bind(&if_rhsisnotreceiver); 3795 assembler->Bind(&if_rhsisnotreceiver);
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
4054 assembler->Bind(&if_rhsissmi); 4011 assembler->Bind(&if_rhsissmi);
4055 assembler->Goto(&if_notequal); 4012 assembler->Goto(&if_notequal);
4056 4013
4057 assembler->Bind(&if_rhsisnotsmi); 4014 assembler->Bind(&if_rhsisnotsmi);
4058 { 4015 {
4059 // Load the instance type of {lhs}. 4016 // Load the instance type of {lhs}.
4060 Node* lhs_instance_type = assembler->LoadMapInstanceType(lhs_map); 4017 Node* lhs_instance_type = assembler->LoadMapInstanceType(lhs_map);
4061 4018
4062 // Check if {lhs} is a String. 4019 // Check if {lhs} is a String.
4063 Label if_lhsisstring(assembler), if_lhsisnotstring(assembler); 4020 Label if_lhsisstring(assembler), if_lhsisnotstring(assembler);
4064 assembler->Branch(assembler->Int32LessThan( 4021 assembler->Branch(assembler->IsStringInstanceType(lhs_instance_type),
4065 lhs_instance_type,
4066 assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
4067 &if_lhsisstring, &if_lhsisnotstring); 4022 &if_lhsisstring, &if_lhsisnotstring);
4068 4023
4069 assembler->Bind(&if_lhsisstring); 4024 assembler->Bind(&if_lhsisstring);
4070 { 4025 {
4071 // Load the instance type of {rhs}. 4026 // Load the instance type of {rhs}.
4072 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); 4027 Node* rhs_instance_type = assembler->LoadInstanceType(rhs);
4073 4028
4074 // Check if {rhs} is also a String. 4029 // Check if {rhs} is also a String.
4075 Label if_rhsisstring(assembler, Label::kDeferred), 4030 Label if_rhsisstring(assembler, Label::kDeferred),
4076 if_rhsisnotstring(assembler); 4031 if_rhsisnotstring(assembler);
4077 assembler->Branch(assembler->Int32LessThan( 4032 assembler->Branch(
4078 rhs_instance_type, assembler->Int32Constant( 4033 assembler->IsStringInstanceType(rhs_instance_type),
4079 FIRST_NONSTRING_TYPE)), 4034 &if_rhsisstring, &if_rhsisnotstring);
4080 &if_rhsisstring, &if_rhsisnotstring);
4081 4035
4082 assembler->Bind(&if_rhsisstring); 4036 assembler->Bind(&if_rhsisstring);
4083 { 4037 {
4084 Callable callable = 4038 Callable callable =
4085 (mode == kDontNegateResult) 4039 (mode == kDontNegateResult)
4086 ? CodeFactory::StringEqual(assembler->isolate()) 4040 ? CodeFactory::StringEqual(assembler->isolate())
4087 : CodeFactory::StringNotEqual(assembler->isolate()); 4041 : CodeFactory::StringNotEqual(assembler->isolate());
4088 result.Bind(assembler->CallStub(callable, context, lhs, rhs)); 4042 result.Bind(assembler->CallStub(callable, context, lhs, rhs));
4089 assembler->Goto(&end); 4043 assembler->Goto(&end);
4090 } 4044 }
(...skipping 1781 matching lines...) Expand 10 before | Expand all | Expand 10 after
5872 5826
5873 if (type == MachineType::Pointer()) { 5827 if (type == MachineType::Pointer()) {
5874 return Representation::External(); 5828 return Representation::External();
5875 } 5829 }
5876 5830
5877 return Representation::Tagged(); 5831 return Representation::Tagged();
5878 } 5832 }
5879 5833
5880 } // namespace internal 5834 } // namespace internal
5881 } // namespace v8 5835 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698