7 Star 45 Fork 26

Gitee 极速下载/WebKit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
此仓库是为了提升国内下载速度的镜像仓库,每日同步一次。 原始仓库: https://github.com/WebKit/webkit
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
rest-parameter-allocation-elimination.js 13.20 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
function assert(b, m = "") {
if (!b)
throw new Error("Bad assertion: " + m);
}
noInline(assert);
const iterations = 20000;
function test1() {
function bar(a, b, ...args) {
return args.length;
}
noInline(bar);
for (let i = 0; i < iterations; i++) {
assert(bar() === 0, bar());
assert(bar(i) === 0);
assert(bar(i, i) === 0);
assert(bar(i, i, i) === 1);
assert(bar(i, i, i, i, i) === 3);
}
}
function shallowEq(a, b) {
if (a.length !== b.length)
return false;
for (let i = 0; i < a.length; i++) {
if (a.length !== b.length)
return false;
}
return true;
}
noInline(shallowEq);
function test2() {
function jaz(a, b, ...args) {
let result = [];
for (let i = 0; i < args.length; i++) {
result.push(args[i]);
}
return result;
}
noInline(jaz);
function jaz2(...args) {
function kaz(a, b, ...args) {
let result = [];
for (let i = 0; i < args.length; i++) {
result.push(args[i]);
}
return result;
}
return kaz.apply(null, args);
}
noInline(jaz2);
for (let f of [jaz, jaz2]) {
for (let i = 0; i < iterations; i++) {
let r = f();
assert(!r.length);
r = f(i);
assert(!r.length);
r = f(i, i)
assert(!r.length);
r = f(i, i, i)
assert(r.length === 1);
assert(shallowEq(r, [i]));
r = f(i, i, i)
assert(r.length === 1);
assert(shallowEq(r, [i]));
r = f(i, i, i, i*2, i*4)
assert(r.length === 3);
assert(shallowEq(r, [i, i*2, i*4]));
}
}
}
function test3() {
function foo(...args) {
return args;
}
function baz(a, b, c, ...args) {
return foo.apply(null, args);
}
function jaz(a, b, c, d, e, f) {
return baz(a, b, c, d, e, f);
}
noInline(jaz);
for (let i = 0; i < iterations; i++) {
let r = jaz();
assert(r.length === 3);
assert(shallowEq(r, [undefined, undefined, undefined]));
r = jaz(i, i);
assert(r.length === 3);
assert(shallowEq(r, [undefined, undefined, undefined]));
r = jaz(i, i, i);
assert(r.length === 3);
assert(shallowEq(r, [undefined, undefined, undefined]));
r = jaz(i, i, i, i);
assert(r.length === 3);
assert(shallowEq(r, [i, undefined, undefined]));
r = jaz(i, i, i, i, i, i);
assert(r.length === 3);
assert(shallowEq(r, [i, i, i]));
}
}
function test4() {
function baz(...args) {
return args;
}
function jaz(a, b, ...args) {
return baz.apply(null, args);
}
noInline(jaz);
for (let i = 0; i < iterations; i++) {
let r = jaz();
assert(r.length === 0);
r = jaz(i);
assert(r.length === 0);
r = jaz(i, i);
assert(r.length === 0);
r = jaz(i, i, i);
assert(r.length === 1);
assert(shallowEq(r, [i]));
r = jaz(i, i, i, i*10);
assert(r.length === 2);
assert(shallowEq(r, [i, i*10]));
let o = {};
r = jaz(i, i, i, i*10, o);
assert(r.length === 3);
assert(shallowEq(r, [i, i*10, o]));
}
}
function test5() {
function baz(...args) {
return args;
}
noInline(baz);
function jaz(a, b, ...args) {
return baz.apply(null, args);
}
noInline(jaz);
for (let i = 0; i < iterations; i++) {
let r = jaz();
assert(r.length === 0);
r = jaz(i);
assert(r.length === 0);
r = jaz(i, i);
assert(r.length === 0);
r = jaz(i, i, i);
assert(r.length === 1);
assert(shallowEq(r, [i]));
r = jaz(i, i, i, i*10);
assert(r.length === 2);
assert(shallowEq(r, [i, i*10]));
let o = {};
r = jaz(i, i, i, i*10, o);
assert(r.length === 3);
assert(shallowEq(r, [i, i*10, o]));
}
}
function test6() {
"use strict";
function baz(...args) {
return args;
}
noInline(baz);
function jaz(a, b, ...args) {
return baz.apply(null, args);
}
noInline(jaz);
for (let i = 0; i < iterations; i++) {
let r = jaz();
assert(r.length === 0);
r = jaz(i);
assert(r.length === 0);
r = jaz(i, i);
assert(r.length === 0);
r = jaz(i, i, i);
assert(r.length === 1);
assert(shallowEq(r, [i]));
r = jaz(i, i, i, i*10);
assert(r.length === 2);
assert(shallowEq(r, [i, i*10]));
let o = {};
r = jaz(i, i, i, i*10, o);
assert(r.length === 3);
assert(shallowEq(r, [i, i*10, o]));
}
}
function test7() {
let shouldExit = false;
function baz(...args) {
if (shouldExit) {
OSRExit();
return [args.length, args[0], args[1], args[2]];
}
return [args.length, args[0], args[1], args[2]];
}
function jaz(a, b, ...args) {
return baz.apply(null, args);
}
noInline(jaz);
function check(i) {
let [length, a, b, c] = jaz();
assert(length === 0);
assert(a === undefined);
assert(b === undefined);
assert(c === undefined);
[length, a, b, c] = jaz(i);
assert(length === 0);
assert(a === undefined);
assert(b === undefined);
assert(c === undefined);
[length, a, b, c] = jaz(i, i);
assert(length === 0);
assert(a === undefined);
assert(b === undefined);
assert(c === undefined);
[length, a, b, c] = jaz(i, i, i);
assert(length === 1);
assert(a === i, JSON.stringify(a));
assert(b === undefined);
assert(c === undefined);
[length, a, b, c] = jaz(i, i, i, i*10);
assert(length === 2);
assert(a === i);
assert(b === i*10);
assert(c === undefined);
let o = {oooo:20};
[length, a, b, c] = jaz(i, i, i, i*10, o);
assert(length === 3);
assert(a === i);
assert(b === i*10);
assert(c === o);
}
shouldExit = true;
for (let i = 0; i < 400; i++) {
check(i);
}
shouldExit = false;
for (let i = 0; i < iterations; i++) {
check(i);
}
shouldExit = false;
check(10);
}
function test8() {
let shouldExit = false;
function baz(...args) {
if (shouldExit) {
OSRExit();
return args;
}
return args;
}
function jaz(a, b, ...args) {
return baz.apply(null, args);
}
noInline(jaz);
function check(i) {
let args = jaz();
assert(args.length === 0);
args = jaz(i);
assert(args.length === 0);
args = jaz(i, i);
assert(args.length === 0);
args = jaz(i, i, i);
assert(args.length === 1);
assert(args[0] === i);
args = jaz(i, i, i, i*10);
assert(args.length === 2);
assert(args[0] === i);
assert(args[1] === i*10);
let o = {oooo:20};
args = jaz(i, i, i, i*10, o);
assert(args.length === 3);
assert(args[0] === i);
assert(args[1] === i*10);
assert(args[2] === o);
}
shouldExit = true;
for (let i = 0; i < 400; i++) {
check(i);
}
shouldExit = false;
for (let i = 0; i < iterations; i++) {
check(i);
}
shouldExit = false;
check(10);
}
function test9() {
let shouldExit = false;
function baz(a, ...args) {
if (shouldExit) {
OSRExit();
return [args.length, args[0], args[1]];
}
return [args.length, args[0], args[1]];
}
function jaz(...args) {
return baz.apply(null, args);
}
noInline(jaz);
function check(i) {
let [length, a, b] = jaz();
assert(length === 0);
[length, a, b] = jaz(i);
assert(length === 0);
assert(a === undefined);
assert(b === undefined);
[length, a, b] = jaz(i, i + 1);
assert(length === 1);
assert(a === i+1);
assert(b === undefined);
[length, a, b] = jaz(i, i+1, i+2);
assert(length === 2);
assert(a === i+1);
assert(b === i+2);
let o = {oooo:20};
[length, a, b] = jaz(i, i+1, o);
assert(length === 2);
assert(a === i+1);
assert(b === o);
}
shouldExit = true;
for (let i = 0; i < 400; i++) {
check(i);
}
shouldExit = false;
for (let i = 0; i < iterations; i++) {
check(i);
}
shouldExit = false;
check(10);
}
function test10() {
function baz(a, b, c, ...args) {
return [args.length, args[0], args[1], args[2], args[3]];
}
function jaz(a, b, c, d, e, f) {
return baz(a, b, c, d, e, f);
}
noInline(jaz);
for (let i = 0; i < iterations; i++) {
let [length, a, b, c, d] = jaz(1, 2, 3, 4, 5, 6);
assert(length === 3);
assert(a === 4);
assert(b === 5);
assert(c === 6);
assert(d === undefined);
}
}
function test11() {
function bar(...args) {
return args;
}
noInline(bar);
function foo(a, b, c, d, ...args) {
return bar.apply(null, args);
}
noInline(foo);
function makeArguments(args) {
return [1,2,3,4, ...args];
}
for (let i = 0; i < iterations; i++) {
function test() { assert(shallowEq(a, foo.apply(null, makeArguments(a)))); }
let a = [{}, 25, 50];
test();
a = [];
test();
a = [{foo: 20}];
test();
a = [10, 20, 30, 40, 50, 60, 70, 80];
test();
}
}
function test12() {
"use strict";
let thisValue = {};
function getThisValue() { return thisValue; }
noInline(getThisValue);
function bar(...args) {
assert(this === thisValue);
return args;
}
noInline(bar);
function foo(a, b, c, d, ...args) {
return bar.apply(getThisValue(), args);
}
noInline(foo);
function makeArguments(args) {
return [1,2,3,4, ...args];
}
for (let i = 0; i < iterations; i++) {
function test() { assert(shallowEq(a, foo.apply(null, makeArguments(a)))); }
let a = [{}, 25, 50];
test();
a = [];
test();
a = [{foo: 20}];
test();
a = [10, 20, 30, 40, 50, 60, 70, 80];
test();
}
}
function test13() {
"use strict";
function bar(...args) {
return args;
}
noInline(bar);
function top(a, b, c, d, ...args) {
return bar.apply(null, args);
}
function foo(...args) {
let r = top.apply(null, args);
return r;
}
noInline(foo);
function makeArguments(args) {
return [1,2,3,4, ...args];
}
for (let i = 0; i < iterations; i++) {
function test() { assert(shallowEq(a, foo.apply(null, makeArguments(a)))); }
let a = [{}, 25, 50];
test();
a = [];
test();
a = [10, 20, 30, 40, 50, 60, 70, 80];
test();
}
}
function test14() {
"use strict";
function bar(...args) {
return args;
}
noInline(bar);
function top(a, b, c, d, ...args) {
return bar.apply(null, args);
}
function foo(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) {
return top(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17);
}
noInline(foo);
function makeArguments(args) {
let r = [1,2,3,4, ...args];
while (r.length < foo.length)
r.push(undefined);
return r;
}
for (let i = 0; i < iterations; i++) {
function test()
{
let args = makeArguments(a);
assert(shallowEq(args.slice(4), foo.apply(null, args)));
}
let a = [{}, 25, 50];
test();
a = [];
test();
a = [10, 20, 30, 40, 50, 60, 70, 80];
test();
}
}
function test15() {
"use strict";
function bar(...args) {
return args;
}
noInline(bar);
function top(a, b, c, d, ...args) {
return bar.apply(null, args);
}
function foo(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) {
let r = top(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17);
return r;
}
noInline(foo);
function makeArguments(args) {
let r = [1,2,3,4, ...args];
while (r.length < foo.length)
r.push(undefined);
return r;
}
for (let i = 0; i < iterations; i++) {
function test()
{
let args = makeArguments(a);
assert(shallowEq(args.slice(4), foo.apply(null, args)));
}
let a = [{}, 25, 50];
test();
a = [];
test();
a = [10, 20, 30, 40, 50, 60, 70, 80];
test();
}
}
let start = Date.now();
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
test10();
test11();
test12();
test13();
test14();
test15();
const verbose = false;
if (verbose)
print(Date.now() - start);
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/mirrors/WebKit.git
git@gitee.com:mirrors/WebKit.git
mirrors
WebKit
WebKit
main

搜索帮助