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.
7 #include "test/cctest/compiler/function-tester.h"
9 using namespace v8::internal;
10 using namespace v8::internal::compiler;
11 uint32_t flags = CompilationInfo::kInliningEnabled;
14 FLAG_turbo_deoptimization = true;
15 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags);
17 T.CheckTrue(T.Val(1));
18 T.CheckFalse(T.Val(1.1));
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());
26 TEST(IsNonNegativeSmi) {
27 FLAG_turbo_deoptimization = true;
28 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags);
30 T.CheckTrue(T.Val(1));
31 T.CheckFalse(T.Val(1.1));
32 T.CheckFalse(T.Val(-0.0));
33 T.CheckFalse(T.Val(-2));
34 T.CheckFalse(T.Val(-2.3));
35 T.CheckFalse(T.undefined());
40 FLAG_turbo_deoptimization = true;
41 FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags);
43 T.CheckFalse(T.Val(1));
44 T.CheckFalse(T.Val(1.1));
45 T.CheckTrue(T.Val(-0.0));
46 T.CheckFalse(T.Val(-2));
47 T.CheckFalse(T.Val(-2.3));
48 T.CheckFalse(T.undefined());
53 FLAG_turbo_deoptimization = true;
54 FunctionTester T("(function(a) { return %_IsArray(a); })", flags);
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));
68 FLAG_turbo_deoptimization = true;
69 FunctionTester T("(function(a) { return %_IsObject(a); })", flags);
71 T.CheckFalse(T.NewObject("(function() {})"));
72 T.CheckTrue(T.NewObject("([1])"));
73 T.CheckTrue(T.NewObject("({})"));
74 T.CheckTrue(T.NewObject("(/x/)"));
75 T.CheckFalse(T.undefined());
76 T.CheckTrue(T.null());
77 T.CheckFalse(T.Val("x"));
78 T.CheckFalse(T.Val(1));
83 FLAG_turbo_deoptimization = true;
84 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags);
86 T.CheckTrue(T.NewObject("(function() {})"));
87 T.CheckFalse(T.NewObject("([1])"));
88 T.CheckFalse(T.NewObject("({})"));
89 T.CheckFalse(T.NewObject("(/x/)"));
90 T.CheckFalse(T.undefined());
91 T.CheckFalse(T.null());
92 T.CheckFalse(T.Val("x"));
93 T.CheckFalse(T.Val(1));
98 FLAG_turbo_deoptimization = true;
99 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags);
101 T.CheckFalse(T.NewObject("(function() {})"));
102 T.CheckFalse(T.NewObject("([1])"));
103 T.CheckFalse(T.NewObject("({})"));
104 T.CheckTrue(T.NewObject("(/x/)"));
105 T.CheckFalse(T.undefined());
106 T.CheckFalse(T.null());
107 T.CheckFalse(T.Val("x"));
108 T.CheckFalse(T.Val(1));
113 FLAG_turbo_deoptimization = true;
114 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags);
116 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})"));
117 T.CheckCall(T.Val("Array"), T.NewObject("([1])"));
118 T.CheckCall(T.Val("Object"), T.NewObject("({})"));
119 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)"));
120 T.CheckCall(T.null(), T.undefined());
121 T.CheckCall(T.null(), T.null());
122 T.CheckCall(T.null(), T.Val("x"));
123 T.CheckCall(T.null(), T.Val(1));
128 FLAG_turbo_deoptimization = true;
129 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags);
130 CompileRun("var o = {}");
132 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
133 T.CheckTrue(T.Val("internal"), T.Val("internal"));
134 T.CheckTrue(T.true_value(), T.true_value());
135 T.CheckFalse(T.true_value(), T.false_value());
136 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
137 T.CheckFalse(T.Val("a"), T.Val("b"));
142 FLAG_turbo_deoptimization = true;
143 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags);
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))"));
153 FLAG_turbo_deoptimization = true;
154 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags);
156 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));
158 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x"));
162 TEST(StringCharFromCode) {
163 FLAG_turbo_deoptimization = true;
164 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags);
166 T.CheckCall(T.Val("a"), T.Val(97));
167 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A));
168 T.CheckCall(T.Val(""), T.undefined());
173 FLAG_turbo_deoptimization = true;
174 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags);
176 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));
178 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23));
182 TEST(StringCharCodeAt) {
183 FLAG_turbo_deoptimization = true;
184 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })",
187 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));
189 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23));
194 FLAG_turbo_deoptimization = true;
195 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags);
197 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb"));
198 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(""));
199 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb"));
203 TEST(StringSubString) {
204 FLAG_turbo_deoptimization = true;
205 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags);
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));
213 TEST(StringCompare) {
214 FLAG_turbo_deoptimization = true;
215 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags);
217 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb"));
218 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb"));
219 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb"));
224 FLAG_turbo_deoptimization = true;
225 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })",
227 CompileRun("function f(a,b,c) { return a + b + c + this.d; }");
229 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f"));
230 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f"));