bug977966.js (2985B)
1 // |jit-test| --ion-eager 2 3 function join_check() { 4 var lengthWasCalled = false; 5 var obj = {"0": "", "1": ""}; 6 Object.defineProperty(obj, "length", { 7 get : function(){ lengthWasCalled = true; return 2; }, 8 enumerable : true, 9 configurable : true 10 }); 11 12 var res = Array.prototype.join.call(obj, { toString: function () { 13 if (lengthWasCalled) 14 return "good"; 15 else 16 return "bad"; 17 }}) 18 19 assertEq(res, "good"); 20 } 21 function split(i) { 22 var x = (i + "->" + i).split("->"); 23 assertEq(x[0], "" + i); 24 return i; 25 } 26 27 function join(i) { 28 var x = [i, i].join("->"); 29 assertEq(x, i + "->" + i); 30 return i; 31 } 32 33 function split_join(i) { 34 var x = (i + "-" + i).split("-").join("->"); 35 assertEq(x, i + "->" + i); 36 return i; 37 } 38 39 function split_join_2(i) { 40 var x = (i + "-" + i).split("-"); 41 x.push("" + i); 42 var res = x.join("->"); 43 assertEq(res, i + "->" + i + "->" + i); 44 return i; 45 } 46 47 function resumeHere() { bailout(); } 48 49 function split_join_3(i) { 50 var x = (i + "-" + i).split("-"); 51 resumeHere(); 52 var res = x.join("->"); 53 assertEq(res, i + "->" + i); 54 return i; 55 } 56 57 function trip(i) { 58 if (i == 99) 59 assertEq(myjoin.arguments[1][0], "" + i) 60 } 61 62 function myjoin(i, x) { 63 trip(i); 64 return x.join("->"); 65 } 66 67 function split_join_4(i) { 68 var x = (i + "-" + i).split("-"); 69 var res = myjoin(i, x); 70 assertEq(res, i + "->" + i); 71 return i; 72 } 73 74 function split_join_5(i) { 75 var s = "abca"; 76 assertEq(s.split("a").join("") + i, "bc" + i); 77 } 78 79 function split_join_two_byte_char(i) { 80 var s1 = "ab"; 81 assertEq(s1.split("").join("\u03c0"), "a\u03c0b"); 82 var s2 = i + "\u03c0" + i; 83 assertEq(s2.split("\u03c0").join("-"), i + "-" + i); 84 } 85 86 function split_join_underflow(i) 87 { 88 var s = ""; 89 assertEq(s.split("").join("x" + i), ""); 90 } 91 92 // Check that we do not consider the string argument of join as a replacement 93 // pattern, as the string replace primitive is supposed to do. 94 function split_join_pattern(i) { 95 var s = i + "-" + i; 96 assertEq(s.split("-").join("$`$&$'"), i + "$`$&$'" + i); 97 assertEq(s.replace("-", "$`$&$'"), "" + i + i + "-" + i + i); 98 } 99 100 // Check that, as opposed to String.replace, we are doing a global replacement 101 // as String.split does. 102 function split_join_multiple(i) { 103 var s1 = i + "-\n-" + i + "-\n-" + i; 104 assertEq(s1.split("-\n-").join("-") , i + "-" + i + "-" + i); 105 assertEq(s1.replace("-\n-", "-") , i + "-" + i + "-\n-" + i); 106 107 var s2 = "abc"; 108 assertEq(s2.split("").join("" + i) , "a" + i + "b" + i + "c"); 109 assertEq(s2.replace("", "" + i) , i + "abc"); 110 } 111 112 for (var i = 0; i < 1000; ++i) { 113 join_check(i); 114 split(i); 115 join(i); 116 split_join(i); 117 split_join_2(i); 118 split_join_3(i); 119 split_join_4(i); 120 split_join_5(i); 121 split_join_pattern(i); 122 split_join_multiple(i); 123 split_join_two_byte_char(i); 124 split_join_underflow(i); 125 }