| var testCase = function (actual, expected, message) { |
| if (actual !== expected) { |
| throw message + ". Expected '" + expected + "', but was '" + actual + "'"; |
| } |
| }; |
| |
| var txtMsg = 'Error: arguments is not lexically binded inside of the arrow function '; |
| |
| function afFactory0() { |
| return a => arguments; |
| } |
| |
| var af0 = afFactory0('ABC', 'DEF'); |
| |
| noInline(af0); |
| |
| for (var i=0; i<10000; i++) { |
| var arr = af0(i); |
| |
| testCase(arr.length, 2, txtMsg + "#1"); |
| testCase(arr[0],'ABC', txtMsg + "#2"); |
| testCase(arr[1],'DEF', txtMsg + "#3"); |
| testCase(typeof arr[2], 'undefined', txtMsg + "#4"); |
| } |
| |
| |
| function afFactory() { |
| return a => arguments[0]; |
| } |
| |
| var af = afFactory(12); |
| |
| noInline(af); |
| |
| for (var i=0; i<10000; i++) { |
| testCase(af(6), 12, txtMsg + "#5"); |
| } |
| |
| function afFactory1(x, y, z) { |
| return (a, b) => arguments[0] + '-' + arguments[1] + '-' + arguments[2] + '-' + a + '-' + b; |
| } |
| |
| var af1 = afFactory1('AB', 'CD', 'EF'); |
| |
| noInline(af1); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(af1('G', i), 'AB-CD-EF-G-' + i, txtMsg + "#5"); |
| } |
| |
| if (true) { |
| let arguments = []; |
| |
| var af2 = (x, y) => arguments[0] + '-' + x + y; |
| |
| noInline(af2); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(af2('ABC', i), 'undefined-ABC' + i, txtMsg + "#6"); |
| } |
| |
| var af3 = () => arguments; |
| |
| noInline(af3); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(typeof af3('ABC', i), 'object', txtMsg + "#7"); |
| testCase(typeof af3('ABC', i)[0], 'undefined', txtMsg + "#8"); |
| } |
| } |
| |
| var afFactory4 = function () { |
| this.func = (a, b) => arguments[0] + '_' + arguments[1] + '_' + arguments[2] + '_' + a + '_' + b; |
| }; |
| |
| var af4 = new afFactory4('P1', 'Q2', 'R3'); |
| noInline(af4); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(af4.func('EF', i), 'P1_Q2_R3_EF_' + i, txtMsg + "#9"); |
| } |
| |
| var afFactory5 = function () { |
| this.func = (a, b) => (c, d) => arguments[0] + '_' + arguments[1] + '_' + arguments[2] + '_' + a + '_' + b + '_' + c + '_' + d; |
| }; |
| |
| var af5 = new afFactory5('PQ', 'RS', 'TU'); |
| noInline(af5); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(af5.func('VW', 'XY')('Z',i), 'PQ_RS_TU_VW_XY_Z_' + i, txtMsg + "#9"); |
| } |
| |
| var afNested = function () { |
| return function () { |
| this.func = (a, b) => (c, d) => arguments[0] + '_' + arguments[1] + '_' + arguments[2] + '_' + a + '_' + b + '_' + c + '_' + d; |
| }; |
| }; |
| |
| var afInternal = new afNested('AB', 'CD', 'EF'); |
| var af6 = new afInternal('GH', 'IJ', 'KL'); |
| noInline(af6); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(af6.func('VW', 'XY')('Z',i), 'GH_IJ_KL_VW_XY_Z_' + i, txtMsg + "#9"); |
| } |
| |
| if (true) { |
| let arguments = []; |
| |
| var obj = { |
| name : 'id', |
| method : (index) => arguments[0] + '-' + index |
| }; |
| |
| noInline(obj.method); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(obj.method(i), 'undefined-' + i, txtMsg + "#10"); |
| } |
| } |
| |
| var objFactory = function () { |
| return { |
| name : 'nested', |
| method : (index) => arguments[0] + '-' + index |
| }; |
| }; |
| |
| var objInternal = objFactory('ABC', 'DEF'); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(objInternal.method(i), 'ABC-' + i, txtMsg + "#11"); |
| } |
| |
| var af_block_scope = function (first, x, y) { |
| let arr; |
| if (first) { |
| let arguments = 'branch-1'; |
| arr = () => arguments; |
| } else { |
| let arguments = 'branch-2'; |
| arr = () => { |
| if (true) { |
| let arguments = 'internal-arrow-block-scope'; |
| return arguments; |
| } |
| }; |
| } |
| return arr; |
| }; |
| |
| var af_function_scope = function (first, x, y) { |
| let arr; |
| var arguments = 'af_function_scope'; |
| if (first) { |
| arr = () => arguments; |
| } else { |
| arr = () => { |
| var arguments = 'internal-arrow-scope'; |
| return arguments; |
| }; |
| } |
| return arr; |
| }; |
| |
| var af_mixed_scope = function (first, x, y) { |
| let arr; |
| var arguments = 'af_mixed_scope'; |
| if (first) { |
| let arguments = 'local-scope'; |
| arr = () => arguments; |
| } else { |
| let arguments = 'local-scope-2'; |
| arr = () => { |
| let arguments = 'internal-arrow-scope'; |
| return arguments; |
| }; |
| } |
| return arr; |
| }; |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(af_block_scope(true, 'A', 'B')('C'), 'branch-1', txtMsg + "#12"); |
| testCase(af_block_scope(false, 'A', 'B')('C'), 'internal-arrow-block-scope', txtMsg + "#12"); |
| testCase(af_function_scope(true, 'D', 'E')('F'), 'af_function_scope', txtMsg + "#13"); |
| testCase(af_function_scope(false, 'D', 'E')('F'), 'internal-arrow-scope', txtMsg + "#13"); |
| testCase(af_mixed_scope(true, 'G', 'H')('I'), 'local-scope', txtMsg + "#14"); |
| testCase(af_mixed_scope(false, 'G', 'H')('I'), 'internal-arrow-scope', txtMsg + "#14"); |
| } |
| |
| function foo() { |
| var x = (p) => eval(p); |
| return x; |
| } |
| |
| var foo_arr = foo('A', 'B'); |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(foo_arr('arguments[0]'), 'A', txtMsg + "#15"); |
| testCase(foo_arr('arguments[1]'), 'B', txtMsg + "#16"); |
| } |
| |
| function boo() { |
| return () => { |
| return () => { |
| return function () { |
| return () => arguments; |
| } |
| } |
| } |
| } |
| |
| for (var i = 0; i < 10000; i++) { |
| testCase(boo('A' + i)('B' + i)('D' + i)('E' + i)('G' + i)[0], 'E' + i, txtMsg + "#17"); |
| } |
| |
| var testValue = 'test-value'; |
| |
| function f_args () { |
| if (true) { |
| let someValue = ''; |
| if (true) { |
| let anotherValue = 'value'; |
| return () => () => () => arguments[0]; |
| } |
| } |
| |
| return () => 'no-value'; |
| } |
| |
| for (var i = 0; i < 10000; i++) { |
| let v = f_args(testValue, 'anotherValue')()()(); |
| testCase(v, testValue); |
| } |
| |
| function f_args_eval () { |
| if (true) { |
| let someValue = ''; |
| if (true) { |
| let anotherValue = 'value'; |
| return () => () => () => eval('arguments[0]'); |
| } |
| } |
| |
| return () => 'no-value'; |
| } |
| |
| for (var i = 0; i < 10000; i++) { |
| let v = f_args_eval(testValue, 'anotherValue')()()(); |
| testCase(v, testValue); |
| } |