--- /dev/null
+function foo() {
+ return function bar(str) {
+ var barBefore = bar;
+ var result = eval(str);
+ return [
+ barBefore,
+ bar,
+ function () {
+ return bar;
+ },
+ result
+ ];
+ }
+}
+
+function check() {
+ var bar = foo();
+
+ function verify(result, barAfter, evalResult) {
+ if (result[0] !== bar)
+ throw "Error: bad first entry: " + result[0];
+ if (result[1] !== barAfter)
+ throw "Error: bad first entry: " + result[1];
+ var subResult = result[2]();
+ if (subResult !== barAfter)
+ throw "Error: bad second entry: " + result[2] + "; returned: " + subResult;
+ if (result[3] !== evalResult)
+ throw "Error: bad third entry: " + result[3] + "; expected: " + evalResult;
+ }
+
+ verify(bar("42"), bar, 42);
+ verify(bar("bar"), bar, bar);
+ verify(bar("var bar = 42; function fuzz() { return bar; }; fuzz()"), 42, 42);
+}
+
+// Execute check() more than once. At the time that we wrote this regression test, trunk would fail on
+// the second execution. Executing 100 times would also gives us some optimizing JIT coverage.
+for (var i = 0; i < 100; ++i)
+ check();
+