michael@0: michael@0: function a() { michael@0: return "a"; michael@0: } michael@0: function b() { michael@0: return "b"; michael@0: } michael@0: function c() { michael@0: return "c"; michael@0: } michael@0: var names = ["a","b","c"]; michael@0: michael@0: function foo(name) { michael@0: return eval(name + "()"); michael@0: } michael@0: michael@0: for (var i = 0; i < names.length; i++) michael@0: assertEq(foo(names[i]), names[i]); michael@0: michael@0: // Test bailout due to bad name passed to eval. michael@0: try { michael@0: foo("missing"); michael@0: } catch (e) { michael@0: assertEq(/missing/.test(e), true); michael@0: } michael@0: michael@0: function bar(name) { michael@0: return eval(name + "()"); michael@0: } michael@0: michael@0: for (var i = 0; i < names.length; i++) michael@0: assertEq(bar(names[i]), names[i]); michael@0: michael@0: function recursion() { michael@0: return bar({ valueOf: function() { return "gotcha"; }}); michael@0: } michael@0: michael@0: function gotcha() { michael@0: return "gotcha"; michael@0: } michael@0: michael@0: // Test invalidation within call made after name lookup. michael@0: assertEq(bar("recursion"), "gotcha");