diff options
Diffstat (limited to 'deps/v8/test/mjsunit/es6/templates.js')
-rw-r--r-- | deps/v8/test/mjsunit/es6/templates.js | 162 |
1 files changed, 146 insertions, 16 deletions
diff --git a/deps/v8/test/mjsunit/es6/templates.js b/deps/v8/test/mjsunit/es6/templates.js index 3eb73e4d16..3e113cb829 100644 --- a/deps/v8/test/mjsunit/es6/templates.js +++ b/deps/v8/test/mjsunit/es6/templates.js @@ -342,27 +342,30 @@ var obj = { var a = 1; var b = 2; - tag`head${a}tail`; - tag`head${b}tail`; - + // Call-sites are cached by ParseNode. Same tag call in a loop + // means same template object + for (var i = 0; i < 2; ++i) { + tag`head${i == 0 ? a : b}tail`; + } assertEquals(2, callSites.length); assertSame(callSites[0], callSites[1]); - eval("tag`head${a}tail`"); - assertEquals(3, callSites.length); - assertSame(callSites[1], callSites[2]); - - eval("tag`head${b}tail`"); + // Tag calls within eval() never have the same ParseNode as the same tag + // call from a different eval() invocation. + for (var i = 0; i < 2; ++i) { + eval("tag`head${i == 0 ? a : b}tail`"); + } assertEquals(4, callSites.length); - assertSame(callSites[2], callSites[3]); + assertTrue(callSites[1] !== callSites[2]); + assertTrue(callSites[2] !== callSites[3]); (new Function("tag", "a", "b", "return tag`head${a}tail`;"))(tag, 1, 2); assertEquals(5, callSites.length); - assertSame(callSites[3], callSites[4]); + assertTrue(callSites[3] !== callSites[4]); (new Function("tag", "a", "b", "return tag`head${b}tail`;"))(tag, 1, 2); assertEquals(6, callSites.length); - assertSame(callSites[4], callSites[5]); + assertTrue(callSites[4] !== callSites[5]); callSites = []; @@ -374,17 +377,19 @@ var obj = { callSites = []; - eval("tag`\\\r\n\\\n\\\r`"); - eval("tag`\\\r\n\\\n\\\r`"); + for (var i = 0; i < 2; ++i) { + eval("tag`\\\r\n\\\n\\\r`"); + } assertEquals(2, callSites.length); - assertSame(callSites[0], callSites[1]); + assertTrue(callSites[0] !== callSites[1]); assertEquals("", callSites[0][0]); assertEquals("\\\n\\\n\\\n", callSites[0].raw[0]); callSites = []; - tag`\uc548\ub155`; - tag`\uc548\ub155`; + for (var i = 0; i < 2; ++i) { + tag`\uc548\ub155`; + } assertEquals(2, callSites.length); assertSame(callSites[0], callSites[1]); assertEquals("안녕", callSites[0][0]); @@ -735,3 +740,128 @@ var global = this; assertThrows(() => Function("f`foo`--"), ReferenceError); assertThrows(() => Function("f`foo` = 1"), ReferenceError); })(); + +// Disable eval caching if a tagged template occurs in a nested function +var v = 0; +var templates = []; +function tag(callSite) { templates.push(callSite); } +for (v = 0; v < 6; v += 2) { + eval("(function() { for (var i = 0; i < 2; ++i) tag`Hello${v}world` })()"); + assertSame(templates[v], templates[v + 1]); +} +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); + +function makeSource1(id) { + return `function f() { + for (var i = 0; i < 2; ++i) tag\`Hello${id}world\`; + } + f();`; +} +templates = []; +for (v = 0; v < 6; v += 2) { + eval(makeSource1(v)); + assertSame(templates[v], templates[v + 1]); +} +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); + +templates = []; +eval("(function() { for (var i = 0; i < 2; ++i) tag`Hello${1}world` })()"); +eval("(function() { for (var i = 0; i < 2; ++i) tag`Hello${2}world` })()"); +eval("(function() { for (var i = 0; i < 2; ++i) tag`Hello${2}world` })()"); +assertSame(templates[0], templates[1]); +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertSame(templates[2], templates[3]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); +assertSame(templates[4],templates[5]); + +templates = []; +eval(makeSource1(1)); +eval(makeSource1(2)); +eval(makeSource1(3)); +assertSame(templates[0], templates[1]); +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertSame(templates[2], templates[3]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); +assertSame(templates[4],templates[5]); + +// Disable eval caching if a tagged template occurs in an even deeper nested function +var v = 0; +templates = []; +for (v = 0; v < 6; v += 2) { + eval("(function() { (function() { for (var i = 0; i < 2; ++i) tag`Hello${v}world` })() })()"); + if (!v) continue; + assertNotSame(templates[v], templates[v - 1]); +} +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); + +function makeSource2(id) { + return `function f() { + function innerF() { + for (var i = 0; i < 2; ++i) tag\`Hello${id}world\`; + } + return innerF(); + } + f();`; +} +templates = []; +for (v = 0; v < 6; v += 2) { + eval(makeSource2(v)); + assertSame(templates[v], templates[v + 1]); +} +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); + +templates = []; +eval("(function() { (function() { for (var i = 0; i < 2; ++i) tag`Hello${1}world` })() })()"); +eval("(function() { (function() { for (var i = 0; i < 2; ++i) tag`Hello${2}world` })() })()"); +eval("(function() { (function() { for (var i = 0; i < 2; ++i) tag`Hello${2}world` })() })()"); +assertSame(templates[0], templates[1]); +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertSame(templates[2], templates[3]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); +assertSame(templates[4], templates[5]); + +templates = []; +eval(makeSource2(1)); +eval(makeSource2(2)); +eval(makeSource2(3)); +assertSame(templates[0], templates[1]); +assertNotSame(templates[0], templates[2]); +assertNotSame(templates[0], templates[4]); +assertNotSame(templates[1], templates[3]); +assertNotSame(templates[1], templates[5]); +assertSame(templates[2], templates[3]); +assertNotSame(templates[2], templates[4]); +assertNotSame(templates[3], templates[5]); +assertSame(templates[4], templates[5]); |