sort-trampoline.js (3415B)
1 function testGC() { 2 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 3 for (var i = 0; i < 20; i++) { 4 arr.sort((x, y) => { 5 if (i === 17) { 6 gc(); 7 } 8 return x.n - y.n; 9 }); 10 } 11 assertEq(arr.map(x => x.n).join(""), "0135"); 12 } 13 testGC(); 14 15 function testException() { 16 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 17 var ex; 18 try { 19 for (var i = 0; i < 20; i++) { 20 arr.sort((x, y) => { 21 if (i === 17) { 22 throw "fit"; 23 } 24 return x.n - y.n; 25 }); 26 } 27 } catch (e) { 28 ex = e; 29 } 30 assertEq(ex, "fit"); 31 assertEq(i, 17); 32 } 33 testException(); 34 35 function testRectifier() { 36 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 37 for (var i = 0; i < 20; i++) { 38 arr.sort(function(x, y, a) { 39 assertEq(arguments.length, 2); 40 assertEq(a, undefined); 41 return y.n - x.n; 42 }); 43 } 44 assertEq(arr.map(x => x.n).join(""), "5310"); 45 } 46 testRectifier(); 47 48 function testClassConstructor() { 49 var normal = (x, y) => x.n - y.n; 50 var dummy = {}; 51 var ctor = (class { constructor(x, y) { 52 assertEq(x, dummy); 53 }}); 54 // Warm up the constructor. 55 for (var i = 0; i < 20; i++) { 56 new ctor(dummy, dummy); 57 } 58 for (var i = 0; i < 20; i++) { 59 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 60 var ex; 61 try { 62 arr.sort(i < 17 ? normal : ctor); 63 } catch (e) { 64 ex = e; 65 } 66 assertEq(ex instanceof TypeError, i >= 17); 67 assertEq(arr.map(x => x.n).join(""), i >= 17 ? "1305" : "0135"); 68 } 69 } 70 testClassConstructor(); 71 72 function testSwitchRealms() { 73 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 74 var g = newGlobal({sameCompartmentAs: this}); 75 g.foo = 123; 76 var comp = g.evaluate(`((x, y) => { 77 assertEq(foo, 123); 78 return x.n - y.n; 79 })`); 80 for (var i = 0; i < 20; i++) { 81 arr.sort(comp); 82 } 83 assertEq(arr.map(x => x.n).join(""), "0135"); 84 } 85 testSwitchRealms(); 86 87 function testCrossCompartment() { 88 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 89 var g = newGlobal({newCompartment: true}); 90 var wrapper = g.evaluate(`((x, y) => { 91 return x.n - y.n; 92 })`); 93 for (var i = 0; i < 20; i++) { 94 arr.sort(wrapper); 95 } 96 assertEq(arr.map(x => x.n).join(""), "0135"); 97 } 98 testCrossCompartment(); 99 100 function testBound() { 101 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 102 var fun = (function(a, x, y) { 103 "use strict"; 104 assertEq(this, null); 105 assertEq(a, 1); 106 return x.n - y.n; 107 }).bind(null, 1); 108 for (var i = 0; i < 20; i++) { 109 arr.sort(fun); 110 } 111 assertEq(arr.map(x => x.n).join(""), "0135"); 112 } 113 testBound(); 114 115 function testExtraArgs() { 116 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 117 var cmp = (x, y) => x.n - y.n; 118 for (var i = 0; i < 20; i++) { 119 arr.sort(cmp, cmp, cmp, cmp, cmp, cmp, cmp); 120 } 121 assertEq(arr.map(x => x.n).join(""), "0135"); 122 } 123 testExtraArgs(); 124 125 function testBailout() { 126 var arr = [{n: 1}, {n: 3}, {n: 0}, {n: 5}]; 127 for (var i = 0; i < 110; i++) { 128 arr.sort(function(x, y) { 129 if (i === 108) { 130 bailout(); 131 } 132 return x.n - y.n; 133 }); 134 } 135 assertEq(arr.map(x => x.n).join(""), "0135"); 136 } 137 testBailout(); 138 139 function testExceptionHandlerSwitchRealm() { 140 var g = newGlobal({sameCompartmentAs: this}); 141 for (var i = 0; i < 25; i++) { 142 var ex = null; 143 try { 144 g.Array.prototype.toSorted.call([2, 3], () => { 145 throw "fit"; 146 }); 147 } catch (e) { 148 ex = e; 149 } 150 assertEq(ex, "fit"); 151 } 152 } 153 testExceptionHandlerSwitchRealm();