js/src/jit-test/tests/basic/spread-call-length.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

michael@0 1 load(libdir + 'iteration.js');
michael@0 2
michael@0 3 let makeCall = farg => Function("f", "arg", "return f(" + farg + ");");
michael@0 4 let makeFunCall = farg => Function("f", "arg", "return f.call(null, " + farg + ");");
michael@0 5 let makeNew = farg => Function("f", "arg", "return new f(" + farg + ").length;");
michael@0 6
michael@0 7 function checkLength(f, makeFn) {
michael@0 8 assertEq(makeFn("...[1, 2, 3]")(f), 3);
michael@0 9 assertEq(makeFn("1, ...[2], 3")(f), 3);
michael@0 10 assertEq(makeFn("1, ...[2], ...[3]")(f), 3);
michael@0 11 assertEq(makeFn("1, ...[2, 3]")(f), 3);
michael@0 12 assertEq(makeFn("1, ...[], 2, 3")(f), 3);
michael@0 13
michael@0 14 assertEq(makeFn("...[1]")(f), 1);
michael@0 15 assertEq(makeFn("...[1, 2]")(f), 2);
michael@0 16 assertEq(makeFn("...[1, 2, 3, 4]")(f), 4);
michael@0 17 assertEq(makeFn("1, ...[2, 3, 4], 5")(f), 5);
michael@0 18
michael@0 19 assertEq(makeFn("...[undefined]")(f), 1);
michael@0 20
michael@0 21 // other iterable objects
michael@0 22 assertEq(makeFn("...arg")(f, new Int32Array([1, 2, 3])), 3);
michael@0 23 assertEq(makeFn("...arg")(f, "abc"), 3);
michael@0 24 assertEq(makeFn("...arg")(f, [1, 2, 3][std_iterator]()), 3);
michael@0 25 assertEq(makeFn("...arg")(f, Set([1, 2, 3])), 3);
michael@0 26 assertEq(makeFn("...arg")(f, Map([["a", "A"], ["b", "B"], ["c", "C"]])), 3);
michael@0 27 let itr = {};
michael@0 28 itr[std_iterator] = function() {
michael@0 29 return {
michael@0 30 i: 1,
michael@0 31 next: function() {
michael@0 32 if (this.i < 4)
michael@0 33 return { value: this.i++, done: false };
michael@0 34 else
michael@0 35 return { value: undefined, done: true };
michael@0 36 }
michael@0 37 };
michael@0 38 }
michael@0 39 assertEq(makeFn("...arg")(f, itr), 3);
michael@0 40 function* gen() {
michael@0 41 for (let i = 1; i < 4; i ++)
michael@0 42 yield i;
michael@0 43 }
michael@0 44 assertEq(makeFn("...arg")(f, gen()), 3);
michael@0 45 }
michael@0 46
michael@0 47 checkLength(function(x) arguments.length, makeCall);
michael@0 48 checkLength(function(x) arguments.length, makeFunCall);
michael@0 49 checkLength((x) => arguments.length, makeCall);
michael@0 50 checkLength((x) => arguments.length, makeFunCall);
michael@0 51 function lengthClass(x) {
michael@0 52 this.length = arguments.length;
michael@0 53 }
michael@0 54 checkLength(lengthClass, makeNew);

mercurial