blob: 6aa5f391adeb6e392153148a58071df71a183747 [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
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#include "test/cctest/compiler/function-tester.h"
6
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00007namespace v8 {
8namespace internal {
9namespace compiler {
10
Emily Bernierd0a1eb72015-03-24 16:35:39 -040011uint32_t flags = CompilationInfo::kInliningEnabled;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012
Ben Murdochb8a8cc12014-11-26 15:28:44 +000013
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014TEST(Call) {
15 FunctionTester T("(function(a,b) { return %_Call(b, a, 1, 2, 3); })", flags);
16 CompileRun("function f(a,b,c) { return a + b + c + this.d; }");
Ben Murdochb8a8cc12014-11-26 15:28:44 +000017
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000018 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f"));
19 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f"));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020}
21
22
23TEST(ClassOf) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040024 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025
26 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})"));
27 T.CheckCall(T.Val("Array"), T.NewObject("([1])"));
28 T.CheckCall(T.Val("Object"), T.NewObject("({})"));
29 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)"));
30 T.CheckCall(T.null(), T.undefined());
31 T.CheckCall(T.null(), T.null());
32 T.CheckCall(T.null(), T.Val("x"));
33 T.CheckCall(T.null(), T.Val(1));
34}
35
36
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037TEST(IsArray) {
38 FunctionTester T("(function(a) { return %_IsArray(a); })", flags);
39
40 T.CheckFalse(T.NewObject("new Date()"));
41 T.CheckFalse(T.NewObject("(function() {})"));
42 T.CheckTrue(T.NewObject("([1])"));
43 T.CheckFalse(T.NewObject("({})"));
44 T.CheckFalse(T.NewObject("(/x/)"));
45 T.CheckFalse(T.undefined());
46 T.CheckFalse(T.null());
47 T.CheckFalse(T.Val("x"));
48 T.CheckFalse(T.Val(1));
49}
50
51
52TEST(IsDate) {
53 FunctionTester T("(function(a) { return %_IsDate(a); })", flags);
54
55 T.CheckTrue(T.NewObject("new Date()"));
56 T.CheckFalse(T.NewObject("(function() {})"));
57 T.CheckFalse(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
67TEST(IsFunction) {
68 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags);
69
70 T.CheckFalse(T.NewObject("new Date()"));
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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000082TEST(IsRegExp) {
83 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags);
84
85 T.CheckFalse(T.NewObject("new Date()"));
86 T.CheckFalse(T.NewObject("(function() {})"));
87 T.CheckFalse(T.NewObject("([1])"));
88 T.CheckFalse(T.NewObject("({})"));
89 T.CheckTrue(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));
94}
95
96
97TEST(IsSmi) {
98 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags);
99
100 T.CheckFalse(T.NewObject("new Date()"));
101 T.CheckFalse(T.NewObject("(function() {})"));
102 T.CheckFalse(T.NewObject("([1])"));
103 T.CheckFalse(T.NewObject("({})"));
104 T.CheckFalse(T.NewObject("(/x/)"));
105 T.CheckFalse(T.undefined());
106 T.CheckTrue(T.Val(1));
107 T.CheckFalse(T.Val(1.1));
108 T.CheckFalse(T.Val(-0.0));
109 T.CheckTrue(T.Val(-2));
110 T.CheckFalse(T.Val(-2.3));
111}
112
113
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114TEST(OneByteSeqStringGetChar) {
115 FunctionTester T("(function(a,b) { return %_OneByteSeqStringGetChar(a,b); })",
116 flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000118 Handle<SeqOneByteString> string =
119 T.main_isolate()->factory()->NewRawOneByteString(3).ToHandleChecked();
120 string->SeqOneByteStringSet(0, 'b');
121 string->SeqOneByteStringSet(1, 'a');
122 string->SeqOneByteStringSet(2, 'r');
123 T.CheckCall(T.Val('b'), string, T.Val(0.0));
124 T.CheckCall(T.Val('a'), string, T.Val(1));
125 T.CheckCall(T.Val('r'), string, T.Val(2));
126}
127
128
129TEST(OneByteSeqStringSetChar) {
130 FunctionTester T("(function(a,b) { %_OneByteSeqStringSetChar(a,88,b); })",
131 flags);
132
133 Handle<SeqOneByteString> string =
134 T.main_isolate()->factory()->NewRawOneByteString(3).ToHandleChecked();
135 string->SeqOneByteStringSet(0, 'b');
136 string->SeqOneByteStringSet(1, 'a');
137 string->SeqOneByteStringSet(2, 'r');
138 T.Call(T.Val(1), string);
139 CHECK_EQ('b', string->SeqOneByteStringGet(0));
140 CHECK_EQ('X', string->SeqOneByteStringGet(1));
141 CHECK_EQ('r', string->SeqOneByteStringGet(2));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000142}
143
144
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000145TEST(StringAdd) {
146 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000147
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000148 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb"));
149 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(""));
150 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb"));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000151}
152
153
154TEST(StringCharAt) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400155 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156
157 T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3));
158 T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
159 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23));
160}
161
162
163TEST(StringCharCodeAt) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400164 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })",
165 flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000166
167 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3));
168 T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
169 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23));
170}
171
172
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173TEST(StringCharFromCode) {
174 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000175
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000176 T.CheckCall(T.Val("a"), T.Val(97));
177 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A));
178 T.CheckCall(T.Val(""), T.undefined());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000179}
180
181
182TEST(StringCompare) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400183 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184
185 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb"));
186 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb"));
187 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb"));
188}
189
190
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000191TEST(SubString) {
192 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000193
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000194 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0));
195 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2));
196 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000197}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198
199
200TEST(TwoByteSeqStringGetChar) {
201 FunctionTester T("(function(a,b) { return %_TwoByteSeqStringGetChar(a,b); })",
202 flags);
203
204 Handle<SeqTwoByteString> string =
205 T.main_isolate()->factory()->NewRawTwoByteString(3).ToHandleChecked();
206 string->SeqTwoByteStringSet(0, 'b');
207 string->SeqTwoByteStringSet(1, 'a');
208 string->SeqTwoByteStringSet(2, 'r');
209 T.CheckCall(T.Val('b'), string, T.Val(0.0));
210 T.CheckCall(T.Val('a'), string, T.Val(1));
211 T.CheckCall(T.Val('r'), string, T.Val(2));
212}
213
214
215TEST(TwoByteSeqStringSetChar) {
216 FunctionTester T("(function(a,b) { %_TwoByteSeqStringSetChar(a,88,b); })",
217 flags);
218
219 Handle<SeqTwoByteString> string =
220 T.main_isolate()->factory()->NewRawTwoByteString(3).ToHandleChecked();
221 string->SeqTwoByteStringSet(0, 'b');
222 string->SeqTwoByteStringSet(1, 'a');
223 string->SeqTwoByteStringSet(2, 'r');
224 T.Call(T.Val(1), string);
225 CHECK_EQ('b', string->SeqTwoByteStringGet(0));
226 CHECK_EQ('X', string->SeqTwoByteStringGet(1));
227 CHECK_EQ('r', string->SeqTwoByteStringGet(2));
228}
229
230
231TEST(ValueOf) {
232 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags);
233
234 T.CheckCall(T.Val("a"), T.Val("a"));
235 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))"));
236 T.CheckCall(T.Val(123), T.Val(123));
237 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))"));
238}
239
240} // namespace compiler
241} // namespace internal
242} // namespace v8