Have es2015 rest transform safely use arguments

This commit is contained in:
Victor Felder 2015-11-04 15:14:41 +01:00
parent 82ddbc0ecd
commit 306b5db1ef
4 changed files with 33 additions and 15 deletions

View File

@ -11,6 +11,10 @@ let buildRest = template(`
}
`);
let loadRest = template(`
ARGUMENTS.length <= KEY || ARGUMENTS[KEY] === undefined ? undefined : ARGUMENTS[KEY]
`);
let memberExpressionOptimisationVisitor = {
Scope(path, state) {
// check if this scope has a local binding that will shadow the rest parameter
@ -116,7 +120,15 @@ export let visitor = {
// otherwise `arguments` will be remapped in arrow functions
argsId._shadowedFunctionLiteral = path;
// support patterns
function optimiseLoadStatement(parent, offset) {
let newExpr = loadRest({
ARGUMENTS: argsId,
KEY: t.numericLiteral(parent.property.value + offset)
});
return newExpr;
}
// support patterns // no test case?
if (t.isPattern(rest)) {
let pattern = rest;
rest = scope.generateUidIdentifier("ref");
@ -154,7 +166,13 @@ export let visitor = {
for (let candidate of (state.candidates: Array)) {
candidate.replaceWith(argsId);
if (candidate.parentPath.isMemberExpression()) {
optimiseMemberExpression(candidate.parent, state.offset);
if (t.isReturnStatement(candidate.parentPath.parent)
|| t.isIdentifier(candidate.parentPath.parent.id)) {
let optimized = optimiseLoadStatement(candidate.parent, state.offset, argsId);
candidate.parentPath.replaceWith(optimized);
} else {
optimiseMemberExpression(candidate.parent, state.offset);
}
}
}
}

View File

@ -14,7 +14,7 @@ var somefun = function () {
};
var _d = args1[1];
};
let get1stArg = (...args) => args[0];
let get3rdArg = (...args) => args[2];
}
function demo1(...args) {

View File

@ -1,21 +1,21 @@
var concat = function () {
var x = arguments[0];
var y = arguments[1];
var x = arguments.length <= 0 || arguments[0] === undefined ? undefined : arguments[0];
var y = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1];
};
var somefun = function () {
var get2ndArg = function (a, b) {
var _b = arguments[2];
var _b = arguments.length <= 2 || arguments[2] === undefined ? undefined : arguments[2];
var somef = function (x, y, z) {
var _a = arguments[3];
var _a = arguments.length <= 3 || arguments[3] === undefined ? undefined : arguments[3];
};
var somefg = function (c, d, e, f) {
var _a = arguments[4];
var _a = arguments.length <= 4 || arguments[4] === undefined ? undefined : arguments[4];
};
var _d = arguments[3];
var _d = arguments.length <= 3 || arguments[3] === undefined ? undefined : arguments[3];
};
var get1stArg = function () {
return arguments[0];
var get3rdArg = function () {
return arguments.length <= 2 || arguments[2] === undefined ? undefined : arguments[2];
};
};

View File

@ -1,9 +1,9 @@
var t = function () {
var x = arguments[0];
var y = arguments[1];
var x = arguments.length <= 0 || arguments[0] === undefined ? undefined : arguments[0];
var y = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1];
};
function t() {
var x = arguments[0];
var y = arguments[1];
var x = arguments.length <= 0 || arguments[0] === undefined ? undefined : arguments[0];
var y = arguments.length <= 1 || arguments[1] === undefined ? undefined : arguments[1];
}