Commit f5828cb4 authored by adamk's avatar adamk Committed by Commit bot

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}
parent 96ec06ef
...@@ -5189,7 +5189,6 @@ Expression* Parser::CloseTemplateLiteral(TemplateLiteralState* state, int start, ...@@ -5189,7 +5189,6 @@ Expression* Parser::CloseTemplateLiteral(TemplateLiteralState* state, int start,
Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash))); Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash)));
args->Add(factory()->NewSmiLiteral(hash_obj->value(), pos), zone()); args->Add(factory()->NewSmiLiteral(hash_obj->value(), pos), zone());
this->CheckPossibleEvalCall(tag, scope_);
Expression* call_site = factory()->NewCallRuntime( Expression* call_site = factory()->NewCallRuntime(
Context::GET_TEMPLATE_CALL_SITE_INDEX, args, start); Context::GET_TEMPLATE_CALL_SITE_INDEX, args, start);
......
...@@ -697,3 +697,22 @@ var global = this; ...@@ -697,3 +697,22 @@ var global = this;
assertArrayEquals(["get0"], log); assertArrayEquals(["get0"], log);
assertArrayEquals([1], tagged); 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());
})();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment