deopt rest parameter member expression optimisation on child arrow functions - fixes #1631

This commit is contained in:
Sebastian McKenzie
2015-05-28 10:22:12 -04:00
parent 4aec242979
commit 4901075960
3 changed files with 56 additions and 32 deletions

View File

@@ -9,6 +9,13 @@ var memberExpressionOptimisationVisitor = {
return this.skip();
}
var stop = () => {
state.canOptimise = false;
this.stop();
};
if (this.isArrowFunctionExpression()) return stop();
// skip over functions as whatever `arguments` we reference inside will refer
// to the wrong function
if (this.isFunctionDeclaration() || this.isFunctionExpression()) {
@@ -31,8 +38,7 @@ var memberExpressionOptimisationVisitor = {
}
}
state.canOptimise = false;
this.stop();
stop();
}
};
@@ -90,8 +96,7 @@ export function Func/*tion*/(node, parent, scope, file) {
// we only have shorthands and there's no other references
if (state.canOptimise && state.candidates.length) {
for (var i = 0; i < state.candidates.length; i++) {
var candidate = state.candidates[i];
for (var candidate of (state.candidates: Array)) {
candidate.replaceWith(argsId);
optimizeMemberExpression(candidate.parent, node.params.length);
}

View File

@@ -1,19 +1,25 @@
var concat = (...arrs) => {
var x = arrs[0];
var y = arrs[1];
var x = arrs[0];
var y = arrs[1];
};
var somefun = function () {
let get2ndArg = (a, b, ...args1) => {
var _b = args1[0];
let somef = (x, y, z, ...args2) => {
var _a = args2[0];
};
let somefg = (c, d, e, f, ...args3) => {
var _a = args3[0];
};
var _c = arguments[1];
var _d = args1[1];
let get2ndArg = (a, b, ...args1) => {
var _b = args1[0];
let somef = (x, y, z, ...args2) => {
var _a = args2[0];
};
let get1stArg = (...args) => args[0];
let somefg = (c, d, e, f, ...args3) => {
var _a = args3[0];
};
var _c = arguments[1];
var _d = args1[1];
};
let get1stArg = (...args) => args[0];
}
function demo1(...args) {
return (i) => {
return args[i+0];
};
}

View File

@@ -1,26 +1,39 @@
"use strict";
var concat = function concat() {
var x = arguments[0];
var y = arguments[1];
var x = arguments[0];
var y = arguments[1];
};
var somefun = function somefun() {
var _arguments = arguments;
var _arguments = arguments;
var get2ndArg = function get2ndArg(a, b) {
var _b = arguments[2];
var somef = function somef(x, y, z) {
var _a = arguments[3];
};
var somefg = function somefg(c, d, e, f) {
var _a = arguments[4];
};
var _c = _arguments[1];
var _d = arguments[3];
var get2ndArg = function get2ndArg(a, b) {
for (var _len = arguments.length, args1 = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args1[_key - 2] = arguments[_key];
}
var _b = args1[0];
var somef = function somef(x, y, z) {
var _a = arguments[3];
};
var get1stArg = function get1stArg() {
return arguments[0];
var somefg = function somefg(c, d, e, f) {
var _a = arguments[4];
};
var _c = _arguments[1];
var _d = args1[1];
};
var get1stArg = function get1stArg() {
return arguments[0];
};
};
function demo1() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return function (i) {
return args[i + 0];
};
}