Skip to content

Commit

Permalink
Test for change to cache templates by site, not contents
Browse files Browse the repository at this point in the history
These tests are against a specification change based on discussion in
tc39/ecma262#840

The tests here passed on SpiderMonkey but failed on other
implementations, which implement the current specification.
  • Loading branch information
littledan committed Apr 12, 2017
1 parent 230f9fc commit d80d09d
Show file tree
Hide file tree
Showing 10 changed files with 93 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
es6id: 12.2.8
description: Template caching using distinct expressions within `eval`
info: >
Previously-created template objects should be retrieved from the internal
template registry when their source is identical but their expressions
evaluate to different values and the tagged template is being evaluated in
an `eval` context.
Templates are cached by source location; different locations will
have different template objects.
---*/
function tag(templateObject) {
previousObject = templateObject;
Expand All @@ -23,4 +21,4 @@ assert(firstObject !== null);
previousObject = null;

eval('tag`head${b}tail`');
assert.sameValue(previousObject, firstObject);
assert.notSameValue(previousObject, firstObject);
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
es6id: 12.2.8
description: Template caching using distinct expressions within `new Function`
info: >
Previously-created template objects should be retrieved from the internal
template registry when their source is identical but their expressions
evaluate to different values and the tagged template is being evaluated in
an `eval` context.
Templates are cached by source location; different locations will
have different template objects.
---*/
function tag(templateObject) {
previousObject = templateObject;
Expand All @@ -23,8 +21,8 @@ assert(firstObject !== null);
previousObject = null;

(new Function('tag', 'a', 'b', 'return tag`head${b}tail`;'))(tag, 1, 2);
assert.sameValue(
assert.notSameValue(
previousObject,
firstObject,
'The realm\'s template cache is referenced when tagged templates are declared within "new Function" contexts and templated values differ'
'The realm\'s template cache is by site, not string contents'
);
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
es6id: 12.2.8
description: Template caching using distinct expressions
info: >
Previously-created template objects should be retrieved from the internal
template registry when their source is identical but their expressions
evaluate to different values.
Templates are cached by source location; different locations will
have different template objects.
---*/
function tag(templateObject) {
previousObject = templateObject;
Expand All @@ -22,4 +21,4 @@ assert(firstObject !== null);
previousObject = null;

tag`head${b}tail`;
assert.sameValue(previousObject, firstObject);
assert.notSameValue(previousObject, firstObject);
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 12.2.8
description: Templates are cached according to their "raw" representation
description: Templates are cached according to their site
info: >
The internal template registry should be queried according to the "raw"
strings of the tagged template.
Templates are cached by source location; different locations will
have different template objects.
---*/
var previousObject = null;
var firstObject = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 12.2.8
description: Templates are cached according to the number of "raw" strings
description: Templates are cached according to the site
info: >
The internal template registry should be queried according to the number of
"raw" strings in the tagged template.
Templates are cached by source location; different locations will
have different template objects.
---*/
var previousObject = null;
var firstObject = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
es6id: 12.2.8
description: Template caching using identical expressions within `eval`
info: >
Previously-created template objects should be retrieved from the internal
template registry when their source is identical and the tagged template is
being evaluated in an `eval` context.
Templates are cached by source location; different locations will
have different template objects.
---*/
function tag(templateObject) {
previousObject = templateObject;
Expand All @@ -21,4 +20,4 @@ assert(firstObject !== null);
previousObject = null;

eval('tag`head${a}tail`');
assert.sameValue(previousObject, firstObject);
assert.notSameValue(previousObject, firstObject);
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@
es6id: 12.2.8
description: Template caching using identical expressions within `new Function`
info: >
Previously-created template objects should be retrieved from the internal
template registry when their source is identical and the tagged template is
being evaluated in a `new Function` context.
Templates are cached by source location; different locations will
have different template objects.
---*/
function tag(templateObject) {
previousObject = templateObject;
Expand All @@ -21,4 +20,4 @@ assert(firstObject !== null);
previousObject = null;

(new Function('tag', 'a', 'b', 'return tag`head${b}tail`;'))(tag, 1, 2);
assert.sameValue(previousObject, firstObject);
assert.notSameValue(previousObject, firstObject);
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
es6id: 12.2.8
description: Template caching using identical expressions
info: >
Previously-created template objects should be retrieved from the internal
template registry when their source is identical.
Templates are cached by source location; different locations will
have different template objects.
---*/
function tag(templateObject) {
previousObject = templateObject;
Expand All @@ -20,8 +20,8 @@ assert(firstObject !== null);
previousObject = null;

tag`head${a}tail`;
assert.sameValue(
assert.notSameValue(
previousObject,
firstObject,
'The realm\'s template cache is used when tagged templates are executed in the source code directly'
'The realm\'s template cache is by site, not string contents'
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright (C) 2017 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-gettemplateobject
description: Templates are cached by source location inside a function
info: >
1. For each element _e_ of _templateRegistry_, do
1. If _e_.[[Site]] is the same Parse Node as _templateLiteral_, then
1. Return _e_.[[Array]].
---*/

let templates = [];

function tag(templateObject) {
templates.push(templateObject);
}

let a = 1;
for (let i = 0; i < 2; i++) {
tag`head${a}tail`;
}

assert.sameValue(templates.length, 2);

assert.sameValue(
templates[0],
templates[1],
'The realm\'s template cache is for source code locations in a top-level script'
);


36 changes: 36 additions & 0 deletions test/language/expressions/tagged-template/cache-same-site.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (C) 2017 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-gettemplateobject
description: Templates are cached by source location inside a function
info: >
1. For each element _e_ of _templateRegistry_, do
1. If _e_.[[Site]] is the same Parse Node as _templateLiteral_, then
1. Return _e_.[[Array]].
---*/
function tag(templateObject) {
previousObject = templateObject;
}

var a = 1;
var firstObject = null;
var previousObject = null;

function runTemplate() {
tag`head${a}tail`;
}

runTemplate();
firstObject = previousObject;

assert(firstObject !== null);
previousObject = null;

runTemplate();

assert.sameValue(
previousObject,
firstObject,
'The realm\'s template cache is for source code locations in a function'
);

0 comments on commit d80d09d

Please sign in to comment.