Ruby 4.1.0dev (2026-10-31 revision 3c6a1c7a86b5a45b87e657f2843d5c8b406ef33f)
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
24
25#include "prism/internal/allocator.h"
26#include "prism/internal/buffer.h"
27#include "prism/internal/comments.h"
28#include "prism/internal/diagnostic.h"
29#include "prism/internal/encoding.h"
30#include "prism/internal/list.h"
31#include "prism/internal/magic_comments.h"
32#include "prism/internal/options.h"
33#include "prism/internal/parser.h"
34
35#include "prism.h"
36#include "prism/ast.h"
38
39#include <assert.h>
40#include <stdbool.h>
41#include <stdio.h>
42#include <stdlib.h>
43#include <string.h>
44
45static PRISM_INLINE uint32_t
46pm_ptrdifft_to_u32(ptrdiff_t value) {
47 assert(value >= 0 && ((unsigned long) value) < UINT32_MAX);
48 return (uint32_t) value;
49}
50
51static PRISM_INLINE uint32_t
52pm_sizet_to_u32(size_t value) {
53 assert(value < UINT32_MAX);
54 return (uint32_t) value;
55}
56
57static void
58pm_serialize_location(const pm_location_t *location, pm_buffer_t *buffer) {
59 pm_buffer_append_varuint(buffer, location->start);
60 pm_buffer_append_varuint(buffer, location->length);
61}
62
63static void
64pm_serialize_string(const pm_string_t *string, pm_buffer_t *buffer) {
65 uint32_t length = pm_sizet_to_u32(pm_string_length(string));
66 pm_buffer_append_varuint(buffer, length);
67 pm_buffer_append_bytes(buffer, pm_string_source(string), length);
68}
69
70static void
71pm_serialize_integer(const pm_integer_t *integer, pm_buffer_t *buffer) {
72 pm_buffer_append_byte(buffer, integer->negative ? 1 : 0);
73 if (integer->values == NULL) {
74 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(1));
75 pm_buffer_append_varuint(buffer, integer->value);
76 } else {
77 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(integer->length));
78 for (size_t i = 0; i < integer->length; i++) {
79 pm_buffer_append_varuint(buffer, integer->values[i]);
80 }
81 }
82}
83
87typedef enum {
89 PM_SERIALIZE_ENTRY_NODE,
90
92 PM_SERIALIZE_ENTRY_LAZY_HEADER,
93
95 PM_SERIALIZE_ENTRY_LAZY_START,
96
98 PM_SERIALIZE_ENTRY_LAZY_END
99} pm_serialize_entry_kind_t;
100
104typedef struct {
107
113 size_t offset;
114
116 pm_serialize_entry_kind_t kind;
117
121
126typedef struct {
129
131 size_t size;
132
134 size_t capacity;
136
141static void
142pm_serialize_stack_push(pm_serialize_stack_t *stack, pm_serialize_entry_kind_t kind, const pm_node_t *node, size_t offset) {
143 if (PRISM_UNLIKELY(stack->size == stack->capacity)) {
144 size_t capacity = stack->capacity == 0 ? 64 : stack->capacity * 2;
145 pm_serialize_entry_t *entries = (pm_serialize_entry_t *) xrealloc_sized(stack->entries, capacity * sizeof(pm_serialize_entry_t), stack->capacity * sizeof(pm_serialize_entry_t));
146
147 if (PRISM_UNLIKELY(entries == NULL)) {
148 fprintf(stderr, "prism: out of memory; aborting\n");
149 abort();
150 }
151
152 stack->entries = entries;
153 stack->capacity = capacity;
154 }
155
156 stack->entries[stack->size++] = (pm_serialize_entry_t) { .node = node, .offset = offset, .kind = kind, .visited = false };
157}
158
169static void
170pm_serialize_node(pm_node_t *root, pm_buffer_t *buffer) {
171 pm_serialize_stack_t stack = { 0 };
172 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, root, 0);
173
174 while (stack.size > 0) {
175 pm_serialize_entry_t *entry = &stack.entries[--stack.size];
176
177 switch (entry->kind) {
178 case PM_SERIALIZE_ENTRY_LAZY_HEADER: {
179 pm_buffer_append_byte(buffer, 255);
180 stack.entries[entry->offset].offset = buffer->length;
181 pm_buffer_append_zeroes(buffer, 8);
182 continue;
183 }
184 case PM_SERIALIZE_ENTRY_LAZY_START: {
185 size_t offset = stack.entries[entry->offset].offset;
186 uint32_t skip = pm_sizet_to_u32(buffer->length - offset - 8);
187 memcpy(buffer->value + offset, &skip, sizeof(uint32_t));
188 continue;
189 }
190 case PM_SERIALIZE_ENTRY_LAZY_END: {
191 size_t offset = stack.entries[entry->offset].offset;
192 uint32_t skip;
193 memcpy(&skip, buffer->value + offset, sizeof(uint32_t));
194
195 uint32_t length = pm_sizet_to_u32(buffer->length - offset - 8 - skip);
196 memcpy(buffer->value + offset + 4, &length, sizeof(uint32_t));
197 continue;
198 }
199 case PM_SERIALIZE_ENTRY_NODE:
200 break;
201 }
202
203 const pm_node_t *node = entry->node;
204
205 if (node == NULL) {
206 pm_buffer_append_byte(buffer, 0);
207 continue;
208 }
209
210 if (!entry->visited) {
211 /* Leave the node on the stack beneath its children, which are
212 * pushed in reverse field order so that they are popped, and
213 * therefore written, in field order. A node without children is
214 * written straight away instead. */
215 entry->visited = true;
216 size_t index = stack.size++;
217
218 switch (PM_NODE_TYPE(node)) {
219 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
221 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->old_name, 0);
222 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->new_name, 0);
223 break;
224 }
225 case PM_ALIAS_METHOD_NODE: {
226 const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
227 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->old_name, 0);
228 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->new_name, 0);
229 break;
230 }
231 case PM_ALTERNATION_PATTERN_NODE: {
233 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
234 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
235 break;
236 }
237 case PM_AND_NODE: {
238 const pm_and_node_t *cast = (const pm_and_node_t *) node;
239 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
240 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
241 break;
242 }
243 case PM_ARGUMENTS_NODE: {
244 const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node;
245 for (size_t list_index = cast->arguments.size; list_index > 0; list_index--) {
246 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->arguments.nodes[list_index - 1], 0);
247 }
248 break;
249 }
250 case PM_ARRAY_NODE: {
251 const pm_array_node_t *cast = (const pm_array_node_t *) node;
252 for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
253 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
254 }
255 break;
256 }
257 case PM_ARRAY_PATTERN_NODE: {
259 for (size_t list_index = cast->posts.size; list_index > 0; list_index--) {
260 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->posts.nodes[list_index - 1], 0);
261 }
262 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
263 for (size_t list_index = cast->requireds.size; list_index > 0; list_index--) {
264 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->requireds.nodes[list_index - 1], 0);
265 }
266 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant, 0);
267 break;
268 }
269 case PM_ASSOC_NODE: {
270 const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
271 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
272 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->key, 0);
273 break;
274 }
275 case PM_ASSOC_SPLAT_NODE: {
276 const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
277 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
278 break;
279 }
280 case PM_BEGIN_NODE: {
281 const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
282 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->ensure_clause, 0);
283 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
284 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rescue_clause, 0);
285 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
286 break;
287 }
288 case PM_BLOCK_ARGUMENT_NODE: {
290 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
291 break;
292 }
293 case PM_BLOCK_NODE: {
294 const pm_block_node_t *cast = (const pm_block_node_t *) node;
295 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
296 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
297 break;
298 }
299 case PM_BLOCK_PARAMETERS_NODE: {
301 for (size_t list_index = cast->locals.size; list_index > 0; list_index--) {
302 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->locals.nodes[list_index - 1], 0);
303 }
304 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
305 break;
306 }
307 case PM_BREAK_NODE: {
308 const pm_break_node_t *cast = (const pm_break_node_t *) node;
309 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
310 break;
311 }
312 case PM_CALL_AND_WRITE_NODE: {
314 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
315 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
316 break;
317 }
318 case PM_CALL_NODE: {
319 const pm_call_node_t *cast = (const pm_call_node_t *) node;
320 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
321 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
322 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
323 break;
324 }
325 case PM_CALL_OPERATOR_WRITE_NODE: {
327 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
328 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
329 break;
330 }
331 case PM_CALL_OR_WRITE_NODE: {
333 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
334 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
335 break;
336 }
337 case PM_CALL_TARGET_NODE: {
338 const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
339 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
340 break;
341 }
342 case PM_CAPTURE_PATTERN_NODE: {
344 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
345 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
346 break;
347 }
348 case PM_CASE_MATCH_NODE: {
349 const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
350 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
351 for (size_t list_index = cast->conditions.size; list_index > 0; list_index--) {
352 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->conditions.nodes[list_index - 1], 0);
353 }
354 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
355 break;
356 }
357 case PM_CASE_NODE: {
358 const pm_case_node_t *cast = (const pm_case_node_t *) node;
359 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
360 for (size_t list_index = cast->conditions.size; list_index > 0; list_index--) {
361 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->conditions.nodes[list_index - 1], 0);
362 }
363 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
364 break;
365 }
366 case PM_CLASS_NODE: {
367 const pm_class_node_t *cast = (const pm_class_node_t *) node;
368 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
369 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->superclass, 0);
370 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant_path, 0);
371 break;
372 }
373 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
375 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
376 break;
377 }
378 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
380 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
381 break;
382 }
383 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
385 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
386 break;
387 }
388 case PM_CLASS_VARIABLE_WRITE_NODE: {
390 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
391 break;
392 }
393 case PM_CONSTANT_AND_WRITE_NODE: {
395 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
396 break;
397 }
398 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
400 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
401 break;
402 }
403 case PM_CONSTANT_OR_WRITE_NODE: {
405 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
406 break;
407 }
408 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
410 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
411 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
412 break;
413 }
414 case PM_CONSTANT_PATH_NODE: {
416 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parent, 0);
417 break;
418 }
419 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
421 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
422 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
423 break;
424 }
425 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
427 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
428 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
429 break;
430 }
431 case PM_CONSTANT_PATH_TARGET_NODE: {
433 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parent, 0);
434 break;
435 }
436 case PM_CONSTANT_PATH_WRITE_NODE: {
438 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
439 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
440 break;
441 }
442 case PM_CONSTANT_WRITE_NODE: {
444 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
445 break;
446 }
447 case PM_DEF_NODE: {
448 const pm_def_node_t *cast = (const pm_def_node_t *) node;
449 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_LAZY_END, NULL, index);
450 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
451 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_LAZY_START, NULL, index);
452 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
453 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
454 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_LAZY_HEADER, NULL, index);
455 break;
456 }
457 case PM_DEFINED_NODE: {
458 const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
459 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
460 break;
461 }
462 case PM_ELSE_NODE: {
463 const pm_else_node_t *cast = (const pm_else_node_t *) node;
464 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
465 break;
466 }
467 case PM_EMBEDDED_STATEMENTS_NODE: {
469 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
470 break;
471 }
472 case PM_EMBEDDED_VARIABLE_NODE: {
474 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->variable, 0);
475 break;
476 }
477 case PM_ENSURE_NODE: {
478 const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
479 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
480 break;
481 }
482 case PM_ERROR_RECOVERY_NODE: {
484 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->unexpected, 0);
485 break;
486 }
487 case PM_FIND_PATTERN_NODE: {
488 const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
489 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
490 for (size_t list_index = cast->requireds.size; list_index > 0; list_index--) {
491 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->requireds.nodes[list_index - 1], 0);
492 }
493 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
494 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant, 0);
495 break;
496 }
497 case PM_FLIP_FLOP_NODE: {
498 const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
499 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
500 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
501 break;
502 }
503 case PM_FOR_NODE: {
504 const pm_for_node_t *cast = (const pm_for_node_t *) node;
505 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
506 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->collection, 0);
507 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->index, 0);
508 break;
509 }
510 case PM_FORWARDING_SUPER_NODE: {
512 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
513 break;
514 }
515 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
517 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
518 break;
519 }
520 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
522 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
523 break;
524 }
525 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
527 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
528 break;
529 }
530 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
532 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
533 break;
534 }
535 case PM_HASH_NODE: {
536 const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
537 for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
538 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
539 }
540 break;
541 }
542 case PM_HASH_PATTERN_NODE: {
543 const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
544 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
545 for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
546 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
547 }
548 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant, 0);
549 break;
550 }
551 case PM_IF_NODE: {
552 const pm_if_node_t *cast = (const pm_if_node_t *) node;
553 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->subsequent, 0);
554 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
555 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
556 break;
557 }
558 case PM_IMAGINARY_NODE: {
559 const pm_imaginary_node_t *cast = (const pm_imaginary_node_t *) node;
560 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->numeric, 0);
561 break;
562 }
563 case PM_IMPLICIT_NODE: {
564 const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node;
565 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
566 break;
567 }
568 case PM_IN_NODE: {
569 const pm_in_node_t *cast = (const pm_in_node_t *) node;
570 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
571 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->pattern, 0);
572 break;
573 }
574 case PM_INDEX_AND_WRITE_NODE: {
576 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
577 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
578 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
579 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
580 break;
581 }
582 case PM_INDEX_OPERATOR_WRITE_NODE: {
584 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
585 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
586 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
587 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
588 break;
589 }
590 case PM_INDEX_OR_WRITE_NODE: {
592 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
593 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
594 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
595 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
596 break;
597 }
598 case PM_INDEX_TARGET_NODE: {
599 const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
600 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
601 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
602 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
603 break;
604 }
605 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
607 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
608 break;
609 }
610 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
612 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
613 break;
614 }
615 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
617 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
618 break;
619 }
620 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
622 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
623 break;
624 }
625 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
627 for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
628 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
629 }
630 break;
631 }
632 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
634 for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
635 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
636 }
637 break;
638 }
639 case PM_INTERPOLATED_STRING_NODE: {
641 for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
642 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
643 }
644 break;
645 }
646 case PM_INTERPOLATED_SYMBOL_NODE: {
648 for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
649 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
650 }
651 break;
652 }
653 case PM_INTERPOLATED_X_STRING_NODE: {
655 for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
656 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
657 }
658 break;
659 }
660 case PM_KEYWORD_HASH_NODE: {
661 const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node;
662 for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
663 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
664 }
665 break;
666 }
667 case PM_LAMBDA_NODE: {
668 const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
669 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
670 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
671 break;
672 }
673 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
675 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
676 break;
677 }
678 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
680 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
681 break;
682 }
683 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
685 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
686 break;
687 }
688 case PM_LOCAL_VARIABLE_WRITE_NODE: {
690 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
691 break;
692 }
693 case PM_MATCH_PREDICATE_NODE: {
695 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->pattern, 0);
696 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
697 break;
698 }
699 case PM_MATCH_REQUIRED_NODE: {
701 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->pattern, 0);
702 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
703 break;
704 }
705 case PM_MATCH_WRITE_NODE: {
706 const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
707 for (size_t list_index = cast->targets.size; list_index > 0; list_index--) {
708 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->targets.nodes[list_index - 1], 0);
709 }
710 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->call, 0);
711 break;
712 }
713 case PM_MODULE_NODE: {
714 const pm_module_node_t *cast = (const pm_module_node_t *) node;
715 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
716 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant_path, 0);
717 break;
718 }
719 case PM_MULTI_TARGET_NODE: {
720 const pm_multi_target_node_t *cast = (const pm_multi_target_node_t *) node;
721 for (size_t list_index = cast->rights.size; list_index > 0; list_index--) {
722 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->rights.nodes[list_index - 1], 0);
723 }
724 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
725 for (size_t list_index = cast->lefts.size; list_index > 0; list_index--) {
726 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->lefts.nodes[list_index - 1], 0);
727 }
728 break;
729 }
730 case PM_MULTI_WRITE_NODE: {
731 const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node;
732 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
733 for (size_t list_index = cast->rights.size; list_index > 0; list_index--) {
734 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->rights.nodes[list_index - 1], 0);
735 }
736 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
737 for (size_t list_index = cast->lefts.size; list_index > 0; list_index--) {
738 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->lefts.nodes[list_index - 1], 0);
739 }
740 break;
741 }
742 case PM_NEXT_NODE: {
743 const pm_next_node_t *cast = (const pm_next_node_t *) node;
744 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
745 break;
746 }
747 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
749 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
750 break;
751 }
752 case PM_OPTIONAL_PARAMETER_NODE: {
754 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
755 break;
756 }
757 case PM_OR_NODE: {
758 const pm_or_node_t *cast = (const pm_or_node_t *) node;
759 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
760 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
761 break;
762 }
763 case PM_PARAMETERS_NODE: {
764 const pm_parameters_node_t *cast = (const pm_parameters_node_t *) node;
765 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
766 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->keyword_rest, 0);
767 for (size_t list_index = cast->keywords.size; list_index > 0; list_index--) {
768 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->keywords.nodes[list_index - 1], 0);
769 }
770 for (size_t list_index = cast->posts.size; list_index > 0; list_index--) {
771 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->posts.nodes[list_index - 1], 0);
772 }
773 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
774 for (size_t list_index = cast->optionals.size; list_index > 0; list_index--) {
775 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->optionals.nodes[list_index - 1], 0);
776 }
777 for (size_t list_index = cast->requireds.size; list_index > 0; list_index--) {
778 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->requireds.nodes[list_index - 1], 0);
779 }
780 break;
781 }
782 case PM_PARENTHESES_NODE: {
783 const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
784 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
785 break;
786 }
787 case PM_PINNED_EXPRESSION_NODE: {
789 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
790 break;
791 }
792 case PM_PINNED_VARIABLE_NODE: {
794 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->variable, 0);
795 break;
796 }
797 case PM_POST_EXECUTION_NODE: {
799 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
800 break;
801 }
802 case PM_PRE_EXECUTION_NODE: {
804 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
805 break;
806 }
807 case PM_PROGRAM_NODE: {
808 const pm_program_node_t *cast = (const pm_program_node_t *) node;
809 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
810 break;
811 }
812 case PM_RANGE_NODE: {
813 const pm_range_node_t *cast = (const pm_range_node_t *) node;
814 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
815 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
816 break;
817 }
818 case PM_RESCUE_MODIFIER_NODE: {
820 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rescue_expression, 0);
821 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
822 break;
823 }
824 case PM_RESCUE_NODE: {
825 const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node;
826 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->subsequent, 0);
827 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
828 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->reference, 0);
829 for (size_t list_index = cast->exceptions.size; list_index > 0; list_index--) {
830 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->exceptions.nodes[list_index - 1], 0);
831 }
832 break;
833 }
834 case PM_RETURN_NODE: {
835 const pm_return_node_t *cast = (const pm_return_node_t *) node;
836 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
837 break;
838 }
839 case PM_SHAREABLE_CONSTANT_NODE: {
841 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->write, 0);
842 break;
843 }
844 case PM_SINGLETON_CLASS_NODE: {
846 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
847 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
848 break;
849 }
850 case PM_SPLAT_NODE: {
851 const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
852 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
853 break;
854 }
855 case PM_STATEMENTS_NODE: {
856 const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
857 for (size_t list_index = cast->body.size; list_index > 0; list_index--) {
858 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->body.nodes[list_index - 1], 0);
859 }
860 break;
861 }
862 case PM_SUPER_NODE: {
863 const pm_super_node_t *cast = (const pm_super_node_t *) node;
864 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
865 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
866 break;
867 }
868 case PM_UNDEF_NODE: {
869 const pm_undef_node_t *cast = (const pm_undef_node_t *) node;
870 for (size_t list_index = cast->names.size; list_index > 0; list_index--) {
871 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->names.nodes[list_index - 1], 0);
872 }
873 break;
874 }
875 case PM_UNLESS_NODE: {
876 const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
877 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
878 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
879 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
880 break;
881 }
882 case PM_UNTIL_NODE: {
883 const pm_until_node_t *cast = (const pm_until_node_t *) node;
884 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
885 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
886 break;
887 }
888 case PM_WHEN_NODE: {
889 const pm_when_node_t *cast = (const pm_when_node_t *) node;
890 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
891 for (size_t list_index = cast->conditions.size; list_index > 0; list_index--) {
892 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->conditions.nodes[list_index - 1], 0);
893 }
894 break;
895 }
896 case PM_WHILE_NODE: {
897 const pm_while_node_t *cast = (const pm_while_node_t *) node;
898 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
899 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
900 break;
901 }
902 case PM_YIELD_NODE: {
903 const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
904 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
905 break;
906 }
907 default:
908 break;
909 }
910
911 if (stack.size != index + 1) continue;
912 stack.size--;
913 }
914
915 pm_buffer_append_byte(buffer, (uint8_t) PM_NODE_TYPE(node));
916 pm_buffer_append_varuint(buffer, node->node_id);
917 pm_serialize_location(&node->location, buffer);
918
919 switch (PM_NODE_TYPE(node)) {
920 /* A ScopeNode is never part of the tree, so it has no fields to
921 * serialize. */
922 case PM_SCOPE_NODE:
923 break;
924 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
926 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
927 pm_serialize_location(&cast->keyword_loc, buffer);
928 break;
929 }
930 case PM_ALIAS_METHOD_NODE: {
931 const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
932 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
933 pm_serialize_location(&cast->keyword_loc, buffer);
934 break;
935 }
936 case PM_ALTERNATION_PATTERN_NODE: {
938 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
939 pm_serialize_location(&cast->operator_loc, buffer);
940 break;
941 }
942 case PM_AND_NODE: {
943 const pm_and_node_t *cast = (const pm_and_node_t *) node;
944 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
945 pm_serialize_location(&cast->operator_loc, buffer);
946 break;
947 }
948 case PM_ARGUMENTS_NODE: {
949 const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node;
950 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
951 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->arguments.size));
952 break;
953 }
954 case PM_ARRAY_NODE: {
955 const pm_array_node_t *cast = (const pm_array_node_t *) node;
956 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
957 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
958 if (cast->opening_loc.length == 0) {
959 pm_buffer_append_byte(buffer, 0);
960 } else {
961 pm_buffer_append_byte(buffer, 1);
962 pm_serialize_location(&cast->opening_loc, buffer);
963 }
964 if (cast->closing_loc.length == 0) {
965 pm_buffer_append_byte(buffer, 0);
966 } else {
967 pm_buffer_append_byte(buffer, 1);
968 pm_serialize_location(&cast->closing_loc, buffer);
969 }
970 break;
971 }
972 case PM_ARRAY_PATTERN_NODE: {
974 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
975 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->requireds.size));
976 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->posts.size));
977 if (cast->opening_loc.length == 0) {
978 pm_buffer_append_byte(buffer, 0);
979 } else {
980 pm_buffer_append_byte(buffer, 1);
981 pm_serialize_location(&cast->opening_loc, buffer);
982 }
983 if (cast->closing_loc.length == 0) {
984 pm_buffer_append_byte(buffer, 0);
985 } else {
986 pm_buffer_append_byte(buffer, 1);
987 pm_serialize_location(&cast->closing_loc, buffer);
988 }
989 break;
990 }
991 case PM_ASSOC_NODE: {
992 const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
993 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
994 if (cast->operator_loc.length == 0) {
995 pm_buffer_append_byte(buffer, 0);
996 } else {
997 pm_buffer_append_byte(buffer, 1);
998 pm_serialize_location(&cast->operator_loc, buffer);
999 }
1000 break;
1001 }
1002 case PM_ASSOC_SPLAT_NODE: {
1003 const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
1004 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1005 pm_serialize_location(&cast->operator_loc, buffer);
1006 break;
1007 }
1008 case PM_BACK_REFERENCE_READ_NODE: {
1010 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1011 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1012 break;
1013 }
1014 case PM_BEGIN_NODE: {
1015 const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
1016 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1017 if (cast->begin_keyword_loc.length == 0) {
1018 pm_buffer_append_byte(buffer, 0);
1019 } else {
1020 pm_buffer_append_byte(buffer, 1);
1021 pm_serialize_location(&cast->begin_keyword_loc, buffer);
1022 }
1023 if (cast->end_keyword_loc.length == 0) {
1024 pm_buffer_append_byte(buffer, 0);
1025 } else {
1026 pm_buffer_append_byte(buffer, 1);
1027 pm_serialize_location(&cast->end_keyword_loc, buffer);
1028 }
1029 break;
1030 }
1031 case PM_BLOCK_ARGUMENT_NODE: {
1033 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1034 pm_serialize_location(&cast->operator_loc, buffer);
1035 break;
1036 }
1037 case PM_BLOCK_LOCAL_VARIABLE_NODE: {
1039 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1040 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1041 break;
1042 }
1043 case PM_BLOCK_NODE: {
1044 const pm_block_node_t *cast = (const pm_block_node_t *) node;
1045 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1046 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1047 for (size_t index = 0; index < cast->locals.size; index++) {
1048 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1049 }
1050 pm_serialize_location(&cast->opening_loc, buffer);
1051 pm_serialize_location(&cast->closing_loc, buffer);
1052 break;
1053 }
1054 case PM_BLOCK_PARAMETER_NODE: {
1056 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1057 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1058 if (cast->name_loc.length == 0) {
1059 pm_buffer_append_byte(buffer, 0);
1060 } else {
1061 pm_buffer_append_byte(buffer, 1);
1062 pm_serialize_location(&cast->name_loc, buffer);
1063 }
1064 pm_serialize_location(&cast->operator_loc, buffer);
1065 break;
1066 }
1067 case PM_BLOCK_PARAMETERS_NODE: {
1069 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1070 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1071 if (cast->opening_loc.length == 0) {
1072 pm_buffer_append_byte(buffer, 0);
1073 } else {
1074 pm_buffer_append_byte(buffer, 1);
1075 pm_serialize_location(&cast->opening_loc, buffer);
1076 }
1077 if (cast->closing_loc.length == 0) {
1078 pm_buffer_append_byte(buffer, 0);
1079 } else {
1080 pm_buffer_append_byte(buffer, 1);
1081 pm_serialize_location(&cast->closing_loc, buffer);
1082 }
1083 break;
1084 }
1085 case PM_BREAK_NODE: {
1086 const pm_break_node_t *cast = (const pm_break_node_t *) node;
1087 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1088 pm_serialize_location(&cast->keyword_loc, buffer);
1089 break;
1090 }
1091 case PM_CALL_AND_WRITE_NODE: {
1093 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1094 if (cast->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(&cast->call_operator_loc, buffer);
1099 }
1100 if (cast->message_loc.length == 0) {
1101 pm_buffer_append_byte(buffer, 0);
1102 } else {
1103 pm_buffer_append_byte(buffer, 1);
1104 pm_serialize_location(&cast->message_loc, buffer);
1105 }
1106 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->read_name));
1107 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->write_name));
1108 pm_serialize_location(&cast->operator_loc, buffer);
1109 break;
1110 }
1111 case PM_CALL_NODE: {
1112 const pm_call_node_t *cast = (const pm_call_node_t *) node;
1113 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1114 if (cast->call_operator_loc.length == 0) {
1115 pm_buffer_append_byte(buffer, 0);
1116 } else {
1117 pm_buffer_append_byte(buffer, 1);
1118 pm_serialize_location(&cast->call_operator_loc, buffer);
1119 }
1120 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1121 if (cast->message_loc.length == 0) {
1122 pm_buffer_append_byte(buffer, 0);
1123 } else {
1124 pm_buffer_append_byte(buffer, 1);
1125 pm_serialize_location(&cast->message_loc, buffer);
1126 }
1127 if (cast->opening_loc.length == 0) {
1128 pm_buffer_append_byte(buffer, 0);
1129 } else {
1130 pm_buffer_append_byte(buffer, 1);
1131 pm_serialize_location(&cast->opening_loc, buffer);
1132 }
1133 if (cast->closing_loc.length == 0) {
1134 pm_buffer_append_byte(buffer, 0);
1135 } else {
1136 pm_buffer_append_byte(buffer, 1);
1137 pm_serialize_location(&cast->closing_loc, buffer);
1138 }
1139 if (cast->equal_loc.length == 0) {
1140 pm_buffer_append_byte(buffer, 0);
1141 } else {
1142 pm_buffer_append_byte(buffer, 1);
1143 pm_serialize_location(&cast->equal_loc, buffer);
1144 }
1145 break;
1146 }
1147 case PM_CALL_OPERATOR_WRITE_NODE: {
1149 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1150 if (cast->call_operator_loc.length == 0) {
1151 pm_buffer_append_byte(buffer, 0);
1152 } else {
1153 pm_buffer_append_byte(buffer, 1);
1154 pm_serialize_location(&cast->call_operator_loc, buffer);
1155 }
1156 if (cast->message_loc.length == 0) {
1157 pm_buffer_append_byte(buffer, 0);
1158 } else {
1159 pm_buffer_append_byte(buffer, 1);
1160 pm_serialize_location(&cast->message_loc, buffer);
1161 }
1162 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->read_name));
1163 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->write_name));
1164 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1165 pm_serialize_location(&cast->binary_operator_loc, buffer);
1166 break;
1167 }
1168 case PM_CALL_OR_WRITE_NODE: {
1170 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1171 if (cast->call_operator_loc.length == 0) {
1172 pm_buffer_append_byte(buffer, 0);
1173 } else {
1174 pm_buffer_append_byte(buffer, 1);
1175 pm_serialize_location(&cast->call_operator_loc, buffer);
1176 }
1177 if (cast->message_loc.length == 0) {
1178 pm_buffer_append_byte(buffer, 0);
1179 } else {
1180 pm_buffer_append_byte(buffer, 1);
1181 pm_serialize_location(&cast->message_loc, buffer);
1182 }
1183 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->read_name));
1184 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->write_name));
1185 pm_serialize_location(&cast->operator_loc, buffer);
1186 break;
1187 }
1188 case PM_CALL_TARGET_NODE: {
1189 const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
1190 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1191 pm_serialize_location(&cast->call_operator_loc, buffer);
1192 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1193 pm_serialize_location(&cast->message_loc, buffer);
1194 break;
1195 }
1196 case PM_CAPTURE_PATTERN_NODE: {
1198 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1199 pm_serialize_location(&cast->operator_loc, buffer);
1200 break;
1201 }
1202 case PM_CASE_MATCH_NODE: {
1203 const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
1204 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1205 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->conditions.size));
1206 pm_serialize_location(&cast->case_keyword_loc, buffer);
1207 pm_serialize_location(&cast->end_keyword_loc, buffer);
1208 break;
1209 }
1210 case PM_CASE_NODE: {
1211 const pm_case_node_t *cast = (const pm_case_node_t *) node;
1212 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1213 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->conditions.size));
1214 pm_serialize_location(&cast->case_keyword_loc, buffer);
1215 pm_serialize_location(&cast->end_keyword_loc, buffer);
1216 break;
1217 }
1218 case PM_CLASS_NODE: {
1219 const pm_class_node_t *cast = (const pm_class_node_t *) node;
1220 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1221 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1222 for (size_t index = 0; index < cast->locals.size; index++) {
1223 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1224 }
1225 pm_serialize_location(&cast->class_keyword_loc, buffer);
1226 if (cast->inheritance_operator_loc.length == 0) {
1227 pm_buffer_append_byte(buffer, 0);
1228 } else {
1229 pm_buffer_append_byte(buffer, 1);
1230 pm_serialize_location(&cast->inheritance_operator_loc, buffer);
1231 }
1232 pm_serialize_location(&cast->end_keyword_loc, buffer);
1233 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1234 break;
1235 }
1236 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
1238 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1239 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1240 pm_serialize_location(&cast->name_loc, buffer);
1241 pm_serialize_location(&cast->operator_loc, buffer);
1242 break;
1243 }
1244 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
1246 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1247 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1248 pm_serialize_location(&cast->name_loc, buffer);
1249 pm_serialize_location(&cast->binary_operator_loc, buffer);
1250 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1251 break;
1252 }
1253 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
1255 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1256 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1257 pm_serialize_location(&cast->name_loc, buffer);
1258 pm_serialize_location(&cast->operator_loc, buffer);
1259 break;
1260 }
1261 case PM_CLASS_VARIABLE_READ_NODE: {
1263 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1264 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1265 break;
1266 }
1267 case PM_CLASS_VARIABLE_TARGET_NODE: {
1269 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1270 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1271 break;
1272 }
1273 case PM_CLASS_VARIABLE_WRITE_NODE: {
1275 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1276 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1277 pm_serialize_location(&cast->name_loc, buffer);
1278 pm_serialize_location(&cast->operator_loc, buffer);
1279 break;
1280 }
1281 case PM_CONSTANT_AND_WRITE_NODE: {
1283 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1284 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1285 pm_serialize_location(&cast->name_loc, buffer);
1286 pm_serialize_location(&cast->operator_loc, buffer);
1287 break;
1288 }
1289 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
1291 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1292 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1293 pm_serialize_location(&cast->name_loc, buffer);
1294 pm_serialize_location(&cast->binary_operator_loc, buffer);
1295 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1296 break;
1297 }
1298 case PM_CONSTANT_OR_WRITE_NODE: {
1300 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1301 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1302 pm_serialize_location(&cast->name_loc, buffer);
1303 pm_serialize_location(&cast->operator_loc, buffer);
1304 break;
1305 }
1306 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
1308 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1309 pm_serialize_location(&cast->operator_loc, buffer);
1310 break;
1311 }
1312 case PM_CONSTANT_PATH_NODE: {
1314 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1315 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1316 pm_serialize_location(&cast->delimiter_loc, buffer);
1317 pm_serialize_location(&cast->name_loc, buffer);
1318 break;
1319 }
1320 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
1322 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1323 pm_serialize_location(&cast->binary_operator_loc, buffer);
1324 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1325 break;
1326 }
1327 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
1329 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1330 pm_serialize_location(&cast->operator_loc, buffer);
1331 break;
1332 }
1333 case PM_CONSTANT_PATH_TARGET_NODE: {
1335 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1336 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1337 pm_serialize_location(&cast->delimiter_loc, buffer);
1338 pm_serialize_location(&cast->name_loc, buffer);
1339 break;
1340 }
1341 case PM_CONSTANT_PATH_WRITE_NODE: {
1343 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1344 pm_serialize_location(&cast->operator_loc, buffer);
1345 break;
1346 }
1347 case PM_CONSTANT_READ_NODE: {
1349 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1350 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1351 break;
1352 }
1353 case PM_CONSTANT_TARGET_NODE: {
1355 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1356 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1357 break;
1358 }
1359 case PM_CONSTANT_WRITE_NODE: {
1361 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1362 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1363 pm_serialize_location(&cast->name_loc, buffer);
1364 pm_serialize_location(&cast->operator_loc, buffer);
1365 break;
1366 }
1367 case PM_DEF_NODE: {
1368 const pm_def_node_t *cast = (const pm_def_node_t *) node;
1369 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1370 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1371 pm_serialize_location(&cast->name_loc, buffer);
1372 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1373 for (size_t index = 0; index < cast->locals.size; index++) {
1374 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1375 }
1376 pm_serialize_location(&cast->def_keyword_loc, buffer);
1377 if (cast->operator_loc.length == 0) {
1378 pm_buffer_append_byte(buffer, 0);
1379 } else {
1380 pm_buffer_append_byte(buffer, 1);
1381 pm_serialize_location(&cast->operator_loc, buffer);
1382 }
1383 if (cast->lparen_loc.length == 0) {
1384 pm_buffer_append_byte(buffer, 0);
1385 } else {
1386 pm_buffer_append_byte(buffer, 1);
1387 pm_serialize_location(&cast->lparen_loc, buffer);
1388 }
1389 if (cast->rparen_loc.length == 0) {
1390 pm_buffer_append_byte(buffer, 0);
1391 } else {
1392 pm_buffer_append_byte(buffer, 1);
1393 pm_serialize_location(&cast->rparen_loc, buffer);
1394 }
1395 if (cast->equal_loc.length == 0) {
1396 pm_buffer_append_byte(buffer, 0);
1397 } else {
1398 pm_buffer_append_byte(buffer, 1);
1399 pm_serialize_location(&cast->equal_loc, buffer);
1400 }
1401 if (cast->end_keyword_loc.length == 0) {
1402 pm_buffer_append_byte(buffer, 0);
1403 } else {
1404 pm_buffer_append_byte(buffer, 1);
1405 pm_serialize_location(&cast->end_keyword_loc, buffer);
1406 }
1407 break;
1408 }
1409 case PM_DEFINED_NODE: {
1410 const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
1411 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1412 if (cast->lparen_loc.length == 0) {
1413 pm_buffer_append_byte(buffer, 0);
1414 } else {
1415 pm_buffer_append_byte(buffer, 1);
1416 pm_serialize_location(&cast->lparen_loc, buffer);
1417 }
1418 if (cast->rparen_loc.length == 0) {
1419 pm_buffer_append_byte(buffer, 0);
1420 } else {
1421 pm_buffer_append_byte(buffer, 1);
1422 pm_serialize_location(&cast->rparen_loc, buffer);
1423 }
1424 pm_serialize_location(&cast->keyword_loc, buffer);
1425 break;
1426 }
1427 case PM_ELSE_NODE: {
1428 const pm_else_node_t *cast = (const pm_else_node_t *) node;
1429 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1430 pm_serialize_location(&cast->else_keyword_loc, buffer);
1431 if (cast->end_keyword_loc.length == 0) {
1432 pm_buffer_append_byte(buffer, 0);
1433 } else {
1434 pm_buffer_append_byte(buffer, 1);
1435 pm_serialize_location(&cast->end_keyword_loc, buffer);
1436 }
1437 break;
1438 }
1439 case PM_EMBEDDED_STATEMENTS_NODE: {
1441 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1442 pm_serialize_location(&cast->opening_loc, buffer);
1443 pm_serialize_location(&cast->closing_loc, buffer);
1444 break;
1445 }
1446 case PM_EMBEDDED_VARIABLE_NODE: {
1448 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1449 pm_serialize_location(&cast->operator_loc, buffer);
1450 break;
1451 }
1452 case PM_ENSURE_NODE: {
1453 const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
1454 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1455 pm_serialize_location(&cast->ensure_keyword_loc, buffer);
1456 pm_serialize_location(&cast->end_keyword_loc, buffer);
1457 break;
1458 }
1459 case PM_ERROR_RECOVERY_NODE: {
1460 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1461 break;
1462 }
1463 case PM_FALSE_NODE: {
1464 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1465 break;
1466 }
1467 case PM_FIND_PATTERN_NODE: {
1468 const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
1469 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1470 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->requireds.size));
1471 if (cast->opening_loc.length == 0) {
1472 pm_buffer_append_byte(buffer, 0);
1473 } else {
1474 pm_buffer_append_byte(buffer, 1);
1475 pm_serialize_location(&cast->opening_loc, buffer);
1476 }
1477 if (cast->closing_loc.length == 0) {
1478 pm_buffer_append_byte(buffer, 0);
1479 } else {
1480 pm_buffer_append_byte(buffer, 1);
1481 pm_serialize_location(&cast->closing_loc, buffer);
1482 }
1483 break;
1484 }
1485 case PM_FLIP_FLOP_NODE: {
1486 const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
1487 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1488 pm_serialize_location(&cast->operator_loc, buffer);
1489 break;
1490 }
1491 case PM_FLOAT_NODE: {
1492 const pm_float_node_t *cast = (const pm_float_node_t *) node;
1493 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1494 pm_buffer_append_double(buffer, cast->value);
1495 break;
1496 }
1497 case PM_FOR_NODE: {
1498 const pm_for_node_t *cast = (const pm_for_node_t *) node;
1499 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1500 pm_serialize_location(&cast->for_keyword_loc, buffer);
1501 pm_serialize_location(&cast->in_keyword_loc, buffer);
1502 if (cast->do_keyword_loc.length == 0) {
1503 pm_buffer_append_byte(buffer, 0);
1504 } else {
1505 pm_buffer_append_byte(buffer, 1);
1506 pm_serialize_location(&cast->do_keyword_loc, buffer);
1507 }
1508 pm_serialize_location(&cast->end_keyword_loc, buffer);
1509 break;
1510 }
1511 case PM_FORWARDING_ARGUMENTS_NODE: {
1512 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1513 break;
1514 }
1515 case PM_FORWARDING_PARAMETER_NODE: {
1516 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1517 break;
1518 }
1519 case PM_FORWARDING_SUPER_NODE: {
1521 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1522 pm_serialize_location(&cast->keyword_loc, buffer);
1523 break;
1524 }
1525 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
1527 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1528 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1529 pm_serialize_location(&cast->name_loc, buffer);
1530 pm_serialize_location(&cast->operator_loc, buffer);
1531 break;
1532 }
1533 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
1535 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1536 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1537 pm_serialize_location(&cast->name_loc, buffer);
1538 pm_serialize_location(&cast->binary_operator_loc, buffer);
1539 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1540 break;
1541 }
1542 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
1544 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1545 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1546 pm_serialize_location(&cast->name_loc, buffer);
1547 pm_serialize_location(&cast->operator_loc, buffer);
1548 break;
1549 }
1550 case PM_GLOBAL_VARIABLE_READ_NODE: {
1552 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1553 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1554 break;
1555 }
1556 case PM_GLOBAL_VARIABLE_TARGET_NODE: {
1558 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1559 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1560 break;
1561 }
1562 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
1564 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1565 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1566 pm_serialize_location(&cast->name_loc, buffer);
1567 pm_serialize_location(&cast->operator_loc, buffer);
1568 break;
1569 }
1570 case PM_HASH_NODE: {
1571 const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
1572 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1573 pm_serialize_location(&cast->opening_loc, buffer);
1574 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
1575 pm_serialize_location(&cast->closing_loc, buffer);
1576 break;
1577 }
1578 case PM_HASH_PATTERN_NODE: {
1579 const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
1580 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1581 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
1582 if (cast->opening_loc.length == 0) {
1583 pm_buffer_append_byte(buffer, 0);
1584 } else {
1585 pm_buffer_append_byte(buffer, 1);
1586 pm_serialize_location(&cast->opening_loc, buffer);
1587 }
1588 if (cast->closing_loc.length == 0) {
1589 pm_buffer_append_byte(buffer, 0);
1590 } else {
1591 pm_buffer_append_byte(buffer, 1);
1592 pm_serialize_location(&cast->closing_loc, buffer);
1593 }
1594 break;
1595 }
1596 case PM_IF_NODE: {
1597 const pm_if_node_t *cast = (const pm_if_node_t *) node;
1598 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1599 if (cast->if_keyword_loc.length == 0) {
1600 pm_buffer_append_byte(buffer, 0);
1601 } else {
1602 pm_buffer_append_byte(buffer, 1);
1603 pm_serialize_location(&cast->if_keyword_loc, buffer);
1604 }
1605 if (cast->then_keyword_loc.length == 0) {
1606 pm_buffer_append_byte(buffer, 0);
1607 } else {
1608 pm_buffer_append_byte(buffer, 1);
1609 pm_serialize_location(&cast->then_keyword_loc, buffer);
1610 }
1611 if (cast->end_keyword_loc.length == 0) {
1612 pm_buffer_append_byte(buffer, 0);
1613 } else {
1614 pm_buffer_append_byte(buffer, 1);
1615 pm_serialize_location(&cast->end_keyword_loc, buffer);
1616 }
1617 break;
1618 }
1619 case PM_IMAGINARY_NODE: {
1620 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1621 break;
1622 }
1623 case PM_IMPLICIT_NODE: {
1624 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1625 break;
1626 }
1627 case PM_IMPLICIT_REST_NODE: {
1628 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1629 break;
1630 }
1631 case PM_IN_NODE: {
1632 const pm_in_node_t *cast = (const pm_in_node_t *) node;
1633 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1634 pm_serialize_location(&cast->in_keyword_loc, buffer);
1635 if (cast->then_keyword_loc.length == 0) {
1636 pm_buffer_append_byte(buffer, 0);
1637 } else {
1638 pm_buffer_append_byte(buffer, 1);
1639 pm_serialize_location(&cast->then_keyword_loc, buffer);
1640 }
1641 break;
1642 }
1643 case PM_INDEX_AND_WRITE_NODE: {
1645 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1646 if (cast->call_operator_loc.length == 0) {
1647 pm_buffer_append_byte(buffer, 0);
1648 } else {
1649 pm_buffer_append_byte(buffer, 1);
1650 pm_serialize_location(&cast->call_operator_loc, buffer);
1651 }
1652 pm_serialize_location(&cast->opening_loc, buffer);
1653 pm_serialize_location(&cast->closing_loc, buffer);
1654 pm_serialize_location(&cast->operator_loc, buffer);
1655 break;
1656 }
1657 case PM_INDEX_OPERATOR_WRITE_NODE: {
1659 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1660 if (cast->call_operator_loc.length == 0) {
1661 pm_buffer_append_byte(buffer, 0);
1662 } else {
1663 pm_buffer_append_byte(buffer, 1);
1664 pm_serialize_location(&cast->call_operator_loc, buffer);
1665 }
1666 pm_serialize_location(&cast->opening_loc, buffer);
1667 pm_serialize_location(&cast->closing_loc, buffer);
1668 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1669 pm_serialize_location(&cast->binary_operator_loc, buffer);
1670 break;
1671 }
1672 case PM_INDEX_OR_WRITE_NODE: {
1674 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1675 if (cast->call_operator_loc.length == 0) {
1676 pm_buffer_append_byte(buffer, 0);
1677 } else {
1678 pm_buffer_append_byte(buffer, 1);
1679 pm_serialize_location(&cast->call_operator_loc, buffer);
1680 }
1681 pm_serialize_location(&cast->opening_loc, buffer);
1682 pm_serialize_location(&cast->closing_loc, buffer);
1683 pm_serialize_location(&cast->operator_loc, buffer);
1684 break;
1685 }
1686 case PM_INDEX_TARGET_NODE: {
1687 const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
1688 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1689 pm_serialize_location(&cast->opening_loc, buffer);
1690 pm_serialize_location(&cast->closing_loc, buffer);
1691 break;
1692 }
1693 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1695 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1696 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1697 pm_serialize_location(&cast->name_loc, buffer);
1698 pm_serialize_location(&cast->operator_loc, buffer);
1699 break;
1700 }
1701 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1703 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1704 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1705 pm_serialize_location(&cast->name_loc, buffer);
1706 pm_serialize_location(&cast->binary_operator_loc, buffer);
1707 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1708 break;
1709 }
1710 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1712 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1713 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1714 pm_serialize_location(&cast->name_loc, buffer);
1715 pm_serialize_location(&cast->operator_loc, buffer);
1716 break;
1717 }
1718 case PM_INSTANCE_VARIABLE_READ_NODE: {
1720 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1721 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1722 break;
1723 }
1724 case PM_INSTANCE_VARIABLE_TARGET_NODE: {
1726 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1727 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1728 break;
1729 }
1730 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1732 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1733 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1734 pm_serialize_location(&cast->name_loc, buffer);
1735 pm_serialize_location(&cast->operator_loc, buffer);
1736 break;
1737 }
1738 case PM_INTEGER_NODE: {
1739 const pm_integer_node_t *cast = (const pm_integer_node_t *) node;
1740 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1741 pm_serialize_integer(&cast->value, buffer);
1742 break;
1743 }
1744 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1746 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1747 pm_serialize_location(&cast->opening_loc, buffer);
1748 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1749 pm_serialize_location(&cast->closing_loc, buffer);
1750 break;
1751 }
1752 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1754 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1755 pm_serialize_location(&cast->opening_loc, buffer);
1756 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1757 pm_serialize_location(&cast->closing_loc, buffer);
1758 break;
1759 }
1760 case PM_INTERPOLATED_STRING_NODE: {
1762 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1763 if (cast->opening_loc.length == 0) {
1764 pm_buffer_append_byte(buffer, 0);
1765 } else {
1766 pm_buffer_append_byte(buffer, 1);
1767 pm_serialize_location(&cast->opening_loc, buffer);
1768 }
1769 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1770 if (cast->closing_loc.length == 0) {
1771 pm_buffer_append_byte(buffer, 0);
1772 } else {
1773 pm_buffer_append_byte(buffer, 1);
1774 pm_serialize_location(&cast->closing_loc, buffer);
1775 }
1776 break;
1777 }
1778 case PM_INTERPOLATED_SYMBOL_NODE: {
1780 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1781 if (cast->opening_loc.length == 0) {
1782 pm_buffer_append_byte(buffer, 0);
1783 } else {
1784 pm_buffer_append_byte(buffer, 1);
1785 pm_serialize_location(&cast->opening_loc, buffer);
1786 }
1787 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1788 if (cast->closing_loc.length == 0) {
1789 pm_buffer_append_byte(buffer, 0);
1790 } else {
1791 pm_buffer_append_byte(buffer, 1);
1792 pm_serialize_location(&cast->closing_loc, buffer);
1793 }
1794 break;
1795 }
1796 case PM_INTERPOLATED_X_STRING_NODE: {
1798 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1799 pm_serialize_location(&cast->opening_loc, buffer);
1800 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1801 pm_serialize_location(&cast->closing_loc, buffer);
1802 break;
1803 }
1804 case PM_IT_LOCAL_VARIABLE_READ_NODE: {
1805 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1806 break;
1807 }
1808 case PM_IT_PARAMETERS_NODE: {
1809 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1810 break;
1811 }
1812 case PM_KEYWORD_HASH_NODE: {
1813 const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node;
1814 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1815 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
1816 break;
1817 }
1818 case PM_KEYWORD_REST_PARAMETER_NODE: {
1820 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1821 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1822 if (cast->name_loc.length == 0) {
1823 pm_buffer_append_byte(buffer, 0);
1824 } else {
1825 pm_buffer_append_byte(buffer, 1);
1826 pm_serialize_location(&cast->name_loc, buffer);
1827 }
1828 pm_serialize_location(&cast->operator_loc, buffer);
1829 break;
1830 }
1831 case PM_LAMBDA_NODE: {
1832 const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
1833 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1834 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1835 for (size_t index = 0; index < cast->locals.size; index++) {
1836 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1837 }
1838 pm_serialize_location(&cast->operator_loc, buffer);
1839 pm_serialize_location(&cast->opening_loc, buffer);
1840 pm_serialize_location(&cast->closing_loc, buffer);
1841 break;
1842 }
1843 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
1845 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1846 pm_serialize_location(&cast->name_loc, buffer);
1847 pm_serialize_location(&cast->operator_loc, buffer);
1848 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1849 pm_buffer_append_varuint(buffer, cast->depth);
1850 break;
1851 }
1852 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1854 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1855 pm_serialize_location(&cast->name_loc, buffer);
1856 pm_serialize_location(&cast->binary_operator_loc, buffer);
1857 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1858 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1859 pm_buffer_append_varuint(buffer, cast->depth);
1860 break;
1861 }
1862 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1864 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1865 pm_serialize_location(&cast->name_loc, buffer);
1866 pm_serialize_location(&cast->operator_loc, buffer);
1867 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1868 pm_buffer_append_varuint(buffer, cast->depth);
1869 break;
1870 }
1871 case PM_LOCAL_VARIABLE_READ_NODE: {
1873 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1874 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1875 pm_buffer_append_varuint(buffer, cast->depth);
1876 break;
1877 }
1878 case PM_LOCAL_VARIABLE_TARGET_NODE: {
1880 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1881 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1882 pm_buffer_append_varuint(buffer, cast->depth);
1883 break;
1884 }
1885 case PM_LOCAL_VARIABLE_WRITE_NODE: {
1887 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1888 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1889 pm_buffer_append_varuint(buffer, cast->depth);
1890 pm_serialize_location(&cast->name_loc, buffer);
1891 pm_serialize_location(&cast->operator_loc, buffer);
1892 break;
1893 }
1894 case PM_MATCH_LAST_LINE_NODE: {
1896 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1897 pm_serialize_location(&cast->opening_loc, buffer);
1898 pm_serialize_location(&cast->content_loc, buffer);
1899 pm_serialize_location(&cast->closing_loc, buffer);
1900 pm_serialize_string(&cast->unescaped, buffer);
1901 break;
1902 }
1903 case PM_MATCH_PREDICATE_NODE: {
1905 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1906 pm_serialize_location(&cast->keyword_loc, buffer);
1907 break;
1908 }
1909 case PM_MATCH_REQUIRED_NODE: {
1911 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1912 pm_serialize_location(&cast->operator_loc, buffer);
1913 break;
1914 }
1915 case PM_MATCH_WRITE_NODE: {
1916 const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
1917 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1918 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->targets.size));
1919 break;
1920 }
1921 case PM_MODULE_NODE: {
1922 const pm_module_node_t *cast = (const pm_module_node_t *) node;
1923 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1924 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1925 for (size_t index = 0; index < cast->locals.size; index++) {
1926 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1927 }
1928 pm_serialize_location(&cast->module_keyword_loc, buffer);
1929 pm_serialize_location(&cast->end_keyword_loc, buffer);
1930 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1931 break;
1932 }
1933 case PM_MULTI_TARGET_NODE: {
1934 const pm_multi_target_node_t *cast = (const pm_multi_target_node_t *) node;
1935 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1936 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->lefts.size));
1937 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->rights.size));
1938 if (cast->lparen_loc.length == 0) {
1939 pm_buffer_append_byte(buffer, 0);
1940 } else {
1941 pm_buffer_append_byte(buffer, 1);
1942 pm_serialize_location(&cast->lparen_loc, buffer);
1943 }
1944 if (cast->rparen_loc.length == 0) {
1945 pm_buffer_append_byte(buffer, 0);
1946 } else {
1947 pm_buffer_append_byte(buffer, 1);
1948 pm_serialize_location(&cast->rparen_loc, buffer);
1949 }
1950 break;
1951 }
1952 case PM_MULTI_WRITE_NODE: {
1953 const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node;
1954 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1955 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->lefts.size));
1956 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->rights.size));
1957 if (cast->lparen_loc.length == 0) {
1958 pm_buffer_append_byte(buffer, 0);
1959 } else {
1960 pm_buffer_append_byte(buffer, 1);
1961 pm_serialize_location(&cast->lparen_loc, buffer);
1962 }
1963 if (cast->rparen_loc.length == 0) {
1964 pm_buffer_append_byte(buffer, 0);
1965 } else {
1966 pm_buffer_append_byte(buffer, 1);
1967 pm_serialize_location(&cast->rparen_loc, buffer);
1968 }
1969 pm_serialize_location(&cast->operator_loc, buffer);
1970 break;
1971 }
1972 case PM_NEXT_NODE: {
1973 const pm_next_node_t *cast = (const pm_next_node_t *) node;
1974 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1975 pm_serialize_location(&cast->keyword_loc, buffer);
1976 break;
1977 }
1978 case PM_NIL_NODE: {
1979 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1980 break;
1981 }
1982 case PM_NO_BLOCK_PARAMETER_NODE: {
1984 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1985 pm_serialize_location(&cast->operator_loc, buffer);
1986 pm_serialize_location(&cast->keyword_loc, buffer);
1987 break;
1988 }
1989 case PM_NO_KEYWORDS_PARAMETER_NODE: {
1991 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1992 pm_serialize_location(&cast->operator_loc, buffer);
1993 pm_serialize_location(&cast->keyword_loc, buffer);
1994 break;
1995 }
1996 case PM_NUMBERED_PARAMETERS_NODE: {
1998 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1999 pm_buffer_append_byte(buffer, cast->maximum);
2000 break;
2001 }
2002 case PM_NUMBERED_REFERENCE_READ_NODE: {
2004 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2005 pm_buffer_append_varuint(buffer, cast->number);
2006 break;
2007 }
2008 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
2010 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2011 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2012 pm_serialize_location(&cast->name_loc, buffer);
2013 break;
2014 }
2015 case PM_OPTIONAL_PARAMETER_NODE: {
2017 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2018 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2019 pm_serialize_location(&cast->name_loc, buffer);
2020 pm_serialize_location(&cast->operator_loc, buffer);
2021 break;
2022 }
2023 case PM_OR_NODE: {
2024 const pm_or_node_t *cast = (const pm_or_node_t *) node;
2025 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2026 pm_serialize_location(&cast->operator_loc, buffer);
2027 break;
2028 }
2029 case PM_PARAMETERS_NODE: {
2030 const pm_parameters_node_t *cast = (const pm_parameters_node_t *) node;
2031 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2032 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->requireds.size));
2033 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->optionals.size));
2034 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->posts.size));
2035 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->keywords.size));
2036 break;
2037 }
2038 case PM_PARENTHESES_NODE: {
2039 const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
2040 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2041 pm_serialize_location(&cast->opening_loc, buffer);
2042 pm_serialize_location(&cast->closing_loc, buffer);
2043 break;
2044 }
2045 case PM_PINNED_EXPRESSION_NODE: {
2047 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2048 pm_serialize_location(&cast->operator_loc, buffer);
2049 pm_serialize_location(&cast->lparen_loc, buffer);
2050 pm_serialize_location(&cast->rparen_loc, buffer);
2051 break;
2052 }
2053 case PM_PINNED_VARIABLE_NODE: {
2055 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2056 pm_serialize_location(&cast->operator_loc, buffer);
2057 break;
2058 }
2059 case PM_POST_EXECUTION_NODE: {
2061 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2062 pm_serialize_location(&cast->keyword_loc, buffer);
2063 pm_serialize_location(&cast->opening_loc, buffer);
2064 pm_serialize_location(&cast->closing_loc, buffer);
2065 break;
2066 }
2067 case PM_PRE_EXECUTION_NODE: {
2069 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2070 pm_serialize_location(&cast->keyword_loc, buffer);
2071 pm_serialize_location(&cast->opening_loc, buffer);
2072 pm_serialize_location(&cast->closing_loc, buffer);
2073 break;
2074 }
2075 case PM_PROGRAM_NODE: {
2076 const pm_program_node_t *cast = (const pm_program_node_t *) node;
2077 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2078 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
2079 for (size_t index = 0; index < cast->locals.size; index++) {
2080 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
2081 }
2082 break;
2083 }
2084 case PM_RANGE_NODE: {
2085 const pm_range_node_t *cast = (const pm_range_node_t *) node;
2086 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2087 pm_serialize_location(&cast->operator_loc, buffer);
2088 break;
2089 }
2090 case PM_RATIONAL_NODE: {
2091 const pm_rational_node_t *cast = (const pm_rational_node_t *) node;
2092 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2093 pm_serialize_integer(&cast->numerator, buffer);
2094 pm_serialize_integer(&cast->denominator, buffer);
2095 break;
2096 }
2097 case PM_REDO_NODE: {
2098 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2099 break;
2100 }
2101 case PM_REGULAR_EXPRESSION_NODE: {
2103 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2104 pm_serialize_location(&cast->opening_loc, buffer);
2105 pm_serialize_location(&cast->content_loc, buffer);
2106 pm_serialize_location(&cast->closing_loc, buffer);
2107 pm_serialize_string(&cast->unescaped, buffer);
2108 break;
2109 }
2110 case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
2112 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2113 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2114 pm_serialize_location(&cast->name_loc, buffer);
2115 break;
2116 }
2117 case PM_REQUIRED_PARAMETER_NODE: {
2119 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2120 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2121 break;
2122 }
2123 case PM_RESCUE_MODIFIER_NODE: {
2125 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2126 pm_serialize_location(&cast->keyword_loc, buffer);
2127 break;
2128 }
2129 case PM_RESCUE_NODE: {
2130 const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node;
2131 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2132 pm_serialize_location(&cast->keyword_loc, buffer);
2133 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->exceptions.size));
2134 if (cast->operator_loc.length == 0) {
2135 pm_buffer_append_byte(buffer, 0);
2136 } else {
2137 pm_buffer_append_byte(buffer, 1);
2138 pm_serialize_location(&cast->operator_loc, buffer);
2139 }
2140 if (cast->then_keyword_loc.length == 0) {
2141 pm_buffer_append_byte(buffer, 0);
2142 } else {
2143 pm_buffer_append_byte(buffer, 1);
2144 pm_serialize_location(&cast->then_keyword_loc, buffer);
2145 }
2146 break;
2147 }
2148 case PM_REST_PARAMETER_NODE: {
2150 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2151 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2152 if (cast->name_loc.length == 0) {
2153 pm_buffer_append_byte(buffer, 0);
2154 } else {
2155 pm_buffer_append_byte(buffer, 1);
2156 pm_serialize_location(&cast->name_loc, buffer);
2157 }
2158 pm_serialize_location(&cast->operator_loc, buffer);
2159 break;
2160 }
2161 case PM_RETRY_NODE: {
2162 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2163 break;
2164 }
2165 case PM_RETURN_NODE: {
2166 const pm_return_node_t *cast = (const pm_return_node_t *) node;
2167 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2168 pm_serialize_location(&cast->keyword_loc, buffer);
2169 break;
2170 }
2171 case PM_SELF_NODE: {
2172 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2173 break;
2174 }
2175 case PM_SHAREABLE_CONSTANT_NODE: {
2176 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2177 break;
2178 }
2179 case PM_SINGLETON_CLASS_NODE: {
2181 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2182 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
2183 for (size_t index = 0; index < cast->locals.size; index++) {
2184 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
2185 }
2186 pm_serialize_location(&cast->class_keyword_loc, buffer);
2187 pm_serialize_location(&cast->operator_loc, buffer);
2188 pm_serialize_location(&cast->end_keyword_loc, buffer);
2189 break;
2190 }
2191 case PM_SOURCE_ENCODING_NODE: {
2192 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2193 break;
2194 }
2195 case PM_SOURCE_FILE_NODE: {
2196 const pm_source_file_node_t *cast = (const pm_source_file_node_t *) node;
2197 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2198 pm_serialize_string(&cast->filepath, buffer);
2199 break;
2200 }
2201 case PM_SOURCE_LINE_NODE: {
2202 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2203 break;
2204 }
2205 case PM_SPLAT_NODE: {
2206 const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
2207 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2208 pm_serialize_location(&cast->operator_loc, buffer);
2209 break;
2210 }
2211 case PM_STATEMENTS_NODE: {
2212 const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
2213 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2214 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->body.size));
2215 break;
2216 }
2217 case PM_STRING_NODE: {
2218 const pm_string_node_t *cast = (const pm_string_node_t *) node;
2219 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2220 if (cast->opening_loc.length == 0) {
2221 pm_buffer_append_byte(buffer, 0);
2222 } else {
2223 pm_buffer_append_byte(buffer, 1);
2224 pm_serialize_location(&cast->opening_loc, buffer);
2225 }
2226 pm_serialize_location(&cast->content_loc, buffer);
2227 if (cast->closing_loc.length == 0) {
2228 pm_buffer_append_byte(buffer, 0);
2229 } else {
2230 pm_buffer_append_byte(buffer, 1);
2231 pm_serialize_location(&cast->closing_loc, buffer);
2232 }
2233 pm_serialize_string(&cast->unescaped, buffer);
2234 break;
2235 }
2236 case PM_SUPER_NODE: {
2237 const pm_super_node_t *cast = (const pm_super_node_t *) node;
2238 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2239 pm_serialize_location(&cast->keyword_loc, buffer);
2240 if (cast->lparen_loc.length == 0) {
2241 pm_buffer_append_byte(buffer, 0);
2242 } else {
2243 pm_buffer_append_byte(buffer, 1);
2244 pm_serialize_location(&cast->lparen_loc, buffer);
2245 }
2246 if (cast->rparen_loc.length == 0) {
2247 pm_buffer_append_byte(buffer, 0);
2248 } else {
2249 pm_buffer_append_byte(buffer, 1);
2250 pm_serialize_location(&cast->rparen_loc, buffer);
2251 }
2252 break;
2253 }
2254 case PM_SYMBOL_NODE: {
2255 const pm_symbol_node_t *cast = (const pm_symbol_node_t *) node;
2256 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2257 if (cast->opening_loc.length == 0) {
2258 pm_buffer_append_byte(buffer, 0);
2259 } else {
2260 pm_buffer_append_byte(buffer, 1);
2261 pm_serialize_location(&cast->opening_loc, buffer);
2262 }
2263 pm_serialize_location(&cast->content_loc, buffer);
2264 if (cast->closing_loc.length == 0) {
2265 pm_buffer_append_byte(buffer, 0);
2266 } else {
2267 pm_buffer_append_byte(buffer, 1);
2268 pm_serialize_location(&cast->closing_loc, buffer);
2269 }
2270 pm_serialize_string(&cast->unescaped, buffer);
2271 break;
2272 }
2273 case PM_TRUE_NODE: {
2274 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2275 break;
2276 }
2277 case PM_UNDEF_NODE: {
2278 const pm_undef_node_t *cast = (const pm_undef_node_t *) node;
2279 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2280 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->names.size));
2281 pm_serialize_location(&cast->keyword_loc, buffer);
2282 break;
2283 }
2284 case PM_UNLESS_NODE: {
2285 const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
2286 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2287 pm_serialize_location(&cast->unless_keyword_loc, buffer);
2288 if (cast->then_keyword_loc.length == 0) {
2289 pm_buffer_append_byte(buffer, 0);
2290 } else {
2291 pm_buffer_append_byte(buffer, 1);
2292 pm_serialize_location(&cast->then_keyword_loc, buffer);
2293 }
2294 if (cast->end_keyword_loc.length == 0) {
2295 pm_buffer_append_byte(buffer, 0);
2296 } else {
2297 pm_buffer_append_byte(buffer, 1);
2298 pm_serialize_location(&cast->end_keyword_loc, buffer);
2299 }
2300 break;
2301 }
2302 case PM_UNTIL_NODE: {
2303 const pm_until_node_t *cast = (const pm_until_node_t *) node;
2304 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2305 pm_serialize_location(&cast->until_keyword_loc, buffer);
2306 if (cast->do_keyword_loc.length == 0) {
2307 pm_buffer_append_byte(buffer, 0);
2308 } else {
2309 pm_buffer_append_byte(buffer, 1);
2310 pm_serialize_location(&cast->do_keyword_loc, buffer);
2311 }
2312 if (cast->end_keyword_loc.length == 0) {
2313 pm_buffer_append_byte(buffer, 0);
2314 } else {
2315 pm_buffer_append_byte(buffer, 1);
2316 pm_serialize_location(&cast->end_keyword_loc, buffer);
2317 }
2318 break;
2319 }
2320 case PM_WHEN_NODE: {
2321 const pm_when_node_t *cast = (const pm_when_node_t *) node;
2322 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2323 pm_serialize_location(&cast->when_keyword_loc, buffer);
2324 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->conditions.size));
2325 if (cast->then_keyword_loc.length == 0) {
2326 pm_buffer_append_byte(buffer, 0);
2327 } else {
2328 pm_buffer_append_byte(buffer, 1);
2329 pm_serialize_location(&cast->then_keyword_loc, buffer);
2330 }
2331 break;
2332 }
2333 case PM_WHILE_NODE: {
2334 const pm_while_node_t *cast = (const pm_while_node_t *) node;
2335 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2336 pm_serialize_location(&cast->while_keyword_loc, buffer);
2337 if (cast->do_keyword_loc.length == 0) {
2338 pm_buffer_append_byte(buffer, 0);
2339 } else {
2340 pm_buffer_append_byte(buffer, 1);
2341 pm_serialize_location(&cast->do_keyword_loc, buffer);
2342 }
2343 if (cast->end_keyword_loc.length == 0) {
2344 pm_buffer_append_byte(buffer, 0);
2345 } else {
2346 pm_buffer_append_byte(buffer, 1);
2347 pm_serialize_location(&cast->end_keyword_loc, buffer);
2348 }
2349 break;
2350 }
2351 case PM_X_STRING_NODE: {
2352 const pm_x_string_node_t *cast = (const pm_x_string_node_t *) node;
2353 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2354 pm_serialize_location(&cast->opening_loc, buffer);
2355 pm_serialize_location(&cast->content_loc, buffer);
2356 pm_serialize_location(&cast->closing_loc, buffer);
2357 pm_serialize_string(&cast->unescaped, buffer);
2358 break;
2359 }
2360 case PM_YIELD_NODE: {
2361 const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
2362 pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2363 pm_serialize_location(&cast->keyword_loc, buffer);
2364 if (cast->lparen_loc.length == 0) {
2365 pm_buffer_append_byte(buffer, 0);
2366 } else {
2367 pm_buffer_append_byte(buffer, 1);
2368 pm_serialize_location(&cast->lparen_loc, buffer);
2369 }
2370 if (cast->rparen_loc.length == 0) {
2371 pm_buffer_append_byte(buffer, 0);
2372 } else {
2373 pm_buffer_append_byte(buffer, 1);
2374 pm_serialize_location(&cast->rparen_loc, buffer);
2375 }
2376 break;
2377 }
2378 }
2379 }
2380
2381 xfree_sized(stack.entries, stack.capacity * sizeof(pm_serialize_entry_t));
2382}
2383
2384/*
2385 * Serialize the given list of offsets to the given buffer.
2386 */
2387void
2388pm_serialize_line_offset_list(pm_line_offset_list_t *list, pm_buffer_t *buffer) {
2389 uint32_t size = pm_sizet_to_u32(list->size);
2390 pm_buffer_append_varuint(buffer, size);
2391
2392 for (uint32_t i = 0; i < size; i++) {
2393 uint32_t offset = pm_sizet_to_u32(list->offsets[i]);
2394 pm_buffer_append_varuint(buffer, offset);
2395 }
2396}
2397
2398static void
2399pm_serialize_comment(pm_comment_t *comment, pm_buffer_t *buffer) {
2400 // serialize type
2401 pm_buffer_append_byte(buffer, (uint8_t) comment->type);
2402
2403 // serialize location
2404 pm_serialize_location(&comment->location, buffer);
2405}
2406
2410void
2411pm_serialize_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2412 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2413
2414 pm_comment_t *comment;
2415 for (comment = (pm_comment_t *) list->head; comment != NULL; comment = (pm_comment_t *) comment->node.next) {
2416 pm_serialize_comment(comment, buffer);
2417 }
2418}
2419
2426static void
2427pm_serialize_comment_attachments(const pm_comment_attachments_t *attachments, pm_buffer_t *buffer) {
2428 uint32_t count = 0;
2429 for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2430 if (attachments->ranges[node_id].length > 0) count++;
2431 }
2432
2433 pm_buffer_append_varuint(buffer, count);
2434
2435 for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2436 pm_comment_range_t range = attachments->ranges[node_id];
2437 if (range.length == 0) continue;
2438
2439 pm_buffer_append_varuint(buffer, node_id);
2440 pm_buffer_append_varuint(buffer, range.length);
2441
2442 for (uint32_t index = 0; index < range.length; index++) {
2443 pm_buffer_append_varuint(buffer, attachments->attachments[range.index + index]);
2444 }
2445 }
2446}
2447
2448static void
2449pm_serialize_magic_comment(pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
2450 // serialize key location
2451 pm_buffer_append_varuint(buffer, magic_comment->key.start);
2452 pm_buffer_append_varuint(buffer, magic_comment->key.length);
2453
2454 // serialize value location
2455 pm_buffer_append_varuint(buffer, magic_comment->value.start);
2456 pm_buffer_append_varuint(buffer, magic_comment->value.length);
2457}
2458
2459static void
2460pm_serialize_magic_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2461 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2462
2464 for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
2465 pm_serialize_magic_comment(magic_comment, buffer);
2466 }
2467}
2468
2469static void
2470pm_serialize_data_loc(const pm_parser_t *parser, pm_buffer_t *buffer) {
2471 if (parser->data_loc.length == 0) {
2472 pm_buffer_append_byte(buffer, 0);
2473 } else {
2474 pm_buffer_append_byte(buffer, 1);
2475 pm_serialize_location(&parser->data_loc, buffer);
2476 }
2477}
2478
2479static void
2480pm_serialize_diagnostic(pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
2481 // serialize the type
2482 pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->diag_id);
2483
2484 // serialize message
2485 size_t message_length = strlen(diagnostic->message);
2486 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(message_length));
2487 pm_buffer_append_string(buffer, diagnostic->message, message_length);
2488
2489 // serialize location
2490 pm_serialize_location(&diagnostic->location, buffer);
2491
2492 pm_buffer_append_byte(buffer, diagnostic->level);
2493}
2494
2495static void
2496pm_serialize_diagnostic_list(pm_list_t *list, pm_buffer_t *buffer) {
2497 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2498
2499 pm_diagnostic_t *diagnostic;
2500 for (diagnostic = (pm_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (pm_diagnostic_t *) diagnostic->node.next) {
2501 pm_serialize_diagnostic(diagnostic, buffer);
2502 }
2503}
2504
2508void
2509pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer) {
2510 size_t encoding_length = strlen(encoding->name);
2511 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(encoding_length));
2512 pm_buffer_append_string(buffer, encoding->name, encoding_length);
2513}
2514
2515static void
2516pm_serialize_metadata(pm_parser_t *parser, pm_buffer_t *buffer) {
2517 pm_serialize_encoding(parser->encoding, buffer);
2518 pm_buffer_append_varsint(buffer, parser->start_line);
2519 pm_buffer_append_uint64(buffer, pm_parser_checksum(parser));
2520 pm_serialize_line_offset_list(&parser->line_offsets, buffer);
2521 pm_serialize_comment_list(&parser->comment_list, buffer);
2522 pm_serialize_comment_attachments(&parser->comment_attachments, buffer);
2523 pm_serialize_magic_comment_list(&parser->magic_comment_list, buffer);
2524 pm_serialize_data_loc(parser, buffer);
2525 pm_serialize_diagnostic_list(&parser->error_list, buffer);
2526 pm_serialize_diagnostic_list(&parser->warning_list, buffer);
2527 pm_buffer_append_byte(buffer, (uint8_t) parser->continuable);
2528}
2529
2530#line 463 "prism/templates/src/serialize.c.erb"
2534void
2535pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
2536 pm_serialize_metadata(parser, buffer);
2537
2538 // Here we're going to leave space for the offset of the constant pool in
2539 // the buffer.
2540 size_t offset = buffer->length;
2541 pm_buffer_append_zeroes(buffer, 4);
2542
2543 // Next, encode the length of the constant pool.
2544 pm_buffer_append_varuint(buffer, parser->constant_pool.size);
2545
2546 // Now we're going to serialize the content of the node.
2547 pm_serialize_node(node, buffer);
2548
2549 // Now we're going to serialize the offset of the constant pool back where
2550 // we left space for it.
2551 uint32_t length = pm_sizet_to_u32(buffer->length);
2552 memcpy(buffer->value + offset, &length, sizeof(uint32_t));
2553
2554 // Now we're going to serialize the constant pool.
2555 offset = buffer->length;
2556 pm_buffer_append_zeroes(buffer, parser->constant_pool.size * 8);
2557
2558 for (uint32_t index = 0; index < parser->constant_pool.capacity; index++) {
2559 pm_constant_pool_bucket_t *bucket = &parser->constant_pool.buckets[index];
2560
2561 // If we find a constant at this index, serialize it at the correct
2562 // index in the buffer.
2563 if (bucket->id != 0) {
2564 pm_constant_t *constant = &parser->constant_pool.constants[bucket->id - 1];
2565 size_t buffer_offset = offset + ((((size_t)bucket->id) - 1) * 8);
2566
2567 // Write the constant contents into the buffer after the constant
2568 // pool. In place of the source offset, we store a buffer offset.
2569 uint32_t content_offset = pm_sizet_to_u32(buffer->length);
2570 memcpy(buffer->value + buffer_offset, &content_offset, 4);
2571 pm_buffer_append_bytes(buffer, constant->start, constant->length);
2572
2573 uint32_t constant_length = pm_sizet_to_u32(constant->length);
2574 memcpy(buffer->value + buffer_offset + 4, &constant_length, 4);
2575 }
2576 }
2577}
2578
2579static void
2580serialize_token(pm_parser_t *parser, pm_token_t *token, void *data) {
2581 pm_buffer_t *buffer = (pm_buffer_t *) data;
2582
2583 pm_buffer_append_varuint(buffer, token->type);
2584 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
2585 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
2586 pm_buffer_append_varuint(buffer, parser->lex_state);
2587}
2588
2592void
2593pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2594 pm_options_t options = { 0 };
2595 pm_options_read(&options, data);
2596
2597 pm_arena_t arena = { 0 };
2598 pm_parser_t parser;
2599 pm_parser_init(&arena, &parser, source, size, &options);
2600
2601 pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2602 pm_parse(&parser);
2603
2604 // Append 0 to mark end of tokens.
2605 pm_buffer_append_byte(buffer, 0);
2606
2607 pm_serialize_metadata(&parser, buffer);
2608
2609 pm_parser_cleanup(&parser);
2610 pm_arena_cleanup(&arena);
2611 pm_options_cleanup(&options);
2612}
2613
2618void
2619pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2620 pm_options_t options = { 0 };
2621 pm_options_read(&options, data);
2622
2623 pm_arena_t arena = { 0 };
2624 pm_parser_t parser;
2625 pm_parser_init(&arena, &parser, source, size, &options);
2626
2627 pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2628 pm_node_t *node = pm_parse(&parser);
2629
2630 pm_buffer_append_byte(buffer, 0);
2631 pm_serialize(&parser, node, buffer);
2632
2633 pm_parser_cleanup(&parser);
2634 pm_arena_cleanup(&arena);
2635 pm_options_cleanup(&options);
2636}
2637
2641bool
2642pm_serialize_parse_success_p(const uint8_t *source, size_t size, const char *data) {
2643 pm_options_t options = { 0 };
2644 pm_options_read(&options, data);
2645
2646 pm_arena_t arena = { 0 };
2647 pm_parser_t parser;
2648 pm_parser_init(&arena, &parser, source, size, &options);
2649
2650 pm_parse(&parser);
2651
2652 bool result = parser.error_list.size == 0;
2653 pm_parser_cleanup(&parser);
2654 pm_arena_cleanup(&arena);
2655 pm_options_cleanup(&options);
2656
2657 return result;
2658}
2659
2660#endif
#define PRISM_UNLIKELY(x)
The compiler should predicate that this branch will not be taken.
Definition branch.h:17
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.
T * cast(pm_node_t *node) noexcept
Cast the given node, which must not be null and must be of the given struct, to that struct.
Definition node.hpp:50
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:23726
std::string_view constant(const pm_parser_t *parser PRISM_LIFETIMEBOUND, pm_constant_id_t constant_id) noexcept
The name of the constant with the given id, which must not be zero.
Definition parser.hpp:64
The main header file for the prism parser.
C99 shim for <stdbool.h>
AliasGlobalVariableNode.
Definition ast.h:1165
AliasMethodNode.
Definition ast.h:1212
AlternationPatternNode.
Definition ast.h:1271
AndNode.
Definition ast.h:1318
ArgumentsNode.
Definition ast.h:1378
ArrayNode.
Definition ast.h:1408
ArrayPatternNode.
Definition ast.h:1468
AssocNode.
Definition ast.h:1551
AssocSplatNode.
Definition ast.h:1607
BackReferenceReadNode.
Definition ast.h:1644
BeginNode.
Definition ast.h:1674
BlockArgumentNode.
Definition ast.h:1751
BlockLocalVariableNode.
Definition ast.h:1791
BlockNode.
Definition ast.h:1818
BlockParameterNode.
Definition ast.h:1893
BlockParametersNode.
Definition ast.h:1946
BreakNode.
Definition ast.h:2019
CallAndWriteNode.
Definition ast.h:2062
CallNode.
Definition ast.h:2170
CallOperatorWriteNode.
Definition ast.h:2295
CallOrWriteNode.
Definition ast.h:2398
CallTargetNode.
Definition ast.h:2499
CapturePatternNode.
Definition ast.h:2556
CaseMatchNode.
Definition ast.h:2605
CaseNode.
Definition ast.h:2674
ClassNode.
Definition ast.h:2741
ClassVariableAndWriteNode.
Definition ast.h:2827
ClassVariableOperatorWriteNode.
Definition ast.h:2884
ClassVariableOrWriteNode.
Definition ast.h:2926
ClassVariableReadNode.
Definition ast.h:2963
ClassVariableTargetNode.
Definition ast.h:2991
ClassVariableWriteNode.
Definition ast.h:3013
The comments owned by a node, as a slice of the comment attachments of the parser that produced it.
Definition comments.h:34
uint32_t length
The number of attachments owned by the node.
Definition comments.h:39
ConstantAndWriteNode.
Definition ast.h:3074
ConstantOperatorWriteNode.
Definition ast.h:3111
ConstantOrWriteNode.
Definition ast.h:3153
ConstantPathAndWriteNode.
Definition ast.h:3190
ConstantPathNode.
Definition ast.h:3222
ConstantPathOperatorWriteNode.
Definition ast.h:3288
ConstantPathOrWriteNode.
Definition ast.h:3325
ConstantPathTargetNode.
Definition ast.h:3357
ConstantPathWriteNode.
Definition ast.h:3400
ConstantReadNode.
Definition ast.h:3450
ConstantTargetNode.
Definition ast.h:3478
ConstantWriteNode.
Definition ast.h:3500
DefNode.
Definition ast.h:3562
DefinedNode.
Definition ast.h:3639
ElseNode.
Definition ast.h:3676
EmbeddedStatementsNode.
Definition ast.h:3708
EmbeddedVariableNode.
Definition ast.h:3740
EnsureNode.
Definition ast.h:3771
ErrorRecoveryNode.
Definition ast.h:3800
FindPatternNode.
Definition ast.h:3850
FlipFlopNode.
Definition ast.h:3945
FloatNode.
Definition ast.h:3977
ForNode.
Definition ast.h:4001
ForwardingSuperNode.
Definition ast.h:4132
GlobalVariableAndWriteNode.
Definition ast.h:4167
GlobalVariableOperatorWriteNode.
Definition ast.h:4204
GlobalVariableOrWriteNode.
Definition ast.h:4246
GlobalVariableReadNode.
Definition ast.h:4283
GlobalVariableTargetNode.
Definition ast.h:4311
GlobalVariableWriteNode.
Definition ast.h:4333
HashNode.
Definition ast.h:4394
HashPatternNode.
Definition ast.h:4453
IfNode.
Definition ast.h:4541
ImaginaryNode.
Definition ast.h:4646
ImplicitNode.
Definition ast.h:4674
InNode.
Definition ast.h:4722
IndexAndWriteNode.
Definition ast.h:4765
IndexOperatorWriteNode.
Definition ast.h:4828
IndexOrWriteNode.
Definition ast.h:4896
IndexTargetNode.
Definition ast.h:4967
InstanceVariableAndWriteNode.
Definition ast.h:5009
InstanceVariableOperatorWriteNode.
Definition ast.h:5046
InstanceVariableOrWriteNode.
Definition ast.h:5088
InstanceVariableReadNode.
Definition ast.h:5125
InstanceVariableTargetNode.
Definition ast.h:5153
InstanceVariableWriteNode.
Definition ast.h:5175
IntegerNode.
Definition ast.h:5242
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:5279
InterpolatedRegularExpressionNode.
Definition ast.h:5324
InterpolatedStringNode.
Definition ast.h:5360
InterpolatedSymbolNode.
Definition ast.h:5392
InterpolatedXStringNode.
Definition ast.h:5424
KeywordHashNode.
Definition ast.h:5493
KeywordRestParameterNode.
Definition ast.h:5519
LambdaNode.
Definition ast.h:5551
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:5598
LocalVariableOperatorWriteNode.
Definition ast.h:5640
LocalVariableOrWriteNode.
Definition ast.h:5687
LocalVariableReadNode.
Definition ast.h:5729
LocalVariableTargetNode.
Definition ast.h:5777
LocalVariableWriteNode.
Definition ast.h:5804
This struct represents a slice in the source code, defined by an offset and a length.
Definition ast.h:579
uint32_t start
The offset of the location from the start of the source.
Definition ast.h:581
uint32_t length
The length of the location.
Definition ast.h:584
MatchLastLineNode.
Definition ast.h:5895
MatchPredicateNode.
Definition ast.h:5932
MatchRequiredNode.
Definition ast.h:5964
MatchWriteNode.
Definition ast.h:6050
ModuleNode.
Definition ast.h:6077
MultiTargetNode.
Definition ast.h:6129
MultiWriteNode.
Definition ast.h:6211
NextNode.
Definition ast.h:6313
NoBlockParameterNode.
Definition ast.h:6358
NoKeywordsParameterNode.
Definition ast.h:6386
This is the base structure that represents a node in the syntax tree.
Definition ast.h:1090
uint32_t node_id
The unique identifier for this node, which is deterministic based on the source.
Definition ast.h:1109
pm_node_flags_t flags
This represents any flags on the node.
Definition ast.h:1101
pm_location_t location
This is the location of the node in the source.
Definition ast.h:1115
NumberedParametersNode.
Definition ast.h:6413
NumberedReferenceReadNode.
Definition ast.h:6435
OptionalKeywordParameterNode.
Definition ast.h:6469
OptionalParameterNode.
Definition ast.h:6505
OrNode.
Definition ast.h:6542
ParametersNode.
Definition ast.h:6596
ParenthesesNode.
Definition ast.h:6651
PinnedExpressionNode.
Definition ast.h:6683
PinnedVariableNode.
Definition ast.h:6740
PostExecutionNode.
Definition ast.h:6777
PreExecutionNode.
Definition ast.h:6814
ProgramNode.
Definition ast.h:6848
RangeNode.
Definition ast.h:6881
RationalNode.
Definition ast.h:6938
RegularExpressionNode.
Definition ast.h:7003
RequiredKeywordParameterNode.
Definition ast.h:7044
RequiredParameterNode.
Definition ast.h:7075
RescueModifierNode.
Definition ast.h:7097
RescueNode.
Definition ast.h:7134
RestParameterNode.
Definition ast.h:7190
ReturnNode.
Definition ast.h:7239
An entry on the serialization stack.
Definition serialize.c:104
pm_serialize_entry_kind_t kind
The kind of this entry.
Definition serialize.c:116
size_t offset
For NODE entries, the offset of the placeholders that follow the node's lazy marker.
Definition serialize.c:113
bool visited
Whether the children of this node have already been pushed.
Definition serialize.c:119
const pm_node_t * node
The node to serialize, for NODE entries.
Definition serialize.c:106
The explicit stack used to walk the tree, so that serializing deeply nested trees does not depend on ...
Definition serialize.c:126
size_t capacity
The number of entries that fit in the allocated memory.
Definition serialize.c:134
pm_serialize_entry_t * entries
The entries on the stack.
Definition serialize.c:128
size_t size
The number of entries on the stack.
Definition serialize.c:131
ShareableConstantNode.
Definition ast.h:7289
SingletonClassNode.
Definition ast.h:7313
SourceFileNode.
Definition ast.h:7383
SplatNode.
Definition ast.h:7424
StatementsNode.
Definition ast.h:7451
StringNode.
Definition ast.h:7485
A view of a sequence of bytes.
Definition stringy.h:23
SuperNode.
Definition ast.h:7527
SymbolNode.
Definition ast.h:7579
This struct represents a token in the Ruby source.
Definition ast.h:551
UndefNode.
Definition ast.h:7633
UnlessNode.
Definition ast.h:7663
UntilNode.
Definition ast.h:7753
WhenNode.
Definition ast.h:7797
WhileNode.
Definition ast.h:7840
XStringNode.
Definition ast.h:7886
YieldNode.
Definition ast.h:7923