OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "test/cctest/compiler/function-tester.h" | 7 #include "test/cctest/compiler/function-tester.h" |
8 | 8 |
9 using namespace v8::internal; | 9 using namespace v8::internal; |
10 using namespace v8::internal::compiler; | 10 using namespace v8::internal::compiler; |
11 uint32_t flags = CompilationInfo::kInliningEnabled; | 11 uint32_t flags = CompilationInfo::kInliningEnabled; |
12 | 12 |
13 TEST(IsSmi) { | 13 |
| 14 TEST(CallFunction) { |
14 FLAG_turbo_deoptimization = true; | 15 FLAG_turbo_deoptimization = true; |
15 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags); | 16 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })", |
| 17 flags); |
| 18 CompileRun("function f(a,b,c) { return a + b + c + this.d; }"); |
16 | 19 |
17 T.CheckTrue(T.Val(1)); | 20 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f")); |
18 T.CheckFalse(T.Val(1.1)); | 21 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f")); |
19 T.CheckFalse(T.Val(-0.0)); | |
20 T.CheckTrue(T.Val(-2)); | |
21 T.CheckFalse(T.Val(-2.3)); | |
22 T.CheckFalse(T.undefined()); | |
23 } | 22 } |
24 | 23 |
25 | 24 |
26 TEST(IsNonNegativeSmi) { | 25 TEST(ClassOf) { |
27 FLAG_turbo_deoptimization = true; | 26 FLAG_turbo_deoptimization = true; |
28 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags); | 27 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags); |
29 | 28 |
30 T.CheckTrue(T.Val(1)); | 29 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})")); |
31 T.CheckFalse(T.Val(1.1)); | 30 T.CheckCall(T.Val("Array"), T.NewObject("([1])")); |
32 T.CheckFalse(T.Val(-0.0)); | 31 T.CheckCall(T.Val("Object"), T.NewObject("({})")); |
33 T.CheckFalse(T.Val(-2)); | 32 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)")); |
34 T.CheckFalse(T.Val(-2.3)); | 33 T.CheckCall(T.null(), T.undefined()); |
35 T.CheckFalse(T.undefined()); | 34 T.CheckCall(T.null(), T.null()); |
| 35 T.CheckCall(T.null(), T.Val("x")); |
| 36 T.CheckCall(T.null(), T.Val(1)); |
36 } | 37 } |
37 | 38 |
38 | 39 |
| 40 TEST(HeapObjectGetMap) { |
| 41 FLAG_turbo_deoptimization = true; |
| 42 FunctionTester T("(function(a) { return %_HeapObjectGetMap(a); })", flags); |
| 43 |
| 44 Factory* factory = T.main_isolate()->factory(); |
| 45 T.CheckCall(factory->null_map(), T.null()); |
| 46 T.CheckCall(factory->undefined_map(), T.undefined()); |
| 47 T.CheckCall(factory->heap_number_map(), T.Val(3.1415)); |
| 48 T.CheckCall(factory->symbol_map(), factory->NewSymbol()); |
| 49 } |
| 50 |
| 51 |
| 52 TEST(IsArray) { |
| 53 FLAG_turbo_deoptimization = true; |
| 54 FunctionTester T("(function(a) { return %_IsArray(a); })", flags); |
| 55 |
| 56 T.CheckFalse(T.NewObject("(function() {})")); |
| 57 T.CheckTrue(T.NewObject("([1])")); |
| 58 T.CheckFalse(T.NewObject("({})")); |
| 59 T.CheckFalse(T.NewObject("(/x/)")); |
| 60 T.CheckFalse(T.undefined()); |
| 61 T.CheckFalse(T.null()); |
| 62 T.CheckFalse(T.Val("x")); |
| 63 T.CheckFalse(T.Val(1)); |
| 64 } |
| 65 |
| 66 |
| 67 TEST(IsFunction) { |
| 68 FLAG_turbo_deoptimization = true; |
| 69 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags); |
| 70 |
| 71 T.CheckTrue(T.NewObject("(function() {})")); |
| 72 T.CheckFalse(T.NewObject("([1])")); |
| 73 T.CheckFalse(T.NewObject("({})")); |
| 74 T.CheckFalse(T.NewObject("(/x/)")); |
| 75 T.CheckFalse(T.undefined()); |
| 76 T.CheckFalse(T.null()); |
| 77 T.CheckFalse(T.Val("x")); |
| 78 T.CheckFalse(T.Val(1)); |
| 79 } |
| 80 |
| 81 |
39 TEST(IsMinusZero) { | 82 TEST(IsMinusZero) { |
40 FLAG_turbo_deoptimization = true; | 83 FLAG_turbo_deoptimization = true; |
41 FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags); | 84 FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags); |
42 | 85 |
43 T.CheckFalse(T.Val(1)); | 86 T.CheckFalse(T.Val(1)); |
44 T.CheckFalse(T.Val(1.1)); | 87 T.CheckFalse(T.Val(1.1)); |
45 T.CheckTrue(T.Val(-0.0)); | 88 T.CheckTrue(T.Val(-0.0)); |
46 T.CheckFalse(T.Val(-2)); | 89 T.CheckFalse(T.Val(-2)); |
47 T.CheckFalse(T.Val(-2.3)); | 90 T.CheckFalse(T.Val(-2.3)); |
48 T.CheckFalse(T.undefined()); | 91 T.CheckFalse(T.undefined()); |
49 } | 92 } |
50 | 93 |
51 | 94 |
52 TEST(IsArray) { | 95 TEST(IsNonNegativeSmi) { |
53 FLAG_turbo_deoptimization = true; | 96 FLAG_turbo_deoptimization = true; |
54 FunctionTester T("(function(a) { return %_IsArray(a); })", flags); | 97 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags); |
55 | 98 |
56 T.CheckFalse(T.NewObject("(function() {})")); | 99 T.CheckTrue(T.Val(1)); |
57 T.CheckTrue(T.NewObject("([1])")); | 100 T.CheckFalse(T.Val(1.1)); |
58 T.CheckFalse(T.NewObject("({})")); | 101 T.CheckFalse(T.Val(-0.0)); |
59 T.CheckFalse(T.NewObject("(/x/)")); | 102 T.CheckFalse(T.Val(-2)); |
| 103 T.CheckFalse(T.Val(-2.3)); |
60 T.CheckFalse(T.undefined()); | 104 T.CheckFalse(T.undefined()); |
61 T.CheckFalse(T.null()); | |
62 T.CheckFalse(T.Val("x")); | |
63 T.CheckFalse(T.Val(1)); | |
64 } | 105 } |
65 | 106 |
66 | 107 |
67 TEST(IsObject) { | 108 TEST(IsObject) { |
68 FLAG_turbo_deoptimization = true; | 109 FLAG_turbo_deoptimization = true; |
69 FunctionTester T("(function(a) { return %_IsObject(a); })", flags); | 110 FunctionTester T("(function(a) { return %_IsObject(a); })", flags); |
70 | 111 |
71 T.CheckFalse(T.NewObject("(function() {})")); | 112 T.CheckFalse(T.NewObject("(function() {})")); |
72 T.CheckTrue(T.NewObject("([1])")); | 113 T.CheckTrue(T.NewObject("([1])")); |
73 T.CheckTrue(T.NewObject("({})")); | 114 T.CheckTrue(T.NewObject("({})")); |
74 T.CheckTrue(T.NewObject("(/x/)")); | 115 T.CheckTrue(T.NewObject("(/x/)")); |
75 T.CheckFalse(T.undefined()); | 116 T.CheckFalse(T.undefined()); |
76 T.CheckTrue(T.null()); | 117 T.CheckTrue(T.null()); |
77 T.CheckFalse(T.Val("x")); | 118 T.CheckFalse(T.Val("x")); |
78 T.CheckFalse(T.Val(1)); | 119 T.CheckFalse(T.Val(1)); |
79 } | 120 } |
80 | 121 |
81 | 122 |
82 TEST(IsFunction) { | 123 TEST(IsRegExp) { |
83 FLAG_turbo_deoptimization = true; | 124 FLAG_turbo_deoptimization = true; |
84 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags); | 125 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags); |
85 | 126 |
86 T.CheckTrue(T.NewObject("(function() {})")); | 127 T.CheckFalse(T.NewObject("(function() {})")); |
87 T.CheckFalse(T.NewObject("([1])")); | 128 T.CheckFalse(T.NewObject("([1])")); |
88 T.CheckFalse(T.NewObject("({})")); | 129 T.CheckFalse(T.NewObject("({})")); |
89 T.CheckFalse(T.NewObject("(/x/)")); | 130 T.CheckTrue(T.NewObject("(/x/)")); |
90 T.CheckFalse(T.undefined()); | 131 T.CheckFalse(T.undefined()); |
91 T.CheckFalse(T.null()); | 132 T.CheckFalse(T.null()); |
92 T.CheckFalse(T.Val("x")); | 133 T.CheckFalse(T.Val("x")); |
93 T.CheckFalse(T.Val(1)); | 134 T.CheckFalse(T.Val(1)); |
94 } | 135 } |
95 | 136 |
96 | 137 |
97 TEST(IsRegExp) { | 138 TEST(IsSmi) { |
98 FLAG_turbo_deoptimization = true; | 139 FLAG_turbo_deoptimization = true; |
99 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags); | 140 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags); |
100 | 141 |
101 T.CheckFalse(T.NewObject("(function() {})")); | 142 T.CheckTrue(T.Val(1)); |
102 T.CheckFalse(T.NewObject("([1])")); | 143 T.CheckFalse(T.Val(1.1)); |
103 T.CheckFalse(T.NewObject("({})")); | 144 T.CheckFalse(T.Val(-0.0)); |
104 T.CheckTrue(T.NewObject("(/x/)")); | 145 T.CheckTrue(T.Val(-2)); |
| 146 T.CheckFalse(T.Val(-2.3)); |
105 T.CheckFalse(T.undefined()); | 147 T.CheckFalse(T.undefined()); |
106 T.CheckFalse(T.null()); | |
107 T.CheckFalse(T.Val("x")); | |
108 T.CheckFalse(T.Val(1)); | |
109 } | 148 } |
110 | 149 |
111 | 150 |
112 TEST(ClassOf) { | 151 TEST(MapGetInstanceType) { |
113 FLAG_turbo_deoptimization = true; | 152 FLAG_turbo_deoptimization = true; |
114 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags); | 153 FunctionTester T( |
| 154 "(function(a) { return %_MapGetInstanceType(%_HeapObjectGetMap(a)); })", |
| 155 flags); |
115 | 156 |
116 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})")); | 157 Factory* factory = T.main_isolate()->factory(); |
117 T.CheckCall(T.Val("Array"), T.NewObject("([1])")); | 158 T.CheckCall(T.Val(ODDBALL_TYPE), T.null()); |
118 T.CheckCall(T.Val("Object"), T.NewObject("({})")); | 159 T.CheckCall(T.Val(ODDBALL_TYPE), T.undefined()); |
119 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)")); | 160 T.CheckCall(T.Val(HEAP_NUMBER_TYPE), T.Val(3.1415)); |
120 T.CheckCall(T.null(), T.undefined()); | 161 T.CheckCall(T.Val(SYMBOL_TYPE), factory->NewSymbol()); |
121 T.CheckCall(T.null(), T.null()); | |
122 T.CheckCall(T.null(), T.Val("x")); | |
123 T.CheckCall(T.null(), T.Val(1)); | |
124 } | 162 } |
125 | 163 |
126 | 164 |
127 TEST(ObjectEquals) { | 165 TEST(ObjectEquals) { |
128 FLAG_turbo_deoptimization = true; | 166 FLAG_turbo_deoptimization = true; |
129 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags); | 167 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags); |
130 CompileRun("var o = {}"); | 168 CompileRun("var o = {}"); |
131 | 169 |
132 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); | 170 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); |
133 T.CheckTrue(T.Val("internal"), T.Val("internal")); | 171 T.CheckTrue(T.Val("internal"), T.Val("internal")); |
134 T.CheckTrue(T.true_value(), T.true_value()); | 172 T.CheckTrue(T.true_value(), T.true_value()); |
135 T.CheckFalse(T.true_value(), T.false_value()); | 173 T.CheckFalse(T.true_value(), T.false_value()); |
136 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); | 174 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); |
137 T.CheckFalse(T.Val("a"), T.Val("b")); | 175 T.CheckFalse(T.Val("a"), T.Val("b")); |
138 } | 176 } |
139 | 177 |
140 | 178 |
141 TEST(ValueOf) { | |
142 FLAG_turbo_deoptimization = true; | |
143 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags); | |
144 | |
145 T.CheckCall(T.Val("a"), T.Val("a")); | |
146 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))")); | |
147 T.CheckCall(T.Val(123), T.Val(123)); | |
148 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))")); | |
149 } | |
150 | |
151 | |
152 TEST(SetValueOf) { | 179 TEST(SetValueOf) { |
153 FLAG_turbo_deoptimization = true; | 180 FLAG_turbo_deoptimization = true; |
154 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags); | 181 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags); |
155 | 182 |
156 T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a")); | 183 T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a")); |
157 T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123)); | 184 T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123)); |
158 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x")); | 185 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x")); |
159 } | 186 } |
160 | 187 |
161 | 188 |
162 TEST(StringCharFromCode) { | 189 TEST(StringAdd) { |
163 FLAG_turbo_deoptimization = true; | 190 FLAG_turbo_deoptimization = true; |
164 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags); | 191 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags); |
165 | 192 |
166 T.CheckCall(T.Val("a"), T.Val(97)); | 193 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb")); |
167 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A)); | 194 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val("")); |
168 T.CheckCall(T.Val(""), T.undefined()); | 195 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb")); |
169 } | 196 } |
170 | 197 |
171 | 198 |
172 TEST(StringCharAt) { | 199 TEST(StringCharAt) { |
173 FLAG_turbo_deoptimization = true; | 200 FLAG_turbo_deoptimization = true; |
174 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags); | 201 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags); |
175 | 202 |
176 T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3)); | 203 T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3)); |
177 T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2)); | 204 T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2)); |
178 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23)); | 205 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23)); |
179 } | 206 } |
180 | 207 |
181 | 208 |
182 TEST(StringCharCodeAt) { | 209 TEST(StringCharCodeAt) { |
183 FLAG_turbo_deoptimization = true; | 210 FLAG_turbo_deoptimization = true; |
184 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })", | 211 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })", |
185 flags); | 212 flags); |
186 | 213 |
187 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3)); | 214 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3)); |
188 T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2)); | 215 T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2)); |
189 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23)); | 216 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23)); |
190 } | 217 } |
191 | 218 |
192 | 219 |
193 TEST(StringAdd) { | 220 TEST(StringCharFromCode) { |
194 FLAG_turbo_deoptimization = true; | 221 FLAG_turbo_deoptimization = true; |
195 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags); | 222 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags); |
196 | 223 |
197 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb")); | 224 T.CheckCall(T.Val("a"), T.Val(97)); |
198 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val("")); | 225 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A)); |
199 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb")); | 226 T.CheckCall(T.Val(""), T.undefined()); |
200 } | 227 } |
201 | 228 |
202 | 229 |
203 TEST(StringSubString) { | |
204 FLAG_turbo_deoptimization = true; | |
205 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags); | |
206 | |
207 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0)); | |
208 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2)); | |
209 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0)); | |
210 } | |
211 | |
212 | |
213 TEST(StringCompare) { | 230 TEST(StringCompare) { |
214 FLAG_turbo_deoptimization = true; | 231 FLAG_turbo_deoptimization = true; |
215 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags); | 232 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags); |
216 | 233 |
217 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb")); | 234 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb")); |
218 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb")); | 235 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb")); |
219 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb")); | 236 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb")); |
220 } | 237 } |
221 | 238 |
222 | 239 |
223 TEST(CallFunction) { | 240 TEST(SubString) { |
224 FLAG_turbo_deoptimization = true; | 241 FLAG_turbo_deoptimization = true; |
225 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })", | 242 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags); |
226 flags); | |
227 CompileRun("function f(a,b,c) { return a + b + c + this.d; }"); | |
228 | 243 |
229 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f")); | 244 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0)); |
230 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f")); | 245 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2)); |
| 246 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0)); |
231 } | 247 } |
| 248 |
| 249 |
| 250 TEST(ValueOf) { |
| 251 FLAG_turbo_deoptimization = true; |
| 252 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags); |
| 253 |
| 254 T.CheckCall(T.Val("a"), T.Val("a")); |
| 255 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))")); |
| 256 T.CheckCall(T.Val(123), T.Val(123)); |
| 257 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))")); |
| 258 } |
OLD | NEW |