diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/messages/InteropMessage.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/messages/InteropMessage.java index cc18e80e3b618..435cb65e7e69f 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/messages/InteropMessage.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/messages/InteropMessage.java @@ -125,6 +125,7 @@ public enum Message { IsBufferWritable, GetBufferSize, ReadBufferByte, + ReadBuffer, WriteBufferByte, ReadBufferShort, WriteBufferShort, diff --git a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/staticobject/SharedInterop.java b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/staticobject/SharedInterop.java index b7640e0640215..849c9e181eda9 100644 --- a/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/staticobject/SharedInterop.java +++ b/espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/runtime/dispatch/staticobject/SharedInterop.java @@ -1358,6 +1358,23 @@ public static byte readBufferByte(StaticObject receiver, long byteOffset, throw unsupported(); } + @ExportMessage + public static byte readBuffer(StaticObject receiver, long byteOffset, byte[] destination, int destinationOffset, int length, + @Cached IndirectCallNode callNode, + @Cached CallSharedInteropMessage sharedCallNode) throws UnsupportedMessageException { + int dispatchId = receiver.getKlass().getDispatchId(); + InteropMessage.Message message = InteropMessage.Message.ReadBuffer; + if (InteropMessageFactories.isShareable(dispatchId, message)) { + dispatchId = InteropMessageFactories.sourceDispatch(dispatchId, message); + return (byte) sharedCallNode.call(dispatchId, message, receiver, byteOffset, destination, destinationOffset, length); + } + CallTarget target = getTarget(receiver, InteropMessage.Message.ReadBuffer); + if (target != null) { + return (byte) callNode.call(target, receiver, byteOffset); + } + throw unsupported(); + } + @ExportMessage public static void writeBufferByte(StaticObject receiver, long byteOffset, byte value, @Cached IndirectCallNode callNode,