deps: update v8 to 4.3.61.21
[platform/upstream/nodejs.git] / deps / v8 / test / cctest / compiler / test-run-intrinsics.cc
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
3 // found in the LICENSE file.
4
5 #include "src/v8.h"
6
7 #include "test/cctest/compiler/function-tester.h"
8
9 using namespace v8::internal;
10 using namespace v8::internal::compiler;
11 uint32_t flags = CompilationInfo::kInliningEnabled;
12
13
14 TEST(CallFunction) {
15   FLAG_turbo_deoptimization = true;
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; }");
19
20   T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f"));
21   T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f"));
22 }
23
24
25 TEST(ClassOf) {
26   FLAG_turbo_deoptimization = true;
27   FunctionTester T("(function(a) { return %_ClassOf(a); })", flags);
28
29   T.CheckCall(T.Val("Function"), T.NewObject("(function() {})"));
30   T.CheckCall(T.Val("Array"), T.NewObject("([1])"));
31   T.CheckCall(T.Val("Object"), T.NewObject("({})"));
32   T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)"));
33   T.CheckCall(T.null(), 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));
37 }
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 #define COUNTER_NAME "hurz"
53
54 static int* LookupCounter(const char* name) {
55   static int counter = 1234;
56   return strcmp(name, COUNTER_NAME) == 0 ? &counter : nullptr;
57 }
58
59
60 TEST(IncrementStatsCounter) {
61   FLAG_turbo_deoptimization = true;
62   FLAG_native_code_counters = true;
63   reinterpret_cast<v8::Isolate*>(CcTest::InitIsolateOnce())
64       ->SetCounterFunction(LookupCounter);
65   FunctionTester T(
66       "(function() { %_IncrementStatsCounter('" COUNTER_NAME "'); })", flags);
67   StatsCounter counter(T.main_isolate(), COUNTER_NAME);
68   if (!counter.Enabled()) return;
69
70   int old_value = *counter.GetInternalPointer();
71   T.CheckCall(T.undefined());
72   CHECK_EQ(old_value + 1, *counter.GetInternalPointer());
73 }
74
75 #undef COUNTER_NAME
76
77
78 TEST(IsArray) {
79   FLAG_turbo_deoptimization = true;
80   FunctionTester T("(function(a) { return %_IsArray(a); })", flags);
81
82   T.CheckFalse(T.NewObject("(function() {})"));
83   T.CheckTrue(T.NewObject("([1])"));
84   T.CheckFalse(T.NewObject("({})"));
85   T.CheckFalse(T.NewObject("(/x/)"));
86   T.CheckFalse(T.undefined());
87   T.CheckFalse(T.null());
88   T.CheckFalse(T.Val("x"));
89   T.CheckFalse(T.Val(1));
90 }
91
92
93 TEST(IsFunction) {
94   FLAG_turbo_deoptimization = true;
95   FunctionTester T("(function(a) { return %_IsFunction(a); })", flags);
96
97   T.CheckTrue(T.NewObject("(function() {})"));
98   T.CheckFalse(T.NewObject("([1])"));
99   T.CheckFalse(T.NewObject("({})"));
100   T.CheckFalse(T.NewObject("(/x/)"));
101   T.CheckFalse(T.undefined());
102   T.CheckFalse(T.null());
103   T.CheckFalse(T.Val("x"));
104   T.CheckFalse(T.Val(1));
105 }
106
107
108 TEST(IsMinusZero) {
109   FLAG_turbo_deoptimization = true;
110   FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags);
111
112   T.CheckFalse(T.Val(1));
113   T.CheckFalse(T.Val(1.1));
114   T.CheckTrue(T.Val(-0.0));
115   T.CheckFalse(T.Val(-2));
116   T.CheckFalse(T.Val(-2.3));
117   T.CheckFalse(T.undefined());
118 }
119
120
121 TEST(IsNonNegativeSmi) {
122   FLAG_turbo_deoptimization = true;
123   FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags);
124
125   T.CheckTrue(T.Val(1));
126   T.CheckFalse(T.Val(1.1));
127   T.CheckFalse(T.Val(-0.0));
128   T.CheckFalse(T.Val(-2));
129   T.CheckFalse(T.Val(-2.3));
130   T.CheckFalse(T.undefined());
131 }
132
133
134 TEST(IsObject) {
135   FLAG_turbo_deoptimization = true;
136   FunctionTester T("(function(a) { return %_IsObject(a); })", flags);
137
138   T.CheckFalse(T.NewObject("(function() {})"));
139   T.CheckTrue(T.NewObject("([1])"));
140   T.CheckTrue(T.NewObject("({})"));
141   T.CheckTrue(T.NewObject("(/x/)"));
142   T.CheckFalse(T.undefined());
143   T.CheckTrue(T.null());
144   T.CheckFalse(T.Val("x"));
145   T.CheckFalse(T.Val(1));
146 }
147
148
149 TEST(IsRegExp) {
150   FLAG_turbo_deoptimization = true;
151   FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags);
152
153   T.CheckFalse(T.NewObject("(function() {})"));
154   T.CheckFalse(T.NewObject("([1])"));
155   T.CheckFalse(T.NewObject("({})"));
156   T.CheckTrue(T.NewObject("(/x/)"));
157   T.CheckFalse(T.undefined());
158   T.CheckFalse(T.null());
159   T.CheckFalse(T.Val("x"));
160   T.CheckFalse(T.Val(1));
161 }
162
163
164 TEST(IsSmi) {
165   FLAG_turbo_deoptimization = true;
166   FunctionTester T("(function(a) { return %_IsSmi(a); })", flags);
167
168   T.CheckTrue(T.Val(1));
169   T.CheckFalse(T.Val(1.1));
170   T.CheckFalse(T.Val(-0.0));
171   T.CheckTrue(T.Val(-2));
172   T.CheckFalse(T.Val(-2.3));
173   T.CheckFalse(T.undefined());
174 }
175
176
177 TEST(MapGetInstanceType) {
178   FLAG_turbo_deoptimization = true;
179   FunctionTester T(
180       "(function(a) { return %_MapGetInstanceType(%_HeapObjectGetMap(a)); })",
181       flags);
182
183   Factory* factory = T.main_isolate()->factory();
184   T.CheckCall(T.Val(ODDBALL_TYPE), T.null());
185   T.CheckCall(T.Val(ODDBALL_TYPE), T.undefined());
186   T.CheckCall(T.Val(HEAP_NUMBER_TYPE), T.Val(3.1415));
187   T.CheckCall(T.Val(SYMBOL_TYPE), factory->NewSymbol());
188 }
189
190
191 TEST(ObjectEquals) {
192   FLAG_turbo_deoptimization = true;
193   FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags);
194   CompileRun("var o = {}");
195
196   T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
197   T.CheckTrue(T.Val("internal"), T.Val("internal"));
198   T.CheckTrue(T.true_value(), T.true_value());
199   T.CheckFalse(T.true_value(), T.false_value());
200   T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
201   T.CheckFalse(T.Val("a"), T.Val("b"));
202 }
203
204
205 TEST(OneByteSeqStringGetChar) {
206   FLAG_turbo_deoptimization = true;
207   FunctionTester T("(function(a,b) { return %_OneByteSeqStringGetChar(a,b); })",
208                    flags);
209
210   Handle<SeqOneByteString> string =
211       T.main_isolate()->factory()->NewRawOneByteString(3).ToHandleChecked();
212   string->SeqOneByteStringSet(0, 'b');
213   string->SeqOneByteStringSet(1, 'a');
214   string->SeqOneByteStringSet(2, 'r');
215   T.CheckCall(T.Val('b'), string, T.Val(0.0));
216   T.CheckCall(T.Val('a'), string, T.Val(1));
217   T.CheckCall(T.Val('r'), string, T.Val(2));
218 }
219
220
221 TEST(OneByteSeqStringSetChar) {
222   FLAG_turbo_deoptimization = true;
223   FunctionTester T("(function(a,b) { %_OneByteSeqStringSetChar(a,88,b); })",
224                    flags);
225
226   Handle<SeqOneByteString> string =
227       T.main_isolate()->factory()->NewRawOneByteString(3).ToHandleChecked();
228   string->SeqOneByteStringSet(0, 'b');
229   string->SeqOneByteStringSet(1, 'a');
230   string->SeqOneByteStringSet(2, 'r');
231   T.Call(T.Val(1), string);
232   CHECK_EQ('b', string->SeqOneByteStringGet(0));
233   CHECK_EQ('X', string->SeqOneByteStringGet(1));
234   CHECK_EQ('r', string->SeqOneByteStringGet(2));
235 }
236
237
238 TEST(NewConsString) {
239   FLAG_turbo_deoptimization = true;
240   FunctionTester T(
241       "(function() { "
242       "   return %_NewConsString(14, true, 'abcdefghi', 'jklmn');"
243       " })",
244       flags);
245
246   T.CheckCall(T.Val("abcdefghijklmn"));
247 }
248
249
250 TEST(SetValueOf) {
251   FLAG_turbo_deoptimization = true;
252   FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags);
253
254   T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a"));
255   T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123));
256   T.CheckCall(T.Val("x"), T.undefined(), T.Val("x"));
257 }
258
259
260 TEST(StringAdd) {
261   FLAG_turbo_deoptimization = true;
262   FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags);
263
264   T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb"));
265   T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(""));
266   T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb"));
267 }
268
269
270 TEST(StringCharAt) {
271   FLAG_turbo_deoptimization = true;
272   FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags);
273
274   T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3));
275   T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
276   T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23));
277 }
278
279
280 TEST(StringCharCodeAt) {
281   FLAG_turbo_deoptimization = true;
282   FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })",
283                    flags);
284
285   T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3));
286   T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
287   T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23));
288 }
289
290
291 TEST(StringCharFromCode) {
292   FLAG_turbo_deoptimization = true;
293   FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags);
294
295   T.CheckCall(T.Val("a"), T.Val(97));
296   T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A));
297   T.CheckCall(T.Val(""), T.undefined());
298 }
299
300
301 TEST(StringCompare) {
302   FLAG_turbo_deoptimization = true;
303   FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags);
304
305   T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb"));
306   T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb"));
307   T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb"));
308 }
309
310
311 TEST(SubString) {
312   FLAG_turbo_deoptimization = true;
313   FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags);
314
315   T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0));
316   T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2));
317   T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0));
318 }
319
320
321 TEST(TwoByteSeqStringGetChar) {
322   FLAG_turbo_deoptimization = true;
323   FunctionTester T("(function(a,b) { return %_TwoByteSeqStringGetChar(a,b); })",
324                    flags);
325
326   Handle<SeqTwoByteString> string =
327       T.main_isolate()->factory()->NewRawTwoByteString(3).ToHandleChecked();
328   string->SeqTwoByteStringSet(0, 'b');
329   string->SeqTwoByteStringSet(1, 'a');
330   string->SeqTwoByteStringSet(2, 'r');
331   T.CheckCall(T.Val('b'), string, T.Val(0.0));
332   T.CheckCall(T.Val('a'), string, T.Val(1));
333   T.CheckCall(T.Val('r'), string, T.Val(2));
334 }
335
336
337 TEST(TwoByteSeqStringSetChar) {
338   FLAG_turbo_deoptimization = true;
339   FunctionTester T("(function(a,b) { %_TwoByteSeqStringSetChar(a,88,b); })",
340                    flags);
341
342   Handle<SeqTwoByteString> string =
343       T.main_isolate()->factory()->NewRawTwoByteString(3).ToHandleChecked();
344   string->SeqTwoByteStringSet(0, 'b');
345   string->SeqTwoByteStringSet(1, 'a');
346   string->SeqTwoByteStringSet(2, 'r');
347   T.Call(T.Val(1), string);
348   CHECK_EQ('b', string->SeqTwoByteStringGet(0));
349   CHECK_EQ('X', string->SeqTwoByteStringGet(1));
350   CHECK_EQ('r', string->SeqTwoByteStringGet(2));
351 }
352
353
354 TEST(ValueOf) {
355   FLAG_turbo_deoptimization = true;
356   FunctionTester T("(function(a) { return %_ValueOf(a); })", flags);
357
358   T.CheckCall(T.Val("a"), T.Val("a"));
359   T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))"));
360   T.CheckCall(T.Val(123), T.Val(123));
361   T.CheckCall(T.Val(456), T.NewObject("(new Number(456))"));
362 }