11#line <%= __LINE__ + 1 %> "prism/templates/ext/prism/<%= File.basename(__FILE__) %> "
22#include "prism/extension.h"
33#include "prism/internal/allocator.h"
4+ #include "prism/internal/arena.h"
45
56#include <assert .h >
67
@@ -81,11 +82,7 @@ pm_source_new(const pm_parser_t *parser, rb_encoding *encoding, bool freeze) {
8182 VALUE source_string = rb_enc_str_new((const char *) start, pm_parser_end(parser) - start, encoding);
8283
8384 const pm_line_offset_list_t *line_offsets = pm_parser_line_offsets(parser);
84- VALUE offsets = rb_ary_new_capa(line_offsets-> size);
85-
86- for (size_t index = 0; index < line _offsets- > size; index++) {
87- rb_ary_push(offsets, ULONG2NUM(line_offsets-> offsets[index]));
88- }
85+ VALUE offsets = rb_str_new((const char *) line_offsets-> offsets, line_offsets-> size * sizeof(uint32_t));
8986
9087 if (freeze) {
9188 rb_obj_freeze(source_string);
@@ -105,8 +102,8 @@ typedef struct pm_node_stack_node {
105102} pm_node_stack_node_t;
106103
107104static void
108- pm_node_stack_push(pm_node_stack_node_t **stack, const pm_node_t *visit) {
109- pm_node_stack_node_t *node = xmalloc( sizeof(pm_node_stack_node_t));
105+ pm_node_stack_push(pm_arena_t *arena, pm_node_stack_node_t **stack, const pm_node_t *visit) {
106+ pm_node_stack_node_t *node = (pm_node_stack_node_t *) pm_arena_alloc(arena, sizeof(pm_node_stack_node_t), PRISM_ALIGNOF (pm_node_stack_node_t));
110107 node-> prev = *stack;
111108 node-> visit = visit;
112109 node-> visited = false;
@@ -119,7 +116,6 @@ pm_node_stack_pop(pm_node_stack_node_t **stack) {
119116 const pm_node_t *visit = current-> visit;
120117
121118 *stack = current-> prev;
122- xfree_sized(current, sizeof(pm_node_stack_node_t));
123119
124120 return visit;
125121}
@@ -151,8 +147,9 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
151147 pm_ast_constants_each_data_t constants_data = { .constants = constants, .encoding = encoding };
152148 pm_parser_constants_each(parser, pm_ast_constants_each, &constants_data);
153149
150+ pm_arena_t *node_arena = pm_arena_new();
154151 pm_node_stack_node_t *node_stack = NULL;
155- pm_node_stack_push(&node_stack, node);
152+ pm_node_stack_push(node_arena, &node_stack, node);
156153 VALUE value_stack = rb_ary_new();
157154
158155 while (node_stack != NULL) {
@@ -175,10 +172,10 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
175172 <%- node . fields . each do |field | -%>
176173 <%- case field -%>
177174 <%- when Prism ::Template ::NodeField , Prism ::Template ::OptionalNodeField -%>
178- pm_node_stack_push(&node_stack, (pm_node_t *) cast-> <%= field . name %> );
175+ pm_node_stack_push(node_arena, &node_stack, (pm_node_t *) cast-> <%= field . name %> );
179176 <%- when Prism ::Template ::NodeListField -%>
180177 for (size_t index = 0; index < cast- > <%= field . name %> .size; index++) {
181- pm_node_stack_push(&node_stack, (pm_node_t *) cast-> <%= field . name %> .nodes[index]);
178+ pm_node_stack_push(node_arena, &node_stack, (pm_node_t *) cast-> <%= field . name %> .nodes[index]);
182179 }
183180 <%- end -%>
184181 <%- end -%>
@@ -280,6 +277,7 @@ pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encodi
280277 }
281278 }
282279
280+ pm_arena_free(node_arena);
283281 return rb_ary_pop(value_stack);
284282}
285283
0 commit comments