| Index: test/cctest/compiler/compiler/test-run-jsops.cc
 | 
| diff --git a/test/cctest/compiler/compiler/test-run-jsops.cc b/test/cctest/compiler/compiler/test-run-jsops.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..68e8bd572240a051aa641d5cf0078e23ffcdc3c4
 | 
| --- /dev/null
 | 
| +++ b/test/cctest/compiler/compiler/test-run-jsops.cc
 | 
| @@ -0,0 +1,522 @@
 | 
| +// Copyright 2014 the V8 project authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +
 | 
| +#include "src/v8.h"
 | 
| +
 | 
| +#include "test/cctest/compiler/function-tester.h"
 | 
| +
 | 
| +using namespace v8::internal;
 | 
| +using namespace v8::internal::compiler;
 | 
| +
 | 
| +TEST(BinopAdd) {
 | 
| +  FunctionTester T("(function(a,b) { return a + b; })");
 | 
| +
 | 
| +  T.CheckCall(3,      1,    2);
 | 
| +  T.CheckCall(-11,   -2,   -9);
 | 
| +  T.CheckCall(-11, -1.5, -9.5);
 | 
| +  T.CheckCall(T.Val("AB"), T.Val("A"), T.Val("B"));
 | 
| +  T.CheckCall(T.Val("A11"), T.Val("A"), T.Val(11));
 | 
| +  T.CheckCall(T.Val("12B"), T.Val(12), T.Val("B"));
 | 
| +  T.CheckCall(T.Val("38"), T.Val("3"), T.Val("8"));
 | 
| +  T.CheckCall(T.Val("31"), T.Val("3"), T.NewObject("([1])"));
 | 
| +  T.CheckCall(T.Val("3[object Object]"), T.Val("3"), T.NewObject("({})"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopSubtract) {
 | 
| +  FunctionTester T("(function(a,b) { return a - b; })");
 | 
| +
 | 
| +  T.CheckCall(3,      4,   1);
 | 
| +  T.CheckCall(3.0,  4.5, 1.5);
 | 
| +  T.CheckCall(T.Val(-9), T.Val("0"), T.Val(9));
 | 
| +  T.CheckCall(T.Val(-9), T.Val(0.0), T.Val("9"));
 | 
| +  T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
 | 
| +  T.CheckCall(T.Val(2), T.Val("3"), T.NewObject("([1])"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopMultiply) {
 | 
| +  FunctionTester T("(function(a,b) { return a * b; })");
 | 
| +
 | 
| +  T.CheckCall(6,      3,    2);
 | 
| +  T.CheckCall(4.5,  2.0, 2.25);
 | 
| +  T.CheckCall(T.Val(6), T.Val("3"), T.Val(2));
 | 
| +  T.CheckCall(T.Val(4.5), T.Val(2.0), T.Val("2.25"));
 | 
| +  T.CheckCall(T.Val(6), T.Val("3"), T.Val("2"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
 | 
| +  T.CheckCall(T.Val(3), T.Val("3"), T.NewObject("([1])"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopDivide) {
 | 
| +  FunctionTester T("(function(a,b) { return a / b; })");
 | 
| +
 | 
| +  T.CheckCall(2,               8, 4);
 | 
| +  T.CheckCall(2.1,           8.4, 4);
 | 
| +  T.CheckCall(V8_INFINITY,     8, 0);
 | 
| +  T.CheckCall(-V8_INFINITY,   -8, 0);
 | 
| +  T.CheckCall(T.infinity(), T.Val(8), T.Val("0"));
 | 
| +  T.CheckCall(T.minus_infinity(), T.Val("-8"), T.Val(0.0));
 | 
| +  T.CheckCall(T.Val(1.5), T.Val("3"), T.Val("2"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
 | 
| +  T.CheckCall(T.Val(1.5), T.Val("3"), T.NewObject("([2])"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopModulus) {
 | 
| +  FunctionTester T("(function(a,b) { return a % b; })");
 | 
| +
 | 
| +  T.CheckCall(3, 8, 5);
 | 
| +  T.CheckCall(T.Val(3), T.Val("8"), T.Val(5));
 | 
| +  T.CheckCall(T.Val(3), T.Val(8), T.Val("5"));
 | 
| +  T.CheckCall(T.Val(1), T.Val("3"), T.Val("2"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.Val("B"));
 | 
| +  T.CheckCall(T.Val(1), T.Val("3"), T.NewObject("([2])"));
 | 
| +  T.CheckCall(T.nan(), T.Val("3"), T.NewObject("({})"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopShiftLeft) {
 | 
| +  FunctionTester T("(function(a,b) { return a << b; })");
 | 
| +
 | 
| +  T.CheckCall(4, 2, 1);
 | 
| +  T.CheckCall(T.Val(4), T.Val("2"), T.Val(1));
 | 
| +  T.CheckCall(T.Val(4), T.Val(2), T.Val("1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopShiftRight) {
 | 
| +  FunctionTester T("(function(a,b) { return a >> b; })");
 | 
| +
 | 
| +  T.CheckCall(4, 8, 1);
 | 
| +  T.CheckCall(-4, -8, 1);
 | 
| +  T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
 | 
| +  T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopShiftRightLogical) {
 | 
| +  FunctionTester T("(function(a,b) { return a >>> b; })");
 | 
| +
 | 
| +  T.CheckCall(4, 8, 1);
 | 
| +  T.CheckCall(0x7ffffffc, -8, 1);
 | 
| +  T.CheckCall(T.Val(4), T.Val("8"), T.Val(1));
 | 
| +  T.CheckCall(T.Val(4), T.Val(8), T.Val("1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopAnd) {
 | 
| +  FunctionTester T("(function(a,b) { return a & b; })");
 | 
| +
 | 
| +  T.CheckCall(7, 7, 15);
 | 
| +  T.CheckCall(7, 15, 7);
 | 
| +  T.CheckCall(T.Val(7), T.Val("15"), T.Val(7));
 | 
| +  T.CheckCall(T.Val(7), T.Val(15), T.Val("7"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopOr) {
 | 
| +  FunctionTester T("(function(a,b) { return a | b; })");
 | 
| +
 | 
| +  T.CheckCall(6, 4, 2);
 | 
| +  T.CheckCall(6, 2, 4);
 | 
| +  T.CheckCall(T.Val(6), T.Val("2"), T.Val(4));
 | 
| +  T.CheckCall(T.Val(6), T.Val(2), T.Val("4"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopXor) {
 | 
| +  FunctionTester T("(function(a,b) { return a ^ b; })");
 | 
| +
 | 
| +  T.CheckCall(7, 15, 8);
 | 
| +  T.CheckCall(7, 8, 15);
 | 
| +  T.CheckCall(T.Val(7), T.Val("8"), T.Val(15));
 | 
| +  T.CheckCall(T.Val(7), T.Val(8), T.Val("15"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopStrictEqual) {
 | 
| +  FunctionTester T("(function(a,b) { return a === b; })");
 | 
| +
 | 
| +  T.CheckTrue(7, 7);
 | 
| +  T.CheckFalse(7, 8);
 | 
| +  T.CheckTrue(7.1, 7.1);
 | 
| +  T.CheckFalse(7.1, 8.1);
 | 
| +
 | 
| +  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7), T.undefined());
 | 
| +  T.CheckFalse(T.undefined(), T.Val(7));
 | 
| +
 | 
| +  CompileRun("var o = { desc : 'I am a singleton' }");
 | 
| +  T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
 | 
| +  T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
 | 
| +  T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopEqual) {
 | 
| +  FunctionTester T("(function(a,b) { return a == b; })");
 | 
| +
 | 
| +  T.CheckTrue(7, 7);
 | 
| +  T.CheckFalse(7, 8);
 | 
| +  T.CheckTrue(7.1, 7.1);
 | 
| +  T.CheckFalse(7.1, 8.1);
 | 
| +
 | 
| +  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("7.1"));
 | 
| +
 | 
| +  CompileRun("var o = { desc : 'I am a singleton' }");
 | 
| +  T.CheckFalse(T.NewObject("([1])"), T.NewObject("([1])"));
 | 
| +  T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
 | 
| +  T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopNotEqual) {
 | 
| +  FunctionTester T("(function(a,b) { return a != b; })");
 | 
| +
 | 
| +  T.CheckFalse(7, 7);
 | 
| +  T.CheckTrue(7, 8);
 | 
| +  T.CheckFalse(7.1, 7.1);
 | 
| +  T.CheckTrue(7.1, 8.1);
 | 
| +
 | 
| +  T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
 | 
| +
 | 
| +  CompileRun("var o = { desc : 'I am a singleton' }");
 | 
| +  T.CheckTrue(T.NewObject("([1])"), T.NewObject("([1])"));
 | 
| +  T.CheckTrue(T.NewObject("({})"), T.NewObject("({})"));
 | 
| +  T.CheckFalse(T.NewObject("(o)"), T.NewObject("(o)"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopLessThan) {
 | 
| +  FunctionTester T("(function(a,b) { return a < b; })");
 | 
| +
 | 
| +  T.CheckTrue(7, 8);
 | 
| +  T.CheckFalse(8, 7);
 | 
| +  T.CheckTrue(-8.1, -8);
 | 
| +  T.CheckFalse(-8, -8.1);
 | 
| +  T.CheckFalse(0.111, 0.111);
 | 
| +
 | 
| +  T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("6.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("8.1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopLessThanEqual) {
 | 
| +  FunctionTester T("(function(a,b) { return a <= b; })");
 | 
| +
 | 
| +  T.CheckTrue(7, 8);
 | 
| +  T.CheckFalse(8, 7);
 | 
| +  T.CheckTrue(-8.1, -8);
 | 
| +  T.CheckFalse(-8, -8.1);
 | 
| +  T.CheckTrue(0.111, 0.111);
 | 
| +
 | 
| +  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("6.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("7.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("8.1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopGreaterThan) {
 | 
| +  FunctionTester T("(function(a,b) { return a > b; })");
 | 
| +
 | 
| +  T.CheckFalse(7, 8);
 | 
| +  T.CheckTrue(8, 7);
 | 
| +  T.CheckFalse(-8.1, -8);
 | 
| +  T.CheckTrue(-8, -8.1);
 | 
| +  T.CheckFalse(0.111, 0.111);
 | 
| +
 | 
| +  T.CheckFalse(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("6.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("8.1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopGreaterThanOrEqual) {
 | 
| +  FunctionTester T("(function(a,b) { return a >= b; })");
 | 
| +
 | 
| +  T.CheckFalse(7, 8);
 | 
| +  T.CheckTrue(8, 7);
 | 
| +  T.CheckFalse(-8.1, -8);
 | 
| +  T.CheckTrue(-8, -8.1);
 | 
| +  T.CheckTrue(0.111, 0.111);
 | 
| +
 | 
| +  T.CheckTrue(T.Val("7.1"), T.Val("7.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("6.1"));
 | 
| +  T.CheckTrue(T.Val(7.1), T.Val("7.1"));
 | 
| +  T.CheckFalse(T.Val(7.1), T.Val("8.1"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopIn) {
 | 
| +  FunctionTester T("(function(a,b) { return a in b; })");
 | 
| +
 | 
| +  T.CheckTrue(T.Val("x"), T.NewObject("({x:23})"));
 | 
| +  T.CheckFalse(T.Val("y"), T.NewObject("({x:42})"));
 | 
| +  T.CheckFalse(T.Val(123), T.NewObject("({x:65})"));
 | 
| +  T.CheckTrue(T.Val(1), T.NewObject("([1,2,3])"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BinopInstanceOf) {
 | 
| +  FunctionTester T("(function(a,b) { return a instanceof b; })");
 | 
| +
 | 
| +  T.CheckTrue(T.NewObject("(new Number(23))"),   T.NewObject("Number"));
 | 
| +  T.CheckFalse(T.NewObject("(new Number(23))"),  T.NewObject("String"));
 | 
| +  T.CheckFalse(T.NewObject("(new String('a'))"), T.NewObject("Number"));
 | 
| +  T.CheckTrue(T.NewObject("(new String('b'))"),  T.NewObject("String"));
 | 
| +  T.CheckFalse(T.Val(1),                         T.NewObject("Number"));
 | 
| +  T.CheckFalse(T.Val("abc"),                     T.NewObject("String"));
 | 
| +
 | 
| +  CompileRun("var bound = (function() {}).bind(undefined)");
 | 
| +  T.CheckTrue(T.NewObject("(new bound())"),      T.NewObject("bound"));
 | 
| +  T.CheckTrue(T.NewObject("(new bound())"),      T.NewObject("Object"));
 | 
| +  T.CheckFalse(T.NewObject("(new bound())"),     T.NewObject("Number"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(UnopNot) {
 | 
| +  FunctionTester T("(function(a) { return !a; })");
 | 
| +
 | 
| +  T.CheckCall(T.true_value(),  T.false_value(), T.undefined());
 | 
| +  T.CheckCall(T.false_value(), T.true_value(),  T.undefined());
 | 
| +  T.CheckCall(T.true_value(),  T.Val(0.0),      T.undefined());
 | 
| +  T.CheckCall(T.false_value(), T.Val(123),      T.undefined());
 | 
| +  T.CheckCall(T.false_value(), T.Val("x"),      T.undefined());
 | 
| +  T.CheckCall(T.true_value(),  T.undefined(),   T.undefined());
 | 
| +  T.CheckCall(T.true_value(),  T.nan(),         T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(UnopCountPost) {
 | 
| +  FunctionTester T("(function(a) { return a++; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(0.0), T.Val(0.0),      T.undefined());
 | 
| +  T.CheckCall(T.Val(2.3), T.Val(2.3),      T.undefined());
 | 
| +  T.CheckCall(T.Val(123), T.Val(123),      T.undefined());
 | 
| +  T.CheckCall(T.Val(7),   T.Val("7"),      T.undefined());
 | 
| +  T.CheckCall(T.nan(),    T.Val("x"),      T.undefined());
 | 
| +  T.CheckCall(T.nan(),    T.undefined(),   T.undefined());
 | 
| +  T.CheckCall(T.Val(1.0), T.true_value(),  T.undefined());
 | 
| +  T.CheckCall(T.Val(0.0), T.false_value(), T.undefined());
 | 
| +  T.CheckCall(T.nan(),    T.nan(),         T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(UnopCountPre) {
 | 
| +  FunctionTester T("(function(a) { return ++a; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(1.0), T.Val(0.0),      T.undefined());
 | 
| +  T.CheckCall(T.Val(3.3), T.Val(2.3),      T.undefined());
 | 
| +  T.CheckCall(T.Val(124), T.Val(123),      T.undefined());
 | 
| +  T.CheckCall(T.Val(8),   T.Val("7"),      T.undefined());
 | 
| +  T.CheckCall(T.nan(),    T.Val("x"),      T.undefined());
 | 
| +  T.CheckCall(T.nan(),    T.undefined(),   T.undefined());
 | 
| +  T.CheckCall(T.Val(2.0), T.true_value(),  T.undefined());
 | 
| +  T.CheckCall(T.Val(1.0), T.false_value(), T.undefined());
 | 
| +  T.CheckCall(T.nan(),    T.nan(),         T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(PropertyNamedLoad) {
 | 
| +  FunctionTester T("(function(a,b) { return a.x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.undefined());
 | 
| +  T.CheckCall(T.undefined(), T.NewObject("({y:23})"), T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(PropertyKeyedLoad) {
 | 
| +  FunctionTester T("(function(a,b) { return a[b]; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(23), T.NewObject("({x:23})"), T.Val("x"));
 | 
| +  T.CheckCall(T.Val(42), T.NewObject("([23,42,65])"), T.Val(1));
 | 
| +  T.CheckCall(T.undefined(), T.NewObject("({x:23})"), T.Val("y"));
 | 
| +  T.CheckCall(T.undefined(), T.NewObject("([23,42,65])"), T.Val(4));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(PropertyNamedStore) {
 | 
| +  FunctionTester T("(function(a) { a.x = 7; return a.x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(7), T.NewObject("({})"),     T.undefined());
 | 
| +  T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(PropertyKeyedStore) {
 | 
| +  FunctionTester T("(function(a,b) { a[b] = 7; return a.x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(7), T.NewObject("({})"),     T.Val("x"));
 | 
| +  T.CheckCall(T.Val(7), T.NewObject("({x:23})"), T.Val("x"));
 | 
| +  T.CheckCall(T.Val(9), T.NewObject("({x:9})"),  T.Val("y"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(PropertyNamedDelete) {
 | 
| +  FunctionTester T("(function(a) { return delete a.x; })");
 | 
| +
 | 
| +  CompileRun("var o = Object.create({}, { x: { value:23 } });");
 | 
| +  T.CheckTrue(T.NewObject("({x:42})"), T.undefined());
 | 
| +  T.CheckTrue(T.NewObject("({})"),     T.undefined());
 | 
| +  T.CheckFalse(T.NewObject("(o)"),     T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(PropertyKeyedDelete) {
 | 
| +  FunctionTester T("(function(a, b) { return delete a[b]; })");
 | 
| +
 | 
| +  CompileRun("function getX() { return 'x'; }");
 | 
| +  CompileRun("var o = Object.create({}, { x: { value:23 } });");
 | 
| +  T.CheckTrue(T.NewObject("({x:42})"), T.Val("x"));
 | 
| +  T.CheckFalse(T.NewObject("(o)"),     T.Val("x"));
 | 
| +  T.CheckFalse(T.NewObject("(o)"),     T.NewObject("({toString:getX})"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(GlobalLoad) {
 | 
| +  FunctionTester T("(function() { return g; })");
 | 
| +
 | 
| +  T.CheckThrows(T.undefined(), T.undefined());
 | 
| +  CompileRun("var g = 23;");
 | 
| +  T.CheckCall(T.Val(23));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(GlobalStoreSloppy) {
 | 
| +  FunctionTester T("(function(a,b) { g = a + b; return g; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
 | 
| +  CompileRun("delete g"); CompileRun("const g = 23");
 | 
| +  T.CheckCall(T.Val(23), T.Val(55), T.Val(44));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(GlobalStoreStrict) {
 | 
| +  FunctionTester T("(function(a,b) { 'use strict'; g = a + b; return g; })");
 | 
| +
 | 
| +  T.CheckThrows(T.Val(22), T.Val(11));
 | 
| +  CompileRun("var g = 'a global variable';");
 | 
| +  T.CheckCall(T.Val(33), T.Val(22), T.Val(11));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ContextLoad) {
 | 
| +  FunctionTester T("(function(a,b) { (function(){a}); return a + b; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(65),   T.Val(23),  T.Val(42));
 | 
| +  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ContextStore) {
 | 
| +  FunctionTester T("(function(a,b) { (function(){x}); var x = a; return x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(23),  T.Val(23),  T.undefined());
 | 
| +  T.CheckCall(T.Val("a"), T.Val("a"), T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(LookupLoad) {
 | 
| +  FunctionTester T("(function(a,b) { with(a) { return x + b; } })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(24), T.NewObject("({x:23})"),                   T.Val(1));
 | 
| +  T.CheckCall(T.Val(32), T.NewObject("({x:23, b:9})"),              T.Val(2));
 | 
| +  T.CheckCall(T.Val(45), T.NewObject("({__proto__:{x:42}})"),       T.Val(3));
 | 
| +  T.CheckCall(T.Val(69), T.NewObject("({get x() { return 65; }})"), T.Val(4));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(LookupStore) {
 | 
| +  FunctionTester T("(function(a,b) { var x; with(a) { x = b; } return x; })");
 | 
| +
 | 
| +  T.CheckCall(T.undefined(), T.NewObject("({x:23})"),             T.Val(1));
 | 
| +  T.CheckCall(T.Val(2),      T.NewObject("({y:23})"),             T.Val(2));
 | 
| +  T.CheckCall(T.Val(23),     T.NewObject("({b:23})"),             T.Val(3));
 | 
| +  T.CheckCall(T.undefined(), T.NewObject("({__proto__:{x:42}})"), T.Val(4));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BlockLoadStore) {
 | 
| +  FLAG_harmony_scoping = true;
 | 
| +  FunctionTester T("(function(a) { 'use strict'; { let x = a+a; return x; }})");
 | 
| +
 | 
| +  T.CheckCall(T.Val(46),   T.Val(23));
 | 
| +  T.CheckCall(T.Val("aa"), T.Val("a"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(BlockLoadStoreNested) {
 | 
| +  FLAG_harmony_scoping = true;
 | 
| +  const char* src = "(function(a,b) {"
 | 
| +      "'use strict';"
 | 
| +      "{ let x = a, y = a;"
 | 
| +      "  { let y = b;"
 | 
| +      "    return x + y;"
 | 
| +      "  }"
 | 
| +      "}})";
 | 
| +  FunctionTester T(src);
 | 
| +
 | 
| +  T.CheckCall(T.Val(65),   T.Val(23),  T.Val(42));
 | 
| +  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ObjectLiteralComputed) {
 | 
| +  FunctionTester T("(function(a,b) { o = { x:a+b }; return o.x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(65),   T.Val(23),  T.Val(42));
 | 
| +  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ObjectLiteralNonString) {
 | 
| +  FunctionTester T("(function(a,b) { o = { 7:a+b }; return o[7]; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(65),   T.Val(23),  T.Val(42));
 | 
| +  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ObjectLiteralPrototype) {
 | 
| +  FunctionTester T("(function(a) { o = { __proto__:a }; return o.x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(23),     T.NewObject("({x:23})"), T.undefined());
 | 
| +  T.CheckCall(T.undefined(), T.NewObject("({y:42})"), T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ObjectLiteralGetter) {
 | 
| +  FunctionTester T("(function(a) { o = { get x() {return a} }; return o.x; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(23),  T.Val(23),  T.undefined());
 | 
| +  T.CheckCall(T.Val("x"), T.Val("x"), T.undefined());
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(ArrayLiteral) {
 | 
| +  FunctionTester T("(function(a,b) { o = [1, a + b, 3]; return o[1]; })");
 | 
| +
 | 
| +  T.CheckCall(T.Val(65),   T.Val(23),  T.Val(42));
 | 
| +  T.CheckCall(T.Val("ab"), T.Val("a"), T.Val("b"));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST(RegExpLiteral) {
 | 
| +  FunctionTester T("(function(a) { o = /b/; return o.test(a); })");
 | 
| +
 | 
| +  T.CheckTrue(T.Val("abc"));
 | 
| +  T.CheckFalse(T.Val("xyz"));
 | 
| +}
 | 
| 
 |