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: michael@0: var ev = eval; michael@0: michael@0: var xcode = 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: michael@0: var f = ev(xcode); michael@0: michael@0: var inner1 = f("get"); michael@0: var local1 = x; michael@0: michael@0: x = 7; michael@0: var inner2 = f("get"); michael@0: var local2 = x; michael@0: michael@0: f("set1"); michael@0: var inner3 = f("get"); michael@0: var local3 = x; michael@0: michael@0: var del = f("delete"); michael@0: var inner4 = f("get"); michael@0: var local4 = x; michael@0: michael@0: f("set2"); michael@0: var inner5 = f("get"); michael@0: var local5 = x; michael@0: michael@0: var resultsX = michael@0: { michael@0: local0: local0, michael@0: inner1: inner1, local1: local1, michael@0: inner2: inner2, local2: local2, michael@0: inner3: inner3, local3: local3, michael@0: del: del, michael@0: inner4: inner4, local4: local4, michael@0: inner5: inner5, local5: local5, michael@0: }; michael@0: michael@0: assertEq(resultsX.local0, 17); michael@0: michael@0: assertEq(resultsX.inner1, 4); michael@0: assertEq(resultsX.local1, 4); michael@0: michael@0: assertEq(resultsX.inner2, 7); michael@0: assertEq(resultsX.local2, 7); michael@0: michael@0: assertEq(resultsX.inner3, 9); michael@0: assertEq(resultsX.local3, 9); michael@0: michael@0: assertEq(resultsX.del, false); michael@0: michael@0: assertEq(resultsX.inner4, 9); michael@0: assertEq(resultsX.local4, 9); michael@0: michael@0: assertEq(resultsX.inner5, 23); michael@0: assertEq(resultsX.local5, 23); michael@0: michael@0: michael@0: var ycode = 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: try { var local0 = y; } catch (e) { local0 = e.name; } michael@0: michael@0: var f = ev(ycode); michael@0: michael@0: var inner1 = f("get"); michael@0: var local1 = y; michael@0: michael@0: y = 8; michael@0: var inner2 = f("get"); michael@0: var local2 = y; michael@0: michael@0: f("set1"); michael@0: var inner3 = f("get"); michael@0: var local3 = y; michael@0: michael@0: var del = f("delete"); michael@0: try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } michael@0: try { var local4 = y; } catch (e) { local4 = e.name; } michael@0: michael@0: f("set2"); michael@0: try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } michael@0: try { var local5 = y; } catch (e) { local5 = e.name; } michael@0: michael@0: var resultsY = michael@0: { michael@0: local0: local0, michael@0: inner1: inner1, local1: local1, michael@0: inner2: inner2, local2: local2, michael@0: inner3: inner3, local3: local3, michael@0: del: del, michael@0: inner4: inner4, local4: local4, michael@0: inner5: inner5, local5: local5, michael@0: }; michael@0: michael@0: assertEq(resultsY.local0, "ReferenceError"); michael@0: michael@0: assertEq(resultsY.inner1, 5); michael@0: assertEq(resultsY.local1, 5); michael@0: michael@0: assertEq(resultsY.inner2, 8); michael@0: assertEq(resultsY.local2, 8); michael@0: michael@0: assertEq(resultsY.inner3, 2); michael@0: assertEq(resultsY.local3, 2); michael@0: michael@0: assertEq(resultsY.del, true); michael@0: michael@0: assertEq(resultsY.inner4, "ReferenceError"); michael@0: assertEq(resultsY.local4, "ReferenceError"); michael@0: michael@0: assertEq(resultsY.inner5, 71); michael@0: assertEq(resultsY.local5, 71); michael@0: michael@0: /******************************************************************************/ michael@0: michael@0: if (typeof reportCompare === "function") michael@0: reportCompare(true, true); michael@0: michael@0: print("Tests complete!");