blob: bb8ba7a72b1c29ee3977f6d1a036a6d278a89b30 [file] [log] [blame]
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);
}