evalCallingName.js (728B)
1 function a() { 2 return "a"; 3 } 4 function b() { 5 return "b"; 6 } 7 function c() { 8 return "c"; 9 } 10 var names = ["a","b","c"]; 11 12 function foo(name) { 13 return eval(name + "()"); 14 } 15 16 for (var i = 0; i < names.length; i++) 17 assertEq(foo(names[i]), names[i]); 18 19 // Test bailout due to bad name passed to eval. 20 try { 21 foo("missing"); 22 } catch (e) { 23 assertEq(/missing/.test(e), true); 24 } 25 26 function bar(name) { 27 return eval(name + "()"); 28 } 29 30 for (var i = 0; i < names.length; i++) 31 assertEq(bar(names[i]), names[i]); 32 33 function recursion() { 34 return bar({ valueOf: function() { return "gotcha"; }}); 35 } 36 37 function gotcha() { 38 return "gotcha"; 39 } 40 41 // Test invalidation within call made after name lookup. 42 assertEq(bar("recursion"), "gotcha");