slice.js (3005B)
1 // |jit-test| skip-if: !this.SharedArrayBuffer 2 3 // SharedArrayBuffer.prototype.slice 4 5 load(libdir + "asserts.js"); 6 7 let buf = new SharedArrayBuffer(1024); 8 let bufAsI8 = new Int8Array(buf); 9 for ( let i=0 ; i < buf.length ; i++ ) 10 bufAsI8[i] = i; 11 12 let base = 10; 13 let len = 10; 14 15 let buf2 = buf.slice(base, base+len); 16 17 // Smells right? 18 assertEq(buf2 instanceof SharedArrayBuffer, true); 19 assertEq(buf2.byteLength, len); 20 21 // Data got copied correctly? 22 let buf2AsI8 = new Int8Array(buf2); 23 for ( let i=0 ; i < buf2AsI8.length ; i++ ) 24 assertEq(buf2AsI8[i], bufAsI8[base+i]); 25 26 // Storage not shared? 27 let correct = bufAsI8[base]; 28 bufAsI8[base]++; 29 assertEq(buf2AsI8[0], correct); 30 31 // Start beyond end 32 let notail = buf.slice(buf.byteLength+1); 33 assertEq(notail.byteLength, 0); 34 35 // Negative start 36 let tail = buf.slice(-5, buf.byteLength); 37 assertEq(tail.byteLength, 5); 38 let tailAsI8 = new Int8Array(tail); 39 for ( let i=0 ; i < tailAsI8.length ; i++ ) 40 assertEq(tailAsI8[i], bufAsI8[buf.byteLength-5+i]); 41 42 // Negative end 43 let head = buf.slice(0, -5); 44 assertEq(head.byteLength, buf.byteLength-5); 45 let headAsI8 = new Int8Array(head); 46 for ( let i=0 ; i < headAsI8.length ; i++ ) 47 assertEq(headAsI8[i], bufAsI8[i]); 48 49 // Subtyping 50 class MySharedArrayBuffer1 extends SharedArrayBuffer { 51 constructor(n) { super(n) } 52 } 53 54 let myBuf = new MySharedArrayBuffer1(1024); 55 56 let myBufAsI8 = new Int8Array(myBuf); 57 for ( let i=0 ; i < myBuf.length ; i++ ) 58 myBufAsI8[i] = i; 59 60 let myBufSlice = myBuf.slice(0, 20); 61 62 assertEq(myBufSlice instanceof MySharedArrayBuffer1, true); 63 64 assertEq(myBufSlice.byteLength, 20); 65 66 let myBufSliceAsI8 = new Int8Array(myBufSlice); 67 for ( let i=0 ; i < myBufSlice.length ; i++ ) 68 assertEq(myBufAsI8[i], myBufSliceAsI8[i]); 69 70 // Error mode: the method requires an object 71 assertThrowsInstanceOf(() => buf.slice.call(false, 0, 1), TypeError); 72 73 // Error mode: the method is not generic. 74 assertThrowsInstanceOf(() => buf.slice.call([1,2,3], 0, 1), TypeError); 75 76 // Error mode (step 15): the buffer constructed on behalf of slice 77 // is too short. 78 79 class MySharedArrayBuffer2 extends SharedArrayBuffer { 80 constructor(n) { super(n-1) } 81 } 82 83 let myBuf2 = new MySharedArrayBuffer2(10); 84 85 assertThrowsInstanceOf(() => myBuf2.slice(0, 5), TypeError); 86 87 // Error mode (step 13): the buffer constructed on behalf of slice 88 // is not a SharedArrayBuffer. 89 90 let subvert = false; 91 92 class MySharedArrayBuffer3 extends SharedArrayBuffer { 93 constructor(n) { 94 super(n); 95 if (subvert) 96 return new Array(n); 97 } 98 } 99 100 let myBuf3 = new MySharedArrayBuffer3(10); 101 102 subvert = true; 103 assertThrowsInstanceOf(() => myBuf3.slice(0, 5), TypeError); 104 105 // Error mode (step 14): the buffer constructed on behalf of slice 106 // is the same as the input buffer. 107 108 let sneaky = null; 109 110 class MySharedArrayBuffer4 extends SharedArrayBuffer { 111 constructor(n) { 112 super(n); 113 if (sneaky) 114 return sneaky; 115 } 116 } 117 118 let myBuf4 = new MySharedArrayBuffer4(10); 119 120 sneaky = myBuf4; 121 assertThrowsInstanceOf(() => myBuf4.slice(0, 5), TypeError);