js/src/jit-test/tests/basic/testLet.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 var otherGlobal = newGlobal();
     3 function test(str, arg, result)
     4 {
     5     arg = arg || 'ponies';
     6     result = result || 'ponies';
     8     var fun = new Function('x', str);
    10     var got = fun.toSource();
    11     var expect = '(function anonymous(x) {\n' + str + '\n})';
    12     if (got !== expect) {
    13         print("GOT:    " + got);
    14         print("EXPECT: " + expect);
    15         assertEq(got, expect);
    16     }
    18     // test reflection logic
    19     Reflect.parse(got);
    21     // test xdr by cloning a cross-compartment function
    22     var code = "(function (x) { " + str + " })";
    23     var c = clone(otherGlobal.evaluate(code, {compileAndGo: false}));
    24     assertEq(c.toSource(), eval(code).toSource());
    26     var got = fun(arg);
    27     var expect = result;
    28     if (got !== expect) {
    29         print("GOT:" + got);
    30         print("EXPECT: " + expect);
    31         assertEq(got, expect);
    32     }
    33 }
    35 function isError(str)
    36 {
    37     var caught = false;
    38     try {
    39         new Function(str);
    40     } catch(e) {
    41         assertEq(String(e).indexOf('TypeError') == 0 || String(e).indexOf('SyntaxError') == 0, true);
    42         caught = true;
    43     }
    44     assertEq(caught, true);
    45 }
    47 // let expr
    48 test('return let (y) x;');
    49 test('return let (x) "" + x;', 'unicorns', 'undefined');
    50 test('return let (y = x) (y++, "" + y);', 'unicorns', 'NaN');
    51 test('return let (y = 1) (y = x, y);');
    52 test('return let ([] = x) x;');
    53 test('return let (x = {a: x}) x.a;');
    54 test('return let ({a: x} = {a: x}) x;');
    55 test('return let ([x] = {0: x}) x;');
    56 test('return let ({0: x} = [x]) x;');
    57 test('return let ({0: []} = []) x;');
    58 test('return let ([, ] = x) x;');
    59 test('return let ([, , , , ] = x) x;');
    60 test('return let ([[]] = x) x;');
    61 test('return let ([[[[[[[[[[[[[]]]]]]]]]]]]] = x) x;');
    62 test('return let ([[], []] = x) x;');
    63 test('return let ([[[[]]], [], , [], [[]]] = x) x;');
    64 test('return let ({x: []} = x) x;');
    65 test('return let ({x: [], y: {x: []}} = x) "ponies";', {y:{}});
    66 test('return let ({x: []} = x, [{x: []}] = x) "ponies";');
    67 test('return let (x = x) x;');
    68 test('return let (x = eval("x")) x;');
    69 test('return let (x = (let (x = x + 1) x) + 1) x;', 1, 3);
    70 test('return let (x = (let (x = eval("x") + 1) eval("x")) + 1) eval("x");', 1, 3);
    71 test('return let (x = x + 1, y = x) y;');
    72 test('return let (x = x + 1, [] = x, [[, , ]] = x, y = x) y;');
    73 test('return let ([{a: x}] = x, [, {b: y}] = x) let (x = x + 1, y = y + 2) x + y;', [{a:"p"},{b:"p"}], "p1p2");
    74 test('return let ([] = []) x;');
    75 test('return let ([] = [x]) x;');
    76 test('return let ([a] = (1, [x])) a;');
    77 test('return let ([a] = (1, x, 1, x)) a;', ['ponies']);
    78 test('return let ([x] = [x]) x;');
    79 test('return let ([[a, [b, c]]] = [[x, []]]) a;');
    80 test('return let ([x, y] = [x, x + 1]) x + y;', 1, 3);
    81 test('return let ([x, y, z] = [x, x + 1, x + 2]) x + y + z;', 1, 6);
    82 test('return let ([[x]] = [[x]]) x;');
    83 test('return let ([x, y] = [x, x + 1]) x;');
    84 test('return let ([x, [y, z]] = [x, x + 1]) x;');
    85 test('return let ([{x: [x]}, {y1: y, z1: z}] = [x, x + 1]) x;',{x:['ponies']});
    86 test('return let (x = (3, x)) x;');
    87 test('return let (x = x + "s") x;', 'ponie');
    88 test('return let ([x] = (3, [x])) x;');
    89 test('return let ([] = [[]] = {}) x;');
    90 test('return let (y = x) function () {return eval("y");}();');
    91 test('return eval("let (y = x) y");');
    92 test('return let (y = x) (eval("var y = 2"), y);', 'ponies', 2);
    93 test('"use strict";return let (y = x) (eval("var y = 2"), y);');
    94 test('this.y = x;return let (y = 1) this.eval("y");');
    95 test('try {let (x = x) eval("throw x");} catch (e) {return e;}');
    96 test('try {return let (x = eval("throw x")) x;} catch (e) {return e;}');
    97 isError('let (x = 1, x = 2) x');
    98 isError('let ([x, y] = a, {a:x} = b) x');
    99 isError('let ([x, y, x] = a) x');
   100 isError('let ([x, [y, [x]]] = a) x');
   101 isError('let (x = function() { return x}) x()return x;');
   102 isError('(let (x = function() { return x}) x())return x;');
   104 // let block
   105 test('let (y) {return x;}');
   106 test('let (y = x) {y++;return "" + y;}', 'unicorns', 'NaN');
   107 test('let (y = 1) {y = x;return y;}');
   108 test('let (x) {return "" + x;}', 'unicorns', 'undefined');
   109 test('let ([] = x) {return x;}');
   110 test('let (x) {}return x;');
   111 test('let (x = {a: x}) {return x.a;}');
   112 test('let ({a: x} = {a: x}) {return x;}');
   113 test('let ([x] = {0: x}) {return x;}');
   114 test('let ({0: x} = [x]) {return x;}');
   115 test('let ({0: []} = []) {return x;}');
   116 test('let ([, ] = x) {return x;}');
   117 test('let ([, , , , ] = x) {return x;}');
   118 test('let ([[]] = x) {return x;}');
   119 test('let ([[[[[[[[[[[[[]]]]]]]]]]]]] = x) {return x;}');
   120 test('let ([[], []] = x) {return x;}');
   121 test('let ([[[[]]], [], , [], [[]]] = x) {return x;}');
   122 test('let ({x: []} = x) {return x;}');
   123 test('let ({x: [], y: {x: []}} = x) {return "ponies";}', {y:{}});
   124 test('let ({x: []} = x, [{x: []}] = x) {return "ponies";}');
   125 test('let (x = x) {return x;}');
   126 test('let (x = eval("x")) {return x;}');
   127 test('let (x = (let (x = x + 1) x) + 1) {return x;}', 1, 3);
   128 test('let (x = (let (x = eval("x") + 1) eval("x")) + 1) {return eval("x");}', 1, 3);
   129 test('let (x = x + 1, y = x) {return y;}');
   130 test('let (x = x + 1, [] = x, [[, , ]] = x, y = x) {return y;}');
   131 test('let ([{a: x}] = x, [, {b: y}] = x) {let (x = x + 1, y = y + 2) {return x + y;}}', [{a:"p"},{b:"p"}], "p1p2");
   132 test('let ([] = []) {return x;}');
   133 test('let ([] = [x]) {return x;}');
   134 test('let ([a] = (1, [x])) {return a;}');
   135 test('let ([a] = (1, x, 1, x)) {return a;}', ['ponies']);
   136 test('let ([x] = [x]) {return x;}');
   137 test('let ([[a, [b, c]]] = [[x, []]]) {return a;}');
   138 test('let ([x, y] = [x, x + 1]) {return x + y;}', 1, 3);
   139 test('let ([x, y, z] = [x, x + 1, x + 2]) {return x + y + z;}', 1, 6);
   140 test('let ([[x]] = [[x]]) {return x;}');
   141 test('let ([x, y] = [x, x + 1]) {return x;}');
   142 test('let ([x, [y, z]] = [x, x + 1]) {return x;}');
   143 test('let ([{x: [x]}, {y1: y, z1: z}] = [x, x + 1]) {return x;}',{x:['ponies']});
   144 test('let (y = x[1]) {let (x = x[0]) {try {let (y = "unicorns") {throw y;}} catch (e) {return x + y;}}}', ['pon','ies']);
   145 test('let (x = x) {try {let (x = "unicorns") eval("throw x");} catch (e) {return x;}}');
   146 test('let ([] = [[]] = {}) {return x;}');
   147 test('let (y = x) {return function () {return eval("y");}();}');
   148 test('return eval("let (y = x) {y;}");');
   149 test('let (y = x) {eval("var y = 2");return y;}', 'ponies', 2);
   150 test('"use strict";let (y = x) {eval("var y = 2");return y;}');
   151 test('this.y = x;let (y = 1) {return this.eval("y");}');
   152 isError('let (x = 1, x = 2) {x}');
   153 isError('let ([x, y] = a, {a:x} = b) {x}');
   154 isError('let ([x, y, x] = a) {x}');
   155 isError('let ([x, [y, [x]]] = a) {x}');
   157 // var declarations
   158 test('var y;return x;');
   159 test('var y = x;return x;');
   160 test('var [] = x;return x;');
   161 test('var [, ] = x;return x;');
   162 test('var [, , , , ] = x;return x;');
   163 test('var [[]] = x;return x;');
   164 test('var [[[[[[[[[[[[[]]]]]]]]]]]]] = x;return x;');
   165 test('var [[], []] = x;return x;');
   166 test('var [[[[]]], [], , [], [[]]] = x;return x;');
   167 test('var {x: []} = x;return x;');
   168 test('var {x: [], y: {x: []}} = x;return "ponies";', {y:{}});
   169 test('var {x: []} = x, [{x: []}] = x;return "ponies";');
   170 test('var x = x;return x;');
   171 test('var y = y;return "" + y;', 'unicorns', 'undefined');
   172 test('var x = eval("x");return x;');
   173 test('var x = (let (x = x + 1) x) + 1;return x;', 1, 3);
   174 test('var x = (let (x = eval("x") + 1) eval("x")) + 1;return eval("x");', 1, 3);
   175 test('var X = x + 1, y = x;return y;');
   176 test('var X = x + 1, [] = X, [[, , ]] = X, y = x;return y;');
   177 test('var [{a: X}] = x, [, {b: y}] = x;var X = X + 1, y = y + 2;return X + y;', [{a:"p"},{b:"p"}], "p1p2");
   178 test('var [x] = [x];return x;');
   179 test('var [[a, [b, c]]] = [[x, []]];return a;');
   180 test('var [y] = [x];return y;');
   181 test('var [a] = (1, [x]);return a;');
   182 test('var [a] = (1, x, 1, x);return a;', ['ponies']);
   183 test('var [x, y] = [x, x + 1];return x + y;', 1, 3);
   184 test('var [x, y, z] = [x, x + 1, x + 2];return x + y + z;', 1, 6);
   185 test('var [[x]] = [[x]];return x;');
   186 test('var [x, y] = [x, x + 1];return x;');
   187 test('var [x, [y, z]] = [x, x + 1];return x;');
   188 test('var [{x: [x]}, {y1: y, z1: z}] = [x, x + 1];return x;',{x:['ponies']});
   189 test('var [] = [[]] = {};return x;');
   190 test('if (x) {var y = x;return x;}');
   191 test('if (x) {y = x;var y = y;return y;}');
   192 test('if (x) {var z = y;var [y] = x;z += y;}return z;', ['-'], 'undefined-');
   194 // let declaration in context
   195 test('if (x) {let y;return x;}');
   196 test('if (x) {let x;return "" + x;}', 'unicorns', 'undefined');
   197 test('if (x) {let y = x;return x;}');
   198 test('if (x) {y = x;let y = y;return y;}');
   199 test('if (x) {var z = y;let [y] = x;z += y;}return z;', ['-'], 'undefined-');
   200 test('if (x) {let y = x;return x;}');
   201 test('if (x) {let [] = x;return x;}');
   202 test('if (x) {let [, ] = x;return x;}');
   203 test('if (x) {let [, , , , ] = x;return x;}');
   204 test('if (x) {let [[]] = x;return x;}');
   205 test('if (x) {let [[[[[[[[[[[[[]]]]]]]]]]]]] = x;return x;}');
   206 test('if (x) {let [[], []] = x;return x;}');
   207 test('if (x) {let [[[[]]], [], , [], [[]]] = x;return x;}');
   208 test('if (x) {let {x: []} = x;return x;}');
   209 test('if (x) {let {x: [], y: {x: []}} = x;return "ponies";}', {y:{}});
   210 test('if (x) {let {x: []} = x, [{x: []}] = x;return "ponies";}');
   211 test('if (x) {let x = x;return "" + x;}', 'unicorns', 'undefined');
   212 test('if (x) {let y = y;return "" + y;}', 'unicorns', 'undefined');
   213 test('if (x) {let x = eval("x");return "" + x;}', 'unicorns', 'undefined');
   214 test('if (x) {let y = (let (x = x + 1) x) + 1;return y;}', 1, 3);
   215 test('if (x) {let y = (let (x = eval("x") + 1) eval("x")) + 1;return eval("y");}', 1, 3);
   216 test('if (x) {let X = x + 1, y = x;return y;}');
   217 test('if (x) {let X = x + 1, [] = X, [[, , ]] = X, y = x;return y;}');
   218 test('if (x) {let [{a: X}] = x, [, {b: Y}] = x;var XX = X + 1, YY = Y + 2;return XX + YY;}', [{a:"p"},{b:"p"}], "p1p2");
   219 test('if (x) {let [[a, [b, c]]] = [[x, []]];return a;}');
   220 test('if (x) {let [X] = [x];return X;}');
   221 test('if (x) {let [y] = [x];return y;}');
   222 test('if (x) {let [a] = (1, [x]);return a;}');
   223 test('if (x) {let [a] = (1, x, 1, x);return a;}', ['ponies']);
   224 test('if (x) {let [X, y] = [x, x + 1];return X + y;}', 1, 3);
   225 test('if (x) {let [X, y, z] = [x, x + 1, x + 2];return X + y + z;}', 1, 6);
   226 test('if (x) {let [[X]] = [[x]];return X;}');
   227 test('if (x) {let [X, y] = [x, x + 1];return X;}');
   228 test('if (x) {let [X, [y, z]] = [x, x + 1];return X;}');
   229 test('if (x) {let [{x: [X]}, {y1: y, z1: z}] = [x, x + 1];return X;}',{x:['ponies']});
   230 test('if (x) {let y = x;try {let x = 1;throw 2;} catch (e) {return y;}}');
   231 test('if (x) {let [] = [[]] = {};return x;}');
   232 test('let (y, [] = x) {}try {let a = b(), b;} catch (e) {return x;}');
   233 test('try {let x = 1;throw 2;} catch (e) {return x;}');
   234 test('let (y = x) {let x;return y;}');
   235 test('let (y = x) {let x = y;return x;}');
   236 test('let ([y, z] = x) {let a = x, b = y;return a;}');
   237 test('let ([y, z] = x, a = x, [] = x) {let b = x, c = y;return a;}');
   238 test('function f() {return unicorns;}try {let (x = 1) {let a, b;f();}} catch (e) {return x;}');
   239 test('function f() {return unicorns;}try {let (x = 1) {let a, b;}f();} catch (e) {return x;}');
   240 test('x.foo;{let y = x;return y;}');
   241 test('x.foo;if (x) {x.bar;let y = x;return y;}');
   242 test('if (x) {let y = x;return function () {return eval("y");}();}');
   243 test('return eval("let y = x; y");');
   244 test('if (x) {let y = x;eval("var y = 2");return y;}', 'ponies', 2);
   245 test('"use strict";if (x) {let y = x;eval("var y = 2");return y;}');
   246 test('"use strict";if (x) {let y = x;eval("let y = 2");return y;}');
   247 test('"use strict";if (x) {let y = 1;return eval("let y = x;y;");}');
   248 test('this.y = x;if (x) {let y = 1;return this.eval("y");}');
   249 isError('if (x) {let (x = 1, x = 2) {x}}');
   250 isError('if (x) {let ([x, y] = a, {a:x} = b) {x}}');
   251 isError('if (x) {let ([x, y, x] = a) {x}}');
   252 isError('if (x) {let ([x, [y, [x]]] = a) {x}}');
   253 isError('let ([x, y] = x) {let x;}');
   255 // for(;;)
   256 test('for (;;) {return x;}');
   257 test('for (let y = 1;;) {return x;}');
   258 test('for (let y = 1;; ++y) {return x;}');
   259 test('for (let y = 1; ++y;) {return x;}');
   260 test('for (let (x = 1) x; x != 1; ++x) {return x;}');
   261 test('for (let [, {a: [], b: []}] = x, [] = x; x;) {return x;}');
   262 test('for (let x = 1, [y, z] = x, a = x; z < 4; ++z) {return x + y;}', [2,3], 3);
   263 test('for (let (x = 1, [{a: b, c: d}] = [{a: 1, c: 2}]) x; x != 1; ++x) {return x;}');
   264 test('for (let [[a, [b, c]]] = [[x, []]];;) {return a;}');
   265 test('var sum = 0;for (let y = x; y < 4; ++y) {sum += y;}return sum;', 1, 6);
   266 test('var sum = 0;for (let x = x, y = 10; x < 4; ++x) {sum += x;}return sum;', 1, 6);
   267 test('var sum = 0;for (let x = x; x < 4; ++x) {sum += x;}return x;', 1, 1);
   268 test('var sum = 0;for (let x = eval("x"); x < 4; ++x) {sum += x;}return sum;', 1, 6);
   269 test('var sum = 0;for (let x = x; eval("x") < 4; ++x) {sum += eval("x");}return sum;', 1, 6);
   270 test('var sum = 0;for (let x = eval("x"); eval("x") < 4; ++x) {sum += eval("x");}return sum;', 1, 6);
   271 test('for (var y = 1;;) {return x;}');
   272 test('for (var y = 1;; ++y) {return x;}');
   273 test('for (var y = 1; ++y;) {return x;}');
   274 test('for (var [, {a: [], b: []}] = x, [] = x; x;) {return x;}');
   275 test('for (var X = 1, [y, z] = x, a = x; z < 4; ++z) {return X + y;}', [2,3], 3);
   276 test('var sum = 0;for (var y = x; y < 4; ++y) {sum += y;}return sum;', 1, 6);
   277 test('var sum = 0;for (var X = x, y = 10; X < 4; ++X) {sum += X;}return sum;', 1, 6);
   278 test('var sum = 0;for (var X = x; X < 4; ++X) {sum += X;}return x;', 1, 1);
   279 test('var sum = 0;for (var X = eval("x"); X < 4; ++X) {sum += X;}return sum;', 1, 6);
   280 test('var sum = 0;for (var X = x; eval("X") < 4; ++X) {sum += eval("X");}return sum;', 1, 6);
   281 test('var sum = 0;for (var X = eval("x"); eval("X") < 4; ++X) {sum += eval("X");}return sum;', 1, 6);
   282 test('try {for (let x = eval("throw x");;) {}} catch (e) {return e;}');
   283 test('try {for (let x = x + "s"; eval("throw x");) {}} catch (e) {return e;}', 'ponie');
   284 test('for (let y = x;;) {let x;return y;}');
   285 test('for (let y = x;;) {let y;return x;}');
   286 test('for (let y;;) {let y;return x;}');
   287 test('for (let a = x;;) {let c = x, d = x;return c;}');
   288 test('for (let [a, b] = x;;) {let c = x, d = x;return c;}');
   289 test('for (let [] = [[]] = {};;) {return x;}');
   290 test('for (let [a] = (1, [x]);;) {return a;}');
   291 test('for (let [a] = (1, x, 1, x);;) {return a;}', ['ponies']);
   292 isError('for (let x = 1, x = 2;;) {}');
   293 isError('for (let [x, y] = a, {a:x} = b;;) {}');
   294 isError('for (let [x, y, x] = a;;) {}');
   295 isError('for (let [x, [y, [x]]] = a;;) {}');
   297 // for(in)
   298 test('for (let i in x) {return x;}');
   299 test('for (let i in x) {let y;return x;}');
   300 test('for each (let [a, b] in x) {let y;return x;}');
   301 test('for (let i in x) {let (i = x) {return i;}}');
   302 test('for (let i in x) {let i = x;return i;}');
   303 test('for each (let [x, y] in x) {return x + y;}', [['ponies', '']]);
   304 test('for each (let [{0: x, 1: y}, z] in x) {return x + y + z;}', [[['po','nies'], '']]);
   305 test('var s = "";for (let a in x) {for (let b in x) {s += a + b;}}return s;', [1,2], '00011011');
   306 test('var res = "";for (let i in x) {res += x[i];}return res;');
   307 test('var res = "";for (var i in x) {res += x[i];}return res;');
   308 test('for each (let {x: y, y: x} in [{x: x, y: x}]) {return y;}');
   309 test('for (let x in eval("x")) {return x;}', {ponies:true});
   310 test('for (let x in x) {return eval("x");}', {ponies:true});
   311 test('for (let x in eval("x")) {return eval("x");}', {ponies:true});
   312 test('for ((let (x = {y: true}) x).y in eval("x")) {return eval("x");}');
   313 test('for (let i in x) {break;}return x;');
   314 test('for (let i in x) {break;}return eval("x");');
   315 test('for (let x in x) {break;}return x;');
   316 test('for (let x in x) {break;}return eval("x");');
   317 test('a:for (let i in x) {for (let j in x) {break a;}}return x;');
   318 test('a:for (let i in x) {for (let j in x) {break a;}}return eval("x");');
   319 test('var j;for (let i in x) {j = i;break;}return j;', {ponies:true});
   320 test('try {for (let x in eval("throw x")) {}} catch (e) {return e;}');
   321 test('try {for each (let x in x) {eval("throw x");}} catch (e) {return e;}', ['ponies']);
   322 isError('for (let [x, x] in o) {}');
   323 isError('for (let [x, y, x] in o) {}');
   324 isError('for (let [x, [y, [x]]] in o) {}');
   326 // genexps
   327 test('return (i for (i in x)).next();', {ponies:true});
   328 test('return (eval("i") for (i in x)).next();', {ponies:true});
   329 test('return (eval("i") for (i in eval("x"))).next();', {ponies:true});
   330 test('try {return (eval("throw i") for (i in x)).next();} catch (e) {return e;}', {ponies:true});
   332 // array comprehension
   333 test('return [i for (i in x)][0];', {ponies:true});
   334 test('return [eval("i") for (i in x)][0];', {ponies:true});
   335 test('return [eval("i") for (i in eval("x"))][0];', {ponies:true});
   336 test('try {return [eval("throw i") for (i in x)][0];} catch (e) {return e;}', {ponies:true});
   338 // don't forget about switch craziness
   339 test('var y = 3;switch (function () {return eval("y");}()) {case 3:let y;return x;default:;}');
   340 test('switch (x) {case 3:let y;return 3;case 4:let z;return 4;default:return x;}');
   341 test('switch (x) {case 3:let x;break;default:if (x === undefined) {return "ponies";}}');
   342 test('switch (x) {case 3:default:let y;let (y = x) {return y;}}');
   343 isError('switch (x) {case 3:let y;return 3;case 4:let y;return 4;default:;}');

mercurial