1 The expression invoked by a failing call is recovered from the source and 2 named in the error message, regardless of how it is formatted. 3 4 5 1. Whitespace and line breaks within the invoked expression are dropped, while 6 whitespace within subscripts is kept. 7 8 -- Testcase -- 9 {% 10 let o = { a: { "x y": [ { f: 1 } ] } }; 11 12 try { 13 o 14 .a 15 [ "x y" ] [0] 16 .f ( 1, 17 2 ); 18 } 19 catch (e) { 20 print(e.message, "\n"); 21 } 22 23 try { 24 o . a [ "x y" ][0] . f(); 25 } 26 catch (e) { 27 print(e.message, "\n"); 28 } 29 %} 30 -- End -- 31 32 -- Expect stdout -- 33 `o.a[ "x y" ][0].f` is not a function, got 1 instead 34 `o.a[ "x y" ][0].f` is not a function, got 1 instead 35 -- End -- 36 37 38 2. An invoked expression longer than 64 characters shows its tail. 39 40 -- Testcase -- 41 {% 42 let o = { aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: { b: 1 } }; 43 44 try { 45 o.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b(); 46 } 47 catch (e) { 48 print(e.message, "\n"); 49 } 50 %} 51 -- End -- 52 53 -- Expect stdout -- 54 `...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.b` is not a function, got 1 instead 55 -- End -- 56 57 58 3. Arguments of any width up to a few kilobytes do not prevent the expression 59 from being recovered, while wider ones do. 60 61 -- Testcase -- 62 {% 63 function args(n) { 64 let rv = []; 65 66 for (let i = 0; i < n; i++) 67 push(rv, '"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"'); 68 69 return join(",\n\t", rv); 70 } 71 72 for (let n in [ 2, 20, 60, 120 ]) { 73 try { 74 loadstring(`{% let o = { f: { g: 1 } };\no.f.g(${args(n)}); %}`)(); 75 } 76 catch (e) { 77 print(n, ": ", e.message, "\n"); 78 } 79 } 80 %} 81 -- End -- 82 83 -- Expect stdout -- 84 2: `o.f.g` is not a function, got 1 instead 85 20: `o.f.g` is not a function, got 1 instead 86 60: `o.f.g` is not a function, got 1 instead 87 120: left-hand side is not a function, got 1 instead 88 -- End --
This page was automatically generated by LXR 0.3.1. • OpenWrt