'use strict' 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 in strict mode'; var text_value = 'function_global_scope'; function afFactory0() { return a => arguments; } var af0 = afFactory0('ABC', 'DEF'); noInline(af0); for (var i=0; i<10000; i++) { let args = af0(i); testCase(args.length, 2, txtMsg + "#2"); testCase(args[0], 'ABC', txtMsg + "#3"); testCase(args[1], 'DEF', txtMsg + "#4"); testCase(typeof args[2], 'undefined', txtMsg + "#5"); } for (var i=0; i<10000; i++) { let args = af0.call(this, i); testCase(args.length, 2, txtMsg + "#2"); testCase(args[0], 'ABC', txtMsg + "#3"); testCase(args[1], 'DEF', txtMsg + "#4"); testCase(typeof args[2], 'undefined', txtMsg + "#5"); } for (var i=0; i<10000; i++) { var args = af0.apply(this, [i]); testCase(args.length, 2, txtMsg + "#2"); testCase(args[0], 'ABC', txtMsg + "#3"); testCase(args[1], 'DEF', txtMsg + "#4"); testCase(typeof args[2], 'undefined', txtMsg + "#5"); } var innerUseStrict = function () { var createArrow = function (a, b, c) { return (x, y) => arguments[0] + arguments[1] + arguments[2] + x + y; }; let af = createArrow('A', 'B', 'C'); noInline(af); for (var i=0; i<10000; i++) { let args = af('D', 'E'); testCase(args, 'ABCDE', txtMsg + "#6"); } }; innerUseStrict(); var obj = function (value) { this.id = value; }; var arr_nesting = () => () => () => new obj('data'); for (var i=0; i<10000; i++) { testCase(arr_nesting()()().id, 'data'); } 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"); } class A { constructor() { this.list = []; } }; class B extends A { addObj(obj) { this.list.push(obj); this.result = 0; } runAll() { for (let i = 0; i < this.list.length; i++) { this.result += this.list[i].operand(1); } } }; function test() { let b = new B(); function runTest () { b.addObj({ operand : (value) => value + value }); b.addObj({ operand : (value) => value + value }); } for (var i = 0; i < 10000; i++) { runTest(); } b.runAll(); testCase(b.result, 40000, txtMsg + "#18"); } test(); 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); }