Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame^] | 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 | } |