| |
| load(libdir + 'asserts.js'); |
| |
| // globals: |
| a = b = get = set = eval = arguments = 10; |
| |
| assertEq({arguments}.arguments, 10); |
| |
| var o = {a, b: b, get, set: set}; |
| assertEq(o.a, 10); |
| assertEq(o.b, 10); |
| assertEq(o.get, 10); |
| assertEq(o.set, 10); |
| |
| var names = ['a', 'get', 'set', 'eval']; |
| // global |
| names.forEach(ident => |
| assertEq(new Function('return {' + ident + '}.' + ident + ';')(), 10)); |
| // local |
| names.forEach(ident => |
| assertEq(new Function('var ' + ident + ' = 20; return {' + ident + '}.' + ident + ';')(), 20)); |
| // scope |
| names.forEach(ident => |
| assertEq(new Function('var ' + ident + ' = 30; return (function () {return {' + ident + '}.' + ident + ';})();')(), 30)); |
| |
| var reserved = [ |
| 'break', |
| 'do', |
| 'in', |
| 'typeof', |
| 'case', |
| 'else', |
| 'instanceof', |
| 'var', |
| 'catch', |
| 'export', |
| 'new', |
| 'void', |
| 'class', |
| 'extends', |
| 'return', |
| 'while', |
| 'const', |
| 'finally', |
| 'super', |
| 'with', |
| 'continue', |
| 'for', |
| 'switch', |
| 'debugger', |
| 'function', |
| 'this', |
| 'delete', |
| 'import', |
| 'try', |
| 'enum', |
| 'null', |
| 'true', |
| 'false' |
| ]; |
| |
| // non-identifiers should also throw |
| var nonidents = [ |
| '"str"', |
| '0' |
| ]; |
| |
| reserved.concat(nonidents).forEach(ident => |
| assertThrowsInstanceOf(() => new Function('return {' + ident + '}'), SyntaxError)); |
| |
| var reservedStrict = [ |
| 'implements', |
| 'interface', |
| 'package', |
| 'private', |
| 'protected', |
| 'public', |
| 'static', |
| // XXX: according to 12.1.1, these should only be errors in strict code: |
| // see https://bugzilla.mozilla.org/show_bug.cgi?id=1032150 |
| //'let', |
| //'yield' |
| ]; |
| |
| reservedStrict.forEach(ident => |
| assertEq(new Function('var ' + ident + ' = 10; return {' + ident + '}.' + ident + ';')(), 10)); |
| |
| reservedStrict.concat(['let', 'yield']).forEach(ident => |
| assertThrowsInstanceOf(() => new Function('"use strict"; return {' + ident + '}'), SyntaxError)); |
| |