var assert = function (result, expected, message) { if (result !== expected) { throw new Error('Error in assert. Expected "' + expected + '" but was "' + result + '":' + message ); } }; var assertThrow = function (cb, expected) { let error = null; try { cb(); } catch(e) { error = e; } if (error === null) { throw new Error('Error is expected. Expected "' + expected + '" but error was not thrown."'); } if (error.toString() !== expected) { throw new Error('Error is expected. Expected "' + expected + '" but error was "' + error + '"'); } }; function foo() { { var f = 20; eval('var f = 15; eval(" { function f() { }; } ")'); assert(typeof f, "function"); } assert(typeof f, "function", "#1"); } for (var i = 0; i < 10000; i++) { foo(); assertThrow(() => f, "ReferenceError: Can't find variable: f"); } function boo() { { var l = 20; eval('{ let l = 15; eval(" { function l() { }; } ")}'); assert(l, 20, "#3"); } assert(typeof l, 'number', "#4"); } for (var i = 0; i < 10000; i++){ boo(); assertThrow(() => l, "ReferenceError: Can't find variable: l"); } function foobar() { eval("if (false) { function _bar() { } }"); assert(_bar, undefined); } for (var i = 0; i < 10000; i++){ foobar(); assertThrow(() => _bar, "ReferenceError: Can't find variable: _bar"); } // Fixme: https://bugs.webkit.org/show_bug.cgi?id=167837 // Current test does not work because it should raise exception // that f could not be redeclared /* function goo() { { var error = false; try { let f = 20; eval('var f = 15; eval(" { function f() { }; } ")'); } catch (e) { error = e instanceof SyntaxError; } assert(error, true, "syntax error should be raisen"); } assert(typeof f, "undefined", "#6"); } for (var i = 0; i < 10000; i++) { goo(); assert(typeof f, "undefined", "#7"); } */ function hoo() { { let h = 20; eval('var h = 15; eval(" if (false){ function h() { }; } ");'); assert(h, 15); } assert(typeof h, "undefined"); } for (var i = 0; i < 10000; i++) { hoo(); assertThrow(() => h, "ReferenceError: Can't find variable: h"); } function joo() { { var h = 20; eval('var h = 15; eval(" if (false){ function h() { }; } ")'); assert(typeof h, "number"); } assert(typeof h, "number", "#10"); } for (var i = 0; i < 10000; i++){ joo(); assertThrow(() => h, "ReferenceError: Can't find variable: h"); } function koo() { { var k = 20; eval('var k = 15; eval(" if (true){ function k() { }; } ")'); assert(typeof k, "function" ); } assert(typeof k, "function", "#12"); } for (var i = 0; i < 10000; i++){ koo(); assertThrow(() => h, "ReferenceError: Can't find variable: h"); } function loo() { let h = 20; eval("var h; if (false) { function h() { } }"); return h; } assert(loo(), 20); for (var i = 0; i < 10000; i++) { loo(); assertThrow(() => h, "ReferenceError: Can't find variable: h"); }