Ruby 4.1.0dev (2026-04-17 revision 11e3c78b61da705c783dd12fb7f158c0d256ede0)
serialize.c
1/*----------------------------------------------------------------------------*/
2/* This file is generated by the templates/template.rb script and should not */
3/* be modified manually. See */
4/* templates/src/serialize.c.erb */
5/* if you are looking to modify the */
6/* template */
7/*----------------------------------------------------------------------------*/
8
9#include "prism/excludes.h"
10
11/* We optionally support serializing to a binary string. For systems that do not
12 * want or need this functionality, it can be turned off with the
13 * PRISM_EXCLUDE_SERIALIZATION define. */
14#ifdef PRISM_EXCLUDE_SERIALIZATION
15
16/* Ensure this translation unit is never empty, even when serialization is
17 * excluded. */
18typedef int pm_serialize_unused_t;
19
20#else
21
23
24#include "prism/internal/buffer.h"
25#include "prism/internal/comments.h"
26#include "prism/internal/diagnostic.h"
27#include "prism/internal/encoding.h"
28#include "prism/internal/list.h"
29#include "prism/internal/magic_comments.h"
30#include "prism/internal/options.h"
31#include "prism/internal/parser.h"
32
33#include "prism.h"
34#include "prism/ast.h"
36
37#include <assert.h>
38#include <stdio.h>
39#include <string.h>
40
41static PRISM_INLINE uint32_t
42pm_ptrdifft_to_u32(ptrdiff_t value) {
43 assert(value >= 0 && ((unsigned long) value) < UINT32_MAX);
44 return (uint32_t) value;
45}
46
47static PRISM_INLINE uint32_t
48pm_sizet_to_u32(size_t value) {
49 assert(value < UINT32_MAX);
50 return (uint32_t) value;
51}
52
53static void
54pm_serialize_location(const pm_location_t *location, pm_buffer_t *buffer) {
55 pm_buffer_append_varuint(buffer, location->start);
56 pm_buffer_append_varuint(buffer, location->length);
57}
58
59static void
60pm_serialize_string(const pm_string_t *string, pm_buffer_t *buffer) {
61 uint32_t length = pm_sizet_to_u32(pm_string_length(string));
62 pm_buffer_append_varuint(buffer, length);
63 pm_buffer_append_bytes(buffer, pm_string_source(string), length);
64}
65
66static void
67pm_serialize_integer(const pm_integer_t *integer, pm_buffer_t *buffer) {
68 pm_buffer_append_byte(buffer, integer->negative ? 1 : 0);
69 if (integer->values == NULL) {
70 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(1));
71 pm_buffer_append_varuint(buffer, integer->value);
72 } else {
73 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(integer->length));
74 for (size_t i = 0; i < integer->length; i++) {
75 pm_buffer_append_varuint(buffer, integer->values[i]);
76 }
77 }
78}
79
80static void
81pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
82 pm_buffer_append_byte(buffer, (uint8_t) PM_NODE_TYPE(node));
83
84 pm_buffer_append_varuint(buffer, node->node_id);
85 pm_serialize_location(&node->location, buffer);
86
87 switch (PM_NODE_TYPE(node)) {
88 // We do not need to serialize a ScopeNode ever as
89 // it is not part of the AST
90 case PM_SCOPE_NODE:
91 return;
92 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
93 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
94 pm_serialize_node(parser, (pm_node_t *)((pm_alias_global_variable_node_t *)node)->new_name, buffer);
95 pm_serialize_node(parser, (pm_node_t *)((pm_alias_global_variable_node_t *)node)->old_name, buffer);
96 pm_serialize_location(&((pm_alias_global_variable_node_t *)node)->keyword_loc, buffer);
97 break;
98 }
99 case PM_ALIAS_METHOD_NODE: {
100 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
101 pm_serialize_node(parser, (pm_node_t *)((pm_alias_method_node_t *)node)->new_name, buffer);
102 pm_serialize_node(parser, (pm_node_t *)((pm_alias_method_node_t *)node)->old_name, buffer);
103 pm_serialize_location(&((pm_alias_method_node_t *)node)->keyword_loc, buffer);
104 break;
105 }
106 case PM_ALTERNATION_PATTERN_NODE: {
107 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
108 pm_serialize_node(parser, (pm_node_t *)((pm_alternation_pattern_node_t *)node)->left, buffer);
109 pm_serialize_node(parser, (pm_node_t *)((pm_alternation_pattern_node_t *)node)->right, buffer);
110 pm_serialize_location(&((pm_alternation_pattern_node_t *)node)->operator_loc, buffer);
111 break;
112 }
113 case PM_AND_NODE: {
114 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
115 pm_serialize_node(parser, (pm_node_t *)((pm_and_node_t *)node)->left, buffer);
116 pm_serialize_node(parser, (pm_node_t *)((pm_and_node_t *)node)->right, buffer);
117 pm_serialize_location(&((pm_and_node_t *)node)->operator_loc, buffer);
118 break;
119 }
120 case PM_ARGUMENTS_NODE: {
121 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
122 uint32_t arguments_size = pm_sizet_to_u32(((pm_arguments_node_t *)node)->arguments.size);
123 pm_buffer_append_varuint(buffer, arguments_size);
124 for (uint32_t index = 0; index < arguments_size; index++) {
125 pm_serialize_node(parser, (pm_node_t *) ((pm_arguments_node_t *)node)->arguments.nodes[index], buffer);
126 }
127 break;
128 }
129 case PM_ARRAY_NODE: {
130 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
131 uint32_t elements_size = pm_sizet_to_u32(((pm_array_node_t *)node)->elements.size);
132 pm_buffer_append_varuint(buffer, elements_size);
133 for (uint32_t index = 0; index < elements_size; index++) {
134 pm_serialize_node(parser, (pm_node_t *) ((pm_array_node_t *)node)->elements.nodes[index], buffer);
135 }
136 if (((pm_array_node_t *)node)->opening_loc.length == 0) {
137 pm_buffer_append_byte(buffer, 0);
138 } else {
139 pm_buffer_append_byte(buffer, 1);
140 pm_serialize_location(&((pm_array_node_t *)node)->opening_loc, buffer);
141 }
142 if (((pm_array_node_t *)node)->closing_loc.length == 0) {
143 pm_buffer_append_byte(buffer, 0);
144 } else {
145 pm_buffer_append_byte(buffer, 1);
146 pm_serialize_location(&((pm_array_node_t *)node)->closing_loc, buffer);
147 }
148 break;
149 }
150 case PM_ARRAY_PATTERN_NODE: {
151 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
152 if (((pm_array_pattern_node_t *)node)->constant == NULL) {
153 pm_buffer_append_byte(buffer, 0);
154 } else {
155 pm_serialize_node(parser, (pm_node_t *)((pm_array_pattern_node_t *)node)->constant, buffer);
156 }
157 uint32_t requireds_size = pm_sizet_to_u32(((pm_array_pattern_node_t *)node)->requireds.size);
158 pm_buffer_append_varuint(buffer, requireds_size);
159 for (uint32_t index = 0; index < requireds_size; index++) {
160 pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->requireds.nodes[index], buffer);
161 }
162 if (((pm_array_pattern_node_t *)node)->rest == NULL) {
163 pm_buffer_append_byte(buffer, 0);
164 } else {
165 pm_serialize_node(parser, (pm_node_t *)((pm_array_pattern_node_t *)node)->rest, buffer);
166 }
167 uint32_t posts_size = pm_sizet_to_u32(((pm_array_pattern_node_t *)node)->posts.size);
168 pm_buffer_append_varuint(buffer, posts_size);
169 for (uint32_t index = 0; index < posts_size; index++) {
170 pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->posts.nodes[index], buffer);
171 }
172 if (((pm_array_pattern_node_t *)node)->opening_loc.length == 0) {
173 pm_buffer_append_byte(buffer, 0);
174 } else {
175 pm_buffer_append_byte(buffer, 1);
176 pm_serialize_location(&((pm_array_pattern_node_t *)node)->opening_loc, buffer);
177 }
178 if (((pm_array_pattern_node_t *)node)->closing_loc.length == 0) {
179 pm_buffer_append_byte(buffer, 0);
180 } else {
181 pm_buffer_append_byte(buffer, 1);
182 pm_serialize_location(&((pm_array_pattern_node_t *)node)->closing_loc, buffer);
183 }
184 break;
185 }
186 case PM_ASSOC_NODE: {
187 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
188 pm_serialize_node(parser, (pm_node_t *)((pm_assoc_node_t *)node)->key, buffer);
189 pm_serialize_node(parser, (pm_node_t *)((pm_assoc_node_t *)node)->value, buffer);
190 if (((pm_assoc_node_t *)node)->operator_loc.length == 0) {
191 pm_buffer_append_byte(buffer, 0);
192 } else {
193 pm_buffer_append_byte(buffer, 1);
194 pm_serialize_location(&((pm_assoc_node_t *)node)->operator_loc, buffer);
195 }
196 break;
197 }
198 case PM_ASSOC_SPLAT_NODE: {
199 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
200 if (((pm_assoc_splat_node_t *)node)->value == NULL) {
201 pm_buffer_append_byte(buffer, 0);
202 } else {
203 pm_serialize_node(parser, (pm_node_t *)((pm_assoc_splat_node_t *)node)->value, buffer);
204 }
205 pm_serialize_location(&((pm_assoc_splat_node_t *)node)->operator_loc, buffer);
206 break;
207 }
208 case PM_BACK_REFERENCE_READ_NODE: {
209 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
210 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_back_reference_read_node_t *)node)->name));
211 break;
212 }
213 case PM_BEGIN_NODE: {
214 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
215 if (((pm_begin_node_t *)node)->begin_keyword_loc.length == 0) {
216 pm_buffer_append_byte(buffer, 0);
217 } else {
218 pm_buffer_append_byte(buffer, 1);
219 pm_serialize_location(&((pm_begin_node_t *)node)->begin_keyword_loc, buffer);
220 }
221 if (((pm_begin_node_t *)node)->statements == NULL) {
222 pm_buffer_append_byte(buffer, 0);
223 } else {
224 pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->statements, buffer);
225 }
226 if (((pm_begin_node_t *)node)->rescue_clause == NULL) {
227 pm_buffer_append_byte(buffer, 0);
228 } else {
229 pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->rescue_clause, buffer);
230 }
231 if (((pm_begin_node_t *)node)->else_clause == NULL) {
232 pm_buffer_append_byte(buffer, 0);
233 } else {
234 pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->else_clause, buffer);
235 }
236 if (((pm_begin_node_t *)node)->ensure_clause == NULL) {
237 pm_buffer_append_byte(buffer, 0);
238 } else {
239 pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->ensure_clause, buffer);
240 }
241 if (((pm_begin_node_t *)node)->end_keyword_loc.length == 0) {
242 pm_buffer_append_byte(buffer, 0);
243 } else {
244 pm_buffer_append_byte(buffer, 1);
245 pm_serialize_location(&((pm_begin_node_t *)node)->end_keyword_loc, buffer);
246 }
247 break;
248 }
249 case PM_BLOCK_ARGUMENT_NODE: {
250 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
251 if (((pm_block_argument_node_t *)node)->expression == NULL) {
252 pm_buffer_append_byte(buffer, 0);
253 } else {
254 pm_serialize_node(parser, (pm_node_t *)((pm_block_argument_node_t *)node)->expression, buffer);
255 }
256 pm_serialize_location(&((pm_block_argument_node_t *)node)->operator_loc, buffer);
257 break;
258 }
259 case PM_BLOCK_LOCAL_VARIABLE_NODE: {
260 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
261 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_local_variable_node_t *)node)->name));
262 break;
263 }
264 case PM_BLOCK_NODE: {
265 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
266 uint32_t locals_size = pm_sizet_to_u32(((pm_block_node_t *)node)->locals.size);
267 pm_buffer_append_varuint(buffer, locals_size);
268 for (uint32_t index = 0; index < locals_size; index++) {
269 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_node_t *)node)->locals.ids[index]));
270 }
271 if (((pm_block_node_t *)node)->parameters == NULL) {
272 pm_buffer_append_byte(buffer, 0);
273 } else {
274 pm_serialize_node(parser, (pm_node_t *)((pm_block_node_t *)node)->parameters, buffer);
275 }
276 if (((pm_block_node_t *)node)->body == NULL) {
277 pm_buffer_append_byte(buffer, 0);
278 } else {
279 pm_serialize_node(parser, (pm_node_t *)((pm_block_node_t *)node)->body, buffer);
280 }
281 pm_serialize_location(&((pm_block_node_t *)node)->opening_loc, buffer);
282 pm_serialize_location(&((pm_block_node_t *)node)->closing_loc, buffer);
283 break;
284 }
285 case PM_BLOCK_PARAMETER_NODE: {
286 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
287 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_block_parameter_node_t *)node)->name));
288 if (((pm_block_parameter_node_t *)node)->name_loc.length == 0) {
289 pm_buffer_append_byte(buffer, 0);
290 } else {
291 pm_buffer_append_byte(buffer, 1);
292 pm_serialize_location(&((pm_block_parameter_node_t *)node)->name_loc, buffer);
293 }
294 pm_serialize_location(&((pm_block_parameter_node_t *)node)->operator_loc, buffer);
295 break;
296 }
297 case PM_BLOCK_PARAMETERS_NODE: {
298 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
299 if (((pm_block_parameters_node_t *)node)->parameters == NULL) {
300 pm_buffer_append_byte(buffer, 0);
301 } else {
302 pm_serialize_node(parser, (pm_node_t *)((pm_block_parameters_node_t *)node)->parameters, buffer);
303 }
304 uint32_t locals_size = pm_sizet_to_u32(((pm_block_parameters_node_t *)node)->locals.size);
305 pm_buffer_append_varuint(buffer, locals_size);
306 for (uint32_t index = 0; index < locals_size; index++) {
307 pm_serialize_node(parser, (pm_node_t *) ((pm_block_parameters_node_t *)node)->locals.nodes[index], buffer);
308 }
309 if (((pm_block_parameters_node_t *)node)->opening_loc.length == 0) {
310 pm_buffer_append_byte(buffer, 0);
311 } else {
312 pm_buffer_append_byte(buffer, 1);
313 pm_serialize_location(&((pm_block_parameters_node_t *)node)->opening_loc, buffer);
314 }
315 if (((pm_block_parameters_node_t *)node)->closing_loc.length == 0) {
316 pm_buffer_append_byte(buffer, 0);
317 } else {
318 pm_buffer_append_byte(buffer, 1);
319 pm_serialize_location(&((pm_block_parameters_node_t *)node)->closing_loc, buffer);
320 }
321 break;
322 }
323 case PM_BREAK_NODE: {
324 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
325 if (((pm_break_node_t *)node)->arguments == NULL) {
326 pm_buffer_append_byte(buffer, 0);
327 } else {
328 pm_serialize_node(parser, (pm_node_t *)((pm_break_node_t *)node)->arguments, buffer);
329 }
330 pm_serialize_location(&((pm_break_node_t *)node)->keyword_loc, buffer);
331 break;
332 }
333 case PM_CALL_AND_WRITE_NODE: {
334 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
335 if (((pm_call_and_write_node_t *)node)->receiver == NULL) {
336 pm_buffer_append_byte(buffer, 0);
337 } else {
338 pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->receiver, buffer);
339 }
340 if (((pm_call_and_write_node_t *)node)->call_operator_loc.length == 0) {
341 pm_buffer_append_byte(buffer, 0);
342 } else {
343 pm_buffer_append_byte(buffer, 1);
344 pm_serialize_location(&((pm_call_and_write_node_t *)node)->call_operator_loc, buffer);
345 }
346 if (((pm_call_and_write_node_t *)node)->message_loc.length == 0) {
347 pm_buffer_append_byte(buffer, 0);
348 } else {
349 pm_buffer_append_byte(buffer, 1);
350 pm_serialize_location(&((pm_call_and_write_node_t *)node)->message_loc, buffer);
351 }
352 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->read_name));
353 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->write_name));
354 pm_serialize_location(&((pm_call_and_write_node_t *)node)->operator_loc, buffer);
355 pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->value, buffer);
356 break;
357 }
358 case PM_CALL_NODE: {
359 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
360 if (((pm_call_node_t *)node)->receiver == NULL) {
361 pm_buffer_append_byte(buffer, 0);
362 } else {
363 pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->receiver, buffer);
364 }
365 if (((pm_call_node_t *)node)->call_operator_loc.length == 0) {
366 pm_buffer_append_byte(buffer, 0);
367 } else {
368 pm_buffer_append_byte(buffer, 1);
369 pm_serialize_location(&((pm_call_node_t *)node)->call_operator_loc, buffer);
370 }
371 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_node_t *)node)->name));
372 if (((pm_call_node_t *)node)->message_loc.length == 0) {
373 pm_buffer_append_byte(buffer, 0);
374 } else {
375 pm_buffer_append_byte(buffer, 1);
376 pm_serialize_location(&((pm_call_node_t *)node)->message_loc, buffer);
377 }
378 if (((pm_call_node_t *)node)->opening_loc.length == 0) {
379 pm_buffer_append_byte(buffer, 0);
380 } else {
381 pm_buffer_append_byte(buffer, 1);
382 pm_serialize_location(&((pm_call_node_t *)node)->opening_loc, buffer);
383 }
384 if (((pm_call_node_t *)node)->arguments == NULL) {
385 pm_buffer_append_byte(buffer, 0);
386 } else {
387 pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->arguments, buffer);
388 }
389 if (((pm_call_node_t *)node)->closing_loc.length == 0) {
390 pm_buffer_append_byte(buffer, 0);
391 } else {
392 pm_buffer_append_byte(buffer, 1);
393 pm_serialize_location(&((pm_call_node_t *)node)->closing_loc, buffer);
394 }
395 if (((pm_call_node_t *)node)->equal_loc.length == 0) {
396 pm_buffer_append_byte(buffer, 0);
397 } else {
398 pm_buffer_append_byte(buffer, 1);
399 pm_serialize_location(&((pm_call_node_t *)node)->equal_loc, buffer);
400 }
401 if (((pm_call_node_t *)node)->block == NULL) {
402 pm_buffer_append_byte(buffer, 0);
403 } else {
404 pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->block, buffer);
405 }
406 break;
407 }
408 case PM_CALL_OPERATOR_WRITE_NODE: {
409 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
410 if (((pm_call_operator_write_node_t *)node)->receiver == NULL) {
411 pm_buffer_append_byte(buffer, 0);
412 } else {
413 pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->receiver, buffer);
414 }
415 if (((pm_call_operator_write_node_t *)node)->call_operator_loc.length == 0) {
416 pm_buffer_append_byte(buffer, 0);
417 } else {
418 pm_buffer_append_byte(buffer, 1);
419 pm_serialize_location(&((pm_call_operator_write_node_t *)node)->call_operator_loc, buffer);
420 }
421 if (((pm_call_operator_write_node_t *)node)->message_loc.length == 0) {
422 pm_buffer_append_byte(buffer, 0);
423 } else {
424 pm_buffer_append_byte(buffer, 1);
425 pm_serialize_location(&((pm_call_operator_write_node_t *)node)->message_loc, buffer);
426 }
427 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->read_name));
428 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->write_name));
429 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->binary_operator));
430 pm_serialize_location(&((pm_call_operator_write_node_t *)node)->binary_operator_loc, buffer);
431 pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->value, buffer);
432 break;
433 }
434 case PM_CALL_OR_WRITE_NODE: {
435 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
436 if (((pm_call_or_write_node_t *)node)->receiver == NULL) {
437 pm_buffer_append_byte(buffer, 0);
438 } else {
439 pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->receiver, buffer);
440 }
441 if (((pm_call_or_write_node_t *)node)->call_operator_loc.length == 0) {
442 pm_buffer_append_byte(buffer, 0);
443 } else {
444 pm_buffer_append_byte(buffer, 1);
445 pm_serialize_location(&((pm_call_or_write_node_t *)node)->call_operator_loc, buffer);
446 }
447 if (((pm_call_or_write_node_t *)node)->message_loc.length == 0) {
448 pm_buffer_append_byte(buffer, 0);
449 } else {
450 pm_buffer_append_byte(buffer, 1);
451 pm_serialize_location(&((pm_call_or_write_node_t *)node)->message_loc, buffer);
452 }
453 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->read_name));
454 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->write_name));
455 pm_serialize_location(&((pm_call_or_write_node_t *)node)->operator_loc, buffer);
456 pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->value, buffer);
457 break;
458 }
459 case PM_CALL_TARGET_NODE: {
460 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
461 pm_serialize_node(parser, (pm_node_t *)((pm_call_target_node_t *)node)->receiver, buffer);
462 pm_serialize_location(&((pm_call_target_node_t *)node)->call_operator_loc, buffer);
463 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_call_target_node_t *)node)->name));
464 pm_serialize_location(&((pm_call_target_node_t *)node)->message_loc, buffer);
465 break;
466 }
467 case PM_CAPTURE_PATTERN_NODE: {
468 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
469 pm_serialize_node(parser, (pm_node_t *)((pm_capture_pattern_node_t *)node)->value, buffer);
470 pm_serialize_node(parser, (pm_node_t *)((pm_capture_pattern_node_t *)node)->target, buffer);
471 pm_serialize_location(&((pm_capture_pattern_node_t *)node)->operator_loc, buffer);
472 break;
473 }
474 case PM_CASE_MATCH_NODE: {
475 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
476 if (((pm_case_match_node_t *)node)->predicate == NULL) {
477 pm_buffer_append_byte(buffer, 0);
478 } else {
479 pm_serialize_node(parser, (pm_node_t *)((pm_case_match_node_t *)node)->predicate, buffer);
480 }
481 uint32_t conditions_size = pm_sizet_to_u32(((pm_case_match_node_t *)node)->conditions.size);
482 pm_buffer_append_varuint(buffer, conditions_size);
483 for (uint32_t index = 0; index < conditions_size; index++) {
484 pm_serialize_node(parser, (pm_node_t *) ((pm_case_match_node_t *)node)->conditions.nodes[index], buffer);
485 }
486 if (((pm_case_match_node_t *)node)->else_clause == NULL) {
487 pm_buffer_append_byte(buffer, 0);
488 } else {
489 pm_serialize_node(parser, (pm_node_t *)((pm_case_match_node_t *)node)->else_clause, buffer);
490 }
491 pm_serialize_location(&((pm_case_match_node_t *)node)->case_keyword_loc, buffer);
492 pm_serialize_location(&((pm_case_match_node_t *)node)->end_keyword_loc, buffer);
493 break;
494 }
495 case PM_CASE_NODE: {
496 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
497 if (((pm_case_node_t *)node)->predicate == NULL) {
498 pm_buffer_append_byte(buffer, 0);
499 } else {
500 pm_serialize_node(parser, (pm_node_t *)((pm_case_node_t *)node)->predicate, buffer);
501 }
502 uint32_t conditions_size = pm_sizet_to_u32(((pm_case_node_t *)node)->conditions.size);
503 pm_buffer_append_varuint(buffer, conditions_size);
504 for (uint32_t index = 0; index < conditions_size; index++) {
505 pm_serialize_node(parser, (pm_node_t *) ((pm_case_node_t *)node)->conditions.nodes[index], buffer);
506 }
507 if (((pm_case_node_t *)node)->else_clause == NULL) {
508 pm_buffer_append_byte(buffer, 0);
509 } else {
510 pm_serialize_node(parser, (pm_node_t *)((pm_case_node_t *)node)->else_clause, buffer);
511 }
512 pm_serialize_location(&((pm_case_node_t *)node)->case_keyword_loc, buffer);
513 pm_serialize_location(&((pm_case_node_t *)node)->end_keyword_loc, buffer);
514 break;
515 }
516 case PM_CLASS_NODE: {
517 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
518 uint32_t locals_size = pm_sizet_to_u32(((pm_class_node_t *)node)->locals.size);
519 pm_buffer_append_varuint(buffer, locals_size);
520 for (uint32_t index = 0; index < locals_size; index++) {
521 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->locals.ids[index]));
522 }
523 pm_serialize_location(&((pm_class_node_t *)node)->class_keyword_loc, buffer);
524 pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->constant_path, buffer);
525 if (((pm_class_node_t *)node)->inheritance_operator_loc.length == 0) {
526 pm_buffer_append_byte(buffer, 0);
527 } else {
528 pm_buffer_append_byte(buffer, 1);
529 pm_serialize_location(&((pm_class_node_t *)node)->inheritance_operator_loc, buffer);
530 }
531 if (((pm_class_node_t *)node)->superclass == NULL) {
532 pm_buffer_append_byte(buffer, 0);
533 } else {
534 pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->superclass, buffer);
535 }
536 if (((pm_class_node_t *)node)->body == NULL) {
537 pm_buffer_append_byte(buffer, 0);
538 } else {
539 pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->body, buffer);
540 }
541 pm_serialize_location(&((pm_class_node_t *)node)->end_keyword_loc, buffer);
542 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->name));
543 break;
544 }
545 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
546 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
547 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_and_write_node_t *)node)->name));
548 pm_serialize_location(&((pm_class_variable_and_write_node_t *)node)->name_loc, buffer);
549 pm_serialize_location(&((pm_class_variable_and_write_node_t *)node)->operator_loc, buffer);
550 pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_and_write_node_t *)node)->value, buffer);
551 break;
552 }
553 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
554 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
555 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->name));
556 pm_serialize_location(&((pm_class_variable_operator_write_node_t *)node)->name_loc, buffer);
557 pm_serialize_location(&((pm_class_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
558 pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_operator_write_node_t *)node)->value, buffer);
559 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->binary_operator));
560 break;
561 }
562 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
563 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
564 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_or_write_node_t *)node)->name));
565 pm_serialize_location(&((pm_class_variable_or_write_node_t *)node)->name_loc, buffer);
566 pm_serialize_location(&((pm_class_variable_or_write_node_t *)node)->operator_loc, buffer);
567 pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_or_write_node_t *)node)->value, buffer);
568 break;
569 }
570 case PM_CLASS_VARIABLE_READ_NODE: {
571 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
572 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_read_node_t *)node)->name));
573 break;
574 }
575 case PM_CLASS_VARIABLE_TARGET_NODE: {
576 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
577 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_target_node_t *)node)->name));
578 break;
579 }
580 case PM_CLASS_VARIABLE_WRITE_NODE: {
581 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
582 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_class_variable_write_node_t *)node)->name));
583 pm_serialize_location(&((pm_class_variable_write_node_t *)node)->name_loc, buffer);
584 pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_write_node_t *)node)->value, buffer);
585 pm_serialize_location(&((pm_class_variable_write_node_t *)node)->operator_loc, buffer);
586 break;
587 }
588 case PM_CONSTANT_AND_WRITE_NODE: {
589 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
590 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_and_write_node_t *)node)->name));
591 pm_serialize_location(&((pm_constant_and_write_node_t *)node)->name_loc, buffer);
592 pm_serialize_location(&((pm_constant_and_write_node_t *)node)->operator_loc, buffer);
593 pm_serialize_node(parser, (pm_node_t *)((pm_constant_and_write_node_t *)node)->value, buffer);
594 break;
595 }
596 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
597 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
598 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->name));
599 pm_serialize_location(&((pm_constant_operator_write_node_t *)node)->name_loc, buffer);
600 pm_serialize_location(&((pm_constant_operator_write_node_t *)node)->binary_operator_loc, buffer);
601 pm_serialize_node(parser, (pm_node_t *)((pm_constant_operator_write_node_t *)node)->value, buffer);
602 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->binary_operator));
603 break;
604 }
605 case PM_CONSTANT_OR_WRITE_NODE: {
606 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
607 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_or_write_node_t *)node)->name));
608 pm_serialize_location(&((pm_constant_or_write_node_t *)node)->name_loc, buffer);
609 pm_serialize_location(&((pm_constant_or_write_node_t *)node)->operator_loc, buffer);
610 pm_serialize_node(parser, (pm_node_t *)((pm_constant_or_write_node_t *)node)->value, buffer);
611 break;
612 }
613 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
614 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
615 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_and_write_node_t *)node)->target, buffer);
616 pm_serialize_location(&((pm_constant_path_and_write_node_t *)node)->operator_loc, buffer);
617 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_and_write_node_t *)node)->value, buffer);
618 break;
619 }
620 case PM_CONSTANT_PATH_NODE: {
621 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
622 if (((pm_constant_path_node_t *)node)->parent == NULL) {
623 pm_buffer_append_byte(buffer, 0);
624 } else {
625 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_node_t *)node)->parent, buffer);
626 }
627 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_node_t *)node)->name));
628 pm_serialize_location(&((pm_constant_path_node_t *)node)->delimiter_loc, buffer);
629 pm_serialize_location(&((pm_constant_path_node_t *)node)->name_loc, buffer);
630 break;
631 }
632 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
633 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
634 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->target, buffer);
635 pm_serialize_location(&((pm_constant_path_operator_write_node_t *)node)->binary_operator_loc, buffer);
636 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->value, buffer);
637 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_operator_write_node_t *)node)->binary_operator));
638 break;
639 }
640 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
641 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
642 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_or_write_node_t *)node)->target, buffer);
643 pm_serialize_location(&((pm_constant_path_or_write_node_t *)node)->operator_loc, buffer);
644 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_or_write_node_t *)node)->value, buffer);
645 break;
646 }
647 case PM_CONSTANT_PATH_TARGET_NODE: {
648 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
649 if (((pm_constant_path_target_node_t *)node)->parent == NULL) {
650 pm_buffer_append_byte(buffer, 0);
651 } else {
652 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_target_node_t *)node)->parent, buffer);
653 }
654 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_path_target_node_t *)node)->name));
655 pm_serialize_location(&((pm_constant_path_target_node_t *)node)->delimiter_loc, buffer);
656 pm_serialize_location(&((pm_constant_path_target_node_t *)node)->name_loc, buffer);
657 break;
658 }
659 case PM_CONSTANT_PATH_WRITE_NODE: {
660 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
661 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_write_node_t *)node)->target, buffer);
662 pm_serialize_location(&((pm_constant_path_write_node_t *)node)->operator_loc, buffer);
663 pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_write_node_t *)node)->value, buffer);
664 break;
665 }
666 case PM_CONSTANT_READ_NODE: {
667 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
668 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_read_node_t *)node)->name));
669 break;
670 }
671 case PM_CONSTANT_TARGET_NODE: {
672 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
673 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_target_node_t *)node)->name));
674 break;
675 }
676 case PM_CONSTANT_WRITE_NODE: {
677 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
678 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_constant_write_node_t *)node)->name));
679 pm_serialize_location(&((pm_constant_write_node_t *)node)->name_loc, buffer);
680 pm_serialize_node(parser, (pm_node_t *)((pm_constant_write_node_t *)node)->value, buffer);
681 pm_serialize_location(&((pm_constant_write_node_t *)node)->operator_loc, buffer);
682 break;
683 }
684 case PM_DEF_NODE: {
685 // serialize length
686 // encoding of location u32s make us need to save this offset.
687 size_t length_offset = buffer->length;
688 pm_buffer_append_string(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
689 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
690 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->name));
691 pm_serialize_location(&((pm_def_node_t *)node)->name_loc, buffer);
692 if (((pm_def_node_t *)node)->receiver == NULL) {
693 pm_buffer_append_byte(buffer, 0);
694 } else {
695 pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->receiver, buffer);
696 }
697 if (((pm_def_node_t *)node)->parameters == NULL) {
698 pm_buffer_append_byte(buffer, 0);
699 } else {
700 pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->parameters, buffer);
701 }
702 if (((pm_def_node_t *)node)->body == NULL) {
703 pm_buffer_append_byte(buffer, 0);
704 } else {
705 pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->body, buffer);
706 }
707 uint32_t locals_size = pm_sizet_to_u32(((pm_def_node_t *)node)->locals.size);
708 pm_buffer_append_varuint(buffer, locals_size);
709 for (uint32_t index = 0; index < locals_size; index++) {
710 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->locals.ids[index]));
711 }
712 pm_serialize_location(&((pm_def_node_t *)node)->def_keyword_loc, buffer);
713 if (((pm_def_node_t *)node)->operator_loc.length == 0) {
714 pm_buffer_append_byte(buffer, 0);
715 } else {
716 pm_buffer_append_byte(buffer, 1);
717 pm_serialize_location(&((pm_def_node_t *)node)->operator_loc, buffer);
718 }
719 if (((pm_def_node_t *)node)->lparen_loc.length == 0) {
720 pm_buffer_append_byte(buffer, 0);
721 } else {
722 pm_buffer_append_byte(buffer, 1);
723 pm_serialize_location(&((pm_def_node_t *)node)->lparen_loc, buffer);
724 }
725 if (((pm_def_node_t *)node)->rparen_loc.length == 0) {
726 pm_buffer_append_byte(buffer, 0);
727 } else {
728 pm_buffer_append_byte(buffer, 1);
729 pm_serialize_location(&((pm_def_node_t *)node)->rparen_loc, buffer);
730 }
731 if (((pm_def_node_t *)node)->equal_loc.length == 0) {
732 pm_buffer_append_byte(buffer, 0);
733 } else {
734 pm_buffer_append_byte(buffer, 1);
735 pm_serialize_location(&((pm_def_node_t *)node)->equal_loc, buffer);
736 }
737 if (((pm_def_node_t *)node)->end_keyword_loc.length == 0) {
738 pm_buffer_append_byte(buffer, 0);
739 } else {
740 pm_buffer_append_byte(buffer, 1);
741 pm_serialize_location(&((pm_def_node_t *)node)->end_keyword_loc, buffer);
742 }
743 // serialize length
744 uint32_t length = pm_sizet_to_u32(buffer->length - length_offset);
745 memcpy(buffer->value + length_offset, &length, sizeof(uint32_t));
746 break;
747 }
748 case PM_DEFINED_NODE: {
749 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
750 if (((pm_defined_node_t *)node)->lparen_loc.length == 0) {
751 pm_buffer_append_byte(buffer, 0);
752 } else {
753 pm_buffer_append_byte(buffer, 1);
754 pm_serialize_location(&((pm_defined_node_t *)node)->lparen_loc, buffer);
755 }
756 pm_serialize_node(parser, (pm_node_t *)((pm_defined_node_t *)node)->value, buffer);
757 if (((pm_defined_node_t *)node)->rparen_loc.length == 0) {
758 pm_buffer_append_byte(buffer, 0);
759 } else {
760 pm_buffer_append_byte(buffer, 1);
761 pm_serialize_location(&((pm_defined_node_t *)node)->rparen_loc, buffer);
762 }
763 pm_serialize_location(&((pm_defined_node_t *)node)->keyword_loc, buffer);
764 break;
765 }
766 case PM_ELSE_NODE: {
767 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
768 pm_serialize_location(&((pm_else_node_t *)node)->else_keyword_loc, buffer);
769 if (((pm_else_node_t *)node)->statements == NULL) {
770 pm_buffer_append_byte(buffer, 0);
771 } else {
772 pm_serialize_node(parser, (pm_node_t *)((pm_else_node_t *)node)->statements, buffer);
773 }
774 if (((pm_else_node_t *)node)->end_keyword_loc.length == 0) {
775 pm_buffer_append_byte(buffer, 0);
776 } else {
777 pm_buffer_append_byte(buffer, 1);
778 pm_serialize_location(&((pm_else_node_t *)node)->end_keyword_loc, buffer);
779 }
780 break;
781 }
782 case PM_EMBEDDED_STATEMENTS_NODE: {
783 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
784 pm_serialize_location(&((pm_embedded_statements_node_t *)node)->opening_loc, buffer);
785 if (((pm_embedded_statements_node_t *)node)->statements == NULL) {
786 pm_buffer_append_byte(buffer, 0);
787 } else {
788 pm_serialize_node(parser, (pm_node_t *)((pm_embedded_statements_node_t *)node)->statements, buffer);
789 }
790 pm_serialize_location(&((pm_embedded_statements_node_t *)node)->closing_loc, buffer);
791 break;
792 }
793 case PM_EMBEDDED_VARIABLE_NODE: {
794 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
795 pm_serialize_location(&((pm_embedded_variable_node_t *)node)->operator_loc, buffer);
796 pm_serialize_node(parser, (pm_node_t *)((pm_embedded_variable_node_t *)node)->variable, buffer);
797 break;
798 }
799 case PM_ENSURE_NODE: {
800 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
801 pm_serialize_location(&((pm_ensure_node_t *)node)->ensure_keyword_loc, buffer);
802 if (((pm_ensure_node_t *)node)->statements == NULL) {
803 pm_buffer_append_byte(buffer, 0);
804 } else {
805 pm_serialize_node(parser, (pm_node_t *)((pm_ensure_node_t *)node)->statements, buffer);
806 }
807 pm_serialize_location(&((pm_ensure_node_t *)node)->end_keyword_loc, buffer);
808 break;
809 }
810 case PM_ERROR_RECOVERY_NODE: {
811 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
812 if (((pm_error_recovery_node_t *)node)->unexpected == NULL) {
813 pm_buffer_append_byte(buffer, 0);
814 } else {
815 pm_serialize_node(parser, (pm_node_t *)((pm_error_recovery_node_t *)node)->unexpected, buffer);
816 }
817 break;
818 }
819 case PM_FALSE_NODE: {
820 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
821 break;
822 }
823 case PM_FIND_PATTERN_NODE: {
824 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
825 if (((pm_find_pattern_node_t *)node)->constant == NULL) {
826 pm_buffer_append_byte(buffer, 0);
827 } else {
828 pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->constant, buffer);
829 }
830 pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->left, buffer);
831 uint32_t requireds_size = pm_sizet_to_u32(((pm_find_pattern_node_t *)node)->requireds.size);
832 pm_buffer_append_varuint(buffer, requireds_size);
833 for (uint32_t index = 0; index < requireds_size; index++) {
834 pm_serialize_node(parser, (pm_node_t *) ((pm_find_pattern_node_t *)node)->requireds.nodes[index], buffer);
835 }
836 pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->right, buffer);
837 if (((pm_find_pattern_node_t *)node)->opening_loc.length == 0) {
838 pm_buffer_append_byte(buffer, 0);
839 } else {
840 pm_buffer_append_byte(buffer, 1);
841 pm_serialize_location(&((pm_find_pattern_node_t *)node)->opening_loc, buffer);
842 }
843 if (((pm_find_pattern_node_t *)node)->closing_loc.length == 0) {
844 pm_buffer_append_byte(buffer, 0);
845 } else {
846 pm_buffer_append_byte(buffer, 1);
847 pm_serialize_location(&((pm_find_pattern_node_t *)node)->closing_loc, buffer);
848 }
849 break;
850 }
851 case PM_FLIP_FLOP_NODE: {
852 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
853 if (((pm_flip_flop_node_t *)node)->left == NULL) {
854 pm_buffer_append_byte(buffer, 0);
855 } else {
856 pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->left, buffer);
857 }
858 if (((pm_flip_flop_node_t *)node)->right == NULL) {
859 pm_buffer_append_byte(buffer, 0);
860 } else {
861 pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->right, buffer);
862 }
863 pm_serialize_location(&((pm_flip_flop_node_t *)node)->operator_loc, buffer);
864 break;
865 }
866 case PM_FLOAT_NODE: {
867 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
868 pm_buffer_append_double(buffer, ((pm_float_node_t *)node)->value);
869 break;
870 }
871 case PM_FOR_NODE: {
872 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
873 pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->index, buffer);
874 pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->collection, buffer);
875 if (((pm_for_node_t *)node)->statements == NULL) {
876 pm_buffer_append_byte(buffer, 0);
877 } else {
878 pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->statements, buffer);
879 }
880 pm_serialize_location(&((pm_for_node_t *)node)->for_keyword_loc, buffer);
881 pm_serialize_location(&((pm_for_node_t *)node)->in_keyword_loc, buffer);
882 if (((pm_for_node_t *)node)->do_keyword_loc.length == 0) {
883 pm_buffer_append_byte(buffer, 0);
884 } else {
885 pm_buffer_append_byte(buffer, 1);
886 pm_serialize_location(&((pm_for_node_t *)node)->do_keyword_loc, buffer);
887 }
888 pm_serialize_location(&((pm_for_node_t *)node)->end_keyword_loc, buffer);
889 break;
890 }
891 case PM_FORWARDING_ARGUMENTS_NODE: {
892 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
893 break;
894 }
895 case PM_FORWARDING_PARAMETER_NODE: {
896 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
897 break;
898 }
899 case PM_FORWARDING_SUPER_NODE: {
900 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
901 pm_serialize_location(&((pm_forwarding_super_node_t *)node)->keyword_loc, buffer);
902 if (((pm_forwarding_super_node_t *)node)->block == NULL) {
903 pm_buffer_append_byte(buffer, 0);
904 } else {
905 pm_serialize_node(parser, (pm_node_t *)((pm_forwarding_super_node_t *)node)->block, buffer);
906 }
907 break;
908 }
909 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
910 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
911 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_and_write_node_t *)node)->name));
912 pm_serialize_location(&((pm_global_variable_and_write_node_t *)node)->name_loc, buffer);
913 pm_serialize_location(&((pm_global_variable_and_write_node_t *)node)->operator_loc, buffer);
914 pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_and_write_node_t *)node)->value, buffer);
915 break;
916 }
917 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
918 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
919 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->name));
920 pm_serialize_location(&((pm_global_variable_operator_write_node_t *)node)->name_loc, buffer);
921 pm_serialize_location(&((pm_global_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
922 pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_operator_write_node_t *)node)->value, buffer);
923 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->binary_operator));
924 break;
925 }
926 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
927 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
928 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_or_write_node_t *)node)->name));
929 pm_serialize_location(&((pm_global_variable_or_write_node_t *)node)->name_loc, buffer);
930 pm_serialize_location(&((pm_global_variable_or_write_node_t *)node)->operator_loc, buffer);
931 pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_or_write_node_t *)node)->value, buffer);
932 break;
933 }
934 case PM_GLOBAL_VARIABLE_READ_NODE: {
935 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
936 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_read_node_t *)node)->name));
937 break;
938 }
939 case PM_GLOBAL_VARIABLE_TARGET_NODE: {
940 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
941 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_target_node_t *)node)->name));
942 break;
943 }
944 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
945 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
946 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_global_variable_write_node_t *)node)->name));
947 pm_serialize_location(&((pm_global_variable_write_node_t *)node)->name_loc, buffer);
948 pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_write_node_t *)node)->value, buffer);
949 pm_serialize_location(&((pm_global_variable_write_node_t *)node)->operator_loc, buffer);
950 break;
951 }
952 case PM_HASH_NODE: {
953 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
954 pm_serialize_location(&((pm_hash_node_t *)node)->opening_loc, buffer);
955 uint32_t elements_size = pm_sizet_to_u32(((pm_hash_node_t *)node)->elements.size);
956 pm_buffer_append_varuint(buffer, elements_size);
957 for (uint32_t index = 0; index < elements_size; index++) {
958 pm_serialize_node(parser, (pm_node_t *) ((pm_hash_node_t *)node)->elements.nodes[index], buffer);
959 }
960 pm_serialize_location(&((pm_hash_node_t *)node)->closing_loc, buffer);
961 break;
962 }
963 case PM_HASH_PATTERN_NODE: {
964 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
965 if (((pm_hash_pattern_node_t *)node)->constant == NULL) {
966 pm_buffer_append_byte(buffer, 0);
967 } else {
968 pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->constant, buffer);
969 }
970 uint32_t elements_size = pm_sizet_to_u32(((pm_hash_pattern_node_t *)node)->elements.size);
971 pm_buffer_append_varuint(buffer, elements_size);
972 for (uint32_t index = 0; index < elements_size; index++) {
973 pm_serialize_node(parser, (pm_node_t *) ((pm_hash_pattern_node_t *)node)->elements.nodes[index], buffer);
974 }
975 if (((pm_hash_pattern_node_t *)node)->rest == NULL) {
976 pm_buffer_append_byte(buffer, 0);
977 } else {
978 pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->rest, buffer);
979 }
980 if (((pm_hash_pattern_node_t *)node)->opening_loc.length == 0) {
981 pm_buffer_append_byte(buffer, 0);
982 } else {
983 pm_buffer_append_byte(buffer, 1);
984 pm_serialize_location(&((pm_hash_pattern_node_t *)node)->opening_loc, buffer);
985 }
986 if (((pm_hash_pattern_node_t *)node)->closing_loc.length == 0) {
987 pm_buffer_append_byte(buffer, 0);
988 } else {
989 pm_buffer_append_byte(buffer, 1);
990 pm_serialize_location(&((pm_hash_pattern_node_t *)node)->closing_loc, buffer);
991 }
992 break;
993 }
994 case PM_IF_NODE: {
995 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
996 if (((pm_if_node_t *)node)->if_keyword_loc.length == 0) {
997 pm_buffer_append_byte(buffer, 0);
998 } else {
999 pm_buffer_append_byte(buffer, 1);
1000 pm_serialize_location(&((pm_if_node_t *)node)->if_keyword_loc, buffer);
1001 }
1002 pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->predicate, buffer);
1003 if (((pm_if_node_t *)node)->then_keyword_loc.length == 0) {
1004 pm_buffer_append_byte(buffer, 0);
1005 } else {
1006 pm_buffer_append_byte(buffer, 1);
1007 pm_serialize_location(&((pm_if_node_t *)node)->then_keyword_loc, buffer);
1008 }
1009 if (((pm_if_node_t *)node)->statements == NULL) {
1010 pm_buffer_append_byte(buffer, 0);
1011 } else {
1012 pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->statements, buffer);
1013 }
1014 if (((pm_if_node_t *)node)->subsequent == NULL) {
1015 pm_buffer_append_byte(buffer, 0);
1016 } else {
1017 pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->subsequent, buffer);
1018 }
1019 if (((pm_if_node_t *)node)->end_keyword_loc.length == 0) {
1020 pm_buffer_append_byte(buffer, 0);
1021 } else {
1022 pm_buffer_append_byte(buffer, 1);
1023 pm_serialize_location(&((pm_if_node_t *)node)->end_keyword_loc, buffer);
1024 }
1025 break;
1026 }
1027 case PM_IMAGINARY_NODE: {
1028 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1029 pm_serialize_node(parser, (pm_node_t *)((pm_imaginary_node_t *)node)->numeric, buffer);
1030 break;
1031 }
1032 case PM_IMPLICIT_NODE: {
1033 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1034 pm_serialize_node(parser, (pm_node_t *)((pm_implicit_node_t *)node)->value, buffer);
1035 break;
1036 }
1037 case PM_IMPLICIT_REST_NODE: {
1038 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1039 break;
1040 }
1041 case PM_IN_NODE: {
1042 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1043 pm_serialize_node(parser, (pm_node_t *)((pm_in_node_t *)node)->pattern, buffer);
1044 if (((pm_in_node_t *)node)->statements == NULL) {
1045 pm_buffer_append_byte(buffer, 0);
1046 } else {
1047 pm_serialize_node(parser, (pm_node_t *)((pm_in_node_t *)node)->statements, buffer);
1048 }
1049 pm_serialize_location(&((pm_in_node_t *)node)->in_loc, buffer);
1050 if (((pm_in_node_t *)node)->then_loc.length == 0) {
1051 pm_buffer_append_byte(buffer, 0);
1052 } else {
1053 pm_buffer_append_byte(buffer, 1);
1054 pm_serialize_location(&((pm_in_node_t *)node)->then_loc, buffer);
1055 }
1056 break;
1057 }
1058 case PM_INDEX_AND_WRITE_NODE: {
1059 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1060 if (((pm_index_and_write_node_t *)node)->receiver == NULL) {
1061 pm_buffer_append_byte(buffer, 0);
1062 } else {
1063 pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->receiver, buffer);
1064 }
1065 if (((pm_index_and_write_node_t *)node)->call_operator_loc.length == 0) {
1066 pm_buffer_append_byte(buffer, 0);
1067 } else {
1068 pm_buffer_append_byte(buffer, 1);
1069 pm_serialize_location(&((pm_index_and_write_node_t *)node)->call_operator_loc, buffer);
1070 }
1071 pm_serialize_location(&((pm_index_and_write_node_t *)node)->opening_loc, buffer);
1072 if (((pm_index_and_write_node_t *)node)->arguments == NULL) {
1073 pm_buffer_append_byte(buffer, 0);
1074 } else {
1075 pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->arguments, buffer);
1076 }
1077 pm_serialize_location(&((pm_index_and_write_node_t *)node)->closing_loc, buffer);
1078 if (((pm_index_and_write_node_t *)node)->block == NULL) {
1079 pm_buffer_append_byte(buffer, 0);
1080 } else {
1081 pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->block, buffer);
1082 }
1083 pm_serialize_location(&((pm_index_and_write_node_t *)node)->operator_loc, buffer);
1084 pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->value, buffer);
1085 break;
1086 }
1087 case PM_INDEX_OPERATOR_WRITE_NODE: {
1088 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1089 if (((pm_index_operator_write_node_t *)node)->receiver == NULL) {
1090 pm_buffer_append_byte(buffer, 0);
1091 } else {
1092 pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->receiver, buffer);
1093 }
1094 if (((pm_index_operator_write_node_t *)node)->call_operator_loc.length == 0) {
1095 pm_buffer_append_byte(buffer, 0);
1096 } else {
1097 pm_buffer_append_byte(buffer, 1);
1098 pm_serialize_location(&((pm_index_operator_write_node_t *)node)->call_operator_loc, buffer);
1099 }
1100 pm_serialize_location(&((pm_index_operator_write_node_t *)node)->opening_loc, buffer);
1101 if (((pm_index_operator_write_node_t *)node)->arguments == NULL) {
1102 pm_buffer_append_byte(buffer, 0);
1103 } else {
1104 pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->arguments, buffer);
1105 }
1106 pm_serialize_location(&((pm_index_operator_write_node_t *)node)->closing_loc, buffer);
1107 if (((pm_index_operator_write_node_t *)node)->block == NULL) {
1108 pm_buffer_append_byte(buffer, 0);
1109 } else {
1110 pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->block, buffer);
1111 }
1112 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_index_operator_write_node_t *)node)->binary_operator));
1113 pm_serialize_location(&((pm_index_operator_write_node_t *)node)->binary_operator_loc, buffer);
1114 pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->value, buffer);
1115 break;
1116 }
1117 case PM_INDEX_OR_WRITE_NODE: {
1118 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1119 if (((pm_index_or_write_node_t *)node)->receiver == NULL) {
1120 pm_buffer_append_byte(buffer, 0);
1121 } else {
1122 pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->receiver, buffer);
1123 }
1124 if (((pm_index_or_write_node_t *)node)->call_operator_loc.length == 0) {
1125 pm_buffer_append_byte(buffer, 0);
1126 } else {
1127 pm_buffer_append_byte(buffer, 1);
1128 pm_serialize_location(&((pm_index_or_write_node_t *)node)->call_operator_loc, buffer);
1129 }
1130 pm_serialize_location(&((pm_index_or_write_node_t *)node)->opening_loc, buffer);
1131 if (((pm_index_or_write_node_t *)node)->arguments == NULL) {
1132 pm_buffer_append_byte(buffer, 0);
1133 } else {
1134 pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->arguments, buffer);
1135 }
1136 pm_serialize_location(&((pm_index_or_write_node_t *)node)->closing_loc, buffer);
1137 if (((pm_index_or_write_node_t *)node)->block == NULL) {
1138 pm_buffer_append_byte(buffer, 0);
1139 } else {
1140 pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->block, buffer);
1141 }
1142 pm_serialize_location(&((pm_index_or_write_node_t *)node)->operator_loc, buffer);
1143 pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->value, buffer);
1144 break;
1145 }
1146 case PM_INDEX_TARGET_NODE: {
1147 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1148 pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->receiver, buffer);
1149 pm_serialize_location(&((pm_index_target_node_t *)node)->opening_loc, buffer);
1150 if (((pm_index_target_node_t *)node)->arguments == NULL) {
1151 pm_buffer_append_byte(buffer, 0);
1152 } else {
1153 pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->arguments, buffer);
1154 }
1155 pm_serialize_location(&((pm_index_target_node_t *)node)->closing_loc, buffer);
1156 if (((pm_index_target_node_t *)node)->block == NULL) {
1157 pm_buffer_append_byte(buffer, 0);
1158 } else {
1159 pm_serialize_node(parser, (pm_node_t *)((pm_index_target_node_t *)node)->block, buffer);
1160 }
1161 break;
1162 }
1163 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1164 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1165 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
1166 pm_serialize_location(&((pm_instance_variable_and_write_node_t *)node)->name_loc, buffer);
1167 pm_serialize_location(&((pm_instance_variable_and_write_node_t *)node)->operator_loc, buffer);
1168 pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_and_write_node_t *)node)->value, buffer);
1169 break;
1170 }
1171 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1172 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1173 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->name));
1174 pm_serialize_location(&((pm_instance_variable_operator_write_node_t *)node)->name_loc, buffer);
1175 pm_serialize_location(&((pm_instance_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
1176 pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_operator_write_node_t *)node)->value, buffer);
1177 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->binary_operator));
1178 break;
1179 }
1180 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1181 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1182 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_or_write_node_t *)node)->name));
1183 pm_serialize_location(&((pm_instance_variable_or_write_node_t *)node)->name_loc, buffer);
1184 pm_serialize_location(&((pm_instance_variable_or_write_node_t *)node)->operator_loc, buffer);
1185 pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_or_write_node_t *)node)->value, buffer);
1186 break;
1187 }
1188 case PM_INSTANCE_VARIABLE_READ_NODE: {
1189 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1190 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_read_node_t *)node)->name));
1191 break;
1192 }
1193 case PM_INSTANCE_VARIABLE_TARGET_NODE: {
1194 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1195 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_target_node_t *)node)->name));
1196 break;
1197 }
1198 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1199 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1200 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_instance_variable_write_node_t *)node)->name));
1201 pm_serialize_location(&((pm_instance_variable_write_node_t *)node)->name_loc, buffer);
1202 pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_write_node_t *)node)->value, buffer);
1203 pm_serialize_location(&((pm_instance_variable_write_node_t *)node)->operator_loc, buffer);
1204 break;
1205 }
1206 case PM_INTEGER_NODE: {
1207 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1208 pm_serialize_integer(&((pm_integer_node_t *)node)->value, buffer);
1209 break;
1210 }
1211 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1212 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1213 pm_serialize_location(&((pm_interpolated_match_last_line_node_t *)node)->opening_loc, buffer);
1214 uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_match_last_line_node_t *)node)->parts.size);
1215 pm_buffer_append_varuint(buffer, parts_size);
1216 for (uint32_t index = 0; index < parts_size; index++) {
1217 pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_match_last_line_node_t *)node)->parts.nodes[index], buffer);
1218 }
1219 pm_serialize_location(&((pm_interpolated_match_last_line_node_t *)node)->closing_loc, buffer);
1220 break;
1221 }
1222 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1223 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1224 pm_serialize_location(&((pm_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
1225 uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_regular_expression_node_t *)node)->parts.size);
1226 pm_buffer_append_varuint(buffer, parts_size);
1227 for (uint32_t index = 0; index < parts_size; index++) {
1228 pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
1229 }
1230 pm_serialize_location(&((pm_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
1231 break;
1232 }
1233 case PM_INTERPOLATED_STRING_NODE: {
1234 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1235 if (((pm_interpolated_string_node_t *)node)->opening_loc.length == 0) {
1236 pm_buffer_append_byte(buffer, 0);
1237 } else {
1238 pm_buffer_append_byte(buffer, 1);
1239 pm_serialize_location(&((pm_interpolated_string_node_t *)node)->opening_loc, buffer);
1240 }
1241 uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_string_node_t *)node)->parts.size);
1242 pm_buffer_append_varuint(buffer, parts_size);
1243 for (uint32_t index = 0; index < parts_size; index++) {
1244 pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_string_node_t *)node)->parts.nodes[index], buffer);
1245 }
1246 if (((pm_interpolated_string_node_t *)node)->closing_loc.length == 0) {
1247 pm_buffer_append_byte(buffer, 0);
1248 } else {
1249 pm_buffer_append_byte(buffer, 1);
1250 pm_serialize_location(&((pm_interpolated_string_node_t *)node)->closing_loc, buffer);
1251 }
1252 break;
1253 }
1254 case PM_INTERPOLATED_SYMBOL_NODE: {
1255 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1256 if (((pm_interpolated_symbol_node_t *)node)->opening_loc.length == 0) {
1257 pm_buffer_append_byte(buffer, 0);
1258 } else {
1259 pm_buffer_append_byte(buffer, 1);
1260 pm_serialize_location(&((pm_interpolated_symbol_node_t *)node)->opening_loc, buffer);
1261 }
1262 uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_symbol_node_t *)node)->parts.size);
1263 pm_buffer_append_varuint(buffer, parts_size);
1264 for (uint32_t index = 0; index < parts_size; index++) {
1265 pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_symbol_node_t *)node)->parts.nodes[index], buffer);
1266 }
1267 if (((pm_interpolated_symbol_node_t *)node)->closing_loc.length == 0) {
1268 pm_buffer_append_byte(buffer, 0);
1269 } else {
1270 pm_buffer_append_byte(buffer, 1);
1271 pm_serialize_location(&((pm_interpolated_symbol_node_t *)node)->closing_loc, buffer);
1272 }
1273 break;
1274 }
1275 case PM_INTERPOLATED_X_STRING_NODE: {
1276 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1277 pm_serialize_location(&((pm_interpolated_x_string_node_t *)node)->opening_loc, buffer);
1278 uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_x_string_node_t *)node)->parts.size);
1279 pm_buffer_append_varuint(buffer, parts_size);
1280 for (uint32_t index = 0; index < parts_size; index++) {
1281 pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_x_string_node_t *)node)->parts.nodes[index], buffer);
1282 }
1283 pm_serialize_location(&((pm_interpolated_x_string_node_t *)node)->closing_loc, buffer);
1284 break;
1285 }
1286 case PM_IT_LOCAL_VARIABLE_READ_NODE: {
1287 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1288 break;
1289 }
1290 case PM_IT_PARAMETERS_NODE: {
1291 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1292 break;
1293 }
1294 case PM_KEYWORD_HASH_NODE: {
1295 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1296 uint32_t elements_size = pm_sizet_to_u32(((pm_keyword_hash_node_t *)node)->elements.size);
1297 pm_buffer_append_varuint(buffer, elements_size);
1298 for (uint32_t index = 0; index < elements_size; index++) {
1299 pm_serialize_node(parser, (pm_node_t *) ((pm_keyword_hash_node_t *)node)->elements.nodes[index], buffer);
1300 }
1301 break;
1302 }
1303 case PM_KEYWORD_REST_PARAMETER_NODE: {
1304 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1305 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_keyword_rest_parameter_node_t *)node)->name));
1306 if (((pm_keyword_rest_parameter_node_t *)node)->name_loc.length == 0) {
1307 pm_buffer_append_byte(buffer, 0);
1308 } else {
1309 pm_buffer_append_byte(buffer, 1);
1310 pm_serialize_location(&((pm_keyword_rest_parameter_node_t *)node)->name_loc, buffer);
1311 }
1312 pm_serialize_location(&((pm_keyword_rest_parameter_node_t *)node)->operator_loc, buffer);
1313 break;
1314 }
1315 case PM_LAMBDA_NODE: {
1316 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1317 uint32_t locals_size = pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.size);
1318 pm_buffer_append_varuint(buffer, locals_size);
1319 for (uint32_t index = 0; index < locals_size; index++) {
1320 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.ids[index]));
1321 }
1322 pm_serialize_location(&((pm_lambda_node_t *)node)->operator_loc, buffer);
1323 pm_serialize_location(&((pm_lambda_node_t *)node)->opening_loc, buffer);
1324 pm_serialize_location(&((pm_lambda_node_t *)node)->closing_loc, buffer);
1325 if (((pm_lambda_node_t *)node)->parameters == NULL) {
1326 pm_buffer_append_byte(buffer, 0);
1327 } else {
1328 pm_serialize_node(parser, (pm_node_t *)((pm_lambda_node_t *)node)->parameters, buffer);
1329 }
1330 if (((pm_lambda_node_t *)node)->body == NULL) {
1331 pm_buffer_append_byte(buffer, 0);
1332 } else {
1333 pm_serialize_node(parser, (pm_node_t *)((pm_lambda_node_t *)node)->body, buffer);
1334 }
1335 break;
1336 }
1337 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
1338 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1339 pm_serialize_location(&((pm_local_variable_and_write_node_t *)node)->name_loc, buffer);
1340 pm_serialize_location(&((pm_local_variable_and_write_node_t *)node)->operator_loc, buffer);
1341 pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_and_write_node_t *)node)->value, buffer);
1342 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_and_write_node_t *)node)->name));
1343 pm_buffer_append_varuint(buffer, ((pm_local_variable_and_write_node_t *)node)->depth);
1344 break;
1345 }
1346 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1347 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1348 pm_serialize_location(&((pm_local_variable_operator_write_node_t *)node)->name_loc, buffer);
1349 pm_serialize_location(&((pm_local_variable_operator_write_node_t *)node)->binary_operator_loc, buffer);
1350 pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_operator_write_node_t *)node)->value, buffer);
1351 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->name));
1352 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->binary_operator));
1353 pm_buffer_append_varuint(buffer, ((pm_local_variable_operator_write_node_t *)node)->depth);
1354 break;
1355 }
1356 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1357 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1358 pm_serialize_location(&((pm_local_variable_or_write_node_t *)node)->name_loc, buffer);
1359 pm_serialize_location(&((pm_local_variable_or_write_node_t *)node)->operator_loc, buffer);
1360 pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_or_write_node_t *)node)->value, buffer);
1361 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_or_write_node_t *)node)->name));
1362 pm_buffer_append_varuint(buffer, ((pm_local_variable_or_write_node_t *)node)->depth);
1363 break;
1364 }
1365 case PM_LOCAL_VARIABLE_READ_NODE: {
1366 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1367 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_read_node_t *)node)->name));
1368 pm_buffer_append_varuint(buffer, ((pm_local_variable_read_node_t *)node)->depth);
1369 break;
1370 }
1371 case PM_LOCAL_VARIABLE_TARGET_NODE: {
1372 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1373 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_target_node_t *)node)->name));
1374 pm_buffer_append_varuint(buffer, ((pm_local_variable_target_node_t *)node)->depth);
1375 break;
1376 }
1377 case PM_LOCAL_VARIABLE_WRITE_NODE: {
1378 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1379 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_local_variable_write_node_t *)node)->name));
1380 pm_buffer_append_varuint(buffer, ((pm_local_variable_write_node_t *)node)->depth);
1381 pm_serialize_location(&((pm_local_variable_write_node_t *)node)->name_loc, buffer);
1382 pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_write_node_t *)node)->value, buffer);
1383 pm_serialize_location(&((pm_local_variable_write_node_t *)node)->operator_loc, buffer);
1384 break;
1385 }
1386 case PM_MATCH_LAST_LINE_NODE: {
1387 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1388 pm_serialize_location(&((pm_match_last_line_node_t *)node)->opening_loc, buffer);
1389 pm_serialize_location(&((pm_match_last_line_node_t *)node)->content_loc, buffer);
1390 pm_serialize_location(&((pm_match_last_line_node_t *)node)->closing_loc, buffer);
1391 pm_serialize_string(&((pm_match_last_line_node_t *)node)->unescaped, buffer);
1392 break;
1393 }
1394 case PM_MATCH_PREDICATE_NODE: {
1395 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1396 pm_serialize_node(parser, (pm_node_t *)((pm_match_predicate_node_t *)node)->value, buffer);
1397 pm_serialize_node(parser, (pm_node_t *)((pm_match_predicate_node_t *)node)->pattern, buffer);
1398 pm_serialize_location(&((pm_match_predicate_node_t *)node)->operator_loc, buffer);
1399 break;
1400 }
1401 case PM_MATCH_REQUIRED_NODE: {
1402 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1403 pm_serialize_node(parser, (pm_node_t *)((pm_match_required_node_t *)node)->value, buffer);
1404 pm_serialize_node(parser, (pm_node_t *)((pm_match_required_node_t *)node)->pattern, buffer);
1405 pm_serialize_location(&((pm_match_required_node_t *)node)->operator_loc, buffer);
1406 break;
1407 }
1408 case PM_MATCH_WRITE_NODE: {
1409 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1410 pm_serialize_node(parser, (pm_node_t *)((pm_match_write_node_t *)node)->call, buffer);
1411 uint32_t targets_size = pm_sizet_to_u32(((pm_match_write_node_t *)node)->targets.size);
1412 pm_buffer_append_varuint(buffer, targets_size);
1413 for (uint32_t index = 0; index < targets_size; index++) {
1414 pm_serialize_node(parser, (pm_node_t *) ((pm_match_write_node_t *)node)->targets.nodes[index], buffer);
1415 }
1416 break;
1417 }
1418 case PM_MODULE_NODE: {
1419 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1420 uint32_t locals_size = pm_sizet_to_u32(((pm_module_node_t *)node)->locals.size);
1421 pm_buffer_append_varuint(buffer, locals_size);
1422 for (uint32_t index = 0; index < locals_size; index++) {
1423 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->locals.ids[index]));
1424 }
1425 pm_serialize_location(&((pm_module_node_t *)node)->module_keyword_loc, buffer);
1426 pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->constant_path, buffer);
1427 if (((pm_module_node_t *)node)->body == NULL) {
1428 pm_buffer_append_byte(buffer, 0);
1429 } else {
1430 pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->body, buffer);
1431 }
1432 pm_serialize_location(&((pm_module_node_t *)node)->end_keyword_loc, buffer);
1433 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->name));
1434 break;
1435 }
1436 case PM_MULTI_TARGET_NODE: {
1437 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1438 uint32_t lefts_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->lefts.size);
1439 pm_buffer_append_varuint(buffer, lefts_size);
1440 for (uint32_t index = 0; index < lefts_size; index++) {
1441 pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->lefts.nodes[index], buffer);
1442 }
1443 if (((pm_multi_target_node_t *)node)->rest == NULL) {
1444 pm_buffer_append_byte(buffer, 0);
1445 } else {
1446 pm_serialize_node(parser, (pm_node_t *)((pm_multi_target_node_t *)node)->rest, buffer);
1447 }
1448 uint32_t rights_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->rights.size);
1449 pm_buffer_append_varuint(buffer, rights_size);
1450 for (uint32_t index = 0; index < rights_size; index++) {
1451 pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->rights.nodes[index], buffer);
1452 }
1453 if (((pm_multi_target_node_t *)node)->lparen_loc.length == 0) {
1454 pm_buffer_append_byte(buffer, 0);
1455 } else {
1456 pm_buffer_append_byte(buffer, 1);
1457 pm_serialize_location(&((pm_multi_target_node_t *)node)->lparen_loc, buffer);
1458 }
1459 if (((pm_multi_target_node_t *)node)->rparen_loc.length == 0) {
1460 pm_buffer_append_byte(buffer, 0);
1461 } else {
1462 pm_buffer_append_byte(buffer, 1);
1463 pm_serialize_location(&((pm_multi_target_node_t *)node)->rparen_loc, buffer);
1464 }
1465 break;
1466 }
1467 case PM_MULTI_WRITE_NODE: {
1468 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1469 uint32_t lefts_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->lefts.size);
1470 pm_buffer_append_varuint(buffer, lefts_size);
1471 for (uint32_t index = 0; index < lefts_size; index++) {
1472 pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->lefts.nodes[index], buffer);
1473 }
1474 if (((pm_multi_write_node_t *)node)->rest == NULL) {
1475 pm_buffer_append_byte(buffer, 0);
1476 } else {
1477 pm_serialize_node(parser, (pm_node_t *)((pm_multi_write_node_t *)node)->rest, buffer);
1478 }
1479 uint32_t rights_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->rights.size);
1480 pm_buffer_append_varuint(buffer, rights_size);
1481 for (uint32_t index = 0; index < rights_size; index++) {
1482 pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->rights.nodes[index], buffer);
1483 }
1484 if (((pm_multi_write_node_t *)node)->lparen_loc.length == 0) {
1485 pm_buffer_append_byte(buffer, 0);
1486 } else {
1487 pm_buffer_append_byte(buffer, 1);
1488 pm_serialize_location(&((pm_multi_write_node_t *)node)->lparen_loc, buffer);
1489 }
1490 if (((pm_multi_write_node_t *)node)->rparen_loc.length == 0) {
1491 pm_buffer_append_byte(buffer, 0);
1492 } else {
1493 pm_buffer_append_byte(buffer, 1);
1494 pm_serialize_location(&((pm_multi_write_node_t *)node)->rparen_loc, buffer);
1495 }
1496 pm_serialize_location(&((pm_multi_write_node_t *)node)->operator_loc, buffer);
1497 pm_serialize_node(parser, (pm_node_t *)((pm_multi_write_node_t *)node)->value, buffer);
1498 break;
1499 }
1500 case PM_NEXT_NODE: {
1501 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1502 if (((pm_next_node_t *)node)->arguments == NULL) {
1503 pm_buffer_append_byte(buffer, 0);
1504 } else {
1505 pm_serialize_node(parser, (pm_node_t *)((pm_next_node_t *)node)->arguments, buffer);
1506 }
1507 pm_serialize_location(&((pm_next_node_t *)node)->keyword_loc, buffer);
1508 break;
1509 }
1510 case PM_NIL_NODE: {
1511 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1512 break;
1513 }
1514 case PM_NO_BLOCK_PARAMETER_NODE: {
1515 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1516 pm_serialize_location(&((pm_no_block_parameter_node_t *)node)->operator_loc, buffer);
1517 pm_serialize_location(&((pm_no_block_parameter_node_t *)node)->keyword_loc, buffer);
1518 break;
1519 }
1520 case PM_NO_KEYWORDS_PARAMETER_NODE: {
1521 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1522 pm_serialize_location(&((pm_no_keywords_parameter_node_t *)node)->operator_loc, buffer);
1523 pm_serialize_location(&((pm_no_keywords_parameter_node_t *)node)->keyword_loc, buffer);
1524 break;
1525 }
1526 case PM_NUMBERED_PARAMETERS_NODE: {
1527 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1528 pm_buffer_append_byte(buffer, ((pm_numbered_parameters_node_t *)node)->maximum);
1529 break;
1530 }
1531 case PM_NUMBERED_REFERENCE_READ_NODE: {
1532 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1533 pm_buffer_append_varuint(buffer, ((pm_numbered_reference_read_node_t *)node)->number);
1534 break;
1535 }
1536 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
1537 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1538 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_optional_keyword_parameter_node_t *)node)->name));
1539 pm_serialize_location(&((pm_optional_keyword_parameter_node_t *)node)->name_loc, buffer);
1540 pm_serialize_node(parser, (pm_node_t *)((pm_optional_keyword_parameter_node_t *)node)->value, buffer);
1541 break;
1542 }
1543 case PM_OPTIONAL_PARAMETER_NODE: {
1544 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1545 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_optional_parameter_node_t *)node)->name));
1546 pm_serialize_location(&((pm_optional_parameter_node_t *)node)->name_loc, buffer);
1547 pm_serialize_location(&((pm_optional_parameter_node_t *)node)->operator_loc, buffer);
1548 pm_serialize_node(parser, (pm_node_t *)((pm_optional_parameter_node_t *)node)->value, buffer);
1549 break;
1550 }
1551 case PM_OR_NODE: {
1552 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1553 pm_serialize_node(parser, (pm_node_t *)((pm_or_node_t *)node)->left, buffer);
1554 pm_serialize_node(parser, (pm_node_t *)((pm_or_node_t *)node)->right, buffer);
1555 pm_serialize_location(&((pm_or_node_t *)node)->operator_loc, buffer);
1556 break;
1557 }
1558 case PM_PARAMETERS_NODE: {
1559 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1560 uint32_t requireds_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->requireds.size);
1561 pm_buffer_append_varuint(buffer, requireds_size);
1562 for (uint32_t index = 0; index < requireds_size; index++) {
1563 pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->requireds.nodes[index], buffer);
1564 }
1565 uint32_t optionals_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->optionals.size);
1566 pm_buffer_append_varuint(buffer, optionals_size);
1567 for (uint32_t index = 0; index < optionals_size; index++) {
1568 pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->optionals.nodes[index], buffer);
1569 }
1570 if (((pm_parameters_node_t *)node)->rest == NULL) {
1571 pm_buffer_append_byte(buffer, 0);
1572 } else {
1573 pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->rest, buffer);
1574 }
1575 uint32_t posts_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->posts.size);
1576 pm_buffer_append_varuint(buffer, posts_size);
1577 for (uint32_t index = 0; index < posts_size; index++) {
1578 pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->posts.nodes[index], buffer);
1579 }
1580 uint32_t keywords_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->keywords.size);
1581 pm_buffer_append_varuint(buffer, keywords_size);
1582 for (uint32_t index = 0; index < keywords_size; index++) {
1583 pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->keywords.nodes[index], buffer);
1584 }
1585 if (((pm_parameters_node_t *)node)->keyword_rest == NULL) {
1586 pm_buffer_append_byte(buffer, 0);
1587 } else {
1588 pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->keyword_rest, buffer);
1589 }
1590 if (((pm_parameters_node_t *)node)->block == NULL) {
1591 pm_buffer_append_byte(buffer, 0);
1592 } else {
1593 pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->block, buffer);
1594 }
1595 break;
1596 }
1597 case PM_PARENTHESES_NODE: {
1598 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1599 if (((pm_parentheses_node_t *)node)->body == NULL) {
1600 pm_buffer_append_byte(buffer, 0);
1601 } else {
1602 pm_serialize_node(parser, (pm_node_t *)((pm_parentheses_node_t *)node)->body, buffer);
1603 }
1604 pm_serialize_location(&((pm_parentheses_node_t *)node)->opening_loc, buffer);
1605 pm_serialize_location(&((pm_parentheses_node_t *)node)->closing_loc, buffer);
1606 break;
1607 }
1608 case PM_PINNED_EXPRESSION_NODE: {
1609 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1610 pm_serialize_node(parser, (pm_node_t *)((pm_pinned_expression_node_t *)node)->expression, buffer);
1611 pm_serialize_location(&((pm_pinned_expression_node_t *)node)->operator_loc, buffer);
1612 pm_serialize_location(&((pm_pinned_expression_node_t *)node)->lparen_loc, buffer);
1613 pm_serialize_location(&((pm_pinned_expression_node_t *)node)->rparen_loc, buffer);
1614 break;
1615 }
1616 case PM_PINNED_VARIABLE_NODE: {
1617 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1618 pm_serialize_node(parser, (pm_node_t *)((pm_pinned_variable_node_t *)node)->variable, buffer);
1619 pm_serialize_location(&((pm_pinned_variable_node_t *)node)->operator_loc, buffer);
1620 break;
1621 }
1622 case PM_POST_EXECUTION_NODE: {
1623 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1624 if (((pm_post_execution_node_t *)node)->statements == NULL) {
1625 pm_buffer_append_byte(buffer, 0);
1626 } else {
1627 pm_serialize_node(parser, (pm_node_t *)((pm_post_execution_node_t *)node)->statements, buffer);
1628 }
1629 pm_serialize_location(&((pm_post_execution_node_t *)node)->keyword_loc, buffer);
1630 pm_serialize_location(&((pm_post_execution_node_t *)node)->opening_loc, buffer);
1631 pm_serialize_location(&((pm_post_execution_node_t *)node)->closing_loc, buffer);
1632 break;
1633 }
1634 case PM_PRE_EXECUTION_NODE: {
1635 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1636 if (((pm_pre_execution_node_t *)node)->statements == NULL) {
1637 pm_buffer_append_byte(buffer, 0);
1638 } else {
1639 pm_serialize_node(parser, (pm_node_t *)((pm_pre_execution_node_t *)node)->statements, buffer);
1640 }
1641 pm_serialize_location(&((pm_pre_execution_node_t *)node)->keyword_loc, buffer);
1642 pm_serialize_location(&((pm_pre_execution_node_t *)node)->opening_loc, buffer);
1643 pm_serialize_location(&((pm_pre_execution_node_t *)node)->closing_loc, buffer);
1644 break;
1645 }
1646 case PM_PROGRAM_NODE: {
1647 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1648 uint32_t locals_size = pm_sizet_to_u32(((pm_program_node_t *)node)->locals.size);
1649 pm_buffer_append_varuint(buffer, locals_size);
1650 for (uint32_t index = 0; index < locals_size; index++) {
1651 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_program_node_t *)node)->locals.ids[index]));
1652 }
1653 pm_serialize_node(parser, (pm_node_t *)((pm_program_node_t *)node)->statements, buffer);
1654 break;
1655 }
1656 case PM_RANGE_NODE: {
1657 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1658 if (((pm_range_node_t *)node)->left == NULL) {
1659 pm_buffer_append_byte(buffer, 0);
1660 } else {
1661 pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->left, buffer);
1662 }
1663 if (((pm_range_node_t *)node)->right == NULL) {
1664 pm_buffer_append_byte(buffer, 0);
1665 } else {
1666 pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->right, buffer);
1667 }
1668 pm_serialize_location(&((pm_range_node_t *)node)->operator_loc, buffer);
1669 break;
1670 }
1671 case PM_RATIONAL_NODE: {
1672 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1673 pm_serialize_integer(&((pm_rational_node_t *)node)->numerator, buffer);
1674 pm_serialize_integer(&((pm_rational_node_t *)node)->denominator, buffer);
1675 break;
1676 }
1677 case PM_REDO_NODE: {
1678 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1679 break;
1680 }
1681 case PM_REGULAR_EXPRESSION_NODE: {
1682 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1683 pm_serialize_location(&((pm_regular_expression_node_t *)node)->opening_loc, buffer);
1684 pm_serialize_location(&((pm_regular_expression_node_t *)node)->content_loc, buffer);
1685 pm_serialize_location(&((pm_regular_expression_node_t *)node)->closing_loc, buffer);
1686 pm_serialize_string(&((pm_regular_expression_node_t *)node)->unescaped, buffer);
1687 break;
1688 }
1689 case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
1690 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1691 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_required_keyword_parameter_node_t *)node)->name));
1692 pm_serialize_location(&((pm_required_keyword_parameter_node_t *)node)->name_loc, buffer);
1693 break;
1694 }
1695 case PM_REQUIRED_PARAMETER_NODE: {
1696 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1697 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_required_parameter_node_t *)node)->name));
1698 break;
1699 }
1700 case PM_RESCUE_MODIFIER_NODE: {
1701 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1702 pm_serialize_node(parser, (pm_node_t *)((pm_rescue_modifier_node_t *)node)->expression, buffer);
1703 pm_serialize_location(&((pm_rescue_modifier_node_t *)node)->keyword_loc, buffer);
1704 pm_serialize_node(parser, (pm_node_t *)((pm_rescue_modifier_node_t *)node)->rescue_expression, buffer);
1705 break;
1706 }
1707 case PM_RESCUE_NODE: {
1708 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1709 pm_serialize_location(&((pm_rescue_node_t *)node)->keyword_loc, buffer);
1710 uint32_t exceptions_size = pm_sizet_to_u32(((pm_rescue_node_t *)node)->exceptions.size);
1711 pm_buffer_append_varuint(buffer, exceptions_size);
1712 for (uint32_t index = 0; index < exceptions_size; index++) {
1713 pm_serialize_node(parser, (pm_node_t *) ((pm_rescue_node_t *)node)->exceptions.nodes[index], buffer);
1714 }
1715 if (((pm_rescue_node_t *)node)->operator_loc.length == 0) {
1716 pm_buffer_append_byte(buffer, 0);
1717 } else {
1718 pm_buffer_append_byte(buffer, 1);
1719 pm_serialize_location(&((pm_rescue_node_t *)node)->operator_loc, buffer);
1720 }
1721 if (((pm_rescue_node_t *)node)->reference == NULL) {
1722 pm_buffer_append_byte(buffer, 0);
1723 } else {
1724 pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->reference, buffer);
1725 }
1726 if (((pm_rescue_node_t *)node)->then_keyword_loc.length == 0) {
1727 pm_buffer_append_byte(buffer, 0);
1728 } else {
1729 pm_buffer_append_byte(buffer, 1);
1730 pm_serialize_location(&((pm_rescue_node_t *)node)->then_keyword_loc, buffer);
1731 }
1732 if (((pm_rescue_node_t *)node)->statements == NULL) {
1733 pm_buffer_append_byte(buffer, 0);
1734 } else {
1735 pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->statements, buffer);
1736 }
1737 if (((pm_rescue_node_t *)node)->subsequent == NULL) {
1738 pm_buffer_append_byte(buffer, 0);
1739 } else {
1740 pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->subsequent, buffer);
1741 }
1742 break;
1743 }
1744 case PM_REST_PARAMETER_NODE: {
1745 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1746 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_rest_parameter_node_t *)node)->name));
1747 if (((pm_rest_parameter_node_t *)node)->name_loc.length == 0) {
1748 pm_buffer_append_byte(buffer, 0);
1749 } else {
1750 pm_buffer_append_byte(buffer, 1);
1751 pm_serialize_location(&((pm_rest_parameter_node_t *)node)->name_loc, buffer);
1752 }
1753 pm_serialize_location(&((pm_rest_parameter_node_t *)node)->operator_loc, buffer);
1754 break;
1755 }
1756 case PM_RETRY_NODE: {
1757 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1758 break;
1759 }
1760 case PM_RETURN_NODE: {
1761 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1762 pm_serialize_location(&((pm_return_node_t *)node)->keyword_loc, buffer);
1763 if (((pm_return_node_t *)node)->arguments == NULL) {
1764 pm_buffer_append_byte(buffer, 0);
1765 } else {
1766 pm_serialize_node(parser, (pm_node_t *)((pm_return_node_t *)node)->arguments, buffer);
1767 }
1768 break;
1769 }
1770 case PM_SELF_NODE: {
1771 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1772 break;
1773 }
1774 case PM_SHAREABLE_CONSTANT_NODE: {
1775 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1776 pm_serialize_node(parser, (pm_node_t *)((pm_shareable_constant_node_t *)node)->write, buffer);
1777 break;
1778 }
1779 case PM_SINGLETON_CLASS_NODE: {
1780 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1781 uint32_t locals_size = pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.size);
1782 pm_buffer_append_varuint(buffer, locals_size);
1783 for (uint32_t index = 0; index < locals_size; index++) {
1784 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.ids[index]));
1785 }
1786 pm_serialize_location(&((pm_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1787 pm_serialize_location(&((pm_singleton_class_node_t *)node)->operator_loc, buffer);
1788 pm_serialize_node(parser, (pm_node_t *)((pm_singleton_class_node_t *)node)->expression, buffer);
1789 if (((pm_singleton_class_node_t *)node)->body == NULL) {
1790 pm_buffer_append_byte(buffer, 0);
1791 } else {
1792 pm_serialize_node(parser, (pm_node_t *)((pm_singleton_class_node_t *)node)->body, buffer);
1793 }
1794 pm_serialize_location(&((pm_singleton_class_node_t *)node)->end_keyword_loc, buffer);
1795 break;
1796 }
1797 case PM_SOURCE_ENCODING_NODE: {
1798 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1799 break;
1800 }
1801 case PM_SOURCE_FILE_NODE: {
1802 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1803 pm_serialize_string(&((pm_source_file_node_t *)node)->filepath, buffer);
1804 break;
1805 }
1806 case PM_SOURCE_LINE_NODE: {
1807 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1808 break;
1809 }
1810 case PM_SPLAT_NODE: {
1811 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1812 pm_serialize_location(&((pm_splat_node_t *)node)->operator_loc, buffer);
1813 if (((pm_splat_node_t *)node)->expression == NULL) {
1814 pm_buffer_append_byte(buffer, 0);
1815 } else {
1816 pm_serialize_node(parser, (pm_node_t *)((pm_splat_node_t *)node)->expression, buffer);
1817 }
1818 break;
1819 }
1820 case PM_STATEMENTS_NODE: {
1821 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1822 uint32_t body_size = pm_sizet_to_u32(((pm_statements_node_t *)node)->body.size);
1823 pm_buffer_append_varuint(buffer, body_size);
1824 for (uint32_t index = 0; index < body_size; index++) {
1825 pm_serialize_node(parser, (pm_node_t *) ((pm_statements_node_t *)node)->body.nodes[index], buffer);
1826 }
1827 break;
1828 }
1829 case PM_STRING_NODE: {
1830 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1831 if (((pm_string_node_t *)node)->opening_loc.length == 0) {
1832 pm_buffer_append_byte(buffer, 0);
1833 } else {
1834 pm_buffer_append_byte(buffer, 1);
1835 pm_serialize_location(&((pm_string_node_t *)node)->opening_loc, buffer);
1836 }
1837 pm_serialize_location(&((pm_string_node_t *)node)->content_loc, buffer);
1838 if (((pm_string_node_t *)node)->closing_loc.length == 0) {
1839 pm_buffer_append_byte(buffer, 0);
1840 } else {
1841 pm_buffer_append_byte(buffer, 1);
1842 pm_serialize_location(&((pm_string_node_t *)node)->closing_loc, buffer);
1843 }
1844 pm_serialize_string(&((pm_string_node_t *)node)->unescaped, buffer);
1845 break;
1846 }
1847 case PM_SUPER_NODE: {
1848 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1849 pm_serialize_location(&((pm_super_node_t *)node)->keyword_loc, buffer);
1850 if (((pm_super_node_t *)node)->lparen_loc.length == 0) {
1851 pm_buffer_append_byte(buffer, 0);
1852 } else {
1853 pm_buffer_append_byte(buffer, 1);
1854 pm_serialize_location(&((pm_super_node_t *)node)->lparen_loc, buffer);
1855 }
1856 if (((pm_super_node_t *)node)->arguments == NULL) {
1857 pm_buffer_append_byte(buffer, 0);
1858 } else {
1859 pm_serialize_node(parser, (pm_node_t *)((pm_super_node_t *)node)->arguments, buffer);
1860 }
1861 if (((pm_super_node_t *)node)->rparen_loc.length == 0) {
1862 pm_buffer_append_byte(buffer, 0);
1863 } else {
1864 pm_buffer_append_byte(buffer, 1);
1865 pm_serialize_location(&((pm_super_node_t *)node)->rparen_loc, buffer);
1866 }
1867 if (((pm_super_node_t *)node)->block == NULL) {
1868 pm_buffer_append_byte(buffer, 0);
1869 } else {
1870 pm_serialize_node(parser, (pm_node_t *)((pm_super_node_t *)node)->block, buffer);
1871 }
1872 break;
1873 }
1874 case PM_SYMBOL_NODE: {
1875 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1876 if (((pm_symbol_node_t *)node)->opening_loc.length == 0) {
1877 pm_buffer_append_byte(buffer, 0);
1878 } else {
1879 pm_buffer_append_byte(buffer, 1);
1880 pm_serialize_location(&((pm_symbol_node_t *)node)->opening_loc, buffer);
1881 }
1882 if (((pm_symbol_node_t *)node)->value_loc.length == 0) {
1883 pm_buffer_append_byte(buffer, 0);
1884 } else {
1885 pm_buffer_append_byte(buffer, 1);
1886 pm_serialize_location(&((pm_symbol_node_t *)node)->value_loc, buffer);
1887 }
1888 if (((pm_symbol_node_t *)node)->closing_loc.length == 0) {
1889 pm_buffer_append_byte(buffer, 0);
1890 } else {
1891 pm_buffer_append_byte(buffer, 1);
1892 pm_serialize_location(&((pm_symbol_node_t *)node)->closing_loc, buffer);
1893 }
1894 pm_serialize_string(&((pm_symbol_node_t *)node)->unescaped, buffer);
1895 break;
1896 }
1897 case PM_TRUE_NODE: {
1898 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1899 break;
1900 }
1901 case PM_UNDEF_NODE: {
1902 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1903 uint32_t names_size = pm_sizet_to_u32(((pm_undef_node_t *)node)->names.size);
1904 pm_buffer_append_varuint(buffer, names_size);
1905 for (uint32_t index = 0; index < names_size; index++) {
1906 pm_serialize_node(parser, (pm_node_t *) ((pm_undef_node_t *)node)->names.nodes[index], buffer);
1907 }
1908 pm_serialize_location(&((pm_undef_node_t *)node)->keyword_loc, buffer);
1909 break;
1910 }
1911 case PM_UNLESS_NODE: {
1912 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1913 pm_serialize_location(&((pm_unless_node_t *)node)->keyword_loc, buffer);
1914 pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->predicate, buffer);
1915 if (((pm_unless_node_t *)node)->then_keyword_loc.length == 0) {
1916 pm_buffer_append_byte(buffer, 0);
1917 } else {
1918 pm_buffer_append_byte(buffer, 1);
1919 pm_serialize_location(&((pm_unless_node_t *)node)->then_keyword_loc, buffer);
1920 }
1921 if (((pm_unless_node_t *)node)->statements == NULL) {
1922 pm_buffer_append_byte(buffer, 0);
1923 } else {
1924 pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->statements, buffer);
1925 }
1926 if (((pm_unless_node_t *)node)->else_clause == NULL) {
1927 pm_buffer_append_byte(buffer, 0);
1928 } else {
1929 pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->else_clause, buffer);
1930 }
1931 if (((pm_unless_node_t *)node)->end_keyword_loc.length == 0) {
1932 pm_buffer_append_byte(buffer, 0);
1933 } else {
1934 pm_buffer_append_byte(buffer, 1);
1935 pm_serialize_location(&((pm_unless_node_t *)node)->end_keyword_loc, buffer);
1936 }
1937 break;
1938 }
1939 case PM_UNTIL_NODE: {
1940 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1941 pm_serialize_location(&((pm_until_node_t *)node)->keyword_loc, buffer);
1942 if (((pm_until_node_t *)node)->do_keyword_loc.length == 0) {
1943 pm_buffer_append_byte(buffer, 0);
1944 } else {
1945 pm_buffer_append_byte(buffer, 1);
1946 pm_serialize_location(&((pm_until_node_t *)node)->do_keyword_loc, buffer);
1947 }
1948 if (((pm_until_node_t *)node)->closing_loc.length == 0) {
1949 pm_buffer_append_byte(buffer, 0);
1950 } else {
1951 pm_buffer_append_byte(buffer, 1);
1952 pm_serialize_location(&((pm_until_node_t *)node)->closing_loc, buffer);
1953 }
1954 pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->predicate, buffer);
1955 if (((pm_until_node_t *)node)->statements == NULL) {
1956 pm_buffer_append_byte(buffer, 0);
1957 } else {
1958 pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->statements, buffer);
1959 }
1960 break;
1961 }
1962 case PM_WHEN_NODE: {
1963 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1964 pm_serialize_location(&((pm_when_node_t *)node)->keyword_loc, buffer);
1965 uint32_t conditions_size = pm_sizet_to_u32(((pm_when_node_t *)node)->conditions.size);
1966 pm_buffer_append_varuint(buffer, conditions_size);
1967 for (uint32_t index = 0; index < conditions_size; index++) {
1968 pm_serialize_node(parser, (pm_node_t *) ((pm_when_node_t *)node)->conditions.nodes[index], buffer);
1969 }
1970 if (((pm_when_node_t *)node)->then_keyword_loc.length == 0) {
1971 pm_buffer_append_byte(buffer, 0);
1972 } else {
1973 pm_buffer_append_byte(buffer, 1);
1974 pm_serialize_location(&((pm_when_node_t *)node)->then_keyword_loc, buffer);
1975 }
1976 if (((pm_when_node_t *)node)->statements == NULL) {
1977 pm_buffer_append_byte(buffer, 0);
1978 } else {
1979 pm_serialize_node(parser, (pm_node_t *)((pm_when_node_t *)node)->statements, buffer);
1980 }
1981 break;
1982 }
1983 case PM_WHILE_NODE: {
1984 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1985 pm_serialize_location(&((pm_while_node_t *)node)->keyword_loc, buffer);
1986 if (((pm_while_node_t *)node)->do_keyword_loc.length == 0) {
1987 pm_buffer_append_byte(buffer, 0);
1988 } else {
1989 pm_buffer_append_byte(buffer, 1);
1990 pm_serialize_location(&((pm_while_node_t *)node)->do_keyword_loc, buffer);
1991 }
1992 if (((pm_while_node_t *)node)->closing_loc.length == 0) {
1993 pm_buffer_append_byte(buffer, 0);
1994 } else {
1995 pm_buffer_append_byte(buffer, 1);
1996 pm_serialize_location(&((pm_while_node_t *)node)->closing_loc, buffer);
1997 }
1998 pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->predicate, buffer);
1999 if (((pm_while_node_t *)node)->statements == NULL) {
2000 pm_buffer_append_byte(buffer, 0);
2001 } else {
2002 pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->statements, buffer);
2003 }
2004 break;
2005 }
2006 case PM_X_STRING_NODE: {
2007 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2008 pm_serialize_location(&((pm_x_string_node_t *)node)->opening_loc, buffer);
2009 pm_serialize_location(&((pm_x_string_node_t *)node)->content_loc, buffer);
2010 pm_serialize_location(&((pm_x_string_node_t *)node)->closing_loc, buffer);
2011 pm_serialize_string(&((pm_x_string_node_t *)node)->unescaped, buffer);
2012 break;
2013 }
2014 case PM_YIELD_NODE: {
2015 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2016 pm_serialize_location(&((pm_yield_node_t *)node)->keyword_loc, buffer);
2017 if (((pm_yield_node_t *)node)->lparen_loc.length == 0) {
2018 pm_buffer_append_byte(buffer, 0);
2019 } else {
2020 pm_buffer_append_byte(buffer, 1);
2021 pm_serialize_location(&((pm_yield_node_t *)node)->lparen_loc, buffer);
2022 }
2023 if (((pm_yield_node_t *)node)->arguments == NULL) {
2024 pm_buffer_append_byte(buffer, 0);
2025 } else {
2026 pm_serialize_node(parser, (pm_node_t *)((pm_yield_node_t *)node)->arguments, buffer);
2027 }
2028 if (((pm_yield_node_t *)node)->rparen_loc.length == 0) {
2029 pm_buffer_append_byte(buffer, 0);
2030 } else {
2031 pm_buffer_append_byte(buffer, 1);
2032 pm_serialize_location(&((pm_yield_node_t *)node)->rparen_loc, buffer);
2033 }
2034 break;
2035 }
2036 }
2037}
2038
2039static void
2040pm_serialize_line_offset_list(pm_line_offset_list_t *list, pm_buffer_t *buffer) {
2041 uint32_t size = pm_sizet_to_u32(list->size);
2042 pm_buffer_append_varuint(buffer, size);
2043
2044 for (uint32_t i = 0; i < size; i++) {
2045 uint32_t offset = pm_sizet_to_u32(list->offsets[i]);
2046 pm_buffer_append_varuint(buffer, offset);
2047 }
2048}
2049
2050static void
2051pm_serialize_comment(pm_comment_t *comment, pm_buffer_t *buffer) {
2052 // serialize type
2053 pm_buffer_append_byte(buffer, (uint8_t) comment->type);
2054
2055 // serialize location
2056 pm_serialize_location(&comment->location, buffer);
2057}
2058
2062void
2063pm_serialize_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2064 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2065
2066 pm_comment_t *comment;
2067 for (comment = (pm_comment_t *) list->head; comment != NULL; comment = (pm_comment_t *) comment->node.next) {
2068 pm_serialize_comment(comment, buffer);
2069 }
2070}
2071
2072static void
2073pm_serialize_magic_comment(pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
2074 // serialize key location
2075 pm_buffer_append_varuint(buffer, magic_comment->key.start);
2076 pm_buffer_append_varuint(buffer, magic_comment->key.length);
2077
2078 // serialize value location
2079 pm_buffer_append_varuint(buffer, magic_comment->value.start);
2080 pm_buffer_append_varuint(buffer, magic_comment->value.length);
2081}
2082
2083static void
2084pm_serialize_magic_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2085 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2086
2088 for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
2089 pm_serialize_magic_comment(magic_comment, buffer);
2090 }
2091}
2092
2093static void
2094pm_serialize_data_loc(const pm_parser_t *parser, pm_buffer_t *buffer) {
2095 if (parser->data_loc.length == 0) {
2096 pm_buffer_append_byte(buffer, 0);
2097 } else {
2098 pm_buffer_append_byte(buffer, 1);
2099 pm_serialize_location(&parser->data_loc, buffer);
2100 }
2101}
2102
2103static void
2104pm_serialize_diagnostic(pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
2105 // serialize the type
2106 pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->diag_id);
2107
2108 // serialize message
2109 size_t message_length = strlen(diagnostic->message);
2110 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(message_length));
2111 pm_buffer_append_string(buffer, diagnostic->message, message_length);
2112
2113 // serialize location
2114 pm_serialize_location(&diagnostic->location, buffer);
2115
2116 pm_buffer_append_byte(buffer, diagnostic->level);
2117}
2118
2119static void
2120pm_serialize_diagnostic_list(pm_list_t *list, pm_buffer_t *buffer) {
2121 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2122
2123 pm_diagnostic_t *diagnostic;
2124 for (diagnostic = (pm_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (pm_diagnostic_t *) diagnostic->node.next) {
2125 pm_serialize_diagnostic(diagnostic, buffer);
2126 }
2127}
2128
2132void
2133pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer) {
2134 size_t encoding_length = strlen(encoding->name);
2135 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(encoding_length));
2136 pm_buffer_append_string(buffer, encoding->name, encoding_length);
2137}
2138
2139static void
2140pm_serialize_metadata(pm_parser_t *parser, pm_buffer_t *buffer) {
2141 pm_serialize_encoding(parser->encoding, buffer);
2142 pm_buffer_append_varsint(buffer, parser->start_line);
2143 pm_serialize_line_offset_list(&parser->line_offsets, buffer);
2144 pm_serialize_comment_list(&parser->comment_list, buffer);
2145 pm_serialize_magic_comment_list(&parser->magic_comment_list, buffer);
2146 pm_serialize_data_loc(parser, buffer);
2147 pm_serialize_diagnostic_list(&parser->error_list, buffer);
2148 pm_serialize_diagnostic_list(&parser->warning_list, buffer);
2149 pm_buffer_append_byte(buffer, (uint8_t) parser->continuable);
2150}
2151
2152#line 275 "prism/templates/src/serialize.c.erb"
2156void
2157pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
2158 pm_serialize_metadata(parser, buffer);
2159
2160 // Here we're going to leave space for the offset of the constant pool in
2161 // the buffer.
2162 size_t offset = buffer->length;
2163 pm_buffer_append_zeroes(buffer, 4);
2164
2165 // Next, encode the length of the constant pool.
2166 pm_buffer_append_varuint(buffer, parser->constant_pool.size);
2167
2168 // Now we're going to serialize the content of the node.
2169 pm_serialize_node(parser, node, buffer);
2170
2171 // Now we're going to serialize the offset of the constant pool back where
2172 // we left space for it.
2173 uint32_t length = pm_sizet_to_u32(buffer->length);
2174 memcpy(buffer->value + offset, &length, sizeof(uint32_t));
2175
2176 // Now we're going to serialize the constant pool.
2177 offset = buffer->length;
2178 pm_buffer_append_zeroes(buffer, parser->constant_pool.size * 8);
2179
2180 for (uint32_t index = 0; index < parser->constant_pool.capacity; index++) {
2181 pm_constant_pool_bucket_t *bucket = &parser->constant_pool.buckets[index];
2182
2183 // If we find a constant at this index, serialize it at the correct
2184 // index in the buffer.
2185 if (bucket->id != 0) {
2186 pm_constant_t *constant = &parser->constant_pool.constants[bucket->id - 1];
2187 size_t buffer_offset = offset + ((((size_t)bucket->id) - 1) * 8);
2188
2189 // Write the constant contents into the buffer after the constant
2190 // pool. In place of the source offset, we store a buffer offset.
2191 uint32_t content_offset = pm_sizet_to_u32(buffer->length);
2192 memcpy(buffer->value + buffer_offset, &content_offset, 4);
2193 pm_buffer_append_bytes(buffer, constant->start, constant->length);
2194
2195 uint32_t constant_length = pm_sizet_to_u32(constant->length);
2196 memcpy(buffer->value + buffer_offset + 4, &constant_length, 4);
2197 }
2198 }
2199}
2200
2201static void
2202serialize_token(pm_parser_t *parser, pm_token_t *token, void *data) {
2203 pm_buffer_t *buffer = (pm_buffer_t *) data;
2204
2205 pm_buffer_append_varuint(buffer, token->type);
2206 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
2207 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
2208 pm_buffer_append_varuint(buffer, parser->lex_state);
2209}
2210
2214void
2215pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2216 pm_options_t options = { 0 };
2217 pm_options_read(&options, data);
2218
2219 pm_arena_t arena = { 0 };
2220 pm_parser_t parser;
2221 pm_parser_init(&arena, &parser, source, size, &options);
2222
2223 pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2224 pm_parse(&parser);
2225
2226 // Append 0 to mark end of tokens.
2227 pm_buffer_append_byte(buffer, 0);
2228
2229 pm_serialize_metadata(&parser, buffer);
2230
2231 pm_parser_cleanup(&parser);
2232 pm_arena_cleanup(&arena);
2233 pm_options_cleanup(&options);
2234}
2235
2240void
2241pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2242 pm_options_t options = { 0 };
2243 pm_options_read(&options, data);
2244
2245 pm_arena_t arena = { 0 };
2246 pm_parser_t parser;
2247 pm_parser_init(&arena, &parser, source, size, &options);
2248
2249 pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2250 pm_node_t *node = pm_parse(&parser);
2251
2252 pm_buffer_append_byte(buffer, 0);
2253 pm_serialize(&parser, node, buffer);
2254
2255 pm_parser_cleanup(&parser);
2256 pm_arena_cleanup(&arena);
2257 pm_options_cleanup(&options);
2258}
2259
2263bool
2264pm_serialize_parse_success_p(const uint8_t *source, size_t size, const char *data) {
2265 pm_options_t options = { 0 };
2266 pm_options_read(&options, data);
2267
2268 pm_arena_t arena = { 0 };
2269 pm_parser_t parser;
2270 pm_parser_init(&arena, &parser, source, size, &options);
2271
2272 pm_parse(&parser);
2273
2274 bool result = parser.error_list.size == 0;
2275 pm_parser_cleanup(&parser);
2276 pm_arena_cleanup(&arena);
2277 pm_options_cleanup(&options);
2278
2279 return result;
2280}
2281
2282#endif
A header file that defines macros to exclude certain features of the prism library.
#define PRISM_INLINE
Old Visual Studio versions do not support the inline keyword, so we need to define it to be __inline.
Definition inline.h:12
A list of byte offsets of newlines in a string.
PRISM_EXPORTED_FUNCTION pm_node_t * pm_parse(pm_parser_t *parser) PRISM_NONNULL(1)
Initiate the parser with the given parser.
Definition prism.c:22806
The main header file for the prism parser.
AliasGlobalVariableNode.
Definition ast.h:1138
AliasMethodNode.
Definition ast.h:1185
AlternationPatternNode.
Definition ast.h:1244
AndNode.
Definition ast.h:1291
ArgumentsNode.
Definition ast.h:1351
ArrayNode.
Definition ast.h:1381
ArrayPatternNode.
Definition ast.h:1441
AssocNode.
Definition ast.h:1524
AssocSplatNode.
Definition ast.h:1580
BackReferenceReadNode.
Definition ast.h:1617
BeginNode.
Definition ast.h:1647
BlockArgumentNode.
Definition ast.h:1724
BlockLocalVariableNode.
Definition ast.h:1764
BlockNode.
Definition ast.h:1791
BlockParameterNode.
Definition ast.h:1866
BlockParametersNode.
Definition ast.h:1919
BreakNode.
Definition ast.h:1992
CallAndWriteNode.
Definition ast.h:2035
CallNode.
Definition ast.h:2143
CallOperatorWriteNode.
Definition ast.h:2268
CallOrWriteNode.
Definition ast.h:2371
CallTargetNode.
Definition ast.h:2472
CapturePatternNode.
Definition ast.h:2529
CaseMatchNode.
Definition ast.h:2578
CaseNode.
Definition ast.h:2647
ClassNode.
Definition ast.h:2714
ClassVariableAndWriteNode.
Definition ast.h:2800
ClassVariableOperatorWriteNode.
Definition ast.h:2857
ClassVariableOrWriteNode.
Definition ast.h:2899
ClassVariableReadNode.
Definition ast.h:2936
ClassVariableTargetNode.
Definition ast.h:2964
ClassVariableWriteNode.
Definition ast.h:2986
ConstantAndWriteNode.
Definition ast.h:3047
ConstantOperatorWriteNode.
Definition ast.h:3084
ConstantOrWriteNode.
Definition ast.h:3126
ConstantPathAndWriteNode.
Definition ast.h:3163
ConstantPathNode.
Definition ast.h:3195
ConstantPathOperatorWriteNode.
Definition ast.h:3261
ConstantPathOrWriteNode.
Definition ast.h:3298
ConstantPathTargetNode.
Definition ast.h:3330
ConstantPathWriteNode.
Definition ast.h:3373
ConstantReadNode.
Definition ast.h:3423
ConstantTargetNode.
Definition ast.h:3451
ConstantWriteNode.
Definition ast.h:3473
DefNode.
Definition ast.h:3535
DefinedNode.
Definition ast.h:3612
ElseNode.
Definition ast.h:3649
EmbeddedStatementsNode.
Definition ast.h:3681
EmbeddedVariableNode.
Definition ast.h:3713
EnsureNode.
Definition ast.h:3744
ErrorRecoveryNode.
Definition ast.h:3773
FindPatternNode.
Definition ast.h:3823
FlipFlopNode.
Definition ast.h:3918
FloatNode.
Definition ast.h:3950
ForNode.
Definition ast.h:3974
ForwardingSuperNode.
Definition ast.h:4105
GlobalVariableAndWriteNode.
Definition ast.h:4140
GlobalVariableOperatorWriteNode.
Definition ast.h:4177
GlobalVariableOrWriteNode.
Definition ast.h:4219
GlobalVariableReadNode.
Definition ast.h:4256
GlobalVariableTargetNode.
Definition ast.h:4284
GlobalVariableWriteNode.
Definition ast.h:4306
HashNode.
Definition ast.h:4367
HashPatternNode.
Definition ast.h:4426
IfNode.
Definition ast.h:4514
ImaginaryNode.
Definition ast.h:4619
ImplicitNode.
Definition ast.h:4647
InNode.
Definition ast.h:4695
IndexAndWriteNode.
Definition ast.h:4738
IndexOperatorWriteNode.
Definition ast.h:4801
IndexOrWriteNode.
Definition ast.h:4869
IndexTargetNode.
Definition ast.h:4940
InstanceVariableAndWriteNode.
Definition ast.h:4982
InstanceVariableOperatorWriteNode.
Definition ast.h:5019
InstanceVariableOrWriteNode.
Definition ast.h:5061
InstanceVariableReadNode.
Definition ast.h:5098
InstanceVariableTargetNode.
Definition ast.h:5126
InstanceVariableWriteNode.
Definition ast.h:5148
IntegerNode.
Definition ast.h:5215
A structure represents an arbitrary-sized integer.
Definition integer.h:16
size_t length
The number of allocated values.
Definition integer.h:21
uint32_t value
Embedded value for small integer.
Definition integer.h:32
uint32_t * values
List of 32-bit integers.
Definition integer.h:26
bool negative
Whether or not the integer is negative.
Definition integer.h:38
InterpolatedMatchLastLineNode.
Definition ast.h:5252
InterpolatedRegularExpressionNode.
Definition ast.h:5297
InterpolatedStringNode.
Definition ast.h:5333
InterpolatedSymbolNode.
Definition ast.h:5365
InterpolatedXStringNode.
Definition ast.h:5397
KeywordHashNode.
Definition ast.h:5466
KeywordRestParameterNode.
Definition ast.h:5492
LambdaNode.
Definition ast.h:5524
A list of offsets of the start of lines in a string.
uint32_t * offsets
The list of offsets.
size_t size
The number of offsets in the list.
LocalVariableAndWriteNode.
Definition ast.h:5571
LocalVariableOperatorWriteNode.
Definition ast.h:5613
LocalVariableOrWriteNode.
Definition ast.h:5660
LocalVariableReadNode.
Definition ast.h:5702
LocalVariableTargetNode.
Definition ast.h:5750
LocalVariableWriteNode.
Definition ast.h:5777
This struct represents a slice in the source code, defined by an offset and a length.
Definition ast.h:554
uint32_t start
The offset of the location from the start of the source.
Definition ast.h:556
uint32_t length
The length of the location.
Definition ast.h:559
MatchLastLineNode.
Definition ast.h:5868
MatchPredicateNode.
Definition ast.h:5905
MatchRequiredNode.
Definition ast.h:5937
MatchWriteNode.
Definition ast.h:6023
ModuleNode.
Definition ast.h:6050
MultiTargetNode.
Definition ast.h:6102
MultiWriteNode.
Definition ast.h:6184
NextNode.
Definition ast.h:6286
NoBlockParameterNode.
Definition ast.h:6331
NoKeywordsParameterNode.
Definition ast.h:6359
This is the base structure that represents a node in the syntax tree.
Definition ast.h:1065
uint32_t node_id
The unique identifier for this node, which is deterministic based on the source.
Definition ast.h:1082
pm_node_flags_t flags
This represents any flags on the node.
Definition ast.h:1076
pm_location_t location
This is the location of the node in the source.
Definition ast.h:1088
NumberedParametersNode.
Definition ast.h:6386
NumberedReferenceReadNode.
Definition ast.h:6408
OptionalKeywordParameterNode.
Definition ast.h:6442
OptionalParameterNode.
Definition ast.h:6478
OrNode.
Definition ast.h:6515
ParametersNode.
Definition ast.h:6569
ParenthesesNode.
Definition ast.h:6624
PinnedExpressionNode.
Definition ast.h:6656
PinnedVariableNode.
Definition ast.h:6713
PostExecutionNode.
Definition ast.h:6750
PreExecutionNode.
Definition ast.h:6787
ProgramNode.
Definition ast.h:6821
RangeNode.
Definition ast.h:6854
RationalNode.
Definition ast.h:6911
RegularExpressionNode.
Definition ast.h:6976
RequiredKeywordParameterNode.
Definition ast.h:7017
RequiredParameterNode.
Definition ast.h:7048
RescueModifierNode.
Definition ast.h:7070
RescueNode.
Definition ast.h:7107
RestParameterNode.
Definition ast.h:7163
ReturnNode.
Definition ast.h:7212
ShareableConstantNode.
Definition ast.h:7262
SingletonClassNode.
Definition ast.h:7286
SourceFileNode.
Definition ast.h:7356
SplatNode.
Definition ast.h:7397
StatementsNode.
Definition ast.h:7424
StringNode.
Definition ast.h:7458
A generic string type that can have various ownership semantics.
Definition stringy.h:18
SuperNode.
Definition ast.h:7500
SymbolNode.
Definition ast.h:7552
This struct represents a token in the Ruby source.
Definition ast.h:526
UndefNode.
Definition ast.h:7606
UnlessNode.
Definition ast.h:7636
UntilNode.
Definition ast.h:7726
WhenNode.
Definition ast.h:7770
WhileNode.
Definition ast.h:7813
XStringNode.
Definition ast.h:7859
YieldNode.
Definition ast.h:7896