cross-compartment-nukeccw.js (4431B)
1 load(libdir + "asserts.js"); 2 3 const otherGlobal = newGlobal({newCompartment: true}); 4 5 function nukeValue(wrapper, value) { 6 return { 7 valueOf() { 8 nukeCCW(wrapper); 9 return value; 10 } 11 }; 12 }; 13 14 function assertIsDeadWrapper(value) { 15 assertTypeErrorMessage(() => value.foo, "can't access dead object"); 16 } 17 18 // Atomics.load 19 { 20 let sab = new otherGlobal.SharedArrayBuffer(4); 21 let ta = new otherGlobal.Int32Array(sab); 22 ta[0] = 1; 23 24 let val = Atomics.load(ta, nukeValue(ta, 0)); 25 26 assertEq(val, 1); 27 assertIsDeadWrapper(ta); 28 } 29 { 30 let sab = new otherGlobal.SharedArrayBuffer(4); 31 let ta = new otherGlobal.Int32Array(sab); 32 ta[0] = 1; 33 34 let val = Atomics.load(ta, nukeValue(sab, 0)); 35 36 assertEq(val, 1); 37 assertEq(ta[0], 1); 38 assertIsDeadWrapper(sab); 39 } 40 41 // Atomics.store 42 { 43 let sab = new otherGlobal.SharedArrayBuffer(4); 44 let ta = new otherGlobal.Int32Array(sab); 45 46 Atomics.store(ta, 0, nukeValue(ta, 1)); 47 48 assertIsDeadWrapper(ta); 49 } 50 { 51 let sab = new otherGlobal.SharedArrayBuffer(4); 52 let ta = new otherGlobal.Int32Array(sab); 53 54 Atomics.store(ta, 0, nukeValue(sab, 1)); 55 56 assertEq(ta[0], 1); 57 assertIsDeadWrapper(sab); 58 } 59 60 // Atomics.compareExchange 61 { 62 let sab = new otherGlobal.SharedArrayBuffer(4); 63 let ta = new otherGlobal.Int32Array(sab); 64 ta[0] = 1; 65 66 let val = Atomics.compareExchange(ta, 0, 1, nukeValue(ta, 2)); 67 68 assertEq(val, 1); 69 assertIsDeadWrapper(ta); 70 } 71 { 72 let sab = new otherGlobal.SharedArrayBuffer(4); 73 let ta = new otherGlobal.Int32Array(sab); 74 ta[0] = 1; 75 76 let val = Atomics.compareExchange(ta, 0, 1, nukeValue(sab, 2)); 77 78 assertEq(val, 1); 79 assertEq(ta[0], 2); 80 assertIsDeadWrapper(sab); 81 } 82 83 // Atomics.exchange 84 { 85 let sab = new otherGlobal.SharedArrayBuffer(4); 86 let ta = new otherGlobal.Int32Array(sab); 87 ta[0] = 1; 88 89 let val = Atomics.exchange(ta, 0, nukeValue(ta, 2)); 90 91 assertEq(val, 1); 92 assertIsDeadWrapper(ta); 93 } 94 { 95 let sab = new otherGlobal.SharedArrayBuffer(4); 96 let ta = new otherGlobal.Int32Array(sab); 97 ta[0] = 1; 98 99 let val = Atomics.exchange(ta, 0, nukeValue(sab, 2)); 100 101 assertEq(val, 1); 102 assertEq(ta[0], 2); 103 assertIsDeadWrapper(sab); 104 } 105 106 // Atomics.add 107 { 108 let sab = new otherGlobal.SharedArrayBuffer(4); 109 let ta = new otherGlobal.Int32Array(sab); 110 ta[0] = 1; 111 112 let val = Atomics.add(ta, 0, nukeValue(ta, 2)); 113 114 assertEq(val, 1); 115 assertIsDeadWrapper(ta); 116 } 117 { 118 let sab = new otherGlobal.SharedArrayBuffer(4); 119 let ta = new otherGlobal.Int32Array(sab); 120 ta[0] = 1; 121 122 let val = Atomics.add(ta, 0, nukeValue(sab, 2)); 123 124 assertEq(val, 1); 125 assertEq(ta[0], 3); 126 assertIsDeadWrapper(sab); 127 } 128 129 // Atomics.sub 130 { 131 let sab = new otherGlobal.SharedArrayBuffer(4); 132 let ta = new otherGlobal.Int32Array(sab); 133 ta[0] = 3; 134 135 let val = Atomics.sub(ta, 0, nukeValue(ta, 2)); 136 137 assertEq(val, 3); 138 assertIsDeadWrapper(ta); 139 } 140 { 141 let sab = new otherGlobal.SharedArrayBuffer(4); 142 let ta = new otherGlobal.Int32Array(sab); 143 ta[0] = 3; 144 145 let val = Atomics.sub(ta, 0, nukeValue(sab, 2)); 146 147 assertEq(val, 3); 148 assertEq(ta[0], 1); 149 assertIsDeadWrapper(sab); 150 } 151 152 // Atomics.and 153 { 154 let sab = new otherGlobal.SharedArrayBuffer(4); 155 let ta = new otherGlobal.Int32Array(sab); 156 ta[0] = 3; 157 158 let val = Atomics.and(ta, 0, nukeValue(ta, 1)); 159 160 assertEq(val, 3); 161 assertIsDeadWrapper(ta); 162 } 163 { 164 let sab = new otherGlobal.SharedArrayBuffer(4); 165 let ta = new otherGlobal.Int32Array(sab); 166 ta[0] = 3; 167 168 let val = Atomics.and(ta, 0, nukeValue(sab, 1)); 169 170 assertEq(val, 3); 171 assertEq(ta[0], 1); 172 assertIsDeadWrapper(sab); 173 } 174 175 // Atomics.or 176 { 177 let sab = new otherGlobal.SharedArrayBuffer(4); 178 let ta = new otherGlobal.Int32Array(sab); 179 ta[0] = 2; 180 181 let val = Atomics.or(ta, 0, nukeValue(ta, 1)); 182 183 assertEq(val, 2); 184 assertIsDeadWrapper(ta); 185 } 186 { 187 let sab = new otherGlobal.SharedArrayBuffer(4); 188 let ta = new otherGlobal.Int32Array(sab); 189 ta[0] = 2; 190 191 let val = Atomics.or(ta, 0, nukeValue(sab, 1)); 192 193 assertEq(val, 2); 194 assertEq(ta[0], 3); 195 assertIsDeadWrapper(sab); 196 } 197 198 // Atomics.xor 199 { 200 let sab = new otherGlobal.SharedArrayBuffer(4); 201 let ta = new otherGlobal.Int32Array(sab); 202 ta[0] = 3; 203 204 let val = Atomics.xor(ta, 0, nukeValue(ta, 1)); 205 206 assertEq(val, 3); 207 assertIsDeadWrapper(ta); 208 } 209 { 210 let sab = new otherGlobal.SharedArrayBuffer(4); 211 let ta = new otherGlobal.Int32Array(sab); 212 ta[0] = 3; 213 214 let val = Atomics.xor(ta, 0, nukeValue(sab, 1)); 215 216 assertEq(val, 3); 217 assertEq(ta[0], 2); 218 assertIsDeadWrapper(sab); 219 }