optimise rest parameters in spread element position and allocate rest array at the earliest common ancestor of all references - fixes #1768

This commit is contained in:
Sebastian McKenzie
2015-06-17 01:57:14 +01:00
parent 574d47a571
commit b57a80ecae
22 changed files with 347 additions and 99 deletions

View File

@@ -12,7 +12,6 @@ var somefun = function () {
let somefg = (c, d, e, f, ...args3) => {
var _a = args3[0];
};
var _c = arguments[1];
var _d = args1[1];
};
let get1stArg = (...args) => args[0];

View File

@@ -6,22 +6,15 @@ var concat = function concat() {
};
var somefun = function somefun() {
var _arguments = arguments;
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 _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 = args1[1];
var _d = arguments[3];
};
var get1stArg = function get1stArg() {
return arguments[0];
@@ -29,8 +22,8 @@ var somefun = function somefun() {
};
function demo1() {
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return function (i) {

View File

@@ -0,0 +1,32 @@
// single referenes
function r(...rest){
if (noNeedToWork) return 0;
return rest;
}
// multiple references
function r(...rest){
if (noNeedToWork) return 0;
rest;
rest;
}
// multiple nested references
function r(...rest){
if (noNeedToWork) return 0;
if (true) {
return rest;
} else {
return rest;
}
}
// nested reference with root reference
function r(...rest){
if (noNeedToWork) return 0;
if (lol) rest;
rest;
}

View File

@@ -0,0 +1,51 @@
// single referenes
"use strict";
function r() {
if (noNeedToWork) return 0;
for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) {
rest[_key] = arguments[_key];
}
return rest;
}
// multiple references
function r() {
if (noNeedToWork) return 0;
for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
rest[_key2] = arguments[_key2];
}
rest;
rest;
}
// multiple nested references
function r() {
if (noNeedToWork) return 0;
for (var _len3 = arguments.length, rest = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
rest[_key3] = arguments[_key3];
}
if (true) {
return rest;
} else {
return rest;
}
}
// nested reference with root reference
function r() {
if (noNeedToWork) return 0;
for (var _len4 = arguments.length, rest = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
rest[_key4] = arguments[_key4];
}
if (lol) rest;
rest;
}

View File

@@ -47,10 +47,11 @@ var a = function a(foo) {
};
var b = function b(foo) {
var join = "join";
for (var _len6 = arguments.length, bar = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
bar[_key6 - 1] = arguments[_key6];
}
var join = "join";
return bar[join];
};
};

View File

@@ -0,0 +1,15 @@
// optimisation
function foo(...bar) {
foo(...bar);
}
// deoptimisation
function foo(a, ...b) {
foo(...b);
}
function foo(...b) {
foo(1, ...b);
}

View File

@@ -0,0 +1,25 @@
// optimisation
"use strict";
function foo() {
foo.apply(undefined, arguments);
}
// deoptimisation
function foo(a) {
for (var _len = arguments.length, b = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
b[_key - 1] = arguments[_key];
}
foo.apply(undefined, b);
}
function foo() {
for (var _len2 = arguments.length, b = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
b[_key2] = arguments[_key2];
}
foo.apply(undefined, [1].concat(b));
}