summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/typedarray/arraybuffer-pin.js
blob: 8799da29de286e5386391aa7eefeb178fe669ba7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// |jit-test| --enable-arraybuffer-resizable

load(libdir + "asserts.js");

var ab_inline = new ArrayBuffer(4);
assertEq(pinArrayBufferOrViewLength(ab_inline), true);
assertEq(pinArrayBufferOrViewLength(ab_inline), false);
assertErrorMessage(() => detachArrayBuffer(ab_inline), RangeError, /change pinned length/);
assertEq(pinArrayBufferOrViewLength(ab_inline, false), true);
detachArrayBuffer(ab_inline);

var ab_big = new ArrayBuffer(1000);
assertEq(pinArrayBufferOrViewLength(ab_big), true);
assertEq(pinArrayBufferOrViewLength(ab_big), false);
assertErrorMessage(() => detachArrayBuffer(ab_big), RangeError, /change pinned length/);
assertEq(pinArrayBufferOrViewLength(ab_big, false), true);
detachArrayBuffer(ab_big);

if (ArrayBuffer.prototype.resize) {
  var rab_small = new ArrayBuffer(4, { maxByteLength: 20 });
  assertEq(pinArrayBufferOrViewLength(rab_small), true);
  assertEq(pinArrayBufferOrViewLength(rab_small), false);
  assertErrorMessage(() => detachArrayBuffer(rab_small), RangeError, /change pinned length/);
  assertErrorMessage(() => rab_small.resize(18), RangeError, /change pinned length/);
  assertEq(pinArrayBufferOrViewLength(rab_small, false), true);
  assertEq(rab_small.byteLength, 4);
  rab_small.resize(18);
  assertEq(rab_small.byteLength, 18);
  detachArrayBuffer(rab_small);
} else {
  print("Skipped test: resizable ArrayBuffers unavailable");
}

if (ArrayBuffer.prototype.resize) {
  var rab_big = new ArrayBuffer(200, { maxByteLength: 1000 });
  assertEq(pinArrayBufferOrViewLength(rab_big), true);
  assertEq(pinArrayBufferOrViewLength(rab_big), false);
  assertErrorMessage(() => detachArrayBuffer(rab_big), RangeError, /change pinned length/);
  assertErrorMessage(() => rab_big.resize(400), RangeError, /change pinned length/);
  assertEq(pinArrayBufferOrViewLength(rab_big, false), true);
  assertEq(rab_big.byteLength, 200);
  rab_big.resize(400);
  assertEq(rab_big.byteLength, 400);
  detachArrayBuffer(rab_big);
} else {
  print("Skipped test: resizable ArrayBuffers unavailable");
}

var sab = new SharedArrayBuffer(4);
assertEq(pinArrayBufferOrViewLength(sab), false);
assertEq(pinArrayBufferOrViewLength(sab), false);
assertErrorMessage(() => serialize([sab], [sab]), TypeError, /Shared memory objects.*transfer/);
assertEq(pinArrayBufferOrViewLength(sab, false), false);
assertErrorMessage(() => detachArrayBuffer(sab), TypeError, /ArrayBuffer.*required/);

if (SharedArrayBuffer.prototype.grow) {
  var gab = new SharedArrayBuffer(4, { maxByteLength: 1000 });
  assertEq(pinArrayBufferOrViewLength(gab), false);
  assertEq(pinArrayBufferOrViewLength(gab), false);
  assertErrorMessage(() => detachArrayBuffer(gab), TypeError, /ArrayBuffer.*required/);
  // assertErrorMessage(() => gab.grow(400), RangeError, /change pinned length/);
  assertEq(pinArrayBufferOrViewLength(gab, false), false);
  assertEq(gab.byteLength, 4);
  gab.grow(400);
  assertEq(gab.byteLength, 400);
  assertErrorMessage(() => detachArrayBuffer(gab), TypeError, /ArrayBuffer.*required/);
} else {
  print("Skipped test: growable SharedArrayBuffers unavailable");
}