diff options
| author | Benoit Daloze <eregontp@gmail.com> | 2024-02-08 16:26:27 +0100 |
|---|---|---|
| committer | git <svn-admin@ruby-lang.org> | 2024-02-14 15:48:32 +0000 |
| commit | f0f6ffef4252fcc899fe2f039b910fc7613d00aa (patch) | |
| tree | 1fd688e83b79528d07cd38e55917057f4a9d43dd /prism/templates/src | |
| parent | 65f54355406a25f352241406967d038fc72d4737 (diff) | |
[ruby/prism] Serialize the newline_list to avoid recomputing it again later
* Fixes https://github.com/ruby/prism/issues/2380
https://github.com/ruby/prism/commit/4eaaa90114
Diffstat (limited to 'prism/templates/src')
| -rw-r--r-- | prism/templates/src/serialize.c.erb | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/prism/templates/src/serialize.c.erb b/prism/templates/src/serialize.c.erb index deda01f29c..c9511bbfca 100644 --- a/prism/templates/src/serialize.c.erb +++ b/prism/templates/src/serialize.c.erb @@ -129,6 +129,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) { } static void +pm_serialize_newline_list(pm_newline_list_t *list, pm_buffer_t *buffer) { + uint32_t size = pm_sizet_to_u32(list->size); + pm_buffer_append_varuint(buffer, size); + + for (uint32_t i = 0; i < size; i++) { + uint32_t offset = pm_sizet_to_u32(list->offsets[i]); + pm_buffer_append_varuint(buffer, offset); + } +} + +static void pm_serialize_comment(pm_parser_t *parser, pm_comment_t *comment, pm_buffer_t *buffer) { // serialize type pm_buffer_append_byte(buffer, (uint8_t) comment->type); @@ -214,14 +225,11 @@ pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer) { pm_buffer_append_string(buffer, encoding->name, encoding_length); } -#line <%= __LINE__ + 1 %> "<%= File.basename(__FILE__) %>" -/** - * Serialize the encoding, metadata, nodes, and constant pool. - */ -void -pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) { +static void +pm_serialize_metadata(pm_parser_t *parser, pm_buffer_t *buffer) { pm_serialize_encoding(parser->encoding, buffer); pm_buffer_append_varsint(buffer, parser->start_line); + pm_serialize_newline_list(&parser->newline_list, buffer); <%- unless Prism::SERIALIZE_ONLY_SEMANTICS_FIELDS -%> pm_serialize_comment_list(parser, &parser->comment_list, buffer); <%- end -%> @@ -229,6 +237,15 @@ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) pm_serialize_data_loc(parser, buffer); pm_serialize_diagnostic_list(parser, &parser->error_list, buffer); pm_serialize_diagnostic_list(parser, &parser->warning_list, buffer); +} + +#line <%= __LINE__ + 1 %> "<%= File.basename(__FILE__) %>" +/** + * Serialize the metadata, nodes, and constant pool. + */ +void +pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) { + pm_serialize_metadata(parser, buffer); // Here we're going to leave space for the offset of the constant pool in // the buffer. @@ -319,13 +336,7 @@ pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const // Append 0 to mark end of tokens. pm_buffer_append_byte(buffer, 0); - pm_serialize_encoding(parser.encoding, buffer); - pm_buffer_append_varsint(buffer, parser.start_line); - pm_serialize_comment_list(&parser, &parser.comment_list, buffer); - pm_serialize_magic_comment_list(&parser, &parser.magic_comment_list, buffer); - pm_serialize_data_loc(&parser, buffer); - pm_serialize_diagnostic_list(&parser, &parser.error_list, buffer); - pm_serialize_diagnostic_list(&parser, &parser.warning_list, buffer); + pm_serialize_metadata(&parser, buffer); pm_node_destroy(&parser, node); pm_parser_free(&parser); |
