diff --git a/templates/java/org/ruby_lang/prism/Loader.java.erb b/templates/java/org/ruby_lang/prism/Loader.java.erb index 534d8401ca..3e44cccc14 100644 --- a/templates/java/org/ruby_lang/prism/Loader.java.erb +++ b/templates/java/org/ruby_lang/prism/Loader.java.erb @@ -1,4 +1,4 @@ -<%- string_type = Prism::Template::JAVA_STRING_TYPE -%> +<%- id_type = Prism::Template::JAVA_IDENTIFIER_TYPE -%> package org.ruby_lang.prism; import java.lang.Short; @@ -19,37 +19,29 @@ public class Loader { // Overridable methods - public Charset getEncodingCharset(String encodingName) { - encodingName = encodingName.toLowerCase(Locale.ROOT); - if (encodingName.equals("ascii-8bit")) { - return StandardCharsets.US_ASCII; - } - return Charset.forName(encodingName); - } - - public <%= string_type %> bytesToName(byte[] bytes) { - <%- if string_type == "String" -%> - return new String(bytes, encodingCharset).intern(); - <%- else -%> - return null; // Must be implemented by subclassing Loader - <%- end -%> - } + <%- if id_type == "String" -%> + public abstract <%= id_type %> bytesToName(byte[] bytes); + <%- end -%> private static final class ConstantPool { private final Loader loader; private final int bufferOffset; - private final <%= string_type %>[] cache; + private final <%= id_type %>[] cache; ConstantPool(Loader loader, int bufferOffset, int length) { this.loader = loader; this.bufferOffset = bufferOffset; - cache = new <%= string_type %>[length]; + <%- if id_type == "String" -%> + cache = new <%= id_type %>[length]; + <%- else -%> + cache = new byte[length][]; + <%- end -%> } - <%= string_type %> get(ByteBuffer buffer, int oneBasedIndex) { + <%= id_type %> get(ByteBuffer buffer, int oneBasedIndex) { int index = oneBasedIndex - 1; - <%= string_type %> constant = cache[index]; + <%= id_type %> constant = cache[index]; if (constant == null) { int offset = bufferOffset + index * 8; @@ -59,7 +51,11 @@ public class Loader { byte[] bytes = new byte[length]; buffer.get(start, bytes); + <%- if id_type == "byte[]" -%> + constant = bytes; + <%- else %> constant = loader.bytesToName(bytes); + <%- end %> cache[index] = constant; } @@ -70,9 +66,6 @@ public class Loader { private final ByteBuffer buffer; protected String encodingName; - <%- if string_type == "String" -%> - private Charset encodingCharset; - <%- end -%> private ConstantPool constantPool; private Nodes.Source source = null; @@ -100,9 +93,6 @@ public class Loader { byte[] encodingNameBytes = new byte[encodingLength]; buffer.get(encodingNameBytes); this.encodingName = new String(encodingNameBytes, StandardCharsets.US_ASCII); - <%- if string_type == "String" -%> - this.encodingCharset = getEncodingCharset(this.encodingName); - <%- end -%> source.setStartLine(loadVarSInt()); source.setLineOffsets(loadLineOffsets()); @@ -213,11 +203,11 @@ public class Loader { } } - private <%= string_type %> loadConstant() { + private <%= id_type %> loadConstant() { return constantPool.get(buffer, loadVarUInt()); } - private <%= string_type %> loadOptionalConstant() { + private <%= id_type %> loadOptionalConstant() { if (buffer.get(buffer.position()) != 0) { return loadConstant(); } else { @@ -226,12 +216,16 @@ public class Loader { } } - private <%= string_type %>[] loadConstants() { + private <%= id_type %>[] loadConstants() { int length = loadVarUInt(); if (length == 0) { - return Nodes.EMPTY_STRING_ARRAY; + return Nodes.EMPTY_IDENTIFIER_ARRAY; } - <%= string_type %>[] constants = new <%= string_type %>[length]; + <%- if id_type == "String" -%> + <%= id_type %>[] constants = new <%= id_type %>[length]; + <%- else -%> + <%= id_type %>[] constants = new byte[length][]; + <%- end -%> for (int i = 0; i < length; i++) { constants[i] = constantPool.get(buffer, loadVarUInt()); } @@ -395,7 +389,7 @@ public class Loader { int bufferPosition = buffer.position(); int serializedLength = buffer.getInt(); // Load everything except the body and locals, because the name, receiver, parameters are still needed for lazily defining the method - Nodes.DefNode lazyDefNode = new Nodes.DefNode(<%= base_params.join(", ") -%>, -bufferPosition, this, loadConstant(), loadOptionalNode(), (Nodes.ParametersNode) loadOptionalNode(), null, Nodes.EMPTY_STRING_ARRAY); + Nodes.DefNode lazyDefNode = new Nodes.DefNode(<%= base_params.join(", ") -%>, -bufferPosition, this, loadConstant(), loadOptionalNode(), (Nodes.ParametersNode) loadOptionalNode(), null, Nodes.EMPTY_IDENTIFIER_ARRAY); buffer.position(bufferPosition + serializedLength); // skip past the serialized DefNode return lazyDefNode; } diff --git a/templates/java/org/ruby_lang/prism/Nodes.java.erb b/templates/java/org/ruby_lang/prism/Nodes.java.erb index de597eea67..f43df2623e 100644 --- a/templates/java/org/ruby_lang/prism/Nodes.java.erb +++ b/templates/java/org/ruby_lang/prism/Nodes.java.erb @@ -1,4 +1,4 @@ -<%- string_type = Prism::Template::JAVA_STRING_TYPE -%> +<%- id_type = Prism::Template::JAVA_IDENTIFIER_TYPE -%> package org.ruby_lang.prism; import java.lang.Override; @@ -16,7 +16,7 @@ import java.util.Arrays; // @formatter:off public abstract class Nodes { - public static final <%= string_type %>[] EMPTY_STRING_ARRAY = {}; + public static final <%= id_type %>[] EMPTY_IDENTIFIER_ARRAY = {}; @Target(ElementType.FIELD) @Retention(RetentionPolicy.SOURCE) @@ -383,7 +383,7 @@ public abstract class Nodes { builder.append('\n'); <%- when Prism::Template::ConstantListField -%> builder.append('\n'); - for (<%= string_type %> constant : this.<%= field.name %>) { + for (<%= id_type %> constant : this.<%= field.name %>) { builder.append(nextNextIndent).append('"').append(constant).append('"').append('\n'); } <%- when Prism::Template::Flags -%> diff --git a/templates/template.rb b/templates/template.rb index 8f7734dd43..5d1afc9506 100755 --- a/templates/template.rb +++ b/templates/template.rb @@ -11,8 +11,8 @@ module Template # :nodoc: all REMOVE_ON_ERROR_TYPES = SERIALIZE_ONLY_SEMANTICS_FIELDS CHECK_FIELD_KIND = ENV.fetch("CHECK_FIELD_KIND", false) - JAVA_BACKEND = ENV["PRISM_JAVA_BACKEND"] || "truffleruby" - JAVA_STRING_TYPE = JAVA_BACKEND == "jruby" ? "org.jruby.RubySymbol" : "String" + JAVA_BACKEND = ENV["PRISM_JAVA_BACKEND"] || "default" + JAVA_IDENTIFIER_TYPE = JAVA_BACKEND == "truffleruby" ? "String" : "byte[]" INCLUDE_NODE_ID = !SERIALIZE_ONLY_SEMANTICS_FIELDS || JAVA_BACKEND == "jruby" COMMON_FLAGS_COUNT = 2 @@ -272,7 +272,7 @@ def call_seq_type end def java_type - JAVA_STRING_TYPE + JAVA_IDENTIFIER_TYPE end end @@ -292,7 +292,7 @@ def call_seq_type end def java_type - JAVA_STRING_TYPE + JAVA_IDENTIFIER_TYPE end end @@ -312,7 +312,7 @@ def call_seq_type end def java_type - "#{JAVA_STRING_TYPE}[]" + "#{JAVA_IDENTIFIER_TYPE}[]" end end