From dac34842a7b69e83397f1cff90fe2b29596caf48 Mon Sep 17 00:00:00 2001 From: Cayden Tisdale Date: Thu, 1 Oct 2026 19:18:59 -0400 Subject: [PATCH] Build Redline native memory layouts once --- .../runner/internal/NativeMemory.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/redline/runner/src/main/java/run/endive/redline/experimental/runner/internal/NativeMemory.java b/redline/runner/src/main/java/run/endive/redline/experimental/runner/internal/NativeMemory.java index cb907bafa..a76c0fb78 100644 --- a/redline/runner/src/main/java/run/endive/redline/experimental/runner/internal/NativeMemory.java +++ b/redline/runner/src/main/java/run/endive/redline/experimental/runner/internal/NativeMemory.java @@ -33,6 +33,14 @@ private static final class WaitState { private final Map waitStates = new ConcurrentHashMap<>(); private final MemoryLimits limits; private final MemorySegment reserved; + // Build the value layouts at compile time and use known JIT value for lookups instead of building object for each call. + private static final ValueLayout.OfInt INT_LE = + ValueLayout.JAVA_INT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN); + private static final ValueLayout.OfLong LONG_LE = + ValueLayout.JAVA_LONG_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN); + private static final ValueLayout.OfShort SHORT_LE = + ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN); + private MemorySegment segment; private int nPages; private final long reservedSize; @@ -281,8 +289,7 @@ public byte[] readBytes(int addr, int len) { @Override public void writeI32(int addr, int data) { try { - segment.set( - ValueLayout.JAVA_INT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), addr, data); + segment.set(INT_LE, addr, data); } catch (IndexOutOfBoundsException e) { throw outOfBounds(addr); } @@ -291,8 +298,7 @@ public void writeI32(int addr, int data) { @Override public int readInt(int addr) { try { - return segment.get( - ValueLayout.JAVA_INT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), addr); + return segment.get(INT_LE, addr); } catch (IndexOutOfBoundsException e) { throw outOfBounds(addr); } @@ -301,8 +307,7 @@ public int readInt(int addr) { @Override public void writeLong(int addr, long data) { try { - segment.set( - ValueLayout.JAVA_LONG_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), addr, data); + segment.set(LONG_LE, addr, data); } catch (IndexOutOfBoundsException e) { throw outOfBounds(addr); } @@ -311,8 +316,7 @@ public void writeLong(int addr, long data) { @Override public long readLong(int addr) { try { - return segment.get( - ValueLayout.JAVA_LONG_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), addr); + return segment.get(LONG_LE, addr); } catch (IndexOutOfBoundsException e) { throw outOfBounds(addr); } @@ -321,10 +325,7 @@ public long readLong(int addr) { @Override public void writeShort(int addr, short data) { try { - segment.set( - ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), - addr, - data); + segment.set(SHORT_LE, addr, data); } catch (IndexOutOfBoundsException e) { throw outOfBounds(addr); } @@ -333,8 +334,7 @@ public void writeShort(int addr, short data) { @Override public short readShort(int addr) { try { - return segment.get( - ValueLayout.JAVA_SHORT_UNALIGNED.withOrder(ByteOrder.LITTLE_ENDIAN), addr); + return segment.get(SHORT_LE, addr); } catch (IndexOutOfBoundsException e) { throw outOfBounds(addr); }