4242
4343import static com .oracle .truffle .js .lang .JavaScriptLanguage .ID ;
4444import static com .oracle .truffle .js .test .JSTest .assertThrows ;
45+ import static org .junit .Assert .assertArrayEquals ;
4546import static org .junit .Assert .assertEquals ;
4647import static org .junit .Assert .assertTrue ;
4748
@@ -185,19 +186,20 @@ public void testArrayBufferInteropHeap() {
185186
186187 private static void testArrayBufferInteropCommon (boolean direct ) {
187188 try (Context cx = JSTest .newContextBuilder ().option (JSContextOptions .DIRECT_BYTE_BUFFER_NAME , Boolean .toString (direct )).build ()) {
188- Value buffer = cx .eval ("js" , "" +
189- "const ab = new ArrayBuffer(25);" +
190- "let ia = new Int8Array(ab);" +
191- "ia[0] = 41;" +
192- "ia[1] = 42;" +
193- "ia[2] = 43;" +
194- "ia[3] = 44;" +
195- "ia = new Int32Array(ab, 4, 2);" +
196- "ia[0] = 45;" +
197- "ia[1] = 46;" +
198- "ia = new BigInt64Array(ab, 16, 1);" +
199- "ia[0] = 2n ** 63n - 43n;" +
200- "ab;" );
189+ Value buffer = cx .eval ("js" , """
190+ const ab = new ArrayBuffer(25);
191+ let ia = new Int8Array(ab);
192+ ia[0] = 41;
193+ ia[1] = 42;
194+ ia[2] = 43;
195+ ia[3] = 44;
196+ ia = new Int32Array(ab, 4, 2);
197+ ia[0] = 45;
198+ ia[1] = 46;
199+ ia = new BigInt64Array(ab, 16, 1);
200+ ia[0] = 2n ** 63n - 43n;
201+ ab;
202+ """ );
201203 assertEquals (25 , buffer .getBufferSize ());
202204 assertEquals (buffer .readBufferByte (0 ), 41 );
203205 assertEquals (buffer .readBufferByte (1 ), 42 );
@@ -218,6 +220,16 @@ private static void testArrayBufferInteropCommon(boolean direct) {
218220 assertTrue (buffer .isBufferWritable ());
219221 buffer .writeBufferLong (ByteOrder .nativeOrder (), 16 , Double .doubleToRawLongBits (Double .NEGATIVE_INFINITY ));
220222 assertEquals (buffer .readBufferDouble (ByteOrder .nativeOrder (), 16 ), Double .NEGATIVE_INFINITY , 0.0 );
223+
224+ byte [] dst = new byte [4 ];
225+ buffer .readBuffer (0 , dst , 0 , 4 );
226+ assertArrayEquals (new byte []{41 , 42 , 43 , 44 }, dst );
227+ buffer .readBuffer (3 , dst , 2 , 2 );
228+ assertArrayEquals (new byte []{41 , 42 , 44 , (byte ) (ByteOrder .nativeOrder () == ByteOrder .LITTLE_ENDIAN ? 45 : 0 )}, dst );
229+
230+ assertThrows (() -> buffer .readBuffer (-1 , new byte [4 ], 0 , 0 ), IndexOutOfBoundsException .class );
231+ assertThrows (() -> buffer .readBuffer (0 , new byte [24 ], 0 , 25 ), IndexOutOfBoundsException .class );
232+ assertThrows (() -> buffer .readBuffer (1 , new byte [25 ], 0 , 25 ), IndexOutOfBoundsException .class );
221233 }
222234 }
223235
@@ -233,15 +245,14 @@ private static void testDataViewBackedByHostByteBuffer(boolean direct, boolean v
233245 ByteBuffer buffer = direct ? ByteBuffer .allocateDirect (32 ) : ByteBuffer .allocate (32 );
234246 try (Context context = JSTest .newContextBuilder ().allowHostAccess (HostAccess .newBuilder ().allowBufferAccess (true ).build ()).build ()) {
235247 context .getBindings (ID ).putMember ("bb" , buffer );
236- Value dataView = context .eval (ID , "" +
237- "const ab = " + (viaArrayBuffer ? "new ArrayBuffer(bb)" : "bb" ) + ";" +
238- "let dv = new DataView(ab);" +
239- "dv;" );
240- context .eval (ID , "" +
241- "dv.setInt8(0, 41);" +
242- "dv.setInt8(1, dv.getInt8(0) + 1);" +
243- "dv.setUint8(2, dv.getUint8(1) + 1);" +
244- "dv.setInt32(3, -44, true);" );
248+ Value arrayBuffer = context .eval (ID , "const ab = " + (viaArrayBuffer ? "new ArrayBuffer(bb)" : "bb" ) + "; ab;" );
249+ Value dataView = context .eval (ID , "let dv = new DataView(ab); dv;" );
250+ context .eval (ID , """
251+ dv.setInt8(0, 41);
252+ dv.setInt8(1, dv.getInt8(0) + 1);
253+ dv.setUint8(2, dv.getUint8(1) + 1);
254+ dv.setInt32(3, -44, true);
255+ """ );
245256 assertEquals (41 , buffer .get (0 ));
246257 assertEquals (42 , buffer .get (1 ));
247258 assertEquals (43 , buffer .get (2 ));
@@ -265,6 +276,16 @@ private static void testDataViewBackedByHostByteBuffer(boolean direct, boolean v
265276 context .eval (ID , "dv.setBigInt64(24, 1742123762643437888n, false);" );
266277 assertEquals (4614256656552045848L , dataView .invokeMember ("getBigInt64" , 24 , true ).asLong ());
267278 assertEquals (Math .PI , dataView .invokeMember ("getFloat64" , 24 , true ).asDouble (), 0.0 );
279+
280+ byte [] dst = new byte [4 ];
281+ arrayBuffer .readBuffer (0 , dst , 0 , 4 );
282+ assertArrayEquals (new byte []{41 , 42 , 43 , 44 }, dst );
283+ arrayBuffer .readBuffer (2 , dst , 1 , 3 );
284+ assertArrayEquals (new byte []{41 , 43 , 44 , -1 }, dst );
285+
286+ assertThrows (() -> arrayBuffer .readBuffer (-1 , new byte [4 ], 0 , 0 ), IndexOutOfBoundsException .class );
287+ assertThrows (() -> arrayBuffer .readBuffer (0 , new byte [31 ], 0 , 32 ), IndexOutOfBoundsException .class );
288+ assertThrows (() -> arrayBuffer .readBuffer (1 , new byte [33 ], 0 , 32 ), IndexOutOfBoundsException .class );
268289 }
269290 }
270291
@@ -287,11 +308,19 @@ public void testDetachedInteropArrayBuffer() {
287308 try (Context context = JSTest .newContextBuilder ().allowHostAccess (hostAccess ).allowExperimentalOptions (true ).option ("js.debug-builtin" , "true" ).option ("js.v8-compat" , "true" ).build ()) {
288309 ByteBuffer buffer = ByteBuffer .wrap (new byte []{1 , 2 , 3 });
289310 context .getBindings ("js" ).putMember ("buffer" , buffer );
290- Value byteLength = context .eval (ID , "" +
291- "var arrayBuffer = new ArrayBuffer(buffer);\n " +
292- "Debug.typedArrayDetachBuffer(arrayBuffer);\n " +
293- "arrayBuffer.byteLength;" );
311+ Value byteLength = context .eval (ID , """
312+ var arrayBuffer = new ArrayBuffer(buffer);
313+ Debug.typedArrayDetachBuffer(arrayBuffer);
314+ arrayBuffer.byteLength;
315+ """ );
294316 assertEquals (0 , byteLength .asInt ());
317+
318+ Value arrayBuffer = context .getBindings (ID ).getMember ("arrayBuffer" );
319+ assertTrue (arrayBuffer .hasBufferElements ());
320+ assertThrows (() -> arrayBuffer .readBuffer (0 , new byte [1 ], 0 , 1 ), IndexOutOfBoundsException .class );
321+
322+ // even reading zero bytes is not allowed for detached buffers
323+ assertThrows (() -> arrayBuffer .readBuffer (0 , new byte [0 ], 0 , 0 ), IndexOutOfBoundsException .class );
295324 }
296325 }
297326
0 commit comments