nursery-non-shared-moved-gc.js (1708B)
1 // Small (non-shared) TypedArrays can use inline storage and can also be nursery 2 // allocated. Ensure Atomics functions use correct rooting and don't store the 3 // TypedArray's data pointer on the stack across a GC. 4 const INLINE_MEMORY_LENGTH = 1; 5 6 function gcValue(value) { 7 return { 8 valueOf() { 9 minorgc(); 10 return value; 11 } 12 }; 13 }; 14 15 // Atomics.store 16 { 17 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 18 19 Atomics.store(ta, 0, gcValue(1)); 20 21 assertEq(ta[0], 1); 22 } 23 24 // Atomics.compareExchange 25 { 26 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 27 ta[0] = 1; 28 29 let val = Atomics.compareExchange(ta, 0, 1, gcValue(2)); 30 31 assertEq(val, 1); 32 assertEq(ta[0], 2); 33 } 34 35 // Atomics.exchange 36 { 37 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 38 ta[0] = 1; 39 40 let val = Atomics.exchange(ta, 0, gcValue(2)); 41 42 assertEq(val, 1); 43 assertEq(ta[0], 2); 44 } 45 46 // Atomics.add 47 { 48 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 49 ta[0] = 1; 50 51 let val = Atomics.add(ta, 0, gcValue(2)); 52 53 assertEq(val, 1); 54 assertEq(ta[0], 3); 55 } 56 57 // Atomics.sub 58 { 59 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 60 ta[0] = 3; 61 62 let val = Atomics.sub(ta, 0, gcValue(2)); 63 64 assertEq(val, 3); 65 assertEq(ta[0], 1); 66 } 67 68 // Atomics.and 69 { 70 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 71 ta[0] = 3; 72 73 let val = Atomics.and(ta, 0, gcValue(1)); 74 75 assertEq(val, 3); 76 assertEq(ta[0], 1); 77 } 78 79 // Atomics.or 80 { 81 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 82 ta[0] = 2; 83 84 let val = Atomics.or(ta, 0, gcValue(1)); 85 86 assertEq(val, 2); 87 assertEq(ta[0], 3); 88 } 89 90 // Atomics.xor 91 { 92 let ta = new Int32Array(INLINE_MEMORY_LENGTH); 93 ta[0] = 3; 94 95 let val = Atomics.xor(ta, 0, gcValue(1)); 96 97 assertEq(val, 3); 98 assertEq(ta[0], 2); 99 }