OLD | NEW |
(Empty) | |
| 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 TEST(BinopAdd) { |
| 13 FunctionTester T("(function(a,b) { return a + b; })"); |
| 14 |
| 15 T.CheckCall(3, 1, 2); |
| 16 T.CheckCall(-11, -2, -9); |
| 17 T.CheckCall(-11, -1.5, -9.5); |
| 18 T.CheckCall(T.Val("AB"), T.Val("A"), T.Val("B")); |
| 19 T.CheckCall(T.Val("A11"), T.Val("A"), T.Val(11)); |
| 20 T.CheckCall(T.Val("12B"), T.Val(12), T.Val("B")); |
| 21 T.CheckCall(T.Val("38"), T.Val("3"), T.Val("8")); |
| 22 T.CheckCall(T.Val("31"), T.Val("3"), T.NewObject("([1])")); |
| 23 T.CheckCall(T.Val("3[object Object]"), T.Val("3"), T.NewObject("({})")); |
| 24 } |
| 25 |
| 26 |
| 27 TEST(BinopSubtract) { |
| 28 FunctionTester T("(function(a,b) { return a - b; })"); |
| 29 |
| 30 T.CheckCall(3, 4, 1); |
| 31 T.CheckCall(3.0, 4.5, 1.5); |
| 32 T.CheckCall(T.Val(-9), T.Val("0"), T.Val(9)); |
| 33 T.CheckCall(T.Val(-9), T.Val(0.0), T.Val("9")); |
| 34 T.CheckCall(T.Val(1), T.Val("3"), T.Val("2")); |
| 35 T.CheckCall(T.nan(), T.Val("3"), T.Val("B")); |
| 36 T.CheckCall(T.Val(2), T.Val("3"), T.NewObject("([1])")); |
| 37 T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})")); |
| 38 } |
| 39 |
| 40 |
| 41 TEST(BinopMultiply) { |
| 42 FunctionTester T("(function(a,b) { return a * b; })"); |
| 43 |
| 44 T.CheckCall(6, 3, 2); |
| 45 T.CheckCall(4.5, 2.0, 2.25); |
| 46 T.CheckCall(T.Val(6), T.Val("3"), T.Val(2)); |
| 47 T.CheckCall(T.Val(4.5), T.Val(2.0), T.Val("2.25")); |
| 48 T.CheckCall(T.Val(6), T.Val("3"), T.Val("2")); |
| 49 T.CheckCall(T.nan(), T.Val("3"), T.Val("B")); |
| 50 T.CheckCall(T.Val(3), T.Val("3"), T.NewObject("([1])")); |
| 51 T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})")); |
| 52 } |
| 53 |
| 54 |
| 55 TEST(BinopDivide) { |
| 56 FunctionTester T("(function(a,b) { return a / b; })"); |
| 57 |
| 58 T.CheckCall(2, 8, 4); |
| 59 T.CheckCall(2.1, 8.4, 4); |
| 60 T.CheckCall(V8_INFINITY, 8, 0); |
| 61 T.CheckCall(-V8_INFINITY, -8, 0); |
| 62 T.CheckCall(T.infinity(), T.Val(8), T.Val("0")); |
| 63 T.CheckCall(T.minus_infinity(), T.Val("-8"), T.Val(0.0)); |
| 64 T.CheckCall(T.Val(1.5), T.Val("3"), T.Val("2")); |
| 65 T.CheckCall(T.nan(), T.Val("3"), T.Val("B")); |
| 66 T.CheckCall(T.Val(1.5), T.Val("3"), T.NewObject("([2])")); |
| 67 T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})")); |
| 68 } |
| 69 |
| 70 |
| 71 TEST(BinopModulus) { |
| 72 FunctionTester T("(function(a,b) { return a % b; })"); |
| 73 |
| 74 T.CheckCall(3, 8, 5); |
| 75 T.CheckCall(T.Val(3), T.Val("8"), T.Val(5)); |
| 76 T.CheckCall(T.Val(3), T.Val(8), T.Val("5")); |
| 77 T.CheckCall(T.Val(1), T.Val("3"), T.Val("2")); |
| 78 T.CheckCall(T.nan(), T.Val("3"), T.Val("B")); |
| 79 T.CheckCall(T.Val(1), T.Val("3"), T.NewObject("([2])")); |
| 80 T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})")); |
| 81 } |
| 82 |
| 83 |
| 84 TEST(BinopShiftLeft) { |
| 85 FunctionTester T("(function(a,b) { return a << b; })"); |
| 86 |
| 87 T.CheckCall(4, 2, 1); |
| 88 T.CheckCall(T.Val(4), T.Val("2"), T.Val(1)); |
| 89 T.CheckCall(T.Val(4), T.Val(2), T.Val("1")); |
| 90 } |
| 91 |
| 92 |
| 93 TEST(BinopShiftRight) { |
| 94 FunctionTester T("(function(a,b) { return a >> b; })"); |
| 95 |
| 96 T.CheckCall(4, 8, 1); |
| 97 T.CheckCall(-4, -8, 1); |
| 98 T.CheckCall(T.Val(4), T.Val("8"), T.Val(1)); |
| 99 T.CheckCall(T.Val(4), T.Val(8), T.Val("1")); |
| 100 } |
| 101 |
| 102 |
| 103 TEST(BinopShiftRightLogical) { |
| 104 FunctionTester T("(function(a,b) { return a >>> b; })"); |
| 105 |
| 106 T.CheckCall(4, 8, 1); |
| 107 T.CheckCall(0x7ffffffc, -8, 1); |
| 108 T.CheckCall(T.Val(4), T.Val("8"), T.Val(1)); |
| 109 T.CheckCall(T.Val(4), T.Val(8), T.Val("1")); |
| 110 } |
| 111 |
| 112 |
| 113 TEST(BinopAnd) { |
| 114 FunctionTester T("(function(a,b) { return a & b; })"); |
| 115 |
| 116 T.CheckCall(7, 7, 15); |
| 117 T.CheckCall(7, 15, 7); |
| 118 T.CheckCall(T.Val(7), T.Val("15"), T.Val(7)); |
| 119 T.CheckCall(T.Val(7), T.Val(15), T.Val("7")); |
| 120 } |
| 121 |
| 122 |
| 123 TEST(BinopOr) { |
| 124 FunctionTester T("(function(a,b) { return a | b; })"); |
| 125 |
| 126 T.CheckCall(6, 4, 2); |
| 127 T.CheckCall(6, 2, 4); |
| 128 T.CheckCall(T.Val(6), T.Val("2"), T.Val(4)); |
| 129 T.CheckCall(T.Val(6), T.Val(2), T.Val("4")); |
| 130 } |
| 131 |
| 132 |
| 133 TEST(BinopXor) { |
| 134 FunctionTester T("(function(a,b) { return a ^ b; })"); |
| 135 |
| 136 T.CheckCall(7, 15, 8); |
| 137 T.CheckCall(7, 8, 15); |
| 138 T.CheckCall(T.Val(7), T.Val("8"), T.Val(15)); |
| 139 T.CheckCall(T.Val(7), T.Val(8), T.Val("15")); |
| 140 } |
| 141 |
| 142 |
| 143 TEST(BinopStrictEqual) { |
| 144 FunctionTester T("(function(a,b) { return a === b; })"); |
| 145 |
| 146 T.CheckTrue(7, 7); |
| 147 T.CheckFalse(7, 8); |
| 148 T.CheckTrue(7.1, 7.1); |
| 149 T.CheckFalse(7.1, 8.1); |
| 150 |
| 151 T.CheckTrue(T.Val("7.1"), T.Val("7.1")); |
| 152 T.CheckFalse(T.Val(7.1), T.Val("7.1")); |
| 153 T.CheckFalse(T.Val(7), T.undefined()); |
| 154 T.CheckFalse(T.undefined(), T.Val(7)); |
| 155 |
| 156 CompileRun("var o = { desc : 'I am a singleton' }"); |
| 157 T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])")); |
| 158 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); |
| 159 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); |
| 160 } |
| 161 |
| 162 |
| 163 TEST(BinopEqual) { |
| 164 FunctionTester T("(function(a,b) { return a == b; })"); |
| 165 |
| 166 T.CheckTrue(7, 7); |
| 167 T.CheckFalse(7, 8); |
| 168 T.CheckTrue(7.1, 7.1); |
| 169 T.CheckFalse(7.1, 8.1); |
| 170 |
| 171 T.CheckTrue(T.Val("7.1"), T.Val("7.1")); |
| 172 T.CheckTrue(T.Val(7.1), T.Val("7.1")); |
| 173 |
| 174 CompileRun("var o = { desc : 'I am a singleton' }"); |
| 175 T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])")); |
| 176 T.CheckFalse(T.NewObject("({})"), T.NewObject("({})")); |
| 177 T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)")); |
| 178 } |
| 179 |
| 180 |
| 181 TEST(BinopNotEqual) { |
| 182 FunctionTester T("(function(a,b) { return a != b; })"); |
| 183 |
| 184 T.CheckFalse(7, 7); |
| 185 T.CheckTrue(7, 8); |
| 186 T.CheckFalse(7.1, 7.1); |
| 187 T.CheckTrue(7.1, 8.1); |
| 188 |
| 189 T.CheckFalse(T.Val("7.1"), T.Val("7.1")); |
| 190 T.CheckFalse(T.Val(7.1), T.Val("7.1")); |
| 191 |
| 192 CompileRun("var o = { desc : 'I am a singleton' }"); |
| 193 T.CheckTrue(T.NewObject("([1])"), T.NewObject("([1])")); |
| 194 T.CheckTrue(T.NewObject("({})"), T.NewObject("({})")); |
| 195 T.CheckFalse(T.NewObject("(o)"), T.NewObject("(o)")); |
| 196 } |
| 197 |
| 198 |
| 199 TEST(BinopLessThan) { |
| 200 FunctionTester T("(function(a,b) { return a < b; })"); |
| 201 |
| 202 T.CheckTrue(7, 8); |
| 203 T.CheckFalse(8, 7); |
| 204 T.CheckTrue(-8.1, -8); |
| 205 T.CheckFalse(-8, -8.1); |
| 206 T.CheckFalse(0.111, 0.111); |
| 207 |
| 208 T.CheckFalse(T.Val("7.1"), T.Val("7.1")); |
| 209 T.CheckFalse(T.Val(7.1), T.Val("6.1")); |
| 210 T.CheckFalse(T.Val(7.1), T.Val("7.1")); |
| 211 T.CheckTrue(T.Val(7.1), T.Val("8.1")); |
| 212 } |
| 213 |
| 214 |
| 215 TEST(BinopLessThanEqual) { |
| 216 FunctionTester T("(function(a,b) { return a <= b; })"); |
| 217 |
| 218 T.CheckTrue(7, 8); |
| 219 T.CheckFalse(8, 7); |
| 220 T.CheckTrue(-8.1, -8); |
| 221 T.CheckFalse(-8, -8.1); |
| 222 T.CheckTrue(0.111, 0.111); |
| 223 |
| 224 T.CheckTrue(T.Val("7.1"), T.Val("7.1")); |
| 225 T.CheckFalse(T.Val(7.1), T.Val("6.1")); |
| 226 T.CheckTrue(T.Val(7.1), T.Val("7.1")); |
| 227 T.CheckTrue(T.Val(7.1), T.Val("8.1")); |
| 228 } |
| 229 |
| 230 |
| 231 TEST(BinopGreaterThan) { |
| 232 FunctionTester T("(function(a,b) { return a > b; })"); |
| 233 |
| 234 T.CheckFalse(7, 8); |
| 235 T.CheckTrue(8, 7); |
| 236 T.CheckFalse(-8.1, -8); |
| 237 T.CheckTrue(-8, -8.1); |
| 238 T.CheckFalse(0.111, 0.111); |
| 239 |
| 240 T.CheckFalse(T.Val("7.1"), T.Val("7.1")); |
| 241 T.CheckTrue(T.Val(7.1), T.Val("6.1")); |
| 242 T.CheckFalse(T.Val(7.1), T.Val("7.1")); |
| 243 T.CheckFalse(T.Val(7.1), T.Val("8.1")); |
| 244 } |
| 245 |
| 246 |
| 247 TEST(BinopGreaterThanOrEqual) { |
| 248 FunctionTester T("(function(a,b) { return a >= b; })"); |
| 249 |
| 250 T.CheckFalse(7, 8); |
| 251 T.CheckTrue(8, 7); |
| 252 T.CheckFalse(-8.1, -8); |
| 253 T.CheckTrue(-8, -8.1); |
| 254 T.CheckTrue(0.111, 0.111); |
| 255 |
| 256 T.CheckTrue(T.Val("7.1"), T.Val("7.1")); |
| 257 T.CheckTrue(T.Val(7.1), T.Val("6.1")); |
| 258 T.CheckTrue(T.Val(7.1), T.Val("7.1")); |
| 259 T.CheckFalse(T.Val(7.1), T.Val("8.1")); |
| 260 } |
| 261 |
| 262 |
| 263 TEST(BinopIn) { |
| 264 FunctionTester T("(function(a,b) { return a in b; })"); |
| 265 |
| 266 T.CheckTrue(T.Val("x"), T.NewObject("({x:23})")); |
| 267 T.CheckFalse(T.Val("y"), T.NewObject("({x:42})")); |
| 268 T.CheckFalse(T.Val(123), T.NewObject("({x:65})")); |
| 269 T.CheckTrue(T.Val(1), T.NewObject("([1,2,3])")); |
| 270 } |
| 271 |
| 272 |
| 273 TEST(BinopInstanceOf) { |
| 274 FunctionTester T("(function(a,b) { return a instanceof b; })"); |
| 275 |
| 276 T.CheckTrue(T.NewObject("(new Number(23))"), T.NewObject("Number")); |
| 277 T.CheckFalse(T.NewObject("(new Number(23))"), T.NewObject("String")); |
| 278 T.CheckFalse(T.NewObject("(new String('a'))"), T.NewObject("Number")); |
| 279 T.CheckTrue(T.NewObject("(new String('b'))"), T.NewObject("String")); |
| 280 T.CheckFalse(T.Val(1), T.NewObject("Number")); |
| 281 T.CheckFalse(T.Val("abc"), T.NewObject("String")); |
| 282 |
| 283 CompileRun("var bound = (function() {}).bind(undefined)"); |
| 284 T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("bound")); |
| 285 T.CheckTrue(T.NewObject("(new bound())"), T.NewObject("Object")); |
| 286 T.CheckFalse(T.NewObject("(new bound())"), T.NewObject("Number")); |
| 287 } |
| 288 |
| 289 |
| 290 TEST(UnopNot) { |
| 291 FunctionTester T("(function(a) { return !a; })"); |
| 292 |
| 293 T.CheckCall(T.true_value(), T.false_value(), T.undefined()); |
| 294 T.CheckCall(T.false_value(), T.true_value(), T.undefined()); |
| 295 T.CheckCall(T.true_value(), T.Val(0.0), T.undefined()); |
| 296 T.CheckCall(T.false_value(), T.Val(123), T.undefined()); |
| 297 T.CheckCall(T.false_value(), T.Val("x"), T.undefined()); |
| 298 T.CheckCall(T.true_value(), T.undefined(), T.undefined()); |
| 299 T.CheckCall(T.true_value(), T.nan(), T.undefined()); |
| 300 } |
| 301 |
| 302 |
| 303 TEST(UnopCountPost) { |
| 304 FunctionTester T("(function(a) { return a++; })"); |
| 305 |
| 306 T.CheckCall(T.Val(0.0), T.Val(0.0), T.undefined()); |
| 307 T.CheckCall(T.Val(2.3), T.Val(2.3), T.undefined()); |
| 308 T.CheckCall(T.Val(123), T.Val(123), T.undefined()); |
| 309 T.CheckCall(T.Val(7), T.Val("7"), T.undefined()); |
| 310 T.CheckCall(T.nan(), T.Val("x"), T.undefined()); |
| 311 T.CheckCall(T.nan(), T.undefined(), T.undefined()); |
| 312 T.CheckCall(T.Val(1.0), T.true_value(), T.undefined()); |
| 313 T.CheckCall(T.Val(0.0), T.false_value(), T.undefined()); |
| 314 T.CheckCall(T.nan(), T.nan(), T.undefined()); |
| 315 } |
| 316 |
| 317 |
| 318 TEST(UnopCountPre) { |
| 319 FunctionTester T("(function(a) { return ++a; })"); |
| 320 |
| 321 T.CheckCall(T.Val(1.0), T.Val(0.0), T.undefined()); |
| 322 T.CheckCall(T.Val(3.3), T.Val(2.3), T.undefined()); |
| 323 T.CheckCall(T.Val(124), T.Val(123), T.undefined()); |
| 324 T.CheckCall(T.Val(8), T.Val("7"), T.undefined()); |
| 325 T.CheckCall(T.nan(), T.Val("x"), T.undefined()); |
| 326 T.CheckCall(T.nan(), T.undefined(), T.undefined()); |
| 327 T.CheckCall(T.Val(2.0), T.true_value(), T.undefined()); |
| 328 T.CheckCall(T.Val(1.0), T.false_value(), T.undefined()); |
| 329 T.CheckCall(T.nan(), T.nan(), T.undefined()); |
| 330 } |
| 331 |
| 332 |
| 333 TEST(PropertyNamedLoad) { |
| 334 FunctionTester T("(function(a,b) { return a.x; })"); |
| 335 |
| 336 T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined()); |
| 337 T.CheckCall(T.undefined(), T.NewObject("({y:23})"), T.undefined()); |
| 338 } |
| 339 |
| 340 |
| 341 TEST(PropertyKeyedLoad) { |
| 342 FunctionTester T("(function(a,b) { return a[b]; })"); |
| 343 |
| 344 T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.Val("x")); |
| 345 T.CheckCall(T.Val(42), T.NewObject("([23,42,65])"), T.Val(1)); |
| 346 T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val("y")); |
| 347 T.CheckCall(T.undefined(), T.NewObject("([23,42,65])"), T.Val(4)); |
| 348 } |
| 349 |
| 350 |
| 351 TEST(PropertyNamedStore) { |
| 352 FunctionTester T("(function(a) { a.x = 7; return a.x; })"); |
| 353 |
| 354 T.CheckCall(T.Val(7), T.NewObject("({})"), T.undefined()); |
| 355 T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.undefined()); |
| 356 } |
| 357 |
| 358 |
| 359 TEST(PropertyKeyedStore) { |
| 360 FunctionTester T("(function(a,b) { a[b] = 7; return a.x; })"); |
| 361 |
| 362 T.CheckCall(T.Val(7), T.NewObject("({})"), T.Val("x")); |
| 363 T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.Val("x")); |
| 364 T.CheckCall(T.Val(9), T.NewObject("({x:9})"), T.Val("y")); |
| 365 } |
| 366 |
| 367 |
| 368 TEST(PropertyNamedDelete) { |
| 369 FunctionTester T("(function(a) { return delete a.x; })"); |
| 370 |
| 371 CompileRun("var o = Object.create({}, { x: { value:23 } });"); |
| 372 T.CheckTrue(T.NewObject("({x:42})"), T.undefined()); |
| 373 T.CheckTrue(T.NewObject("({})"), T.undefined()); |
| 374 T.CheckFalse(T.NewObject("(o)"), T.undefined()); |
| 375 } |
| 376 |
| 377 |
| 378 TEST(PropertyKeyedDelete) { |
| 379 FunctionTester T("(function(a, b) { return delete a[b]; })"); |
| 380 |
| 381 CompileRun("function getX() { return 'x'; }"); |
| 382 CompileRun("var o = Object.create({}, { x: { value:23 } });"); |
| 383 T.CheckTrue(T.NewObject("({x:42})"), T.Val("x")); |
| 384 T.CheckFalse(T.NewObject("(o)"), T.Val("x")); |
| 385 T.CheckFalse(T.NewObject("(o)"), T.NewObject("({toString:getX})")); |
| 386 } |
| 387 |
| 388 |
| 389 TEST(GlobalLoad) { |
| 390 FunctionTester T("(function() { return g; })"); |
| 391 |
| 392 T.CheckThrows(T.undefined(), T.undefined()); |
| 393 CompileRun("var g = 23;"); |
| 394 T.CheckCall(T.Val(23)); |
| 395 } |
| 396 |
| 397 |
| 398 TEST(GlobalStoreSloppy) { |
| 399 FunctionTester T("(function(a,b) { g = a + b; return g; })"); |
| 400 |
| 401 T.CheckCall(T.Val(33), T.Val(22), T.Val(11)); |
| 402 CompileRun("delete g"); |
| 403 CompileRun("const g = 23"); |
| 404 T.CheckCall(T.Val(23), T.Val(55), T.Val(44)); |
| 405 } |
| 406 |
| 407 |
| 408 TEST(GlobalStoreStrict) { |
| 409 FunctionTester T("(function(a,b) { 'use strict'; g = a + b; return g; })"); |
| 410 |
| 411 T.CheckThrows(T.Val(22), T.Val(11)); |
| 412 CompileRun("var g = 'a global variable';"); |
| 413 T.CheckCall(T.Val(33), T.Val(22), T.Val(11)); |
| 414 } |
| 415 |
| 416 |
| 417 TEST(ContextLoad) { |
| 418 FunctionTester T("(function(a,b) { (function(){a}); return a + b; })"); |
| 419 |
| 420 T.CheckCall(T.Val(65), T.Val(23), T.Val(42)); |
| 421 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b")); |
| 422 } |
| 423 |
| 424 |
| 425 TEST(ContextStore) { |
| 426 FunctionTester T("(function(a,b) { (function(){x}); var x = a; return x; })"); |
| 427 |
| 428 T.CheckCall(T.Val(23), T.Val(23), T.undefined()); |
| 429 T.CheckCall(T.Val("a"), T.Val("a"), T.undefined()); |
| 430 } |
| 431 |
| 432 |
| 433 TEST(LookupLoad) { |
| 434 FunctionTester T("(function(a,b) { with(a) { return x + b; } })"); |
| 435 |
| 436 T.CheckCall(T.Val(24), T.NewObject("({x:23})"), T.Val(1)); |
| 437 T.CheckCall(T.Val(32), T.NewObject("({x:23, b:9})"), T.Val(2)); |
| 438 T.CheckCall(T.Val(45), T.NewObject("({__proto__:{x:42}})"), T.Val(3)); |
| 439 T.CheckCall(T.Val(69), T.NewObject("({get x() { return 65; }})"), T.Val(4)); |
| 440 } |
| 441 |
| 442 |
| 443 TEST(LookupStore) { |
| 444 FunctionTester T("(function(a,b) { var x; with(a) { x = b; } return x; })"); |
| 445 |
| 446 T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val(1)); |
| 447 T.CheckCall(T.Val(2), T.NewObject("({y:23})"), T.Val(2)); |
| 448 T.CheckCall(T.Val(23), T.NewObject("({b:23})"), T.Val(3)); |
| 449 T.CheckCall(T.undefined(), T.NewObject("({__proto__:{x:42}})"), T.Val(4)); |
| 450 } |
| 451 |
| 452 |
| 453 TEST(BlockLoadStore) { |
| 454 FLAG_harmony_scoping = true; |
| 455 FunctionTester T("(function(a) { 'use strict'; { let x = a+a; return x; }})"); |
| 456 |
| 457 T.CheckCall(T.Val(46), T.Val(23)); |
| 458 T.CheckCall(T.Val("aa"), T.Val("a")); |
| 459 } |
| 460 |
| 461 |
| 462 TEST(BlockLoadStoreNested) { |
| 463 FLAG_harmony_scoping = true; |
| 464 const char* src = |
| 465 "(function(a,b) {" |
| 466 "'use strict';" |
| 467 "{ let x = a, y = a;" |
| 468 " { let y = b;" |
| 469 " return x + y;" |
| 470 " }" |
| 471 "}})"; |
| 472 FunctionTester T(src); |
| 473 |
| 474 T.CheckCall(T.Val(65), T.Val(23), T.Val(42)); |
| 475 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b")); |
| 476 } |
| 477 |
| 478 |
| 479 TEST(ObjectLiteralComputed) { |
| 480 FunctionTester T("(function(a,b) { o = { x:a+b }; return o.x; })"); |
| 481 |
| 482 T.CheckCall(T.Val(65), T.Val(23), T.Val(42)); |
| 483 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b")); |
| 484 } |
| 485 |
| 486 |
| 487 TEST(ObjectLiteralNonString) { |
| 488 FunctionTester T("(function(a,b) { o = { 7:a+b }; return o[7]; })"); |
| 489 |
| 490 T.CheckCall(T.Val(65), T.Val(23), T.Val(42)); |
| 491 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b")); |
| 492 } |
| 493 |
| 494 |
| 495 TEST(ObjectLiteralPrototype) { |
| 496 FunctionTester T("(function(a) { o = { __proto__:a }; return o.x; })"); |
| 497 |
| 498 T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined()); |
| 499 T.CheckCall(T.undefined(), T.NewObject("({y:42})"), T.undefined()); |
| 500 } |
| 501 |
| 502 |
| 503 TEST(ObjectLiteralGetter) { |
| 504 FunctionTester T("(function(a) { o = { get x() {return a} }; return o.x; })"); |
| 505 |
| 506 T.CheckCall(T.Val(23), T.Val(23), T.undefined()); |
| 507 T.CheckCall(T.Val("x"), T.Val("x"), T.undefined()); |
| 508 } |
| 509 |
| 510 |
| 511 TEST(ArrayLiteral) { |
| 512 FunctionTester T("(function(a,b) { o = [1, a + b, 3]; return o[1]; })"); |
| 513 |
| 514 T.CheckCall(T.Val(65), T.Val(23), T.Val(42)); |
| 515 T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b")); |
| 516 } |
| 517 |
| 518 |
| 519 TEST(RegExpLiteral) { |
| 520 FunctionTester T("(function(a) { o = /b/; return o.test(a); })"); |
| 521 |
| 522 T.CheckTrue(T.Val("abc")); |
| 523 T.CheckFalse(T.Val("xyz")); |
| 524 } |
OLD | NEW |