| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "test/cctest/compiler/function-tester.h" | 7 #include "test/cctest/compiler/function-tester.h" |
| 8 | 8 |
| 9 using namespace v8::internal; | 9 using namespace v8::internal; |
| 10 using namespace v8::internal::compiler; | 10 using namespace v8::internal::compiler; |
| 11 uint32_t flags = CompilationInfo::kInliningEnabled; | 11 uint32_t flags = CompilationInfo::kInliningEnabled; |
| 12 | 12 |
| 13 TEST(IsSmi) { | 13 |
| 14 TEST(CallFunction) { |
| 14 FLAG_turbo_deoptimization = true; | 15 FLAG_turbo_deoptimization = true; |
| 15 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags); | 16 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })", |
| 17 flags); |
| 18 CompileRun("function f(a,b,c) { return a + b + c + this.d; }"); |
| 16 | 19 |
| 17 T.CheckTrue(T.Val(1)); | 20 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f")); |
| 18 T.CheckFalse(T.Val(1.1)); | 21 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f")); |
| 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()); | |
| 23 } | 22 } |
| 24 | 23 |
| 25 | 24 |
| 26 TEST(IsNonNegativeSmi) { | 25 TEST(ClassOf) { |
| 27 FLAG_turbo_deoptimization = true; | 26 FLAG_turbo_deoptimization = true; |
| 28 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags); | 27 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags); |
| 29 | 28 |
| 30 T.CheckTrue(T.Val(1)); | 29 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})")); |
| 31 T.CheckFalse(T.Val(1.1)); | 30 T.CheckCall(T.Val("Array"), T.NewObject("([1])")); |
| 32 T.CheckFalse(T.Val(-0.0)); | 31 T.CheckCall(T.Val("Object"), T.NewObject("({})")); |
| 33 T.CheckFalse(T.Val(-2)); | 32 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)")); |
| 34 T.CheckFalse(T.Val(-2.3)); | 33 T.CheckCall(T.null(), T.undefined()); |
| 35 T.CheckFalse(T.undefined()); | 34 T.CheckCall(T.null(), T.null()); |
| 35 T.CheckCall(T.null(), T.Val("x")); |
| 36 T.CheckCall(T.null(), T.Val(1)); |
| 36 } | 37 } |
| 37 | 38 |
| 38 | 39 |
| 40 TEST(HeapObjectGetMap) { |
| 41 FLAG_turbo_deoptimization = true; |
| 42 FunctionTester T("(function(a) { return %_HeapObjectGetMap(a); })", flags); |
| 43 |
| 44 Factory* factory = T.main_isolate()->factory(); |
| 45 T.CheckCall(factory->null_map(), T.null()); |
| 46 T.CheckCall(factory->undefined_map(), T.undefined()); |
| 47 T.CheckCall(factory->heap_number_map(), T.Val(3.1415)); |
| 48 T.CheckCall(factory->symbol_map(), factory->NewSymbol()); |
| 49 } |
| 50 |
| 51 |
| 52 TEST(IsArray) { |
| 53 FLAG_turbo_deoptimization = true; |
| 54 FunctionTester T("(function(a) { return %_IsArray(a); })", flags); |
| 55 |
| 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)); |
| 64 } |
| 65 |
| 66 |
| 67 TEST(IsFunction) { |
| 68 FLAG_turbo_deoptimization = true; |
| 69 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags); |
| 70 |
| 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 |
| 39 TEST(IsMinusZero) { | 82 TEST(IsMinusZero) { |
| 40 FLAG_turbo_deoptimization = true; | 83 FLAG_turbo_deoptimization = true; |
| 41 FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags); | 84 FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags); |
| 42 | 85 |
| 43 T.CheckFalse(T.Val(1)); | 86 T.CheckFalse(T.Val(1)); |
| 44 T.CheckFalse(T.Val(1.1)); | 87 T.CheckFalse(T.Val(1.1)); |
| 45 T.CheckTrue(T.Val(-0.0)); | 88 T.CheckTrue(T.Val(-0.0)); |
| 46 T.CheckFalse(T.Val(-2)); | 89 T.CheckFalse(T.Val(-2)); |
| 47 T.CheckFalse(T.Val(-2.3)); | 90 T.CheckFalse(T.Val(-2.3)); |
| 48 T.CheckFalse(T.undefined()); | 91 T.CheckFalse(T.undefined()); |
| 49 } | 92 } |
| 50 | 93 |
| 51 | 94 |
| 52 TEST(IsArray) { | 95 TEST(IsNonNegativeSmi) { |
| 53 FLAG_turbo_deoptimization = true; | 96 FLAG_turbo_deoptimization = true; |
| 54 FunctionTester T("(function(a) { return %_IsArray(a); })", flags); | 97 FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags); |
| 55 | 98 |
| 56 T.CheckFalse(T.NewObject("(function() {})")); | 99 T.CheckTrue(T.Val(1)); |
| 57 T.CheckTrue(T.NewObject("([1])")); | 100 T.CheckFalse(T.Val(1.1)); |
| 58 T.CheckFalse(T.NewObject("({})")); | 101 T.CheckFalse(T.Val(-0.0)); |
| 59 T.CheckFalse(T.NewObject("(/x/)")); | 102 T.CheckFalse(T.Val(-2)); |
| 103 T.CheckFalse(T.Val(-2.3)); |
| 60 T.CheckFalse(T.undefined()); | 104 T.CheckFalse(T.undefined()); |
| 61 T.CheckFalse(T.null()); | |
| 62 T.CheckFalse(T.Val("x")); | |
| 63 T.CheckFalse(T.Val(1)); | |
| 64 } | 105 } |
| 65 | 106 |
| 66 | 107 |
| 67 TEST(IsObject) { | 108 TEST(IsObject) { |
| 68 FLAG_turbo_deoptimization = true; | 109 FLAG_turbo_deoptimization = true; |
| 69 FunctionTester T("(function(a) { return %_IsObject(a); })", flags); | 110 FunctionTester T("(function(a) { return %_IsObject(a); })", flags); |
| 70 | 111 |
| 71 T.CheckFalse(T.NewObject("(function() {})")); | 112 T.CheckFalse(T.NewObject("(function() {})")); |
| 72 T.CheckTrue(T.NewObject("([1])")); | 113 T.CheckTrue(T.NewObject("([1])")); |
| 73 T.CheckTrue(T.NewObject("({})")); | 114 T.CheckTrue(T.NewObject("({})")); |
| 74 T.CheckTrue(T.NewObject("(/x/)")); | 115 T.CheckTrue(T.NewObject("(/x/)")); |
| 75 T.CheckFalse(T.undefined()); | 116 T.CheckFalse(T.undefined()); |
| 76 T.CheckTrue(T.null()); | 117 T.CheckTrue(T.null()); |
| 77 T.CheckFalse(T.Val("x")); | 118 T.CheckFalse(T.Val("x")); |
| 78 T.CheckFalse(T.Val(1)); | 119 T.CheckFalse(T.Val(1)); |
| 79 } | 120 } |
| 80 | 121 |
| 81 | 122 |
| 82 TEST(IsFunction) { | 123 TEST(IsRegExp) { |
| 83 FLAG_turbo_deoptimization = true; | 124 FLAG_turbo_deoptimization = true; |
| 84 FunctionTester T("(function(a) { return %_IsFunction(a); })", flags); | 125 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags); |
| 85 | 126 |
| 86 T.CheckTrue(T.NewObject("(function() {})")); | 127 T.CheckFalse(T.NewObject("(function() {})")); |
| 87 T.CheckFalse(T.NewObject("([1])")); | 128 T.CheckFalse(T.NewObject("([1])")); |
| 88 T.CheckFalse(T.NewObject("({})")); | 129 T.CheckFalse(T.NewObject("({})")); |
| 89 T.CheckFalse(T.NewObject("(/x/)")); | 130 T.CheckTrue(T.NewObject("(/x/)")); |
| 90 T.CheckFalse(T.undefined()); | 131 T.CheckFalse(T.undefined()); |
| 91 T.CheckFalse(T.null()); | 132 T.CheckFalse(T.null()); |
| 92 T.CheckFalse(T.Val("x")); | 133 T.CheckFalse(T.Val("x")); |
| 93 T.CheckFalse(T.Val(1)); | 134 T.CheckFalse(T.Val(1)); |
| 94 } | 135 } |
| 95 | 136 |
| 96 | 137 |
| 97 TEST(IsRegExp) { | 138 TEST(IsSmi) { |
| 98 FLAG_turbo_deoptimization = true; | 139 FLAG_turbo_deoptimization = true; |
| 99 FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags); | 140 FunctionTester T("(function(a) { return %_IsSmi(a); })", flags); |
| 100 | 141 |
| 101 T.CheckFalse(T.NewObject("(function() {})")); | 142 T.CheckTrue(T.Val(1)); |
| 102 T.CheckFalse(T.NewObject("([1])")); | 143 T.CheckFalse(T.Val(1.1)); |
| 103 T.CheckFalse(T.NewObject("({})")); | 144 T.CheckFalse(T.Val(-0.0)); |
| 104 T.CheckTrue(T.NewObject("(/x/)")); | 145 T.CheckTrue(T.Val(-2)); |
| 146 T.CheckFalse(T.Val(-2.3)); |
| 105 T.CheckFalse(T.undefined()); | 147 T.CheckFalse(T.undefined()); |
| 106 T.CheckFalse(T.null()); | |
| 107 T.CheckFalse(T.Val("x")); | |
| 108 T.CheckFalse(T.Val(1)); | |
| 109 } | 148 } |
| 110 | 149 |
| 111 | 150 |
| 112 TEST(ClassOf) { | 151 TEST(MapGetInstanceType) { |
| 113 FLAG_turbo_deoptimization = true; | 152 FLAG_turbo_deoptimization = true; |
| 114 FunctionTester T("(function(a) { return %_ClassOf(a); })", flags); | 153 FunctionTester T( |
| 154 "(function(a) { return %_MapGetInstanceType(%_HeapObjectGetMap(a)); })", |
| 155 flags); |
| 115 | 156 |
| 116 T.CheckCall(T.Val("Function"), T.NewObject("(function() {})")); | 157 Factory* factory = T.main_isolate()->factory(); |
| 117 T.CheckCall(T.Val("Array"), T.NewObject("([1])")); | 158 T.CheckCall(T.Val(ODDBALL_TYPE), T.null()); |
| 118 T.CheckCall(T.Val("Object"), T.NewObject("({})")); | 159 T.CheckCall(T.Val(ODDBALL_TYPE), T.undefined()); |
| 119 T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)")); | 160 T.CheckCall(T.Val(HEAP_NUMBER_TYPE), T.Val(3.1415)); |
| 120 T.CheckCall(T.null(), T.undefined()); | 161 T.CheckCall(T.Val(SYMBOL_TYPE), factory->NewSymbol()); |
| 121 T.CheckCall(T.null(), T.null()); | |
| 122 T.CheckCall(T.null(), T.Val("x")); | |
| 123 T.CheckCall(T.null(), T.Val(1)); | |
| 124 } | 162 } |
| 125 | 163 |
| 126 | 164 |
| 127 TEST(ObjectEquals) { | 165 TEST(ObjectEquals) { |
| 128 FLAG_turbo_deoptimization = true; | 166 FLAG_turbo_deoptimization = true; |
| 129 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags); | 167 FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags); |
| 130 CompileRun("var o = {}"); | 168 CompileRun("var o = {}"); |
| 131 | 169 |
| 132 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); | 170 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); |
| 133 T.CheckTrue(T.Val("internal"), T.Val("internal")); | 171 T.CheckTrue(T.Val("internal"), T.Val("internal")); |
| 134 T.CheckTrue(T.true_value(), T.true_value()); | 172 T.CheckTrue(T.true_value(), T.true_value()); |
| 135 T.CheckFalse(T.true_value(), T.false_value()); | 173 T.CheckFalse(T.true_value(), T.false_value()); |
| 136 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); | 174 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); |
| 137 T.CheckFalse(T.Val("a"), T.Val("b")); | 175 T.CheckFalse(T.Val("a"), T.Val("b")); |
| 138 } | 176 } |
| 139 | 177 |
| 140 | 178 |
| 141 TEST(ValueOf) { | |
| 142 FLAG_turbo_deoptimization = true; | |
| 143 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags); | |
| 144 | |
| 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))")); | |
| 149 } | |
| 150 | |
| 151 | |
| 152 TEST(SetValueOf) { | 179 TEST(SetValueOf) { |
| 153 FLAG_turbo_deoptimization = true; | 180 FLAG_turbo_deoptimization = true; |
| 154 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags); | 181 FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags); |
| 155 | 182 |
| 156 T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a")); | 183 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)); | 184 T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123)); |
| 158 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x")); | 185 T.CheckCall(T.Val("x"), T.undefined(), T.Val("x")); |
| 159 } | 186 } |
| 160 | 187 |
| 161 | 188 |
| 162 TEST(StringCharFromCode) { | 189 TEST(StringAdd) { |
| 163 FLAG_turbo_deoptimization = true; | 190 FLAG_turbo_deoptimization = true; |
| 164 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags); | 191 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags); |
| 165 | 192 |
| 166 T.CheckCall(T.Val("a"), T.Val(97)); | 193 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb")); |
| 167 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A)); | 194 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val("")); |
| 168 T.CheckCall(T.Val(""), T.undefined()); | 195 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb")); |
| 169 } | 196 } |
| 170 | 197 |
| 171 | 198 |
| 172 TEST(StringCharAt) { | 199 TEST(StringCharAt) { |
| 173 FLAG_turbo_deoptimization = true; | 200 FLAG_turbo_deoptimization = true; |
| 174 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags); | 201 FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags); |
| 175 | 202 |
| 176 T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3)); | 203 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)); | 204 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)); | 205 T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23)); |
| 179 } | 206 } |
| 180 | 207 |
| 181 | 208 |
| 182 TEST(StringCharCodeAt) { | 209 TEST(StringCharCodeAt) { |
| 183 FLAG_turbo_deoptimization = true; | 210 FLAG_turbo_deoptimization = true; |
| 184 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })", | 211 FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })", |
| 185 flags); | 212 flags); |
| 186 | 213 |
| 187 T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3)); | 214 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)); | 215 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)); | 216 T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23)); |
| 190 } | 217 } |
| 191 | 218 |
| 192 | 219 |
| 193 TEST(StringAdd) { | 220 TEST(StringCharFromCode) { |
| 194 FLAG_turbo_deoptimization = true; | 221 FLAG_turbo_deoptimization = true; |
| 195 FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags); | 222 FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags); |
| 196 | 223 |
| 197 T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb")); | 224 T.CheckCall(T.Val("a"), T.Val(97)); |
| 198 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val("")); | 225 T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A)); |
| 199 T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb")); | 226 T.CheckCall(T.Val(""), T.undefined()); |
| 200 } | 227 } |
| 201 | 228 |
| 202 | 229 |
| 203 TEST(StringSubString) { | |
| 204 FLAG_turbo_deoptimization = true; | |
| 205 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags); | |
| 206 | |
| 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)); | |
| 210 } | |
| 211 | |
| 212 | |
| 213 TEST(StringCompare) { | 230 TEST(StringCompare) { |
| 214 FLAG_turbo_deoptimization = true; | 231 FLAG_turbo_deoptimization = true; |
| 215 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags); | 232 FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags); |
| 216 | 233 |
| 217 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb")); | 234 T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb")); |
| 218 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb")); | 235 T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb")); |
| 219 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb")); | 236 T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb")); |
| 220 } | 237 } |
| 221 | 238 |
| 222 | 239 |
| 223 TEST(CallFunction) { | 240 TEST(SubString) { |
| 224 FLAG_turbo_deoptimization = true; | 241 FLAG_turbo_deoptimization = true; |
| 225 FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })", | 242 FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags); |
| 226 flags); | |
| 227 CompileRun("function f(a,b,c) { return a + b + c + this.d; }"); | |
| 228 | 243 |
| 229 T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f")); | 244 T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0)); |
| 230 T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f")); | 245 T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2)); |
| 246 T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0)); |
| 231 } | 247 } |
| 248 |
| 249 |
| 250 TEST(ValueOf) { |
| 251 FLAG_turbo_deoptimization = true; |
| 252 FunctionTester T("(function(a) { return %_ValueOf(a); })", flags); |
| 253 |
| 254 T.CheckCall(T.Val("a"), T.Val("a")); |
| 255 T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))")); |
| 256 T.CheckCall(T.Val(123), T.Val(123)); |
| 257 T.CheckCall(T.Val(456), T.NewObject("(new Number(456))")); |
| 258 } |
| OLD | NEW |