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:
parent
96ec06efb0
commit
f5828cb4db
@ -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);
|
||||
|
||||
|
@ -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());
|
||||
})();
|
||||
|
Loading…
Reference in New Issue
Block a user