functionnames.js (3359B)
1 // |jit-test| skip-if: isLcovEnabled() 2 3 /* 4 * Most of these test cases are adapted from: 5 * http://johnjbarton.github.com/nonymous/index.html 6 */ 7 8 function assertName(fn, name) { 9 assertEq(displayName(fn), name) 10 } 11 12 /* simple names */ 13 var a = function b() {}; 14 function c() {}; 15 assertName(a, 'b'); 16 assertName(c, 'c'); 17 18 var a = function(){}, 19 b = function(){}; 20 assertName(a, 'a'); 21 assertName(b, 'b'); 22 23 /* nested names */ 24 var main = function() { 25 function Foo(a) { assertName(a, 'main/foo<') } 26 var foo = new Foo(function() {}); 27 }; 28 assertName(main, 'main') 29 main(); 30 31 /* duplicated */ 32 var Baz = Bar = function(){} 33 assertName(Baz, 'Bar'); 34 assertName(Bar, 'Bar'); 35 36 /* returned from an immediate function */ 37 var Foo = function (){ 38 assertName(arguments.callee, 'Foo<') 39 return function(){}; 40 }(); 41 assertName(Foo, 'Foo</<'); 42 43 /* various properties and such */ 44 var x = {fox: { bax: function(){} } }; 45 assertName(x.fox.bax, 'bax'); 46 var foo = {foo: {foo: {}}}; 47 foo.foo.foo = function(){}; 48 assertName(foo.foo.foo, 'foo.foo.foo'); 49 var z = { 50 foz: function() { 51 var baz = function() { 52 var y = {bay: function() {}}; 53 assertName(y.bay, 'bay'); 54 }; 55 assertName(baz, 'baz'); 56 baz(); 57 } 58 }; 59 assertName(z.foz, 'foz'); 60 z.foz(); 61 62 var outer = function() { 63 x.fox.bax.nx = function(){}; 64 var w = {fow: { baw: function(){} } }; 65 assertName(x.fox.bax.nx, 'outer/x.fox.bax.nx') 66 assertName(w.fow.baw, 'baw'); 67 }; 68 assertName(outer, 'outer'); 69 outer(); 70 function Fuz(){}; 71 Fuz.prototype = { 72 add: function() {} 73 } 74 assertName(Fuz.prototype.add, 'add'); 75 76 var x = 1; 77 x = function(){}; 78 assertName(x, 'x'); 79 80 var a = {b: {}}; 81 a.b.c = (function() { 82 assertName(arguments.callee, 'a.b.c<') 83 }()); 84 85 a.b = function() { 86 function foo(f) { assertName(f, 'a.b/<'); }; 87 return foo(function(){}); 88 } 89 a.b(); 90 91 var bar = 'bar'; 92 a.b[bar] = function(){}; 93 assertName(a.b.bar, 'a.b[bar]'); 94 95 a.b = function() { 96 assertName(arguments.callee, 'a.b<'); 97 return { a: function() {} } 98 }(); 99 assertName(a.b.a, 'a'); 100 101 a = { 102 b: function(a) { 103 if (a) 104 return function() {}; 105 else 106 return function() {}; 107 } 108 }; 109 assertName(a.b, 'b'); 110 assertName(a.b(true), 'b/<') 111 assertName(a.b(false), 'b/<') 112 113 function f(g) { 114 assertName(g, 'x<'); 115 return g(); 116 } 117 var x = f(function () { return function() {}; }); 118 assertName(x, 'x</<'); 119 120 var a = {'b': function(){}}; 121 assertName(a.b, 'b'); 122 123 function g(f) { 124 assertName(f, ''); 125 } 126 label: g(function () {}); 127 128 var z = [function() {}]; 129 assertName(z[0], 'z<'); 130 131 /* fuzz bug from 785089 */ 132 odeURIL:(function(){}) 133 134 a = { 1: function () {} }; 135 assertName(a[1], '1'); 136 137 a = { 138 "embedded spaces": function(){}, 139 "dots.look.like.property.references": function(){}, 140 "\"\'quotes\'\"": function(){}, 141 "!@#$%": function(){} 142 }; 143 assertName(a["embedded spaces"], 'embedded spaces'); 144 assertName(a["dots.look.like.property.references"], 'dots.look.like.property.references'); 145 assertName(a["\"\'quotes\'\""], '"\'quotes\'"'); 146 assertName(a["!@#$%"], '!@#$%'); 147 148 a.b = {}; 149 a.b.c = {}; 150 a.b["c"]["d e"] = { f: { 1: { "g": { "h i": function() {} } } } }; 151 assertName(a.b.c["d e"].f[1].g["h i"], 'h i'); 152 153 this.m = function () {}; 154 assertName(m, "this.m"); 155 156 function N() { 157 this.o = function () {} 158 } 159 let n = new N() 160 assertName(n.o, "N/this.o");