michael@0: // Any copyright is dedicated to the Public Domain. michael@0: // http://creativecommons.org/licenses/publicdomain/ michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: var BUGNUMBER = 514568; michael@0: var summary = "eval in all its myriad flavors"; michael@0: michael@0: print(BUGNUMBER + ": " + summary); michael@0: michael@0: /************** michael@0: * BEGIN TEST * michael@0: **************/ michael@0: michael@0: var x = 17; michael@0: function globalX() { return x; } michael@0: var y = 42; michael@0: function globalY() { return y; } michael@0: michael@0: var ev = eval; michael@0: michael@0: function testX() michael@0: { michael@0: "use strict"; michael@0: michael@0: var x = 2; michael@0: var xcode = michael@0: "'use strict';" + michael@0: "var x = 4;" + michael@0: "function actX(action)" + michael@0: "{" + michael@0: " switch (action)" + michael@0: " {" + michael@0: " case 'get':" + michael@0: " return x;" + michael@0: " case 'set1':" + michael@0: " x = 9;" + michael@0: " return;" + michael@0: " case 'set2':" + michael@0: " x = 23;" + michael@0: " return;" + michael@0: " case 'delete':" + michael@0: " try { return eval('delete x'); }" + michael@0: " catch (e) { return e.name; }" + michael@0: " }" + michael@0: "}" + michael@0: "actX;"; michael@0: michael@0: var local0 = x; michael@0: var global0 = globalX(); michael@0: michael@0: var f = ev(xcode); michael@0: michael@0: var inner1 = f("get"); michael@0: var local1 = x; michael@0: var global1 = globalX(); michael@0: michael@0: x = 7; michael@0: var inner2 = f("get"); michael@0: var local2 = x; michael@0: var global2 = globalX(); michael@0: michael@0: f("set1"); michael@0: var inner3 = f("get"); michael@0: var local3 = x; michael@0: var global3 = globalX(); michael@0: michael@0: var del = f("delete"); michael@0: var inner4 = f("get"); michael@0: var local4 = x; michael@0: var global4 = globalX(); michael@0: michael@0: f("set2"); michael@0: var inner5 = f("get"); michael@0: var local5 = x; michael@0: var global5 = globalX(); michael@0: michael@0: return { michael@0: local0: local0, global0: global0, michael@0: inner1: inner1, local1: local1, global1: global1, michael@0: inner2: inner2, local2: local2, global2: global2, michael@0: inner3: inner3, local3: local3, global3: global3, michael@0: del: del, michael@0: inner4: inner4, local4: local4, global4: global4, michael@0: inner5: inner5, local5: local5, global5: global5, michael@0: }; michael@0: } michael@0: michael@0: var resultsX = testX(); michael@0: michael@0: assertEq(resultsX.local0, 2); michael@0: assertEq(resultsX.global0, 17); michael@0: michael@0: assertEq(resultsX.inner1, 4); michael@0: assertEq(resultsX.local1, 2); michael@0: assertEq(resultsX.global1, 17); michael@0: michael@0: assertEq(resultsX.inner2, 4); michael@0: assertEq(resultsX.local2, 7); michael@0: assertEq(resultsX.global2, 17); michael@0: michael@0: assertEq(resultsX.inner3, 9); michael@0: assertEq(resultsX.local3, 7); michael@0: assertEq(resultsX.global3, 17); michael@0: michael@0: assertEq(resultsX.del, "SyntaxError"); michael@0: michael@0: assertEq(resultsX.inner4, 9); michael@0: assertEq(resultsX.local4, 7); michael@0: assertEq(resultsX.global4, 17); michael@0: michael@0: assertEq(resultsX.inner5, 23); michael@0: assertEq(resultsX.local5, 7); michael@0: assertEq(resultsX.global5, 17); michael@0: michael@0: michael@0: function testY() michael@0: { michael@0: "use strict"; michael@0: michael@0: var ycode = michael@0: "'use strict';" + michael@0: "var y = 5;" + michael@0: "function actY(action)" + michael@0: "{" + michael@0: " switch (action)" + michael@0: " {" + michael@0: " case 'get':" + michael@0: " return y;" + michael@0: " case 'set1':" + michael@0: " y = 2;" + michael@0: " return;" + michael@0: " case 'set2':" + michael@0: " y = 71;" + michael@0: " return;" + michael@0: " case 'delete':" + michael@0: " try { return eval('delete y'); }" + michael@0: " catch (e) { return e.name; }" + michael@0: " }" + michael@0: "}" + michael@0: "actY;"; michael@0: michael@0: var local0 = y; michael@0: var global0 = globalY(); michael@0: michael@0: var f = ev(ycode); michael@0: michael@0: var inner1 = f("get"); michael@0: var local1 = y; michael@0: var global1 = globalY(); michael@0: michael@0: y = 8; michael@0: var inner2 = f("get"); michael@0: var local2 = y; michael@0: var global2 = globalY(); michael@0: michael@0: f("set1"); michael@0: var inner3 = f("get"); michael@0: var local3 = y; michael@0: var global3 = globalY(); michael@0: michael@0: var del = f("delete"); michael@0: var inner4 = f("get"); michael@0: var local4 = y; michael@0: var global4 = globalY(); michael@0: michael@0: f("set2"); michael@0: var inner5 = f("get"); michael@0: var local5 = y; michael@0: var global5 = globalY(); michael@0: michael@0: return { michael@0: local0: local0, global0: global0, michael@0: inner1: inner1, local1: local1, global1: global1, michael@0: inner2: inner2, local2: local2, global2: global2, michael@0: inner3: inner3, local3: local3, global3: global3, michael@0: del: del, michael@0: inner4: inner4, local4: local4, global4: global4, michael@0: inner5: inner5, local5: local5, global5: global5, michael@0: }; michael@0: } michael@0: michael@0: var resultsY = testY(); michael@0: michael@0: assertEq(resultsY.local0, 42); michael@0: assertEq(resultsY.global0, 42); michael@0: michael@0: assertEq(resultsY.inner1, 5); michael@0: assertEq(resultsY.local1, 42); michael@0: assertEq(resultsY.global1, 42); michael@0: michael@0: assertEq(resultsY.inner2, 5); michael@0: assertEq(resultsY.local2, 8); michael@0: assertEq(resultsY.global2, 8); michael@0: michael@0: assertEq(resultsY.inner3, 2); michael@0: assertEq(resultsY.local3, 8); michael@0: assertEq(resultsY.global3, 8); michael@0: michael@0: assertEq(resultsY.del, "SyntaxError"); michael@0: michael@0: assertEq(resultsY.inner4, 2); michael@0: assertEq(resultsY.local4, 8); michael@0: assertEq(resultsY.global4, 8); michael@0: michael@0: assertEq(resultsY.inner5, 71); michael@0: assertEq(resultsY.local5, 8); michael@0: assertEq(resultsY.global5, 8); michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true); michael@0: michael@0: print("Tests complete!");