From e3ab01b44377f120cd223dba70972269ac7c21a3 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Thu, 26 Mar 2026 22:01:47 +0100 Subject: [PATCH] Pass the offset and length to Loader#bytesToName to avoid an extra copy --- .../java/org/ruby_lang/prism/Loader.java.erb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/templates/java/api/target/generated-sources/java/org/ruby_lang/prism/Loader.java.erb b/templates/java/api/target/generated-sources/java/org/ruby_lang/prism/Loader.java.erb index 6d1a77fd10..2d2440b8e6 100644 --- a/templates/java/api/target/generated-sources/java/org/ruby_lang/prism/Loader.java.erb +++ b/templates/java/api/target/generated-sources/java/org/ruby_lang/prism/Loader.java.erb @@ -19,8 +19,10 @@ public class Loader { // Overridable methods - public <%= id_type %> bytesToName(byte[] bytes) { + public <%= id_type %> bytesToName(byte[] serialized, int offset, int length) { <%- if id_type == "byte[]" -%> + byte[] bytes = new byte[length]; + System.arraycopy(serialized, offset, bytes, 0, length); return bytes; <%- else -%> throw new AbstractMethodError("Loader.bytesToName(<%= id_type %>) is not implemented"); @@ -37,9 +39,9 @@ public class Loader { this.loader = loader; this.bufferOffset = bufferOffset; <%- if id_type == "String" -%> - cache = new <%= id_type %>[length]; + this.cache = new <%= id_type %>[length]; <%- else -%> - cache = new byte[length][]; + this.cache = new byte[length][]; <%- end -%> } @@ -52,10 +54,7 @@ public class Loader { int start = buffer.getInt(offset); int length = buffer.getInt(offset + 4); - byte[] bytes = new byte[length]; - buffer.get(start, bytes); - - constant = loader.bytesToName(bytes); + constant = loader.bytesToName(loader.serialized, start, length); cache[index] = constant; } @@ -64,12 +63,14 @@ public class Loader { } + private final byte[] serialized; private final ByteBuffer buffer; protected String encodingName; private ConstantPool constantPool; private Nodes.Source source = null; protected Loader(byte[] serialized) { + this.serialized = serialized; this.buffer = ByteBuffer.wrap(serialized).order(ByteOrder.nativeOrder()); }