1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/debug/Object-evalInGlobal-04.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,55 @@ 1.4 +// Debugger.Object.prototype.evalInGlobal: nested evals 1.5 + 1.6 +var g = newGlobal(); 1.7 +var dbg = new Debugger; 1.8 +var gw = dbg.addDebuggee(g); 1.9 + 1.10 +assertEq(gw.evalInGlobal("eval('\"Awake\"');").return, "Awake"); 1.11 + 1.12 +// Evaluating non-strict-mode code uses the given global as its variable 1.13 +// environment. 1.14 +g.x = "Swing Lo Magellan"; 1.15 +g.y = "The Milk-Eyed Mender"; 1.16 +assertEq(gw.evalInGlobal("eval('var x = \"A Brief History of Love\"');\n" 1.17 + + "var y = 'Merriweather Post Pavilion';" 1.18 + + "x;").return, 1.19 + "A Brief History of Love"); 1.20 +assertEq(g.x, "A Brief History of Love"); 1.21 +assertEq(g.y, "Merriweather Post Pavilion"); 1.22 + 1.23 +// As above, but notice that we still create bindings on the global, even 1.24 +// when we've interposed a new environment via 'withBindings'. 1.25 +g.x = "Swing Lo Magellan"; 1.26 +g.y = "The Milk-Eyed Mender"; 1.27 +assertEq(gw.evalInGlobalWithBindings("eval('var x = d1;'); var y = d2; x;", 1.28 + { d1: "A Brief History of Love", 1.29 + d2: "Merriweather Post Pavilion" }).return, 1.30 + "A Brief History of Love"); 1.31 +assertEq(g.x, "A Brief History of Love"); 1.32 +assertEq(g.y, "Merriweather Post Pavilion"); 1.33 + 1.34 + 1.35 +// Strict mode code variants of the above: 1.36 + 1.37 +// Evaluating strict-mode code uses a fresh call object as its variable environment. 1.38 +// Also, calls to eval from strict-mode code run the eval code in a fresh 1.39 +// call object. 1.40 +g.x = "Swing Lo Magellan"; 1.41 +g.y = "The Milk-Eyed Mender"; 1.42 +assertEq(gw.evalInGlobal("\'use strict\';\n" 1.43 + + "eval('var x = \"A Brief History of Love\"');\n" 1.44 + + "var y = \"Merriweather Post Pavilion\";" 1.45 + + "x;").return, 1.46 + "Swing Lo Magellan"); 1.47 +assertEq(g.x, "Swing Lo Magellan"); 1.48 +assertEq(g.y, "The Milk-Eyed Mender"); 1.49 + 1.50 +// Introducing a bindings object shouldn't change this behavior. 1.51 +g.x = "Swing Lo Magellan"; 1.52 +g.y = "The Milk-Eyed Mender"; 1.53 +assertEq(gw.evalInGlobalWithBindings("'use strict'; eval('var x = d1;'); var y = d2; x;", 1.54 + { d1: "A Brief History of Love", 1.55 + d2: "Merriweather Post Pavilion" }).return, 1.56 + "Swing Lo Magellan"); 1.57 +assertEq(g.x, "Swing Lo Magellan"); 1.58 +assertEq(g.y, "The Milk-Eyed Mender");