14#ifndef PRISM_EXCLUDE_SERIALIZATION
19pm_ptrdifft_to_u32(ptrdiff_t value) {
20 assert(value >= 0 && ((
unsigned long) value) < UINT32_MAX);
21 return (uint32_t) value;
25pm_sizet_to_u32(
size_t value) {
26 assert(value < UINT32_MAX);
27 return (uint32_t) value;
32 pm_buffer_append_varuint(buffer, location->
start);
33 pm_buffer_append_varuint(buffer, location->
length);
38 switch (string->
type) {
39 case PM_STRING_SHARED: {
40 pm_buffer_append_byte(buffer, 1);
46 case PM_STRING_CONSTANT: {
48 pm_buffer_append_byte(buffer, 2);
49 pm_buffer_append_varuint(buffer, length);
54 case PM_STRING_MAPPED:
55 assert(
false &&
"Cannot serialize mapped strings.");
63 pm_buffer_append_byte(buffer, integer->
negative ? 1 : 0);
64 if (integer->
values == NULL) {
65 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(1));
66 pm_buffer_append_varuint(buffer, integer->
value);
68 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(integer->
length));
69 for (
size_t i = 0; i < integer->
length; i++) {
70 pm_buffer_append_varuint(buffer, integer->
values[i]);
77 pm_buffer_append_byte(buffer, (uint8_t) PM_NODE_TYPE(node));
79 size_t offset = buffer->
length;
81 pm_buffer_append_varuint(buffer, node->
node_id);
82 pm_serialize_location(&node->
location, buffer);
84 switch (PM_NODE_TYPE(node)) {
89 case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
90 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
96 case PM_ALIAS_METHOD_NODE: {
97 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
103 case PM_ALTERNATION_PATTERN_NODE: {
104 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
111 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
114 pm_serialize_location(&((
pm_and_node_t *)node)->operator_loc, buffer);
117 case PM_ARGUMENTS_NODE: {
118 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
120 pm_buffer_append_varuint(buffer, arguments_size);
121 for (uint32_t index = 0; index < arguments_size; index++) {
126 case PM_ARRAY_NODE: {
127 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
128 uint32_t elements_size = pm_sizet_to_u32(((
pm_array_node_t *)node)->elements.size);
129 pm_buffer_append_varuint(buffer, elements_size);
130 for (uint32_t index = 0; index < elements_size; index++) {
134 pm_buffer_append_byte(buffer, 0);
136 pm_buffer_append_byte(buffer, 1);
137 pm_serialize_location(&((
pm_array_node_t *)node)->opening_loc, buffer);
140 pm_buffer_append_byte(buffer, 0);
142 pm_buffer_append_byte(buffer, 1);
143 pm_serialize_location(&((
pm_array_node_t *)node)->closing_loc, buffer);
147 case PM_ARRAY_PATTERN_NODE: {
148 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
150 pm_buffer_append_byte(buffer, 0);
155 pm_buffer_append_varuint(buffer, requireds_size);
156 for (uint32_t index = 0; index < requireds_size; index++) {
160 pm_buffer_append_byte(buffer, 0);
165 pm_buffer_append_varuint(buffer, posts_size);
166 for (uint32_t index = 0; index < posts_size; index++) {
170 pm_buffer_append_byte(buffer, 0);
172 pm_buffer_append_byte(buffer, 1);
176 pm_buffer_append_byte(buffer, 0);
178 pm_buffer_append_byte(buffer, 1);
183 case PM_ASSOC_NODE: {
184 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
188 pm_buffer_append_byte(buffer, 0);
190 pm_buffer_append_byte(buffer, 1);
191 pm_serialize_location(&((
pm_assoc_node_t *)node)->operator_loc, buffer);
195 case PM_ASSOC_SPLAT_NODE: {
196 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
198 pm_buffer_append_byte(buffer, 0);
205 case PM_BACK_REFERENCE_READ_NODE: {
206 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
210 case PM_BEGIN_NODE: {
211 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
213 pm_buffer_append_byte(buffer, 0);
215 pm_buffer_append_byte(buffer, 1);
216 pm_serialize_location(&((
pm_begin_node_t *)node)->begin_keyword_loc, buffer);
219 pm_buffer_append_byte(buffer, 0);
224 pm_buffer_append_byte(buffer, 0);
229 pm_buffer_append_byte(buffer, 0);
234 pm_buffer_append_byte(buffer, 0);
239 pm_buffer_append_byte(buffer, 0);
241 pm_buffer_append_byte(buffer, 1);
242 pm_serialize_location(&((
pm_begin_node_t *)node)->end_keyword_loc, buffer);
246 case PM_BLOCK_ARGUMENT_NODE: {
247 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
249 pm_buffer_append_byte(buffer, 0);
256 case PM_BLOCK_LOCAL_VARIABLE_NODE: {
257 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
261 case PM_BLOCK_NODE: {
262 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
263 uint32_t locals_size = pm_sizet_to_u32(((
pm_block_node_t *)node)->locals.size);
264 pm_buffer_append_varuint(buffer, locals_size);
265 for (uint32_t index = 0; index < locals_size; index++) {
266 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_block_node_t *)node)->locals.ids[index]));
269 pm_buffer_append_byte(buffer, 0);
274 pm_buffer_append_byte(buffer, 0);
278 pm_serialize_location(&((
pm_block_node_t *)node)->opening_loc, buffer);
279 pm_serialize_location(&((
pm_block_node_t *)node)->closing_loc, buffer);
282 case PM_BLOCK_PARAMETER_NODE: {
283 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
286 pm_buffer_append_byte(buffer, 0);
288 pm_buffer_append_byte(buffer, 1);
294 case PM_BLOCK_PARAMETERS_NODE: {
295 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
297 pm_buffer_append_byte(buffer, 0);
302 pm_buffer_append_varuint(buffer, locals_size);
303 for (uint32_t index = 0; index < locals_size; index++) {
307 pm_buffer_append_byte(buffer, 0);
309 pm_buffer_append_byte(buffer, 1);
313 pm_buffer_append_byte(buffer, 0);
315 pm_buffer_append_byte(buffer, 1);
320 case PM_BREAK_NODE: {
321 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
323 pm_buffer_append_byte(buffer, 0);
327 pm_serialize_location(&((
pm_break_node_t *)node)->keyword_loc, buffer);
330 case PM_CALL_AND_WRITE_NODE: {
331 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
333 pm_buffer_append_byte(buffer, 0);
338 pm_buffer_append_byte(buffer, 0);
340 pm_buffer_append_byte(buffer, 1);
344 pm_buffer_append_byte(buffer, 0);
346 pm_buffer_append_byte(buffer, 1);
356 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
358 pm_buffer_append_byte(buffer, 0);
363 pm_buffer_append_byte(buffer, 0);
365 pm_buffer_append_byte(buffer, 1);
366 pm_serialize_location(&((
pm_call_node_t *)node)->call_operator_loc, buffer);
368 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_call_node_t *)node)->name));
370 pm_buffer_append_byte(buffer, 0);
372 pm_buffer_append_byte(buffer, 1);
373 pm_serialize_location(&((
pm_call_node_t *)node)->message_loc, buffer);
376 pm_buffer_append_byte(buffer, 0);
378 pm_buffer_append_byte(buffer, 1);
379 pm_serialize_location(&((
pm_call_node_t *)node)->opening_loc, buffer);
382 pm_buffer_append_byte(buffer, 0);
387 pm_buffer_append_byte(buffer, 0);
389 pm_buffer_append_byte(buffer, 1);
390 pm_serialize_location(&((
pm_call_node_t *)node)->closing_loc, buffer);
393 pm_buffer_append_byte(buffer, 0);
395 pm_buffer_append_byte(buffer, 1);
396 pm_serialize_location(&((
pm_call_node_t *)node)->equal_loc, buffer);
399 pm_buffer_append_byte(buffer, 0);
405 case PM_CALL_OPERATOR_WRITE_NODE: {
406 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
408 pm_buffer_append_byte(buffer, 0);
413 pm_buffer_append_byte(buffer, 0);
415 pm_buffer_append_byte(buffer, 1);
419 pm_buffer_append_byte(buffer, 0);
421 pm_buffer_append_byte(buffer, 1);
431 case PM_CALL_OR_WRITE_NODE: {
432 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
434 pm_buffer_append_byte(buffer, 0);
439 pm_buffer_append_byte(buffer, 0);
441 pm_buffer_append_byte(buffer, 1);
445 pm_buffer_append_byte(buffer, 0);
447 pm_buffer_append_byte(buffer, 1);
456 case PM_CALL_TARGET_NODE: {
457 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
464 case PM_CAPTURE_PATTERN_NODE: {
465 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
471 case PM_CASE_MATCH_NODE: {
472 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
474 pm_buffer_append_byte(buffer, 0);
479 pm_buffer_append_varuint(buffer, conditions_size);
480 for (uint32_t index = 0; index < conditions_size; index++) {
484 pm_buffer_append_byte(buffer, 0);
493 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
495 pm_buffer_append_byte(buffer, 0);
499 uint32_t conditions_size = pm_sizet_to_u32(((
pm_case_node_t *)node)->conditions.size);
500 pm_buffer_append_varuint(buffer, conditions_size);
501 for (uint32_t index = 0; index < conditions_size; index++) {
505 pm_buffer_append_byte(buffer, 0);
509 pm_serialize_location(&((
pm_case_node_t *)node)->case_keyword_loc, buffer);
510 pm_serialize_location(&((
pm_case_node_t *)node)->end_keyword_loc, buffer);
513 case PM_CLASS_NODE: {
514 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
515 uint32_t locals_size = pm_sizet_to_u32(((
pm_class_node_t *)node)->locals.size);
516 pm_buffer_append_varuint(buffer, locals_size);
517 for (uint32_t index = 0; index < locals_size; index++) {
518 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_class_node_t *)node)->locals.ids[index]));
520 pm_serialize_location(&((
pm_class_node_t *)node)->class_keyword_loc, buffer);
523 pm_buffer_append_byte(buffer, 0);
525 pm_buffer_append_byte(buffer, 1);
526 pm_serialize_location(&((
pm_class_node_t *)node)->inheritance_operator_loc, buffer);
529 pm_buffer_append_byte(buffer, 0);
534 pm_buffer_append_byte(buffer, 0);
538 pm_serialize_location(&((
pm_class_node_t *)node)->end_keyword_loc, buffer);
539 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_class_node_t *)node)->name));
542 case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
543 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
550 case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
551 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
559 case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
560 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
567 case PM_CLASS_VARIABLE_READ_NODE: {
568 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
572 case PM_CLASS_VARIABLE_TARGET_NODE: {
573 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
577 case PM_CLASS_VARIABLE_WRITE_NODE: {
578 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
585 case PM_CONSTANT_AND_WRITE_NODE: {
586 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
593 case PM_CONSTANT_OPERATOR_WRITE_NODE: {
594 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
602 case PM_CONSTANT_OR_WRITE_NODE: {
603 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
610 case PM_CONSTANT_PATH_AND_WRITE_NODE: {
611 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
617 case PM_CONSTANT_PATH_NODE: {
618 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
620 pm_buffer_append_byte(buffer, 0);
629 case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
630 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
637 case PM_CONSTANT_PATH_OR_WRITE_NODE: {
638 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
644 case PM_CONSTANT_PATH_TARGET_NODE: {
645 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
647 pm_buffer_append_byte(buffer, 0);
656 case PM_CONSTANT_PATH_WRITE_NODE: {
657 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
663 case PM_CONSTANT_READ_NODE: {
664 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
668 case PM_CONSTANT_TARGET_NODE: {
669 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
673 case PM_CONSTANT_WRITE_NODE: {
674 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
684 size_t length_offset = buffer->
length;
685 pm_buffer_append_string(buffer,
"\0\0\0\0", 4);
686 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
687 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_def_node_t *)node)->name));
688 pm_serialize_location(&((
pm_def_node_t *)node)->name_loc, buffer);
690 pm_buffer_append_byte(buffer, 0);
695 pm_buffer_append_byte(buffer, 0);
700 pm_buffer_append_byte(buffer, 0);
704 uint32_t locals_size = pm_sizet_to_u32(((
pm_def_node_t *)node)->locals.size);
705 pm_buffer_append_varuint(buffer, locals_size);
706 for (uint32_t index = 0; index < locals_size; index++) {
707 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_def_node_t *)node)->locals.ids[index]));
709 pm_serialize_location(&((
pm_def_node_t *)node)->def_keyword_loc, buffer);
711 pm_buffer_append_byte(buffer, 0);
713 pm_buffer_append_byte(buffer, 1);
714 pm_serialize_location(&((
pm_def_node_t *)node)->operator_loc, buffer);
717 pm_buffer_append_byte(buffer, 0);
719 pm_buffer_append_byte(buffer, 1);
720 pm_serialize_location(&((
pm_def_node_t *)node)->lparen_loc, buffer);
723 pm_buffer_append_byte(buffer, 0);
725 pm_buffer_append_byte(buffer, 1);
726 pm_serialize_location(&((
pm_def_node_t *)node)->rparen_loc, buffer);
729 pm_buffer_append_byte(buffer, 0);
731 pm_buffer_append_byte(buffer, 1);
732 pm_serialize_location(&((
pm_def_node_t *)node)->equal_loc, buffer);
735 pm_buffer_append_byte(buffer, 0);
737 pm_buffer_append_byte(buffer, 1);
738 pm_serialize_location(&((
pm_def_node_t *)node)->end_keyword_loc, buffer);
741 uint32_t length = pm_sizet_to_u32(buffer->
length - offset -
sizeof(uint32_t));
742 memcpy(buffer->
value + length_offset, &length,
sizeof(uint32_t));
745 case PM_DEFINED_NODE: {
746 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
748 pm_buffer_append_byte(buffer, 0);
750 pm_buffer_append_byte(buffer, 1);
755 pm_buffer_append_byte(buffer, 0);
757 pm_buffer_append_byte(buffer, 1);
764 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
765 pm_serialize_location(&((
pm_else_node_t *)node)->else_keyword_loc, buffer);
767 pm_buffer_append_byte(buffer, 0);
772 pm_buffer_append_byte(buffer, 0);
774 pm_buffer_append_byte(buffer, 1);
775 pm_serialize_location(&((
pm_else_node_t *)node)->end_keyword_loc, buffer);
779 case PM_EMBEDDED_STATEMENTS_NODE: {
780 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
783 pm_buffer_append_byte(buffer, 0);
790 case PM_EMBEDDED_VARIABLE_NODE: {
791 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
796 case PM_ENSURE_NODE: {
797 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
798 pm_serialize_location(&((
pm_ensure_node_t *)node)->ensure_keyword_loc, buffer);
800 pm_buffer_append_byte(buffer, 0);
804 pm_serialize_location(&((
pm_ensure_node_t *)node)->end_keyword_loc, buffer);
807 case PM_FALSE_NODE: {
808 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
811 case PM_FIND_PATTERN_NODE: {
812 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
814 pm_buffer_append_byte(buffer, 0);
820 pm_buffer_append_varuint(buffer, requireds_size);
821 for (uint32_t index = 0; index < requireds_size; index++) {
826 pm_buffer_append_byte(buffer, 0);
828 pm_buffer_append_byte(buffer, 1);
832 pm_buffer_append_byte(buffer, 0);
834 pm_buffer_append_byte(buffer, 1);
839 case PM_FLIP_FLOP_NODE: {
840 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
842 pm_buffer_append_byte(buffer, 0);
847 pm_buffer_append_byte(buffer, 0);
854 case PM_FLOAT_NODE: {
855 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
860 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
864 pm_buffer_append_byte(buffer, 0);
868 pm_serialize_location(&((
pm_for_node_t *)node)->for_keyword_loc, buffer);
869 pm_serialize_location(&((
pm_for_node_t *)node)->in_keyword_loc, buffer);
871 pm_buffer_append_byte(buffer, 0);
873 pm_buffer_append_byte(buffer, 1);
874 pm_serialize_location(&((
pm_for_node_t *)node)->do_keyword_loc, buffer);
876 pm_serialize_location(&((
pm_for_node_t *)node)->end_keyword_loc, buffer);
879 case PM_FORWARDING_ARGUMENTS_NODE: {
880 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
883 case PM_FORWARDING_PARAMETER_NODE: {
884 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
887 case PM_FORWARDING_SUPER_NODE: {
888 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
890 pm_buffer_append_byte(buffer, 0);
896 case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
897 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
904 case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
905 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
913 case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
914 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
921 case PM_GLOBAL_VARIABLE_READ_NODE: {
922 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
926 case PM_GLOBAL_VARIABLE_TARGET_NODE: {
927 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
931 case PM_GLOBAL_VARIABLE_WRITE_NODE: {
932 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
940 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
941 pm_serialize_location(&((
pm_hash_node_t *)node)->opening_loc, buffer);
942 uint32_t elements_size = pm_sizet_to_u32(((
pm_hash_node_t *)node)->elements.size);
943 pm_buffer_append_varuint(buffer, elements_size);
944 for (uint32_t index = 0; index < elements_size; index++) {
947 pm_serialize_location(&((
pm_hash_node_t *)node)->closing_loc, buffer);
950 case PM_HASH_PATTERN_NODE: {
951 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
953 pm_buffer_append_byte(buffer, 0);
958 pm_buffer_append_varuint(buffer, elements_size);
959 for (uint32_t index = 0; index < elements_size; index++) {
963 pm_buffer_append_byte(buffer, 0);
968 pm_buffer_append_byte(buffer, 0);
970 pm_buffer_append_byte(buffer, 1);
974 pm_buffer_append_byte(buffer, 0);
976 pm_buffer_append_byte(buffer, 1);
982 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
983 if (((
pm_if_node_t *)node)->if_keyword_loc.length == 0) {
984 pm_buffer_append_byte(buffer, 0);
986 pm_buffer_append_byte(buffer, 1);
987 pm_serialize_location(&((
pm_if_node_t *)node)->if_keyword_loc, buffer);
990 if (((
pm_if_node_t *)node)->then_keyword_loc.length == 0) {
991 pm_buffer_append_byte(buffer, 0);
993 pm_buffer_append_byte(buffer, 1);
994 pm_serialize_location(&((
pm_if_node_t *)node)->then_keyword_loc, buffer);
997 pm_buffer_append_byte(buffer, 0);
1002 pm_buffer_append_byte(buffer, 0);
1006 if (((
pm_if_node_t *)node)->end_keyword_loc.length == 0) {
1007 pm_buffer_append_byte(buffer, 0);
1009 pm_buffer_append_byte(buffer, 1);
1010 pm_serialize_location(&((
pm_if_node_t *)node)->end_keyword_loc, buffer);
1014 case PM_IMAGINARY_NODE: {
1015 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1019 case PM_IMPLICIT_NODE: {
1020 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1024 case PM_IMPLICIT_REST_NODE: {
1025 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1029 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1032 pm_buffer_append_byte(buffer, 0);
1036 pm_serialize_location(&((
pm_in_node_t *)node)->in_loc, buffer);
1038 pm_buffer_append_byte(buffer, 0);
1040 pm_buffer_append_byte(buffer, 1);
1041 pm_serialize_location(&((
pm_in_node_t *)node)->then_loc, buffer);
1045 case PM_INDEX_AND_WRITE_NODE: {
1046 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1048 pm_buffer_append_byte(buffer, 0);
1053 pm_buffer_append_byte(buffer, 0);
1055 pm_buffer_append_byte(buffer, 1);
1060 pm_buffer_append_byte(buffer, 0);
1066 pm_buffer_append_byte(buffer, 0);
1074 case PM_INDEX_OPERATOR_WRITE_NODE: {
1075 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1077 pm_buffer_append_byte(buffer, 0);
1082 pm_buffer_append_byte(buffer, 0);
1084 pm_buffer_append_byte(buffer, 1);
1089 pm_buffer_append_byte(buffer, 0);
1095 pm_buffer_append_byte(buffer, 0);
1104 case PM_INDEX_OR_WRITE_NODE: {
1105 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1107 pm_buffer_append_byte(buffer, 0);
1112 pm_buffer_append_byte(buffer, 0);
1114 pm_buffer_append_byte(buffer, 1);
1119 pm_buffer_append_byte(buffer, 0);
1125 pm_buffer_append_byte(buffer, 0);
1133 case PM_INDEX_TARGET_NODE: {
1134 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1138 pm_buffer_append_byte(buffer, 0);
1144 pm_buffer_append_byte(buffer, 0);
1150 case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1151 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1158 case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1159 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1167 case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1168 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1175 case PM_INSTANCE_VARIABLE_READ_NODE: {
1176 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1180 case PM_INSTANCE_VARIABLE_TARGET_NODE: {
1181 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1185 case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1186 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1193 case PM_INTEGER_NODE: {
1194 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1198 case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1199 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1202 pm_buffer_append_varuint(buffer, parts_size);
1203 for (uint32_t index = 0; index < parts_size; index++) {
1209 case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1210 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1213 pm_buffer_append_varuint(buffer, parts_size);
1214 for (uint32_t index = 0; index < parts_size; index++) {
1220 case PM_INTERPOLATED_STRING_NODE: {
1221 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1223 pm_buffer_append_byte(buffer, 0);
1225 pm_buffer_append_byte(buffer, 1);
1229 pm_buffer_append_varuint(buffer, parts_size);
1230 for (uint32_t index = 0; index < parts_size; index++) {
1234 pm_buffer_append_byte(buffer, 0);
1236 pm_buffer_append_byte(buffer, 1);
1241 case PM_INTERPOLATED_SYMBOL_NODE: {
1242 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1244 pm_buffer_append_byte(buffer, 0);
1246 pm_buffer_append_byte(buffer, 1);
1250 pm_buffer_append_varuint(buffer, parts_size);
1251 for (uint32_t index = 0; index < parts_size; index++) {
1255 pm_buffer_append_byte(buffer, 0);
1257 pm_buffer_append_byte(buffer, 1);
1262 case PM_INTERPOLATED_X_STRING_NODE: {
1263 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1266 pm_buffer_append_varuint(buffer, parts_size);
1267 for (uint32_t index = 0; index < parts_size; index++) {
1273 case PM_IT_LOCAL_VARIABLE_READ_NODE: {
1274 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1277 case PM_IT_PARAMETERS_NODE: {
1278 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1281 case PM_KEYWORD_HASH_NODE: {
1282 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1284 pm_buffer_append_varuint(buffer, elements_size);
1285 for (uint32_t index = 0; index < elements_size; index++) {
1290 case PM_KEYWORD_REST_PARAMETER_NODE: {
1291 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1294 pm_buffer_append_byte(buffer, 0);
1296 pm_buffer_append_byte(buffer, 1);
1302 case PM_LAMBDA_NODE: {
1303 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1304 uint32_t locals_size = pm_sizet_to_u32(((
pm_lambda_node_t *)node)->locals.size);
1305 pm_buffer_append_varuint(buffer, locals_size);
1306 for (uint32_t index = 0; index < locals_size; index++) {
1307 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_lambda_node_t *)node)->locals.ids[index]));
1313 pm_buffer_append_byte(buffer, 0);
1318 pm_buffer_append_byte(buffer, 0);
1324 case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
1325 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1333 case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1334 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1343 case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1344 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1352 case PM_LOCAL_VARIABLE_READ_NODE: {
1353 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1358 case PM_LOCAL_VARIABLE_TARGET_NODE: {
1359 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1364 case PM_LOCAL_VARIABLE_WRITE_NODE: {
1365 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1373 case PM_MATCH_LAST_LINE_NODE: {
1374 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1381 case PM_MATCH_PREDICATE_NODE: {
1382 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1388 case PM_MATCH_REQUIRED_NODE: {
1389 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1395 case PM_MATCH_WRITE_NODE: {
1396 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1399 pm_buffer_append_varuint(buffer, targets_size);
1400 for (uint32_t index = 0; index < targets_size; index++) {
1405 case PM_MISSING_NODE: {
1406 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1409 case PM_MODULE_NODE: {
1410 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1411 uint32_t locals_size = pm_sizet_to_u32(((
pm_module_node_t *)node)->locals.size);
1412 pm_buffer_append_varuint(buffer, locals_size);
1413 for (uint32_t index = 0; index < locals_size; index++) {
1414 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_module_node_t *)node)->locals.ids[index]));
1416 pm_serialize_location(&((
pm_module_node_t *)node)->module_keyword_loc, buffer);
1419 pm_buffer_append_byte(buffer, 0);
1423 pm_serialize_location(&((
pm_module_node_t *)node)->end_keyword_loc, buffer);
1424 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_module_node_t *)node)->name));
1427 case PM_MULTI_TARGET_NODE: {
1428 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1430 pm_buffer_append_varuint(buffer, lefts_size);
1431 for (uint32_t index = 0; index < lefts_size; index++) {
1435 pm_buffer_append_byte(buffer, 0);
1440 pm_buffer_append_varuint(buffer, rights_size);
1441 for (uint32_t index = 0; index < rights_size; index++) {
1445 pm_buffer_append_byte(buffer, 0);
1447 pm_buffer_append_byte(buffer, 1);
1451 pm_buffer_append_byte(buffer, 0);
1453 pm_buffer_append_byte(buffer, 1);
1458 case PM_MULTI_WRITE_NODE: {
1459 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1461 pm_buffer_append_varuint(buffer, lefts_size);
1462 for (uint32_t index = 0; index < lefts_size; index++) {
1466 pm_buffer_append_byte(buffer, 0);
1471 pm_buffer_append_varuint(buffer, rights_size);
1472 for (uint32_t index = 0; index < rights_size; index++) {
1476 pm_buffer_append_byte(buffer, 0);
1478 pm_buffer_append_byte(buffer, 1);
1482 pm_buffer_append_byte(buffer, 0);
1484 pm_buffer_append_byte(buffer, 1);
1491 case PM_NEXT_NODE: {
1492 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1494 pm_buffer_append_byte(buffer, 0);
1498 pm_serialize_location(&((
pm_next_node_t *)node)->keyword_loc, buffer);
1502 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1505 case PM_NO_BLOCK_PARAMETER_NODE: {
1506 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1511 case PM_NO_KEYWORDS_PARAMETER_NODE: {
1512 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1517 case PM_NUMBERED_PARAMETERS_NODE: {
1518 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1522 case PM_NUMBERED_REFERENCE_READ_NODE: {
1523 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1527 case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
1528 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1534 case PM_OPTIONAL_PARAMETER_NODE: {
1535 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1543 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1546 pm_serialize_location(&((
pm_or_node_t *)node)->operator_loc, buffer);
1549 case PM_PARAMETERS_NODE: {
1550 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1552 pm_buffer_append_varuint(buffer, requireds_size);
1553 for (uint32_t index = 0; index < requireds_size; index++) {
1557 pm_buffer_append_varuint(buffer, optionals_size);
1558 for (uint32_t index = 0; index < optionals_size; index++) {
1562 pm_buffer_append_byte(buffer, 0);
1567 pm_buffer_append_varuint(buffer, posts_size);
1568 for (uint32_t index = 0; index < posts_size; index++) {
1572 pm_buffer_append_varuint(buffer, keywords_size);
1573 for (uint32_t index = 0; index < keywords_size; index++) {
1577 pm_buffer_append_byte(buffer, 0);
1582 pm_buffer_append_byte(buffer, 0);
1588 case PM_PARENTHESES_NODE: {
1589 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1591 pm_buffer_append_byte(buffer, 0);
1599 case PM_PINNED_EXPRESSION_NODE: {
1600 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1607 case PM_PINNED_VARIABLE_NODE: {
1608 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1613 case PM_POST_EXECUTION_NODE: {
1614 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1616 pm_buffer_append_byte(buffer, 0);
1625 case PM_PRE_EXECUTION_NODE: {
1626 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1628 pm_buffer_append_byte(buffer, 0);
1637 case PM_PROGRAM_NODE: {
1638 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1639 uint32_t locals_size = pm_sizet_to_u32(((
pm_program_node_t *)node)->locals.size);
1640 pm_buffer_append_varuint(buffer, locals_size);
1641 for (uint32_t index = 0; index < locals_size; index++) {
1642 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_program_node_t *)node)->locals.ids[index]));
1647 case PM_RANGE_NODE: {
1648 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1650 pm_buffer_append_byte(buffer, 0);
1655 pm_buffer_append_byte(buffer, 0);
1659 pm_serialize_location(&((
pm_range_node_t *)node)->operator_loc, buffer);
1662 case PM_RATIONAL_NODE: {
1663 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1668 case PM_REDO_NODE: {
1669 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1672 case PM_REGULAR_EXPRESSION_NODE: {
1673 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1680 case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
1681 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1686 case PM_REQUIRED_PARAMETER_NODE: {
1687 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1691 case PM_RESCUE_MODIFIER_NODE: {
1692 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1698 case PM_RESCUE_NODE: {
1699 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1701 uint32_t exceptions_size = pm_sizet_to_u32(((
pm_rescue_node_t *)node)->exceptions.size);
1702 pm_buffer_append_varuint(buffer, exceptions_size);
1703 for (uint32_t index = 0; index < exceptions_size; index++) {
1707 pm_buffer_append_byte(buffer, 0);
1709 pm_buffer_append_byte(buffer, 1);
1713 pm_buffer_append_byte(buffer, 0);
1718 pm_buffer_append_byte(buffer, 0);
1720 pm_buffer_append_byte(buffer, 1);
1721 pm_serialize_location(&((
pm_rescue_node_t *)node)->then_keyword_loc, buffer);
1724 pm_buffer_append_byte(buffer, 0);
1729 pm_buffer_append_byte(buffer, 0);
1735 case PM_REST_PARAMETER_NODE: {
1736 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1739 pm_buffer_append_byte(buffer, 0);
1741 pm_buffer_append_byte(buffer, 1);
1747 case PM_RETRY_NODE: {
1748 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1751 case PM_RETURN_NODE: {
1752 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1755 pm_buffer_append_byte(buffer, 0);
1761 case PM_SELF_NODE: {
1762 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1765 case PM_SHAREABLE_CONSTANT_NODE: {
1766 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1770 case PM_SINGLETON_CLASS_NODE: {
1771 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1773 pm_buffer_append_varuint(buffer, locals_size);
1774 for (uint32_t index = 0; index < locals_size; index++) {
1781 pm_buffer_append_byte(buffer, 0);
1788 case PM_SOURCE_ENCODING_NODE: {
1789 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1792 case PM_SOURCE_FILE_NODE: {
1793 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1797 case PM_SOURCE_LINE_NODE: {
1798 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1801 case PM_SPLAT_NODE: {
1802 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1803 pm_serialize_location(&((
pm_splat_node_t *)node)->operator_loc, buffer);
1805 pm_buffer_append_byte(buffer, 0);
1811 case PM_STATEMENTS_NODE: {
1812 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1814 pm_buffer_append_varuint(buffer, body_size);
1815 for (uint32_t index = 0; index < body_size; index++) {
1820 case PM_STRING_NODE: {
1821 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1823 pm_buffer_append_byte(buffer, 0);
1825 pm_buffer_append_byte(buffer, 1);
1830 pm_buffer_append_byte(buffer, 0);
1832 pm_buffer_append_byte(buffer, 1);
1835 pm_serialize_string(parser, &((
pm_string_node_t *)node)->unescaped, buffer);
1838 case PM_SUPER_NODE: {
1839 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1840 pm_serialize_location(&((
pm_super_node_t *)node)->keyword_loc, buffer);
1842 pm_buffer_append_byte(buffer, 0);
1844 pm_buffer_append_byte(buffer, 1);
1845 pm_serialize_location(&((
pm_super_node_t *)node)->lparen_loc, buffer);
1848 pm_buffer_append_byte(buffer, 0);
1853 pm_buffer_append_byte(buffer, 0);
1855 pm_buffer_append_byte(buffer, 1);
1856 pm_serialize_location(&((
pm_super_node_t *)node)->rparen_loc, buffer);
1859 pm_buffer_append_byte(buffer, 0);
1865 case PM_SYMBOL_NODE: {
1866 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1868 pm_buffer_append_byte(buffer, 0);
1870 pm_buffer_append_byte(buffer, 1);
1874 pm_buffer_append_byte(buffer, 0);
1876 pm_buffer_append_byte(buffer, 1);
1880 pm_buffer_append_byte(buffer, 0);
1882 pm_buffer_append_byte(buffer, 1);
1885 pm_serialize_string(parser, &((
pm_symbol_node_t *)node)->unescaped, buffer);
1888 case PM_TRUE_NODE: {
1889 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1892 case PM_UNDEF_NODE: {
1893 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1894 uint32_t names_size = pm_sizet_to_u32(((
pm_undef_node_t *)node)->names.size);
1895 pm_buffer_append_varuint(buffer, names_size);
1896 for (uint32_t index = 0; index < names_size; index++) {
1899 pm_serialize_location(&((
pm_undef_node_t *)node)->keyword_loc, buffer);
1902 case PM_UNLESS_NODE: {
1903 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1907 pm_buffer_append_byte(buffer, 0);
1909 pm_buffer_append_byte(buffer, 1);
1910 pm_serialize_location(&((
pm_unless_node_t *)node)->then_keyword_loc, buffer);
1913 pm_buffer_append_byte(buffer, 0);
1918 pm_buffer_append_byte(buffer, 0);
1923 pm_buffer_append_byte(buffer, 0);
1925 pm_buffer_append_byte(buffer, 1);
1926 pm_serialize_location(&((
pm_unless_node_t *)node)->end_keyword_loc, buffer);
1930 case PM_UNTIL_NODE: {
1931 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1932 pm_serialize_location(&((
pm_until_node_t *)node)->keyword_loc, buffer);
1934 pm_buffer_append_byte(buffer, 0);
1936 pm_buffer_append_byte(buffer, 1);
1937 pm_serialize_location(&((
pm_until_node_t *)node)->do_keyword_loc, buffer);
1940 pm_buffer_append_byte(buffer, 0);
1942 pm_buffer_append_byte(buffer, 1);
1943 pm_serialize_location(&((
pm_until_node_t *)node)->closing_loc, buffer);
1947 pm_buffer_append_byte(buffer, 0);
1953 case PM_WHEN_NODE: {
1954 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1955 pm_serialize_location(&((
pm_when_node_t *)node)->keyword_loc, buffer);
1956 uint32_t conditions_size = pm_sizet_to_u32(((
pm_when_node_t *)node)->conditions.size);
1957 pm_buffer_append_varuint(buffer, conditions_size);
1958 for (uint32_t index = 0; index < conditions_size; index++) {
1962 pm_buffer_append_byte(buffer, 0);
1964 pm_buffer_append_byte(buffer, 1);
1965 pm_serialize_location(&((
pm_when_node_t *)node)->then_keyword_loc, buffer);
1968 pm_buffer_append_byte(buffer, 0);
1974 case PM_WHILE_NODE: {
1975 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1976 pm_serialize_location(&((
pm_while_node_t *)node)->keyword_loc, buffer);
1978 pm_buffer_append_byte(buffer, 0);
1980 pm_buffer_append_byte(buffer, 1);
1981 pm_serialize_location(&((
pm_while_node_t *)node)->do_keyword_loc, buffer);
1984 pm_buffer_append_byte(buffer, 0);
1986 pm_buffer_append_byte(buffer, 1);
1987 pm_serialize_location(&((
pm_while_node_t *)node)->closing_loc, buffer);
1991 pm_buffer_append_byte(buffer, 0);
1997 case PM_X_STRING_NODE: {
1998 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2005 case PM_YIELD_NODE: {
2006 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
2007 pm_serialize_location(&((
pm_yield_node_t *)node)->keyword_loc, buffer);
2009 pm_buffer_append_byte(buffer, 0);
2011 pm_buffer_append_byte(buffer, 1);
2012 pm_serialize_location(&((
pm_yield_node_t *)node)->lparen_loc, buffer);
2015 pm_buffer_append_byte(buffer, 0);
2020 pm_buffer_append_byte(buffer, 0);
2022 pm_buffer_append_byte(buffer, 1);
2023 pm_serialize_location(&((
pm_yield_node_t *)node)->rparen_loc, buffer);
2032 uint32_t size = pm_sizet_to_u32(list->
size);
2033 pm_buffer_append_varuint(buffer, size);
2035 for (uint32_t i = 0; i < size; i++) {
2036 uint32_t offset = pm_sizet_to_u32(list->
offsets[i]);
2037 pm_buffer_append_varuint(buffer, offset);
2044 pm_buffer_append_byte(buffer, (uint8_t) comment->
type);
2047 pm_serialize_location(&comment->
location, buffer);
2055 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
pm_list_size(list)));
2059 pm_serialize_comment(comment, buffer);
2067 pm_buffer_append_varuint(buffer,
magic_comment->key.length);
2070 pm_buffer_append_varuint(buffer,
magic_comment->value.start);
2071 pm_buffer_append_varuint(buffer,
magic_comment->value.length);
2076 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
pm_list_size(list)));
2087 pm_buffer_append_byte(buffer, 0);
2089 pm_buffer_append_byte(buffer, 1);
2090 pm_serialize_location(&parser->
data_loc, buffer);
2097 pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->
diag_id);
2100 size_t message_length = strlen(diagnostic->
message);
2101 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(message_length));
2102 pm_buffer_append_string(buffer, diagnostic->
message, message_length);
2105 pm_serialize_location(&diagnostic->
location, buffer);
2107 pm_buffer_append_byte(buffer, diagnostic->
level);
2112 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
pm_list_size(list)));
2116 pm_serialize_diagnostic(diagnostic, buffer);
2125 size_t encoding_length = strlen(encoding->
name);
2126 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(encoding_length));
2127 pm_buffer_append_string(buffer, encoding->
name, encoding_length);
2133 pm_buffer_append_varsint(buffer, parser->
start_line);
2134 pm_serialize_line_offset_list(&parser->
line_offsets, buffer);
2137 pm_serialize_data_loc(parser, buffer);
2138 pm_serialize_diagnostic_list(&parser->
error_list, buffer);
2139 pm_serialize_diagnostic_list(&parser->
warning_list, buffer);
2142#line 271 "prism/templates/src/serialize.c.erb"
2148 pm_serialize_metadata(parser, buffer);
2152 size_t offset = buffer->
length;
2153 pm_buffer_append_zeroes(buffer, 4);
2159 pm_serialize_node(parser, node, buffer);
2163 uint32_t length = pm_sizet_to_u32(buffer->
length);
2164 memcpy(buffer->
value + offset, &length,
sizeof(uint32_t));
2175 if (bucket->
id != 0) {
2177 size_t buffer_offset = offset + ((((size_t)bucket->
id) - 1) * 8);
2185 uint32_t content_offset = pm_sizet_to_u32(buffer->
length);
2186 uint32_t owned_mask = 1U << 31;
2188 assert(content_offset < owned_mask);
2189 content_offset |= owned_mask;
2191 memcpy(buffer->
value + buffer_offset, &content_offset, 4);
2192 pm_buffer_append_bytes(buffer, constant->
start, constant->
length);
2196 uint32_t source_offset = pm_ptrdifft_to_u32(constant->
start - parser->
start);
2197 memcpy(buffer->
value + buffer_offset, &source_offset, 4);
2201 uint32_t constant_length = pm_sizet_to_u32(constant->
length);
2202 memcpy(buffer->
value + buffer_offset + 4, &constant_length, 4);
2211 pm_buffer_append_varuint(buffer, token->type);
2212 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->start - parser->
start));
2213 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
2214 pm_buffer_append_varuint(buffer, parser->
lex_state);
2223 pm_options_read(&options, data);
2229 .
data = (
void *) buffer,
2230 .callback = serialize_token,
2237 pm_buffer_append_byte(buffer, 0);
2239 pm_serialize_metadata(&parser, buffer);
2241 pm_node_destroy(&parser, node);
2253 pm_options_read(&options, data);
2259 .
data = (
void *) buffer,
2260 .callback = serialize_token,
2266 pm_buffer_append_byte(buffer, 0);
2267 pm_serialize(&parser, node, buffer);
2269 pm_node_destroy(&parser, node);
PRISM_EXPORTED_FUNCTION void pm_options_free(pm_options_t *options)
Free the internal memory associated with the options.
static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_OWNED
An owned constant is one for which memory has been allocated.
static const pm_constant_pool_bucket_type_t PM_CONSTANT_POOL_BUCKET_CONSTANT
A constant constant is known at compile time.
PRISM_EXPORTED_FUNCTION size_t pm_list_size(pm_list_t *list)
Returns the size of the list.
PRISM_EXPORTED_FUNCTION size_t pm_string_length(const pm_string_t *string)
Returns the length associated with the string.
PRISM_EXPORTED_FUNCTION const uint8_t * pm_string_source(const pm_string_t *string)
Returns the start pointer associated with the string.
#define PRISM_EXPORTED_FUNCTION
By default, we compile with -fvisibility=hidden.
PRISM_EXPORTED_FUNCTION pm_node_t * pm_parse(pm_parser_t *parser)
Parse the Ruby source associated with the given parser and return the tree.
PRISM_EXPORTED_FUNCTION void pm_parser_free(pm_parser_t *parser)
Free any memory associated with the given parser.
PRISM_EXPORTED_FUNCTION void pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const pm_options_t *options)
Initialize a parser with the given start and end pointers.
The main header file for the prism parser.
PRISM_EXPORTED_FUNCTION void pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data)
Lex the given source and serialize to the given buffer.
void pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer)
Serialize the encoding, metadata, nodes, and constant pool.
PRISM_EXPORTED_FUNCTION void pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data)
Parse and serialize both the AST and the tokens represented by the given source to the given buffer.
void pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer)
Serialize the name of the encoding to the buffer.
void pm_serialize_comment_list(pm_list_t *list, pm_buffer_t *buffer)
Serialize the given list of comments to the given buffer.
A pm_buffer_t is a simple memory buffer that stores data in a contiguous block of memory.
size_t length
The length of the buffer in bytes.
char * value
A pointer to the start of the buffer.
ClassVariableAndWriteNode.
ClassVariableOperatorWriteNode.
ClassVariableOrWriteNode.
ConstantOperatorWriteNode.
ConstantPathAndWriteNode.
ConstantPathOperatorWriteNode.
A bucket in the hash map.
unsigned int id
The incremental ID used for indexing back into the pool.
pm_constant_pool_bucket_type_t type
The type of the bucket, which determines how to free it.
uint32_t capacity
The number of buckets that have been allocated in the hash map.
pm_constant_pool_bucket_t * buckets
The buckets in the hash map.
uint32_t size
The number of buckets in the hash map.
pm_constant_t * constants
The constants that are stored in the buckets.
A constant in the pool which effectively stores a string.
size_t length
The length of the string.
const uint8_t * start
A pointer to the start of the string.
This struct represents a diagnostic generated during parsing.
pm_location_t location
The location of the diagnostic in the source.
const char * message
The message associated with the diagnostic.
pm_list_node_t node
The embedded base node.
pm_diagnostic_id_t diag_id
The ID of the diagnostic.
uint8_t level
The level of the diagnostic, see pm_error_level_t and pm_warning_level_t for possible values.
This struct defines the functions necessary to implement the encoding interface so we can determine h...
const char * name
The name of the encoding.
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.
When you are lexing through a file, the lexer needs all of the information that the parser additional...
void * data
This opaque pointer is used to provide whatever information the user deemed necessary to the callback...
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.
struct pm_list_node * next
A pointer to the next node in the list.
This represents the overall linked list.
pm_list_node_t * head
A pointer to the head of 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.
The options that can be passed to the parser.
This struct represents the overall parser.
pm_lex_state_t lex_state
The current state of the lexer.
const pm_encoding_t * encoding
The encoding functions for the current file is attached to the parser as it's parsing so that it can ...
pm_constant_pool_t constant_pool
This constant pool keeps all of the constants defined throughout the file so that we can reference th...
pm_list_t magic_comment_list
The list of magic comments that have been found while parsing.
pm_lex_callback_t * lex_callback
This is an optional callback that can be attached to the parser that will be called whenever a new to...
pm_location_t data_loc
An optional location that represents the location of the END marker and the rest of the content of th...
const uint8_t * start
The pointer to the start of the source.
pm_line_offset_list_t line_offsets
This is the list of line offsets in the source file.
pm_list_t error_list
The list of errors that have been found while parsing.
pm_list_t warning_list
The list of warnings that have been found while parsing.
int32_t start_line
The line number at the start of the parse.
pm_list_t comment_list
The list of comments that have been found while parsing.
RequiredKeywordParameterNode.
A generic string type that can have various ownership semantics.
enum pm_string_t::@105 type
The type of the string.
This struct represents a token in the Ruby source.