Stop treating scopes containing template strings tagged with 'eval' specially

There's no need to mark these as possibly-direct-eval, since all such an
eval-tagged string will ever get passed is the array of string parts, which
will be immediately returns (since it's not a string). It will
never do a lookup in the current scope, nor (in sloppy mode) introduce
new declarations.

This patch is not intended to change behavior, but I've added tests that
demonstrate the stuff explained in the preceding paragraph.

Review URL: https://codereview.chromium.org/1580463003

Cr-Commit-Position: refs/heads/master@{#33245}
This commit is contained in:
adamk 2016-01-12 10:08:40 -08:00 committed by Commit bot
parent 96ec06efb0
commit f5828cb4db
2 changed files with 19 additions and 1 deletions

View File

@ -5189,7 +5189,6 @@ Expression* Parser::CloseTemplateLiteral(TemplateLiteralState* state, int start,
Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash)));
args->Add(factory()->NewSmiLiteral(hash_obj->value(), pos), zone());
this->CheckPossibleEvalCall(tag, scope_);
Expression* call_site = factory()->NewCallRuntime(
Context::GET_TEMPLATE_CALL_SITE_INDEX, args, start);

View File

@ -697,3 +697,22 @@ var global = this;
assertArrayEquals(["get0"], log);
assertArrayEquals([1], tagged);
})();
// Since the first argument to the tag function is always an array,
// eval calls will always just return that array.
(function testEvalTagStrict() {
"use strict";
var f = (x) => eval`a${x}b`;
var result = f();
assertEquals(["a", "b"], result);
assertSame(result, f());
})();
(function testEvalTagSloppy() {
var f = (x) => eval`a${x}b`;
var result = f();
assertEquals(["a", "b"], result);
assertSame(result, f());
})();