Skip to content

Commit 66bbc40

Browse files
committed
Perform bulk-copy in ArrayBufferGetContents using InteropLibrary#readBuffer.
1 parent 70d08dd commit 66bbc40

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

graal-nodejs/mx.graal-nodejs/com.oracle.truffle.trufflenode/src/com/oracle/truffle/trufflenode/node/ArrayBufferGetContentsNode.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060
@ImportStatic(JSConfig.class)
6161
public abstract class ArrayBufferGetContentsNode extends JavaScriptBaseNode {
6262

63+
private static final int BULK_COPY_MAX_BUFFER_SIZE = 1024 * 1024; // 1 MB
64+
6365
ArrayBufferGetContentsNode() {
6466
}
6567

@@ -74,10 +76,15 @@ public static ArrayBufferGetContentsNode create() {
7476
protected ByteBuffer doInteropBuffer(Object buffer,
7577
@CachedLibrary("buffer") InteropLibrary interop) {
7678
try {
77-
int bufferSize = (int) interop.getBufferSize(buffer);
79+
final int bufferSize = (int) interop.getBufferSize(buffer);
80+
final int copyBufferSize = Math.min(bufferSize, BULK_COPY_MAX_BUFFER_SIZE);
7881
ByteBuffer byteBuffer = DirectByteBufferHelper.allocateDirect(bufferSize);
79-
for (int i = 0; i < bufferSize; i++) {
80-
byteBuffer.put(i, interop.readBufferByte(buffer, i));
82+
byte[] copyBuffer = new byte[copyBufferSize];
83+
for (int i = 0; i < bufferSize; i += copyBufferSize) {
84+
int remaining = bufferSize - i;
85+
int copyLength = Math.min(copyBufferSize, remaining);
86+
interop.readBuffer(buffer, i, copyBuffer, 0, copyLength);
87+
byteBuffer.put(i, copyBuffer, 0, copyLength);
8188
}
8289
LoopNode.reportLoopCount(this, bufferSize);
8390
return byteBuffer;

0 commit comments

Comments
 (0)