// |jit-test| skip-if: helperThreadCount()===0

let gsab = new SharedArrayBuffer(3, {maxByteLength: 4});

setSharedObject(gsab);

function worker(gsab) {
  let ta = new Int8Array(gsab);

  // Wait until `valueOf` is called.
  while (Atomics.load(ta, 0) === 0);

  // Now grow the buffer.
  gsab.grow(4);

  // Notify the buffer has been resized.
  Atomics.store(ta, 1, 1);
}

evalInWorker(`(${worker})(getSharedObject());`);

let ta = new Int8Array(gsab);

let value = {
  valueOf() {
    // Notify we're in `valueOf()`.
    Atomics.store(ta, 0, 1);

    // Wait until buffer has been resized.
    while (Atomics.load(ta, 1) === 0);

    // Continue execution.
    return 0;
  }
};

// Write into currently out-of-bounds, but later in-bounds index.
ta[3] = value;
