deopt rest parameter member expression optimisation on child arrow functions - fixes #1631
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user