1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/eval/exhaustive-global-strictcaller-direct-strictcode.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,175 @@ 1.4 +// Any copyright is dedicated to the Public Domain. 1.5 +// http://creativecommons.org/licenses/publicdomain/ 1.6 +"use strict"; 1.7 + 1.8 +//----------------------------------------------------------------------------- 1.9 +var BUGNUMBER = 514568; 1.10 +var summary = "eval in all its myriad flavors"; 1.11 + 1.12 +print(BUGNUMBER + ": " + summary); 1.13 + 1.14 +/************** 1.15 + * BEGIN TEST * 1.16 + **************/ 1.17 + 1.18 +var x = 17; 1.19 + 1.20 +var ev = eval; 1.21 + 1.22 +var xcode = 1.23 + "'use strict';" + 1.24 + "var x = 4;" + 1.25 + "function actX(action)" + 1.26 + "{" + 1.27 + " switch (action)" + 1.28 + " {" + 1.29 + " case 'get':" + 1.30 + " return x;" + 1.31 + " case 'set1':" + 1.32 + " x = 9;" + 1.33 + " return;" + 1.34 + " case 'set2':" + 1.35 + " x = 23;" + 1.36 + " return;" + 1.37 + " case 'delete':" + 1.38 + " try { return eval('delete x'); }" + 1.39 + " catch (e) { return e.name; }" + 1.40 + " }" + 1.41 + "}" + 1.42 + "actX;"; 1.43 + 1.44 +var local0 = x; 1.45 + 1.46 +var f = eval(xcode); 1.47 + 1.48 +var inner1 = f("get"); 1.49 +var local1 = x; 1.50 + 1.51 +x = 7; 1.52 +var inner2 = f("get"); 1.53 +var local2 = x; 1.54 + 1.55 +f("set1"); 1.56 +var inner3 = f("get"); 1.57 +var local3 = x; 1.58 + 1.59 +var del = f("delete"); 1.60 +var inner4 = f("get"); 1.61 +var local4 = x; 1.62 + 1.63 +f("set2"); 1.64 +var inner5 = f("get"); 1.65 +var local5 = x; 1.66 + 1.67 +var resultsX = 1.68 + { 1.69 + local0: local0, 1.70 + inner1: inner1, local1: local1, 1.71 + inner2: inner2, local2: local2, 1.72 + inner3: inner3, local3: local3, 1.73 + del: del, 1.74 + inner4: inner4, local4: local4, 1.75 + inner5: inner5, local5: local5, 1.76 + }; 1.77 + 1.78 +assertEq(resultsX.local0, 17); 1.79 + 1.80 +assertEq(resultsX.inner1, 4); 1.81 +assertEq(resultsX.local1, 17); 1.82 + 1.83 +assertEq(resultsX.inner2, 4); 1.84 +assertEq(resultsX.local2, 7); 1.85 + 1.86 +assertEq(resultsX.inner3, 9); 1.87 +assertEq(resultsX.local3, 7); 1.88 + 1.89 +assertEq(resultsX.del, "SyntaxError"); 1.90 + 1.91 +assertEq(resultsX.inner4, 9); 1.92 +assertEq(resultsX.local4, 7); 1.93 + 1.94 +assertEq(resultsX.inner5, 23); 1.95 +assertEq(resultsX.local5, 7); 1.96 + 1.97 + 1.98 +var ycode = 1.99 + "'use strict';" + 1.100 + "var y = 5;" + 1.101 + "function actY(action)" + 1.102 + "{" + 1.103 + " switch (action)" + 1.104 + " {" + 1.105 + " case 'get':" + 1.106 + " return y;" + 1.107 + " case 'set1':" + 1.108 + " y = 2;" + 1.109 + " return;" + 1.110 + " case 'set2':" + 1.111 + " y = 71;" + 1.112 + " return;" + 1.113 + " case 'delete':" + 1.114 + " try { return eval('delete y'); }" + 1.115 + " catch (e) { return e.name; }" + 1.116 + " }" + 1.117 + "}" + 1.118 + "actY;"; 1.119 + 1.120 +try { var local0 = y; } catch (e) { local0 = e.name; } 1.121 + 1.122 +var f = eval(ycode); 1.123 + 1.124 +var inner1 = f("get"); 1.125 +try { var local1 = y; } catch (e) { local1 = e.name; } 1.126 + 1.127 +try { y = 8; } catch (e) { assertEq(e.name, "ReferenceError"); } 1.128 +var inner2 = f("get"); 1.129 +try { var local2 = y; } catch (e) { local2 = e.name; } 1.130 + 1.131 +f("set1"); 1.132 +var inner3 = f("get"); 1.133 +try { var local3 = y; } catch (e) { local3 = e.name; } 1.134 + 1.135 +var del = f("delete"); 1.136 +try { var inner4 = f("get"); } catch (e) { inner4 = e.name; } 1.137 +try { var local4 = y; } catch (e) { local4 = e.name; } 1.138 + 1.139 +f("set2"); 1.140 +try { var inner5 = f("get"); } catch (e) { inner5 = e.name; } 1.141 +try { var local5 = y; } catch (e) { local5 = e.name; } 1.142 + 1.143 +var resultsY = 1.144 + { 1.145 + local0: local0, 1.146 + inner1: inner1, local1: local1, 1.147 + inner2: inner2, local2: local2, 1.148 + inner3: inner3, local3: local3, 1.149 + del: del, 1.150 + inner4: inner4, local4: local4, 1.151 + inner5: inner5, local5: local5, 1.152 + }; 1.153 + 1.154 +assertEq(resultsY.local0, "ReferenceError"); 1.155 + 1.156 +assertEq(resultsY.inner1, 5); 1.157 +assertEq(resultsY.local1, "ReferenceError"); 1.158 + 1.159 +assertEq(resultsY.inner2, 5); 1.160 +assertEq(resultsY.local2, "ReferenceError"); 1.161 + 1.162 +assertEq(resultsY.inner3, 2); 1.163 +assertEq(resultsY.local3, "ReferenceError"); 1.164 + 1.165 +assertEq(resultsY.del, "SyntaxError"); 1.166 + 1.167 +assertEq(resultsY.inner4, 2); 1.168 +assertEq(resultsY.local4, "ReferenceError"); 1.169 + 1.170 +assertEq(resultsY.inner5, 71); 1.171 +assertEq(resultsY.local5, "ReferenceError"); 1.172 + 1.173 +/******************************************************************************/ 1.174 + 1.175 +if (typeof reportCompare === "function") 1.176 + reportCompare(true, true); 1.177 + 1.178 +print("Tests complete!");