blob: 76cbb8fc58f3f2114a928e629464553f18a9ef38 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
9using namespace v8::internal;
10using namespace v8::internal::compiler;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040011uint32_t flags = CompilationInfo::kInliningEnabled;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012
13TEST(IsSmi) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040014 FLAG_turbo_inlining_intrinsics = true;
15 FLAG_turbo_deoptimization = true;
16 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000017
18 T.CheckTrue(T.Val(1));
19 T.CheckFalse(T.Val(1.1));
20 T.CheckFalse(T.Val(-0.0));
21 T.CheckTrue(T.Val(-2));
22 T.CheckFalse(T.Val(-2.3));
23 T.CheckFalse(T.undefined());
24}
25
26
27TEST(IsNonNegativeSmi) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040028 FLAG_turbo_inlining_intrinsics = true;
29 FLAG_turbo_deoptimization = true;
30 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000031
32 T.CheckTrue(T.Val(1));
33 T.CheckFalse(T.Val(1.1));
34 T.CheckFalse(T.Val(-0.0));
35 T.CheckFalse(T.Val(-2));
36 T.CheckFalse(T.Val(-2.3));
37 T.CheckFalse(T.undefined());
38}
39
40
41TEST(IsMinusZero) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040042 FLAG_turbo_inlining_intrinsics = true;
43 FLAG_turbo_deoptimization = true;
44 FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000045
46 T.CheckFalse(T.Val(1));
47 T.CheckFalse(T.Val(1.1));
48 T.CheckTrue(T.Val(-0.0));
49 T.CheckFalse(T.Val(-2));
50 T.CheckFalse(T.Val(-2.3));
51 T.CheckFalse(T.undefined());
52}
53
54
55TEST(IsArray) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040056 FLAG_turbo_inlining_intrinsics = true;
57 FLAG_turbo_deoptimization = true;
58 FunctionTester T("(function(a) { return %_IsArray(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059
60 T.CheckFalse(T.NewObject("(function() {})"));
61 T.CheckTrue(T.NewObject("([1])"));
62 T.CheckFalse(T.NewObject("({})"));
63 T.CheckFalse(T.NewObject("(/x/)"));
64 T.CheckFalse(T.undefined());
65 T.CheckFalse(T.null());
66 T.CheckFalse(T.Val("x"));
67 T.CheckFalse(T.Val(1));
68}
69
70
71TEST(IsObject) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040072 FLAG_turbo_inlining_intrinsics = true;
73 FLAG_turbo_deoptimization = true;
74 FunctionTester T("(function(a) { return %_IsObject(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000075
76 T.CheckFalse(T.NewObject("(function() {})"));
77 T.CheckTrue(T.NewObject("([1])"));
78 T.CheckTrue(T.NewObject("({})"));
79 T.CheckTrue(T.NewObject("(/x/)"));
80 T.CheckFalse(T.undefined());
81 T.CheckTrue(T.null());
82 T.CheckFalse(T.Val("x"));
83 T.CheckFalse(T.Val(1));
84}
85
86
87TEST(IsFunction) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040088 FLAG_turbo_inlining_intrinsics = true;
89 FLAG_turbo_deoptimization = true;
90 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000091
92 T.CheckTrue(T.NewObject("(function() {})"));
93 T.CheckFalse(T.NewObject("([1])"));
94 T.CheckFalse(T.NewObject("({})"));
95 T.CheckFalse(T.NewObject("(/x/)"));
96 T.CheckFalse(T.undefined());
97 T.CheckFalse(T.null());
98 T.CheckFalse(T.Val("x"));
99 T.CheckFalse(T.Val(1));
100}
101
102
103TEST(IsRegExp) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400104 FLAG_turbo_inlining_intrinsics = true;
105 FLAG_turbo_deoptimization = true;
106 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000107
108 T.CheckFalse(T.NewObject("(function() {})"));
109 T.CheckFalse(T.NewObject("([1])"));
110 T.CheckFalse(T.NewObject("({})"));
111 T.CheckTrue(T.NewObject("(/x/)"));
112 T.CheckFalse(T.undefined());
113 T.CheckFalse(T.null());
114 T.CheckFalse(T.Val("x"));
115 T.CheckFalse(T.Val(1));
116}
117
118
119TEST(ClassOf) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400120 FLAG_turbo_inlining_intrinsics = true;
121 FLAG_turbo_deoptimization = true;
122 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000123
124 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})"));
125 T.CheckCall(T.Val("Array"), T.NewObject("([1])"));
126 T.CheckCall(T.Val("Object"), T.NewObject("({})"));
127 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)"));
128 T.CheckCall(T.null(), T.undefined());
129 T.CheckCall(T.null(), T.null());
130 T.CheckCall(T.null(), T.Val("x"));
131 T.CheckCall(T.null(), T.Val(1));
132}
133
134
135TEST(ObjectEquals) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400136 FLAG_turbo_inlining_intrinsics = true;
137 FLAG_turbo_deoptimization = true;
138 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000139 CompileRun("var o = {}");
140
141 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
142 T.CheckTrue(T.Val("internal"), T.Val("internal"));
143 T.CheckTrue(T.true_value(), T.true_value());
144 T.CheckFalse(T.true_value(), T.false_value());
145 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
146 T.CheckFalse(T.Val("a"), T.Val("b"));
147}
148
149
150TEST(ValueOf) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400151 FLAG_turbo_inlining_intrinsics = true;
152 FLAG_turbo_deoptimization = true;
153 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000154
155 T.CheckCall(T.Val("a"), T.Val("a"));
156 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))"));
157 T.CheckCall(T.Val(123), T.Val(123));
158 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))"));
159}
160
161
162TEST(SetValueOf) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400163 FLAG_turbo_inlining_intrinsics = true;
164 FLAG_turbo_deoptimization = true;
165 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000166
167 T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a"));
168 T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123));
169 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x"));
170}
171
172
173TEST(StringCharFromCode) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400174 FLAG_turbo_inlining_intrinsics = true;
175 FLAG_turbo_deoptimization = true;
176 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000177
178 T.CheckCall(T.Val("a"), T.Val(97));
179 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A));
180 T.CheckCall(T.Val(""), T.undefined());
181}
182
183
184TEST(StringCharAt) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400185 FLAG_turbo_inlining_intrinsics = true;
186 FLAG_turbo_deoptimization = true;
187 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000188
189 T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3));
190 T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
191 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23));
192}
193
194
195TEST(StringCharCodeAt) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400196 FLAG_turbo_inlining_intrinsics = true;
197 FLAG_turbo_deoptimization = true;
198 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })",
199 flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000200
201 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3));
202 T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
203 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23));
204}
205
206
207TEST(StringAdd) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400208 FLAG_turbo_inlining_intrinsics = true;
209 FLAG_turbo_deoptimization = true;
210 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000211
212 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb"));
213 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(""));
214 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb"));
215}
216
217
218TEST(StringSubString) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400219 FLAG_turbo_inlining_intrinsics = true;
220 FLAG_turbo_deoptimization = true;
221 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000222
223 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0));
224 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2));
225 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0));
226}
227
228
229TEST(StringCompare) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400230 FLAG_turbo_inlining_intrinsics = true;
231 FLAG_turbo_deoptimization = true;
232 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000233
234 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb"));
235 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb"));
236 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb"));
237}
238
239
240TEST(CallFunction) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400241 FLAG_turbo_inlining_intrinsics = true;
242 FLAG_turbo_deoptimization = true;
243 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })",
244 flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000245 CompileRun("function f(a,b,c) { return a + b + c + this.d; }");
246
247 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f"));
248 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f"));
249}