diff options
Diffstat (limited to 'js/src/jit-test/tests/ion/bug977966.js')
-rw-r--r-- | js/src/jit-test/tests/ion/bug977966.js | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/ion/bug977966.js b/js/src/jit-test/tests/ion/bug977966.js new file mode 100644 index 000000000..6d80c5c37 --- /dev/null +++ b/js/src/jit-test/tests/ion/bug977966.js @@ -0,0 +1,125 @@ +// |jit-test| --ion-eager + +function join_check() { + var lengthWasCalled = false; + var obj = {"0": "", "1": ""}; + Object.defineProperty(obj, "length", { + get : function(){ lengthWasCalled = true; return 2; }, + enumerable : true, + configurable : true + }); + + var res = Array.prototype.join.call(obj, { toString: function () { + if (lengthWasCalled) + return "good"; + else + return "bad"; + }}) + + assertEq(res, "good"); +} +function split(i) { + var x = (i + "->" + i).split("->"); + assertEq(x[0], "" + i); + return i; +} + +function join(i) { + var x = [i, i].join("->"); + assertEq(x, i + "->" + i); + return i; +} + +function split_join(i) { + var x = (i + "-" + i).split("-").join("->"); + assertEq(x, i + "->" + i); + return i; +} + +function split_join_2(i) { + var x = (i + "-" + i).split("-"); + x.push("" + i); + var res = x.join("->"); + assertEq(res, i + "->" + i + "->" + i); + return i; +} + +function resumeHere() { bailout(); } + +function split_join_3(i) { + var x = (i + "-" + i).split("-"); + resumeHere(); + var res = x.join("->"); + assertEq(res, i + "->" + i); + return i; +} + +function trip(i) { + if (i == 99) + assertEq(myjoin.arguments[1][0], "" + i) +} + +function myjoin(i, x) { + trip(i); + return x.join("->"); +} + +function split_join_4(i) { + var x = (i + "-" + i).split("-"); + var res = myjoin(i, x); + assertEq(res, i + "->" + i); + return i; +} + +function split_join_5(i) { + var s = "abca"; + assertEq(s.split("a").join("") + i, "bc" + i); +} + +function split_join_two_byte_char(i) { + var s1 = "ab"; + assertEq(s1.split("").join("\u03c0"), "a\u03c0b"); + var s2 = i + "\u03c0" + i; + assertEq(s2.split("\u03c0").join("-"), i + "-" + i); +} + +function split_join_underflow(i) +{ + var s = ""; + assertEq(s.split("").join("x" + i), ""); +} + +// Check that we do not consider the string argument of join as a replacement +// pattern, as the string replace primitive is supposed to do. +function split_join_pattern(i) { + var s = i + "-" + i; + assertEq(s.split("-").join("$`$&$'"), i + "$`$&$'" + i); + assertEq(s.replace("-", "$`$&$'"), "" + i + i + "-" + i + i); +} + +// Check that, as opposed to String.replace, we are doing a global replacement +// as String.split does. +function split_join_multiple(i) { + var s1 = i + "-\n-" + i + "-\n-" + i; + assertEq(s1.split("-\n-").join("-") , i + "-" + i + "-" + i); + assertEq(s1.replace("-\n-", "-") , i + "-" + i + "-\n-" + i); + + var s2 = "abc"; + assertEq(s2.split("").join("" + i) , "a" + i + "b" + i + "c"); + assertEq(s2.replace("", "" + i) , i + "abc"); +} + +for (var i = 0; i < 1000; ++i) { + join_check(i); + split(i); + join(i); + split_join(i); + split_join_2(i); + split_join_3(i); + split_join_4(i); + split_join_5(i); + split_join_pattern(i); + split_join_multiple(i); + split_join_two_byte_char(i); + split_join_underflow(i); +} |