blob: 0ea611bade79a9f1e7f2d438aaec6cb610170e85 [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(StringAdd) {
115 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb"));
118 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(""));
119 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb"));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000120}
121
122
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000123TEST(StringCharCodeAt) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400124 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })",
125 flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126
127 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3));
128 T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
129 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23));
130}
131
132
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133TEST(StringCharFromCode) {
134 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000135
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136 T.CheckCall(T.Val("a"), T.Val(97));
137 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A));
138 T.CheckCall(T.Val(""), T.undefined());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000139}
140
141
142TEST(StringCompare) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400143 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000144
145 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb"));
146 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb"));
147 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb"));
148}
149
150
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000151TEST(SubString) {
152 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000153
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0));
155 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2));
156 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000157}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000158
159
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000160TEST(ValueOf) {
161 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags);
162
163 T.CheckCall(T.Val("a"), T.Val("a"));
164 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))"));
165 T.CheckCall(T.Val(123), T.Val(123));
166 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))"));
167}
168
169} // namespace compiler
170} // namespace internal
171} // namespace v8