From e012072f7008f8423f5e348b6bbc0494ad5be262 Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Wed, 24 Jul 2024 21:57:11 +0200 Subject: [PATCH] Do not serialize common flags when PRISM_SERIALIZE_ONLY_SEMANTICS_FIELDS is set * Note that we could shift the flags by 2 on serialize & deserialize but it does not seems worth it as it does not save serialized size in any significant amount, i.e. average was 0.799 before #2924. * $ bundle exec rake serialized_size:topgems Before: Total sizes for top 100 gems: total source size: 90207647 total serialized size: 69477115 total serialized/total source: 0.770 Stats of ratio serialized/source per file: average: 0.844 median: 0.825 1st quartile: 0.597 3rd quartile: 1.064 min - max: 0.078 - 3.792 After: Total sizes for top 100 gems: total source size: 90207647 total serialized size: 66150209 total serialized/total source: 0.733 Stats of ratio serialized/source per file: average: 0.800 median: 0.779 1st quartile: 0.568 3rd quartile: 1.007 min - max: 0.076 - 3.675 --- templates/java/org/prism/Loader.java.erb | 2 +- templates/java/org/prism/Nodes.java.erb | 14 +++++++++----- templates/src/serialize.c.erb | 2 ++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/templates/java/org/prism/Loader.java.erb b/templates/java/org/prism/Loader.java.erb index c82820e91d9..fd39f4db1cb 100644 --- a/templates/java/org/prism/Loader.java.erb +++ b/templates/java/org/prism/Loader.java.erb @@ -363,7 +363,7 @@ public class Loader { <%- params = ["startOffset", "length"] params << "buffer.getInt()" if node.needs_serialized_length? - params << "loadFlags()" + params << "loadFlags()" if node.flags params.concat node.semantic_fields.map { |field| case field when Prism::Template::NodeField then "#{field.java_cast}loadNode()" diff --git a/templates/java/org/prism/Nodes.java.erb b/templates/java/org/prism/Nodes.java.erb index 45a4aa71dd7..f2fa870ecec 100644 --- a/templates/java/org/prism/Nodes.java.erb +++ b/templates/java/org/prism/Nodes.java.erb @@ -94,13 +94,11 @@ public abstract class Nodes { public final int startOffset; public final int length; - protected final short flags; private boolean newLineFlag = false; - public Node(int startOffset, int length, short flags) { + public Node(int startOffset, int length) { this.startOffset = startOffset; this.length = length; - this.flags = flags; } public final int endOffset() { @@ -202,6 +200,9 @@ public abstract class Nodes { <%- if node.needs_serialized_length? -%> public final int serializedLength; <%- end -%> + <%- if node.flags -%> + public final short flags; + <%- end -%> <%- node.semantic_fields.each do |field| -%> <%- if field.comment -%> /** @@ -224,14 +225,17 @@ public abstract class Nodes { <%- params = ["int startOffset", "int length"] params << "int serializedLength" if node.needs_serialized_length? - params << "short flags" + params << "short flags" if node.flags params.concat(node.semantic_fields.map { |field| "#{field.java_type} #{field.name}" }) -%> public <%= node.name -%>(<%= params.join(", ") %>) { - super(startOffset, length, flags); + super(startOffset, length); <%- if node.needs_serialized_length? -%> this.serializedLength = serializedLength; <%- end -%> + <%- if node.flags -%> + this.flags = flags; + <%- end -%> <%- node.semantic_fields.each do |field| -%> this.<%= field.name %> = <%= field.name %>; <%- end -%> diff --git a/templates/src/serialize.c.erb b/templates/src/serialize.c.erb index faf7962b741..9f8f0cbd077 100644 --- a/templates/src/serialize.c.erb +++ b/templates/src/serialize.c.erb @@ -92,7 +92,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) { size_t length_offset = buffer->length; pm_buffer_append_string(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */ <%- end -%> + <%- unless Prism::Template::SERIALIZE_ONLY_SEMANTICS_FIELDS && !node.flags -%> pm_buffer_append_varuint(buffer, (uint32_t) node->flags); + <%- end -%> <%- node.fields.each do |field| -%> <%- case field -%> <%- when Prism::Template::NodeField -%>