Handle side effects correctly in rest params index expressions (#4348) (#4674)

This commit is contained in:
Moti Zilberman 2016-10-05 22:59:41 +03:00 committed by Daniel Tschinder
parent 7a7704fea0
commit 0366d1ad19
4 changed files with 33 additions and 6 deletions

View File

@ -17,6 +17,10 @@ let restIndex = template(`
ARGUMENTS.length <= INDEX ? undefined : ARGUMENTS[INDEX] ARGUMENTS.length <= INDEX ? undefined : ARGUMENTS[INDEX]
`); `);
let restIndexImpure = template(`
REF = INDEX, ARGUMENTS.length <= REF ? undefined : ARGUMENTS[REF]
`);
let restLength = template(` let restLength = template(`
ARGUMENTS.length <= OFFSET ? 0 : ARGUMENTS.length - OFFSET ARGUMENTS.length <= OFFSET ? 0 : ARGUMENTS.length - OFFSET
`); `);
@ -161,10 +165,21 @@ function optimiseIndexGetter(path, argsId, offset) {
index = t.binaryExpression("+", path.parent.property, t.numericLiteral(offset)); index = t.binaryExpression("+", path.parent.property, t.numericLiteral(offset));
} }
const { scope } = path;
if (!scope.isPure(index)) {
let temp = scope.generateUidIdentifierBasedOnNode(index);
scope.push({id: temp, kind: "var"});
path.parentPath.replaceWith(restIndexImpure({
ARGUMENTS: argsId,
INDEX: index,
REF: temp
}));
} else {
path.parentPath.replaceWith(restIndex({ path.parentPath.replaceWith(restIndex({
ARGUMENTS: argsId, ARGUMENTS: argsId,
INDEX: index, INDEX: index,
})); }));
}
} }
function optimiseLengthGetter(path, argsId, offset) { function optimiseLengthGetter(path, argsId, offset) {

View File

@ -0,0 +1,4 @@
function first(...values) {
var index = 0;
return values[index++];
}

View File

@ -0,0 +1,6 @@
function first() {
var _ref;
var index = 0;
return _ref = index++ + 0, arguments.length <= _ref ? undefined : arguments[_ref];
}

View File

@ -1,6 +1,8 @@
var t = function (f) { var t = function (f) {
var _ref;
arguments.length <= 1 ? undefined : arguments[1]; arguments.length <= 1 ? undefined : arguments[1];
arguments.length <= (arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1 ? undefined : arguments[(arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1]; _ref = (arguments.length <= 1 ? 0 : arguments.length - 1) - 1 + 1, arguments.length <= _ref ? undefined : arguments[_ref];
}; };
function t(f) { function t(f) {