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 12 13 TEST(IsSmi) { 14 FunctionTester T("(function(a) { return %_IsSmi(a); })"); 15 16 T.CheckTrue(T.Val(1)); 17 T.CheckFalse(T.Val(1.1)); 18 T.CheckFalse(T.Val(-0.0)); 19 T.CheckTrue(T.Val(-2)); 20 T.CheckFalse(T.Val(-2.3)); 21 T.CheckFalse(T.undefined()); 22 } 23 24 25 TEST(IsNonNegativeSmi) { 26 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })"); 27 28 T.CheckTrue(T.Val(1)); 29 T.CheckFalse(T.Val(1.1)); 30 T.CheckFalse(T.Val(-0.0)); 31 T.CheckFalse(T.Val(-2)); 32 T.CheckFalse(T.Val(-2.3)); 33 T.CheckFalse(T.undefined()); 34 } 35 36 37 TEST(IsMinusZero) { 38 FunctionTester T("(function(a) { return %_IsMinusZero(a); })"); 39 40 T.CheckFalse(T.Val(1)); 41 T.CheckFalse(T.Val(1.1)); 42 T.CheckTrue(T.Val(-0.0)); 43 T.CheckFalse(T.Val(-2)); 44 T.CheckFalse(T.Val(-2.3)); 45 T.CheckFalse(T.undefined()); 46 } 47 48 49 TEST(IsArray) { 50 FunctionTester T("(function(a) { return %_IsArray(a); })"); 51 52 T.CheckFalse(T.NewObject("(function() {})")); 53 T.CheckTrue(T.NewObject("([1])")); 54 T.CheckFalse(T.NewObject("({})")); 55 T.CheckFalse(T.NewObject("(/x/)")); 56 T.CheckFalse(T.undefined()); 57 T.CheckFalse(T.null()); 58 T.CheckFalse(T.Val("x")); 59 T.CheckFalse(T.Val(1)); 60 } 61 62 63 TEST(IsObject) { 64 FunctionTester T("(function(a) { return %_IsObject(a); })"); 65 66 T.CheckFalse(T.NewObject("(function() {})")); 67 T.CheckTrue(T.NewObject("([1])")); 68 T.CheckTrue(T.NewObject("({})")); 69 T.CheckTrue(T.NewObject("(/x/)")); 70 T.CheckFalse(T.undefined()); 71 T.CheckTrue(T.null()); 72 T.CheckFalse(T.Val("x")); 73 T.CheckFalse(T.Val(1)); 74 } 75 76 77 TEST(IsFunction) { 78 FunctionTester T("(function(a) { return %_IsFunction(a); })"); 79 80 T.CheckTrue(T.NewObject("(function() {})")); 81 T.CheckFalse(T.NewObject("([1])")); 82 T.CheckFalse(T.NewObject("({})")); 83 T.CheckFalse(T.NewObject("(/x/)")); 84 T.CheckFalse(T.undefined()); 85 T.CheckFalse(T.null()); 86 T.CheckFalse(T.Val("x")); 87 T.CheckFalse(T.Val(1)); 88 } 89 90 91 TEST(IsRegExp) { 92 FunctionTester T("(function(a) { return %_IsRegExp(a); })"); 93 94 T.CheckFalse(T.NewObject("(function() {})")); 95 T.CheckFalse(T.NewObject("([1])")); 96 T.CheckFalse(T.NewObject("({})")); 97 T.CheckTrue(T.NewObject("(/x/)")); 98 T.CheckFalse(T.undefined()); 99 T.CheckFalse(T.null()); 100 T.CheckFalse(T.Val("x")); 101 T.CheckFalse(T.Val(1)); 102 } 103 104 105 TEST(ClassOf) { 106 FunctionTester T("(function(a) { return %_ClassOf(a); })"); 107 108 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})")); 109 T.CheckCall(T.Val("Array"), T.NewObject("([1])")); 110 T.CheckCall(T.Val("Object"), T.NewObject("({})")); 111 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)")); 112 T.CheckCall(T.null(), T.undefined()); 113 T.CheckCall(T.null(), T.null()); 114 T.CheckCall(T.null(), T.Val("x")); 115 T.CheckCall(T.null(), T.Val(1)); 116 } 117 118 119 TEST(ObjectEquals) { 120 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })"); 121 CompileRun("var o = {}"); 122 123 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); 124 T.CheckTrue(T.Val("internal"), T.Val("internal")); 125 T.CheckTrue(T.true_value(), T.true_value()); 126 T.CheckFalse(T.true_value(), T.false_value()); 127 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); 128 T.CheckFalse(T.Val("a"), T.Val("b")); 129 } 130 131 132 TEST(ValueOf) { 133 FunctionTester T("(function(a) { return %_ValueOf(a); })"); 134 135 T.CheckCall(T.Val("a"), T.Val("a")); 136 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))")); 137 T.CheckCall(T.Val(123), T.Val(123)); 138 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))")); 139 } 140 141 142 TEST(SetValueOf) { 143 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })"); 144 145 T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a")); 146 T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123)); 147 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x")); 148 } 149 150 151 TEST(StringCharFromCode) { 152 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })"); 153 154 T.CheckCall(T.Val("a"), T.Val(97)); 155 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A)); 156 T.CheckCall(T.Val(""), T.undefined()); 157 } 158 159 160 TEST(StringCharAt) { 161 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })"); 162 163 T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3)); 164 T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2)); 165 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23)); 166 } 167 168 169 TEST(StringCharCodeAt) { 170 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })"); 171 172 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3)); 173 T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2)); 174 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23)); 175 } 176 177 178 TEST(StringAdd) { 179 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })"); 180 181 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb")); 182 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val("")); 183 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb")); 184 } 185 186 187 TEST(StringSubString) { 188 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })"); 189 190 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0)); 191 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2)); 192 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0)); 193 } 194 195 196 TEST(StringCompare) { 197 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })"); 198 199 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb")); 200 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb")); 201 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb")); 202 } 203 204 205 TEST(CallFunction) { 206 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })"); 207 CompileRun("function f(a,b,c) { return a + b + c + this.d; }"); 208 209 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f")); 210 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f")); 211 } 212