14#ifdef PRISM_EXCLUDE_SERIALIZATION
18typedef int pm_serialize_unused_t;
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"
46pm_ptrdifft_to_u32(ptrdiff_t value) {
47 assert(value >= 0 && ((
unsigned long) value) < UINT32_MAX);
48 return (uint32_t) value;
52pm_sizet_to_u32(
size_t value) {
53 assert(value < UINT32_MAX);
54 return (uint32_t) value;
59 pm_buffer_append_varuint(buffer, location->
start);
60 pm_buffer_append_varuint(buffer, location->
length);
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);
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);
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]);
89 PM_SERIALIZE_ENTRY_NODE,
92 PM_SERIALIZE_ENTRY_LAZY_HEADER,
95 PM_SERIALIZE_ENTRY_LAZY_START,
98 PM_SERIALIZE_ENTRY_LAZY_END
99} pm_serialize_entry_kind_t;
116 pm_serialize_entry_kind_t
kind;
148 fprintf(stderr,
"prism: out of memory; aborting\n");
172 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, root, 0);
174 while (stack.
size > 0) {
177 switch (entry->
kind) {
178 case PM_SERIALIZE_ENTRY_LAZY_HEADER: {
179 pm_buffer_append_byte(buffer, 255);
181 pm_buffer_append_zeroes(buffer, 8);
184 case PM_SERIALIZE_ENTRY_LAZY_START: {
186 uint32_t skip = pm_sizet_to_u32(buffer->length - offset - 8);
187 memcpy(buffer->value + offset, &skip,
sizeof(uint32_t));
190 case PM_SERIALIZE_ENTRY_LAZY_END: {
193 memcpy(&skip, buffer->value + offset,
sizeof(uint32_t));
195 uint32_t length = pm_sizet_to_u32(buffer->length - offset - 8 - skip);
196 memcpy(buffer->value + offset + 4, &length,
sizeof(uint32_t));
199 case PM_SERIALIZE_ENTRY_NODE:
206 pm_buffer_append_byte(buffer, 0);
216 size_t index = stack.
size++;
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);
225 case PM_ALIAS_METHOD_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);
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);
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);
243 case PM_ARGUMENTS_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);
250 case PM_ARRAY_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);
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);
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);
266 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->constant, 0);
269 case PM_ASSOC_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);
275 case PM_ASSOC_SPLAT_NODE: {
277 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
280 case PM_BEGIN_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);
288 case PM_BLOCK_ARGUMENT_NODE: {
290 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->expression, 0);
293 case PM_BLOCK_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);
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);
304 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->parameters, 0);
307 case PM_BREAK_NODE: {
309 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->arguments, 0);
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);
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);
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);
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);
337 case PM_CALL_TARGET_NODE: {
339 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->receiver, 0);
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);
348 case PM_CASE_MATCH_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);
354 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->predicate, 0);
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);
363 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->predicate, 0);
366 case PM_CLASS_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);
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);
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);
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);
388 case PM_CLASS_VARIABLE_WRITE_NODE: {
390 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
393 case PM_CONSTANT_AND_WRITE_NODE: {
395 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
398 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
400 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
403 case PM_CONSTANT_OR_WRITE_NODE: {
405 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
414 case PM_CONSTANT_PATH_NODE: {
416 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->parent, 0);
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);
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);
431 case PM_CONSTANT_PATH_TARGET_NODE: {
433 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->parent, 0);
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);
442 case PM_CONSTANT_WRITE_NODE: {
444 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
457 case PM_DEFINED_NODE: {
459 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
464 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->statements, 0);
467 case PM_EMBEDDED_STATEMENTS_NODE: {
469 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->statements, 0);
472 case PM_EMBEDDED_VARIABLE_NODE: {
474 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->variable, 0);
477 case PM_ENSURE_NODE: {
479 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->statements, 0);
482 case PM_ERROR_RECOVERY_NODE: {
484 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->unexpected, 0);
487 case PM_FIND_PATTERN_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);
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);
497 case PM_FLIP_FLOP_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);
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);
510 case PM_FORWARDING_SUPER_NODE: {
512 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->block, 0);
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);
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);
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);
530 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
532 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
542 case PM_HASH_PATTERN_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);
548 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->constant, 0);
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);
558 case PM_IMAGINARY_NODE: {
560 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->numeric, 0);
563 case PM_IMPLICIT_NODE: {
565 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
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);
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);
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);
598 case PM_INDEX_TARGET_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);
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);
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);
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);
620 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
622 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
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);
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);
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);
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);
660 case PM_KEYWORD_HASH_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);
667 case PM_LAMBDA_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);
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);
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);
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);
688 case PM_LOCAL_VARIABLE_WRITE_NODE: {
690 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
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);
705 case PM_MATCH_WRITE_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);
710 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->call, 0);
713 case PM_MODULE_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);
719 case PM_MULTI_TARGET_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);
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);
730 case PM_MULTI_WRITE_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);
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);
744 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->arguments, 0);
747 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
749 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
752 case PM_OPTIONAL_PARAMETER_NODE: {
754 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->value, 0);
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);
763 case PM_PARAMETERS_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);
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);
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);
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);
782 case PM_PARENTHESES_NODE: {
784 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->body, 0);
787 case PM_PINNED_EXPRESSION_NODE: {
789 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->expression, 0);
792 case PM_PINNED_VARIABLE_NODE: {
794 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->variable, 0);
797 case PM_POST_EXECUTION_NODE: {
799 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->statements, 0);
802 case PM_PRE_EXECUTION_NODE: {
804 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->statements, 0);
807 case PM_PROGRAM_NODE: {
809 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->statements, 0);
812 case PM_RANGE_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);
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);
824 case PM_RESCUE_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);
834 case PM_RETURN_NODE: {
836 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->arguments, 0);
839 case PM_SHAREABLE_CONSTANT_NODE: {
841 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->write, 0);
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);
850 case PM_SPLAT_NODE: {
852 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->expression, 0);
855 case PM_STATEMENTS_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);
862 case PM_SUPER_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);
868 case PM_UNDEF_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);
875 case PM_UNLESS_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);
882 case PM_UNTIL_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);
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);
896 case PM_WHILE_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);
902 case PM_YIELD_NODE: {
904 pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (
const pm_node_t *)
cast->arguments, 0);
911 if (stack.
size != index + 1)
continue;
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);
919 switch (PM_NODE_TYPE(node)) {
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);
930 case PM_ALIAS_METHOD_NODE: {
932 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
933 pm_serialize_location(&
cast->keyword_loc, buffer);
936 case PM_ALTERNATION_PATTERN_NODE: {
938 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
939 pm_serialize_location(&
cast->operator_loc, buffer);
944 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
945 pm_serialize_location(&
cast->operator_loc, buffer);
948 case PM_ARGUMENTS_NODE: {
950 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
951 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
cast->arguments.size));
954 case PM_ARRAY_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);
961 pm_buffer_append_byte(buffer, 1);
962 pm_serialize_location(&
cast->opening_loc, buffer);
964 if (
cast->closing_loc.length == 0) {
965 pm_buffer_append_byte(buffer, 0);
967 pm_buffer_append_byte(buffer, 1);
968 pm_serialize_location(&
cast->closing_loc, buffer);
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);
980 pm_buffer_append_byte(buffer, 1);
981 pm_serialize_location(&
cast->opening_loc, buffer);
983 if (
cast->closing_loc.length == 0) {
984 pm_buffer_append_byte(buffer, 0);
986 pm_buffer_append_byte(buffer, 1);
987 pm_serialize_location(&
cast->closing_loc, buffer);
991 case PM_ASSOC_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);
997 pm_buffer_append_byte(buffer, 1);
998 pm_serialize_location(&
cast->operator_loc, buffer);
1002 case PM_ASSOC_SPLAT_NODE: {
1004 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1005 pm_serialize_location(&
cast->operator_loc, buffer);
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));
1014 case PM_BEGIN_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);
1020 pm_buffer_append_byte(buffer, 1);
1021 pm_serialize_location(&
cast->begin_keyword_loc, buffer);
1023 if (
cast->end_keyword_loc.length == 0) {
1024 pm_buffer_append_byte(buffer, 0);
1026 pm_buffer_append_byte(buffer, 1);
1027 pm_serialize_location(&
cast->end_keyword_loc, buffer);
1031 case PM_BLOCK_ARGUMENT_NODE: {
1033 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1034 pm_serialize_location(&
cast->operator_loc, buffer);
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));
1043 case PM_BLOCK_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]));
1050 pm_serialize_location(&
cast->opening_loc, buffer);
1051 pm_serialize_location(&
cast->closing_loc, buffer);
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);
1061 pm_buffer_append_byte(buffer, 1);
1062 pm_serialize_location(&
cast->name_loc, buffer);
1064 pm_serialize_location(&
cast->operator_loc, buffer);
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);
1074 pm_buffer_append_byte(buffer, 1);
1075 pm_serialize_location(&
cast->opening_loc, buffer);
1077 if (
cast->closing_loc.length == 0) {
1078 pm_buffer_append_byte(buffer, 0);
1080 pm_buffer_append_byte(buffer, 1);
1081 pm_serialize_location(&
cast->closing_loc, buffer);
1085 case PM_BREAK_NODE: {
1087 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1088 pm_serialize_location(&
cast->keyword_loc, buffer);
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);
1097 pm_buffer_append_byte(buffer, 1);
1098 pm_serialize_location(&
cast->call_operator_loc, buffer);
1100 if (
cast->message_loc.length == 0) {
1101 pm_buffer_append_byte(buffer, 0);
1103 pm_buffer_append_byte(buffer, 1);
1104 pm_serialize_location(&
cast->message_loc, buffer);
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);
1111 case PM_CALL_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);
1117 pm_buffer_append_byte(buffer, 1);
1118 pm_serialize_location(&
cast->call_operator_loc, buffer);
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);
1124 pm_buffer_append_byte(buffer, 1);
1125 pm_serialize_location(&
cast->message_loc, buffer);
1127 if (
cast->opening_loc.length == 0) {
1128 pm_buffer_append_byte(buffer, 0);
1130 pm_buffer_append_byte(buffer, 1);
1131 pm_serialize_location(&
cast->opening_loc, buffer);
1133 if (
cast->closing_loc.length == 0) {
1134 pm_buffer_append_byte(buffer, 0);
1136 pm_buffer_append_byte(buffer, 1);
1137 pm_serialize_location(&
cast->closing_loc, buffer);
1139 if (
cast->equal_loc.length == 0) {
1140 pm_buffer_append_byte(buffer, 0);
1142 pm_buffer_append_byte(buffer, 1);
1143 pm_serialize_location(&
cast->equal_loc, buffer);
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);
1153 pm_buffer_append_byte(buffer, 1);
1154 pm_serialize_location(&
cast->call_operator_loc, buffer);
1156 if (
cast->message_loc.length == 0) {
1157 pm_buffer_append_byte(buffer, 0);
1159 pm_buffer_append_byte(buffer, 1);
1160 pm_serialize_location(&
cast->message_loc, buffer);
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);
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);
1174 pm_buffer_append_byte(buffer, 1);
1175 pm_serialize_location(&
cast->call_operator_loc, buffer);
1177 if (
cast->message_loc.length == 0) {
1178 pm_buffer_append_byte(buffer, 0);
1180 pm_buffer_append_byte(buffer, 1);
1181 pm_serialize_location(&
cast->message_loc, buffer);
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);
1188 case PM_CALL_TARGET_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);
1196 case PM_CAPTURE_PATTERN_NODE: {
1198 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1199 pm_serialize_location(&
cast->operator_loc, buffer);
1202 case PM_CASE_MATCH_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);
1210 case PM_CASE_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);
1218 case PM_CLASS_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]));
1225 pm_serialize_location(&
cast->class_keyword_loc, buffer);
1226 if (
cast->inheritance_operator_loc.length == 0) {
1227 pm_buffer_append_byte(buffer, 0);
1229 pm_buffer_append_byte(buffer, 1);
1230 pm_serialize_location(&
cast->inheritance_operator_loc, buffer);
1232 pm_serialize_location(&
cast->end_keyword_loc, buffer);
1233 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
cast->name));
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);
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));
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);
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));
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));
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);
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);
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));
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);
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);
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);
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));
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);
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);
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);
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));
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));
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);
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]));
1376 pm_serialize_location(&
cast->def_keyword_loc, buffer);
1377 if (
cast->operator_loc.length == 0) {
1378 pm_buffer_append_byte(buffer, 0);
1380 pm_buffer_append_byte(buffer, 1);
1381 pm_serialize_location(&
cast->operator_loc, buffer);
1383 if (
cast->lparen_loc.length == 0) {
1384 pm_buffer_append_byte(buffer, 0);
1386 pm_buffer_append_byte(buffer, 1);
1387 pm_serialize_location(&
cast->lparen_loc, buffer);
1389 if (
cast->rparen_loc.length == 0) {
1390 pm_buffer_append_byte(buffer, 0);
1392 pm_buffer_append_byte(buffer, 1);
1393 pm_serialize_location(&
cast->rparen_loc, buffer);
1395 if (
cast->equal_loc.length == 0) {
1396 pm_buffer_append_byte(buffer, 0);
1398 pm_buffer_append_byte(buffer, 1);
1399 pm_serialize_location(&
cast->equal_loc, buffer);
1401 if (
cast->end_keyword_loc.length == 0) {
1402 pm_buffer_append_byte(buffer, 0);
1404 pm_buffer_append_byte(buffer, 1);
1405 pm_serialize_location(&
cast->end_keyword_loc, buffer);
1409 case PM_DEFINED_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);
1415 pm_buffer_append_byte(buffer, 1);
1416 pm_serialize_location(&
cast->lparen_loc, buffer);
1418 if (
cast->rparen_loc.length == 0) {
1419 pm_buffer_append_byte(buffer, 0);
1421 pm_buffer_append_byte(buffer, 1);
1422 pm_serialize_location(&
cast->rparen_loc, buffer);
1424 pm_serialize_location(&
cast->keyword_loc, buffer);
1427 case PM_ELSE_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);
1434 pm_buffer_append_byte(buffer, 1);
1435 pm_serialize_location(&
cast->end_keyword_loc, buffer);
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);
1446 case PM_EMBEDDED_VARIABLE_NODE: {
1448 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1449 pm_serialize_location(&
cast->operator_loc, buffer);
1452 case PM_ENSURE_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);
1459 case PM_ERROR_RECOVERY_NODE: {
1460 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1463 case PM_FALSE_NODE: {
1464 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1467 case PM_FIND_PATTERN_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);
1474 pm_buffer_append_byte(buffer, 1);
1475 pm_serialize_location(&
cast->opening_loc, buffer);
1477 if (
cast->closing_loc.length == 0) {
1478 pm_buffer_append_byte(buffer, 0);
1480 pm_buffer_append_byte(buffer, 1);
1481 pm_serialize_location(&
cast->closing_loc, buffer);
1485 case PM_FLIP_FLOP_NODE: {
1487 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1488 pm_serialize_location(&
cast->operator_loc, buffer);
1491 case PM_FLOAT_NODE: {
1493 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1494 pm_buffer_append_double(buffer,
cast->value);
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);
1505 pm_buffer_append_byte(buffer, 1);
1506 pm_serialize_location(&
cast->do_keyword_loc, buffer);
1508 pm_serialize_location(&
cast->end_keyword_loc, buffer);
1511 case PM_FORWARDING_ARGUMENTS_NODE: {
1512 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1515 case PM_FORWARDING_PARAMETER_NODE: {
1516 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1519 case PM_FORWARDING_SUPER_NODE: {
1521 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1522 pm_serialize_location(&
cast->keyword_loc, buffer);
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);
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));
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);
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));
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));
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);
1570 case PM_HASH_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);
1578 case PM_HASH_PATTERN_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);
1585 pm_buffer_append_byte(buffer, 1);
1586 pm_serialize_location(&
cast->opening_loc, buffer);
1588 if (
cast->closing_loc.length == 0) {
1589 pm_buffer_append_byte(buffer, 0);
1591 pm_buffer_append_byte(buffer, 1);
1592 pm_serialize_location(&
cast->closing_loc, buffer);
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);
1602 pm_buffer_append_byte(buffer, 1);
1603 pm_serialize_location(&
cast->if_keyword_loc, buffer);
1605 if (
cast->then_keyword_loc.length == 0) {
1606 pm_buffer_append_byte(buffer, 0);
1608 pm_buffer_append_byte(buffer, 1);
1609 pm_serialize_location(&
cast->then_keyword_loc, buffer);
1611 if (
cast->end_keyword_loc.length == 0) {
1612 pm_buffer_append_byte(buffer, 0);
1614 pm_buffer_append_byte(buffer, 1);
1615 pm_serialize_location(&
cast->end_keyword_loc, buffer);
1619 case PM_IMAGINARY_NODE: {
1620 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1623 case PM_IMPLICIT_NODE: {
1624 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1627 case PM_IMPLICIT_REST_NODE: {
1628 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
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);
1638 pm_buffer_append_byte(buffer, 1);
1639 pm_serialize_location(&
cast->then_keyword_loc, buffer);
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);
1649 pm_buffer_append_byte(buffer, 1);
1650 pm_serialize_location(&
cast->call_operator_loc, buffer);
1652 pm_serialize_location(&
cast->opening_loc, buffer);
1653 pm_serialize_location(&
cast->closing_loc, buffer);
1654 pm_serialize_location(&
cast->operator_loc, buffer);
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);
1663 pm_buffer_append_byte(buffer, 1);
1664 pm_serialize_location(&
cast->call_operator_loc, buffer);
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);
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);
1678 pm_buffer_append_byte(buffer, 1);
1679 pm_serialize_location(&
cast->call_operator_loc, buffer);
1681 pm_serialize_location(&
cast->opening_loc, buffer);
1682 pm_serialize_location(&
cast->closing_loc, buffer);
1683 pm_serialize_location(&
cast->operator_loc, buffer);
1686 case PM_INDEX_TARGET_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);
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);
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));
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);
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));
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));
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);
1738 case PM_INTEGER_NODE: {
1740 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1741 pm_serialize_integer(&
cast->value, buffer);
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);
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);
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);
1766 pm_buffer_append_byte(buffer, 1);
1767 pm_serialize_location(&
cast->opening_loc, buffer);
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);
1773 pm_buffer_append_byte(buffer, 1);
1774 pm_serialize_location(&
cast->closing_loc, buffer);
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);
1784 pm_buffer_append_byte(buffer, 1);
1785 pm_serialize_location(&
cast->opening_loc, buffer);
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);
1791 pm_buffer_append_byte(buffer, 1);
1792 pm_serialize_location(&
cast->closing_loc, buffer);
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);
1804 case PM_IT_LOCAL_VARIABLE_READ_NODE: {
1805 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1808 case PM_IT_PARAMETERS_NODE: {
1809 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1812 case PM_KEYWORD_HASH_NODE: {
1814 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1815 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
cast->elements.size));
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);
1825 pm_buffer_append_byte(buffer, 1);
1826 pm_serialize_location(&
cast->name_loc, buffer);
1828 pm_serialize_location(&
cast->operator_loc, buffer);
1831 case PM_LAMBDA_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]));
1838 pm_serialize_location(&
cast->operator_loc, buffer);
1839 pm_serialize_location(&
cast->opening_loc, buffer);
1840 pm_serialize_location(&
cast->closing_loc, buffer);
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);
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);
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);
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);
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);
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);
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);
1903 case PM_MATCH_PREDICATE_NODE: {
1905 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1906 pm_serialize_location(&
cast->keyword_loc, buffer);
1909 case PM_MATCH_REQUIRED_NODE: {
1911 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1912 pm_serialize_location(&
cast->operator_loc, buffer);
1915 case PM_MATCH_WRITE_NODE: {
1917 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1918 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
cast->targets.size));
1921 case PM_MODULE_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]));
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));
1933 case PM_MULTI_TARGET_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);
1941 pm_buffer_append_byte(buffer, 1);
1942 pm_serialize_location(&
cast->lparen_loc, buffer);
1944 if (
cast->rparen_loc.length == 0) {
1945 pm_buffer_append_byte(buffer, 0);
1947 pm_buffer_append_byte(buffer, 1);
1948 pm_serialize_location(&
cast->rparen_loc, buffer);
1952 case PM_MULTI_WRITE_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);
1960 pm_buffer_append_byte(buffer, 1);
1961 pm_serialize_location(&
cast->lparen_loc, buffer);
1963 if (
cast->rparen_loc.length == 0) {
1964 pm_buffer_append_byte(buffer, 0);
1966 pm_buffer_append_byte(buffer, 1);
1967 pm_serialize_location(&
cast->rparen_loc, buffer);
1969 pm_serialize_location(&
cast->operator_loc, buffer);
1972 case PM_NEXT_NODE: {
1974 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1975 pm_serialize_location(&
cast->keyword_loc, buffer);
1979 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
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);
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);
1996 case PM_NUMBERED_PARAMETERS_NODE: {
1998 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1999 pm_buffer_append_byte(buffer,
cast->maximum);
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);
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);
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);
2025 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2026 pm_serialize_location(&
cast->operator_loc, buffer);
2029 case PM_PARAMETERS_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));
2038 case PM_PARENTHESES_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);
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);
2053 case PM_PINNED_VARIABLE_NODE: {
2055 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2056 pm_serialize_location(&
cast->operator_loc, buffer);
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);
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);
2075 case PM_PROGRAM_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]));
2084 case PM_RANGE_NODE: {
2086 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2087 pm_serialize_location(&
cast->operator_loc, buffer);
2090 case PM_RATIONAL_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);
2097 case PM_REDO_NODE: {
2098 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
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);
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);
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));
2123 case PM_RESCUE_MODIFIER_NODE: {
2125 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2126 pm_serialize_location(&
cast->keyword_loc, buffer);
2129 case PM_RESCUE_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);
2137 pm_buffer_append_byte(buffer, 1);
2138 pm_serialize_location(&
cast->operator_loc, buffer);
2140 if (
cast->then_keyword_loc.length == 0) {
2141 pm_buffer_append_byte(buffer, 0);
2143 pm_buffer_append_byte(buffer, 1);
2144 pm_serialize_location(&
cast->then_keyword_loc, buffer);
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);
2155 pm_buffer_append_byte(buffer, 1);
2156 pm_serialize_location(&
cast->name_loc, buffer);
2158 pm_serialize_location(&
cast->operator_loc, buffer);
2161 case PM_RETRY_NODE: {
2162 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2165 case PM_RETURN_NODE: {
2167 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2168 pm_serialize_location(&
cast->keyword_loc, buffer);
2171 case PM_SELF_NODE: {
2172 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2175 case PM_SHAREABLE_CONSTANT_NODE: {
2176 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
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]));
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);
2191 case PM_SOURCE_ENCODING_NODE: {
2192 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2195 case PM_SOURCE_FILE_NODE: {
2197 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2198 pm_serialize_string(&
cast->filepath, buffer);
2201 case PM_SOURCE_LINE_NODE: {
2202 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2205 case PM_SPLAT_NODE: {
2207 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2208 pm_serialize_location(&
cast->operator_loc, buffer);
2211 case PM_STATEMENTS_NODE: {
2213 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2214 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
cast->body.size));
2217 case PM_STRING_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);
2223 pm_buffer_append_byte(buffer, 1);
2224 pm_serialize_location(&
cast->opening_loc, buffer);
2226 pm_serialize_location(&
cast->content_loc, buffer);
2227 if (
cast->closing_loc.length == 0) {
2228 pm_buffer_append_byte(buffer, 0);
2230 pm_buffer_append_byte(buffer, 1);
2231 pm_serialize_location(&
cast->closing_loc, buffer);
2233 pm_serialize_string(&
cast->unescaped, buffer);
2236 case PM_SUPER_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);
2243 pm_buffer_append_byte(buffer, 1);
2244 pm_serialize_location(&
cast->lparen_loc, buffer);
2246 if (
cast->rparen_loc.length == 0) {
2247 pm_buffer_append_byte(buffer, 0);
2249 pm_buffer_append_byte(buffer, 1);
2250 pm_serialize_location(&
cast->rparen_loc, buffer);
2254 case PM_SYMBOL_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);
2260 pm_buffer_append_byte(buffer, 1);
2261 pm_serialize_location(&
cast->opening_loc, buffer);
2263 pm_serialize_location(&
cast->content_loc, buffer);
2264 if (
cast->closing_loc.length == 0) {
2265 pm_buffer_append_byte(buffer, 0);
2267 pm_buffer_append_byte(buffer, 1);
2268 pm_serialize_location(&
cast->closing_loc, buffer);
2270 pm_serialize_string(&
cast->unescaped, buffer);
2273 case PM_TRUE_NODE: {
2274 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2277 case PM_UNDEF_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);
2284 case PM_UNLESS_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);
2291 pm_buffer_append_byte(buffer, 1);
2292 pm_serialize_location(&
cast->then_keyword_loc, buffer);
2294 if (
cast->end_keyword_loc.length == 0) {
2295 pm_buffer_append_byte(buffer, 0);
2297 pm_buffer_append_byte(buffer, 1);
2298 pm_serialize_location(&
cast->end_keyword_loc, buffer);
2302 case PM_UNTIL_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);
2309 pm_buffer_append_byte(buffer, 1);
2310 pm_serialize_location(&
cast->do_keyword_loc, buffer);
2312 if (
cast->end_keyword_loc.length == 0) {
2313 pm_buffer_append_byte(buffer, 0);
2315 pm_buffer_append_byte(buffer, 1);
2316 pm_serialize_location(&
cast->end_keyword_loc, buffer);
2320 case PM_WHEN_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);
2328 pm_buffer_append_byte(buffer, 1);
2329 pm_serialize_location(&
cast->then_keyword_loc, buffer);
2333 case PM_WHILE_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);
2340 pm_buffer_append_byte(buffer, 1);
2341 pm_serialize_location(&
cast->do_keyword_loc, buffer);
2343 if (
cast->end_keyword_loc.length == 0) {
2344 pm_buffer_append_byte(buffer, 0);
2346 pm_buffer_append_byte(buffer, 1);
2347 pm_serialize_location(&
cast->end_keyword_loc, buffer);
2351 case PM_X_STRING_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);
2360 case PM_YIELD_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);
2367 pm_buffer_append_byte(buffer, 1);
2368 pm_serialize_location(&
cast->lparen_loc, buffer);
2370 if (
cast->rparen_loc.length == 0) {
2371 pm_buffer_append_byte(buffer, 0);
2373 pm_buffer_append_byte(buffer, 1);
2374 pm_serialize_location(&
cast->rparen_loc, buffer);
2389 uint32_t size = pm_sizet_to_u32(list->
size);
2390 pm_buffer_append_varuint(buffer, size);
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);
2401 pm_buffer_append_byte(buffer, (uint8_t) comment->type);
2404 pm_serialize_location(&comment->location, buffer);
2412 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2416 pm_serialize_comment(comment, buffer);
2429 for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2430 if (attachments->ranges[node_id].
length > 0) count++;
2433 pm_buffer_append_varuint(buffer, count);
2435 for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2437 if (range.length == 0)
continue;
2439 pm_buffer_append_varuint(buffer, node_id);
2440 pm_buffer_append_varuint(buffer, range.length);
2442 for (uint32_t index = 0; index < range.length; index++) {
2443 pm_buffer_append_varuint(buffer, attachments->attachments[range.index + index]);
2452 pm_buffer_append_varuint(buffer,
magic_comment->key.length);
2455 pm_buffer_append_varuint(buffer,
magic_comment->value.start);
2456 pm_buffer_append_varuint(buffer,
magic_comment->value.length);
2461 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2471 if (parser->data_loc.
length == 0) {
2472 pm_buffer_append_byte(buffer, 0);
2474 pm_buffer_append_byte(buffer, 1);
2475 pm_serialize_location(&parser->data_loc, buffer);
2482 pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->diag_id);
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);
2490 pm_serialize_location(&diagnostic->location, buffer);
2492 pm_buffer_append_byte(buffer, diagnostic->level);
2497 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2501 pm_serialize_diagnostic(diagnostic, 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);
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);
2530#line 463 "prism/templates/src/serialize.c.erb"
2536 pm_serialize_metadata(parser, buffer);
2540 size_t offset = buffer->length;
2541 pm_buffer_append_zeroes(buffer, 4);
2544 pm_buffer_append_varuint(buffer, parser->constant_pool.size);
2547 pm_serialize_node(node, buffer);
2551 uint32_t length = pm_sizet_to_u32(buffer->length);
2552 memcpy(buffer->value + offset, &length,
sizeof(uint32_t));
2555 offset = buffer->length;
2556 pm_buffer_append_zeroes(buffer, parser->constant_pool.size * 8);
2558 for (uint32_t index = 0; index < parser->constant_pool.capacity; index++) {
2563 if (bucket->id != 0) {
2565 size_t buffer_offset = offset + ((((size_t)bucket->id) - 1) * 8);
2569 uint32_t content_offset = pm_sizet_to_u32(buffer->length);
2570 memcpy(buffer->value + buffer_offset, &content_offset, 4);
2573 uint32_t constant_length = pm_sizet_to_u32(
constant->length);
2574 memcpy(buffer->value + buffer_offset + 4, &constant_length, 4);
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);
2593pm_serialize_lex(
pm_buffer_t *buffer,
const uint8_t *source,
size_t size,
const char *data) {
2595 pm_options_read(&options, data);
2599 pm_parser_init(&arena, &parser, source, size, &options);
2601 pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2605 pm_buffer_append_byte(buffer, 0);
2607 pm_serialize_metadata(&parser, buffer);
2609 pm_parser_cleanup(&parser);
2610 pm_arena_cleanup(&arena);
2611 pm_options_cleanup(&options);
2619pm_serialize_parse_lex(
pm_buffer_t *buffer,
const uint8_t *source,
size_t size,
const char *data) {
2621 pm_options_read(&options, data);
2625 pm_parser_init(&arena, &parser, source, size, &options);
2627 pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2630 pm_buffer_append_byte(buffer, 0);
2631 pm_serialize(&parser, node, buffer);
2633 pm_parser_cleanup(&parser);
2634 pm_arena_cleanup(&arena);
2635 pm_options_cleanup(&options);
2642pm_serialize_parse_success_p(
const uint8_t *source,
size_t size,
const char *data) {
2644 pm_options_read(&options, data);
2648 pm_parser_init(&arena, &parser, source, size, &options);
2652 bool result = parser.error_list.size == 0;
2653 pm_parser_cleanup(&parser);
2654 pm_arena_cleanup(&arena);
2655 pm_options_cleanup(&options);
#define PRISM_UNLIKELY(x)
The compiler should predicate that this branch will not be taken.
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.
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.
PRISM_EXPORTED_FUNCTION pm_node_t * pm_parse(pm_parser_t *parser) PRISM_NONNULL(1)
Initiate the parser with the given parser.
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.
The main header file for the prism parser.
ClassVariableAndWriteNode.
ClassVariableOperatorWriteNode.
ClassVariableOrWriteNode.
ConstantOperatorWriteNode.
ConstantPathAndWriteNode.
ConstantPathOperatorWriteNode.
GlobalVariableAndWriteNode.
GlobalVariableOperatorWriteNode.
GlobalVariableOrWriteNode.
GlobalVariableTargetNode.
InstanceVariableAndWriteNode.
InstanceVariableOperatorWriteNode.
InstanceVariableOrWriteNode.
InstanceVariableReadNode.
InstanceVariableTargetNode.
InstanceVariableWriteNode.
A structure represents an arbitrary-sized integer.
size_t length
The number of allocated values.
uint32_t value
Embedded value for small integer.
uint32_t * values
List of 32-bit integers.
bool negative
Whether or not the integer is negative.
InterpolatedMatchLastLineNode.
InterpolatedRegularExpressionNode.
KeywordRestParameterNode.
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.
LocalVariableOperatorWriteNode.
LocalVariableOrWriteNode.
This struct represents a slice in the source code, defined by an offset and a length.
uint32_t start
The offset of the location from the start of the source.
uint32_t length
The length of the location.
This is the base structure that represents a node in the syntax tree.
uint32_t node_id
The unique identifier for this node, which is deterministic based on the source.
pm_node_flags_t flags
This represents any flags on the node.
pm_location_t location
This is the location of the node in the source.
NumberedReferenceReadNode.
OptionalKeywordParameterNode.
RequiredKeywordParameterNode.
An entry on the serialization stack.
pm_serialize_entry_kind_t kind
The kind of this entry.
size_t offset
For NODE entries, the offset of the placeholders that follow the node's lazy marker.
bool visited
Whether the children of this node have already been pushed.
const pm_node_t * node
The node to serialize, for NODE entries.
The explicit stack used to walk the tree, so that serializing deeply nested trees does not depend on ...
size_t capacity
The number of entries that fit in the allocated memory.
pm_serialize_entry_t * entries
The entries on the stack.
size_t size
The number of entries on the stack.
A view of a sequence of bytes.
This struct represents a token in the Ruby source.