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 assert(location->
start);
33 assert(location->
end);
34 assert(location->
start <= location->
end);
36 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(location->
start - parser->
start));
37 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(location->
end - location->
start));
42 switch (string->
type) {
43 case PM_STRING_SHARED: {
44 pm_buffer_append_byte(buffer, 1);
45 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(pm_string_source(
string) - parser->
start));
46 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_string_length(
string)));
50 case PM_STRING_CONSTANT: {
51 uint32_t length = pm_sizet_to_u32(pm_string_length(
string));
52 pm_buffer_append_byte(buffer, 2);
53 pm_buffer_append_varuint(buffer, length);
54 pm_buffer_append_bytes(buffer, pm_string_source(
string), length);
58 case PM_STRING_MAPPED:
59 assert(
false &&
"Cannot serialize mapped strings.");
67 pm_buffer_append_byte(buffer, integer->
negative ? 1 : 0);
68 if (integer->
values == NULL) {
69 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(1));
70 pm_buffer_append_varuint(buffer, integer->
value);
72 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(integer->
length));
73 for (
size_t i = 0; i < integer->
length; i++) {
74 pm_buffer_append_varuint(buffer, integer->
values[i]);
81 pm_buffer_append_byte(buffer, (uint8_t)
PM_NODE_TYPE(node));
83 size_t offset = buffer->
length;
85 pm_buffer_append_varuint(buffer, node->
node_id);
86 pm_serialize_location(parser, &node->
location, buffer);
94 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
101 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
108 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
115 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
118 pm_serialize_location(parser, &((
pm_and_node_t *)node)->operator_loc, buffer);
122 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
124 pm_buffer_append_varuint(buffer, arguments_size);
125 for (uint32_t index = 0; index < arguments_size; index++) {
131 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
132 uint32_t elements_size = pm_sizet_to_u32(((
pm_array_node_t *)node)->elements.size);
133 pm_buffer_append_varuint(buffer, elements_size);
134 for (uint32_t index = 0; index < elements_size; index++) {
138 pm_buffer_append_byte(buffer, 0);
140 pm_buffer_append_byte(buffer, 1);
141 pm_serialize_location(parser, &((
pm_array_node_t *)node)->opening_loc, buffer);
144 pm_buffer_append_byte(buffer, 0);
146 pm_buffer_append_byte(buffer, 1);
147 pm_serialize_location(parser, &((
pm_array_node_t *)node)->closing_loc, buffer);
152 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
154 pm_buffer_append_byte(buffer, 0);
159 pm_buffer_append_varuint(buffer, requireds_size);
160 for (uint32_t index = 0; index < requireds_size; index++) {
164 pm_buffer_append_byte(buffer, 0);
169 pm_buffer_append_varuint(buffer, posts_size);
170 for (uint32_t index = 0; index < posts_size; index++) {
174 pm_buffer_append_byte(buffer, 0);
176 pm_buffer_append_byte(buffer, 1);
180 pm_buffer_append_byte(buffer, 0);
182 pm_buffer_append_byte(buffer, 1);
188 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
192 pm_buffer_append_byte(buffer, 0);
194 pm_buffer_append_byte(buffer, 1);
195 pm_serialize_location(parser, &((
pm_assoc_node_t *)node)->operator_loc, buffer);
200 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
202 pm_buffer_append_byte(buffer, 0);
210 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
215 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
217 pm_buffer_append_byte(buffer, 0);
219 pm_buffer_append_byte(buffer, 1);
220 pm_serialize_location(parser, &((
pm_begin_node_t *)node)->begin_keyword_loc, buffer);
223 pm_buffer_append_byte(buffer, 0);
228 pm_buffer_append_byte(buffer, 0);
233 pm_buffer_append_byte(buffer, 0);
238 pm_buffer_append_byte(buffer, 0);
243 pm_buffer_append_byte(buffer, 0);
245 pm_buffer_append_byte(buffer, 1);
246 pm_serialize_location(parser, &((
pm_begin_node_t *)node)->end_keyword_loc, buffer);
251 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
253 pm_buffer_append_byte(buffer, 0);
261 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
266 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
267 uint32_t locals_size = pm_sizet_to_u32(((
pm_block_node_t *)node)->locals.size);
268 pm_buffer_append_varuint(buffer, locals_size);
269 for (uint32_t index = 0; index < locals_size; index++) {
270 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_block_node_t *)node)->locals.ids[index]));
273 pm_buffer_append_byte(buffer, 0);
278 pm_buffer_append_byte(buffer, 0);
282 pm_serialize_location(parser, &((
pm_block_node_t *)node)->opening_loc, buffer);
283 pm_serialize_location(parser, &((
pm_block_node_t *)node)->closing_loc, buffer);
287 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
290 pm_buffer_append_byte(buffer, 0);
292 pm_buffer_append_byte(buffer, 1);
299 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
301 pm_buffer_append_byte(buffer, 0);
306 pm_buffer_append_varuint(buffer, locals_size);
307 for (uint32_t index = 0; index < locals_size; index++) {
311 pm_buffer_append_byte(buffer, 0);
313 pm_buffer_append_byte(buffer, 1);
317 pm_buffer_append_byte(buffer, 0);
319 pm_buffer_append_byte(buffer, 1);
325 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
327 pm_buffer_append_byte(buffer, 0);
331 pm_serialize_location(parser, &((
pm_break_node_t *)node)->keyword_loc, buffer);
335 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
337 pm_buffer_append_byte(buffer, 0);
342 pm_buffer_append_byte(buffer, 0);
344 pm_buffer_append_byte(buffer, 1);
348 pm_buffer_append_byte(buffer, 0);
350 pm_buffer_append_byte(buffer, 1);
360 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
362 pm_buffer_append_byte(buffer, 0);
367 pm_buffer_append_byte(buffer, 0);
369 pm_buffer_append_byte(buffer, 1);
370 pm_serialize_location(parser, &((
pm_call_node_t *)node)->call_operator_loc, buffer);
372 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_call_node_t *)node)->name));
374 pm_buffer_append_byte(buffer, 0);
376 pm_buffer_append_byte(buffer, 1);
377 pm_serialize_location(parser, &((
pm_call_node_t *)node)->message_loc, buffer);
380 pm_buffer_append_byte(buffer, 0);
382 pm_buffer_append_byte(buffer, 1);
383 pm_serialize_location(parser, &((
pm_call_node_t *)node)->opening_loc, buffer);
386 pm_buffer_append_byte(buffer, 0);
391 pm_buffer_append_byte(buffer, 0);
393 pm_buffer_append_byte(buffer, 1);
394 pm_serialize_location(parser, &((
pm_call_node_t *)node)->closing_loc, buffer);
397 pm_buffer_append_byte(buffer, 0);
404 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
406 pm_buffer_append_byte(buffer, 0);
411 pm_buffer_append_byte(buffer, 0);
413 pm_buffer_append_byte(buffer, 1);
417 pm_buffer_append_byte(buffer, 0);
419 pm_buffer_append_byte(buffer, 1);
430 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
432 pm_buffer_append_byte(buffer, 0);
437 pm_buffer_append_byte(buffer, 0);
439 pm_buffer_append_byte(buffer, 1);
443 pm_buffer_append_byte(buffer, 0);
445 pm_buffer_append_byte(buffer, 1);
455 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
463 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
470 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
472 pm_buffer_append_byte(buffer, 0);
477 pm_buffer_append_varuint(buffer, conditions_size);
478 for (uint32_t index = 0; index < conditions_size; index++) {
482 pm_buffer_append_byte(buffer, 0);
491 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
493 pm_buffer_append_byte(buffer, 0);
497 uint32_t conditions_size = pm_sizet_to_u32(((
pm_case_node_t *)node)->conditions.size);
498 pm_buffer_append_varuint(buffer, conditions_size);
499 for (uint32_t index = 0; index < conditions_size; index++) {
503 pm_buffer_append_byte(buffer, 0);
507 pm_serialize_location(parser, &((
pm_case_node_t *)node)->case_keyword_loc, buffer);
508 pm_serialize_location(parser, &((
pm_case_node_t *)node)->end_keyword_loc, buffer);
512 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
513 uint32_t locals_size = pm_sizet_to_u32(((
pm_class_node_t *)node)->locals.size);
514 pm_buffer_append_varuint(buffer, locals_size);
515 for (uint32_t index = 0; index < locals_size; index++) {
516 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_class_node_t *)node)->locals.ids[index]));
518 pm_serialize_location(parser, &((
pm_class_node_t *)node)->class_keyword_loc, buffer);
520 if (((
pm_class_node_t *)node)->inheritance_operator_loc.start == NULL) {
521 pm_buffer_append_byte(buffer, 0);
523 pm_buffer_append_byte(buffer, 1);
524 pm_serialize_location(parser, &((
pm_class_node_t *)node)->inheritance_operator_loc, buffer);
527 pm_buffer_append_byte(buffer, 0);
532 pm_buffer_append_byte(buffer, 0);
536 pm_serialize_location(parser, &((
pm_class_node_t *)node)->end_keyword_loc, buffer);
537 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_class_node_t *)node)->name));
541 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
549 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
558 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
566 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
571 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
576 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
584 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
592 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
601 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
609 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
616 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
618 pm_buffer_append_byte(buffer, 0);
628 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
636 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
643 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
645 pm_buffer_append_byte(buffer, 0);
655 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
662 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
667 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
672 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
682 size_t length_offset = buffer->
length;
683 pm_buffer_append_string(buffer,
"\0\0\0\0", 4);
684 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
685 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_def_node_t *)node)->name));
686 pm_serialize_location(parser, &((
pm_def_node_t *)node)->name_loc, buffer);
688 pm_buffer_append_byte(buffer, 0);
693 pm_buffer_append_byte(buffer, 0);
698 pm_buffer_append_byte(buffer, 0);
702 uint32_t locals_size = pm_sizet_to_u32(((
pm_def_node_t *)node)->locals.size);
703 pm_buffer_append_varuint(buffer, locals_size);
704 for (uint32_t index = 0; index < locals_size; index++) {
705 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_def_node_t *)node)->locals.ids[index]));
707 pm_serialize_location(parser, &((
pm_def_node_t *)node)->def_keyword_loc, buffer);
709 pm_buffer_append_byte(buffer, 0);
711 pm_buffer_append_byte(buffer, 1);
712 pm_serialize_location(parser, &((
pm_def_node_t *)node)->operator_loc, buffer);
715 pm_buffer_append_byte(buffer, 0);
717 pm_buffer_append_byte(buffer, 1);
718 pm_serialize_location(parser, &((
pm_def_node_t *)node)->lparen_loc, buffer);
721 pm_buffer_append_byte(buffer, 0);
723 pm_buffer_append_byte(buffer, 1);
724 pm_serialize_location(parser, &((
pm_def_node_t *)node)->rparen_loc, buffer);
727 pm_buffer_append_byte(buffer, 0);
729 pm_buffer_append_byte(buffer, 1);
730 pm_serialize_location(parser, &((
pm_def_node_t *)node)->equal_loc, buffer);
732 if (((
pm_def_node_t *)node)->end_keyword_loc.start == NULL) {
733 pm_buffer_append_byte(buffer, 0);
735 pm_buffer_append_byte(buffer, 1);
736 pm_serialize_location(parser, &((
pm_def_node_t *)node)->end_keyword_loc, buffer);
739 uint32_t length = pm_sizet_to_u32(buffer->
length - offset -
sizeof(uint32_t));
740 memcpy(buffer->
value + length_offset, &length,
sizeof(uint32_t));
744 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
746 pm_buffer_append_byte(buffer, 0);
748 pm_buffer_append_byte(buffer, 1);
753 pm_buffer_append_byte(buffer, 0);
755 pm_buffer_append_byte(buffer, 1);
758 pm_serialize_location(parser, &((
pm_defined_node_t *)node)->keyword_loc, buffer);
762 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
763 pm_serialize_location(parser, &((
pm_else_node_t *)node)->else_keyword_loc, buffer);
765 pm_buffer_append_byte(buffer, 0);
770 pm_buffer_append_byte(buffer, 0);
772 pm_buffer_append_byte(buffer, 1);
773 pm_serialize_location(parser, &((
pm_else_node_t *)node)->end_keyword_loc, buffer);
778 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
781 pm_buffer_append_byte(buffer, 0);
789 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
795 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
796 pm_serialize_location(parser, &((
pm_ensure_node_t *)node)->ensure_keyword_loc, buffer);
798 pm_buffer_append_byte(buffer, 0);
802 pm_serialize_location(parser, &((
pm_ensure_node_t *)node)->end_keyword_loc, buffer);
806 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
810 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
812 pm_buffer_append_byte(buffer, 0);
818 pm_buffer_append_varuint(buffer, requireds_size);
819 for (uint32_t index = 0; index < requireds_size; index++) {
824 pm_buffer_append_byte(buffer, 0);
826 pm_buffer_append_byte(buffer, 1);
830 pm_buffer_append_byte(buffer, 0);
832 pm_buffer_append_byte(buffer, 1);
838 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
840 pm_buffer_append_byte(buffer, 0);
845 pm_buffer_append_byte(buffer, 0);
853 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
858 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
862 pm_buffer_append_byte(buffer, 0);
866 pm_serialize_location(parser, &((
pm_for_node_t *)node)->for_keyword_loc, buffer);
867 pm_serialize_location(parser, &((
pm_for_node_t *)node)->in_keyword_loc, buffer);
869 pm_buffer_append_byte(buffer, 0);
871 pm_buffer_append_byte(buffer, 1);
872 pm_serialize_location(parser, &((
pm_for_node_t *)node)->do_keyword_loc, buffer);
874 pm_serialize_location(parser, &((
pm_for_node_t *)node)->end_keyword_loc, buffer);
878 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
882 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
886 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
888 pm_buffer_append_byte(buffer, 0);
895 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
903 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
912 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
920 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
925 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
930 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
938 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
939 pm_serialize_location(parser, &((
pm_hash_node_t *)node)->opening_loc, buffer);
940 uint32_t elements_size = pm_sizet_to_u32(((
pm_hash_node_t *)node)->elements.size);
941 pm_buffer_append_varuint(buffer, elements_size);
942 for (uint32_t index = 0; index < elements_size; index++) {
945 pm_serialize_location(parser, &((
pm_hash_node_t *)node)->closing_loc, buffer);
949 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
951 pm_buffer_append_byte(buffer, 0);
956 pm_buffer_append_varuint(buffer, elements_size);
957 for (uint32_t index = 0; index < elements_size; index++) {
961 pm_buffer_append_byte(buffer, 0);
966 pm_buffer_append_byte(buffer, 0);
968 pm_buffer_append_byte(buffer, 1);
972 pm_buffer_append_byte(buffer, 0);
974 pm_buffer_append_byte(buffer, 1);
980 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
981 if (((
pm_if_node_t *)node)->if_keyword_loc.start == NULL) {
982 pm_buffer_append_byte(buffer, 0);
984 pm_buffer_append_byte(buffer, 1);
985 pm_serialize_location(parser, &((
pm_if_node_t *)node)->if_keyword_loc, buffer);
988 if (((
pm_if_node_t *)node)->then_keyword_loc.start == NULL) {
989 pm_buffer_append_byte(buffer, 0);
991 pm_buffer_append_byte(buffer, 1);
992 pm_serialize_location(parser, &((
pm_if_node_t *)node)->then_keyword_loc, buffer);
995 pm_buffer_append_byte(buffer, 0);
1000 pm_buffer_append_byte(buffer, 0);
1004 if (((
pm_if_node_t *)node)->end_keyword_loc.start == NULL) {
1005 pm_buffer_append_byte(buffer, 0);
1007 pm_buffer_append_byte(buffer, 1);
1008 pm_serialize_location(parser, &((
pm_if_node_t *)node)->end_keyword_loc, buffer);
1013 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1018 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1023 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1027 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1030 pm_buffer_append_byte(buffer, 0);
1034 pm_serialize_location(parser, &((
pm_in_node_t *)node)->in_loc, buffer);
1036 pm_buffer_append_byte(buffer, 0);
1038 pm_buffer_append_byte(buffer, 1);
1039 pm_serialize_location(parser, &((
pm_in_node_t *)node)->then_loc, buffer);
1044 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1046 pm_buffer_append_byte(buffer, 0);
1051 pm_buffer_append_byte(buffer, 0);
1053 pm_buffer_append_byte(buffer, 1);
1058 pm_buffer_append_byte(buffer, 0);
1064 pm_buffer_append_byte(buffer, 0);
1073 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1075 pm_buffer_append_byte(buffer, 0);
1080 pm_buffer_append_byte(buffer, 0);
1082 pm_buffer_append_byte(buffer, 1);
1087 pm_buffer_append_byte(buffer, 0);
1093 pm_buffer_append_byte(buffer, 0);
1103 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1105 pm_buffer_append_byte(buffer, 0);
1110 pm_buffer_append_byte(buffer, 0);
1112 pm_buffer_append_byte(buffer, 1);
1117 pm_buffer_append_byte(buffer, 0);
1123 pm_buffer_append_byte(buffer, 0);
1132 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1136 pm_buffer_append_byte(buffer, 0);
1142 pm_buffer_append_byte(buffer, 0);
1149 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1157 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1166 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1174 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1179 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1184 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1192 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1197 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1200 pm_buffer_append_varuint(buffer, parts_size);
1201 for (uint32_t index = 0; index < parts_size; index++) {
1208 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1211 pm_buffer_append_varuint(buffer, parts_size);
1212 for (uint32_t index = 0; index < parts_size; index++) {
1219 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1221 pm_buffer_append_byte(buffer, 0);
1223 pm_buffer_append_byte(buffer, 1);
1227 pm_buffer_append_varuint(buffer, parts_size);
1228 for (uint32_t index = 0; index < parts_size; index++) {
1232 pm_buffer_append_byte(buffer, 0);
1234 pm_buffer_append_byte(buffer, 1);
1240 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1242 pm_buffer_append_byte(buffer, 0);
1244 pm_buffer_append_byte(buffer, 1);
1248 pm_buffer_append_varuint(buffer, parts_size);
1249 for (uint32_t index = 0; index < parts_size; index++) {
1253 pm_buffer_append_byte(buffer, 0);
1255 pm_buffer_append_byte(buffer, 1);
1261 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1264 pm_buffer_append_varuint(buffer, parts_size);
1265 for (uint32_t index = 0; index < parts_size; index++) {
1272 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1276 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1280 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1282 pm_buffer_append_varuint(buffer, elements_size);
1283 for (uint32_t index = 0; index < elements_size; index++) {
1289 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1292 pm_buffer_append_byte(buffer, 0);
1294 pm_buffer_append_byte(buffer, 1);
1301 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1302 uint32_t locals_size = pm_sizet_to_u32(((
pm_lambda_node_t *)node)->locals.size);
1303 pm_buffer_append_varuint(buffer, locals_size);
1304 for (uint32_t index = 0; index < locals_size; index++) {
1305 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_lambda_node_t *)node)->locals.ids[index]));
1307 pm_serialize_location(parser, &((
pm_lambda_node_t *)node)->operator_loc, buffer);
1308 pm_serialize_location(parser, &((
pm_lambda_node_t *)node)->opening_loc, buffer);
1309 pm_serialize_location(parser, &((
pm_lambda_node_t *)node)->closing_loc, buffer);
1311 pm_buffer_append_byte(buffer, 0);
1316 pm_buffer_append_byte(buffer, 0);
1323 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1332 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1342 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1351 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1357 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1363 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1372 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1380 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1387 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1394 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1397 pm_buffer_append_varuint(buffer, targets_size);
1398 for (uint32_t index = 0; index < targets_size; index++) {
1404 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1408 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1409 uint32_t locals_size = pm_sizet_to_u32(((
pm_module_node_t *)node)->locals.size);
1410 pm_buffer_append_varuint(buffer, locals_size);
1411 for (uint32_t index = 0; index < locals_size; index++) {
1412 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_module_node_t *)node)->locals.ids[index]));
1414 pm_serialize_location(parser, &((
pm_module_node_t *)node)->module_keyword_loc, buffer);
1417 pm_buffer_append_byte(buffer, 0);
1421 pm_serialize_location(parser, &((
pm_module_node_t *)node)->end_keyword_loc, buffer);
1422 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_module_node_t *)node)->name));
1426 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1428 pm_buffer_append_varuint(buffer, lefts_size);
1429 for (uint32_t index = 0; index < lefts_size; index++) {
1433 pm_buffer_append_byte(buffer, 0);
1438 pm_buffer_append_varuint(buffer, rights_size);
1439 for (uint32_t index = 0; index < rights_size; index++) {
1443 pm_buffer_append_byte(buffer, 0);
1445 pm_buffer_append_byte(buffer, 1);
1449 pm_buffer_append_byte(buffer, 0);
1451 pm_buffer_append_byte(buffer, 1);
1457 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1459 pm_buffer_append_varuint(buffer, lefts_size);
1460 for (uint32_t index = 0; index < lefts_size; index++) {
1464 pm_buffer_append_byte(buffer, 0);
1469 pm_buffer_append_varuint(buffer, rights_size);
1470 for (uint32_t index = 0; index < rights_size; index++) {
1474 pm_buffer_append_byte(buffer, 0);
1476 pm_buffer_append_byte(buffer, 1);
1480 pm_buffer_append_byte(buffer, 0);
1482 pm_buffer_append_byte(buffer, 1);
1490 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1492 pm_buffer_append_byte(buffer, 0);
1496 pm_serialize_location(parser, &((
pm_next_node_t *)node)->keyword_loc, buffer);
1500 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1504 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1510 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1515 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1520 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1527 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1535 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1538 pm_serialize_location(parser, &((
pm_or_node_t *)node)->operator_loc, buffer);
1542 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1544 pm_buffer_append_varuint(buffer, requireds_size);
1545 for (uint32_t index = 0; index < requireds_size; index++) {
1549 pm_buffer_append_varuint(buffer, optionals_size);
1550 for (uint32_t index = 0; index < optionals_size; index++) {
1554 pm_buffer_append_byte(buffer, 0);
1559 pm_buffer_append_varuint(buffer, posts_size);
1560 for (uint32_t index = 0; index < posts_size; index++) {
1564 pm_buffer_append_varuint(buffer, keywords_size);
1565 for (uint32_t index = 0; index < keywords_size; index++) {
1569 pm_buffer_append_byte(buffer, 0);
1574 pm_buffer_append_byte(buffer, 0);
1581 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1583 pm_buffer_append_byte(buffer, 0);
1592 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1600 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1606 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1608 pm_buffer_append_byte(buffer, 0);
1618 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1620 pm_buffer_append_byte(buffer, 0);
1630 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1631 uint32_t locals_size = pm_sizet_to_u32(((
pm_program_node_t *)node)->locals.size);
1632 pm_buffer_append_varuint(buffer, locals_size);
1633 for (uint32_t index = 0; index < locals_size; index++) {
1634 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(((
pm_program_node_t *)node)->locals.ids[index]));
1640 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1642 pm_buffer_append_byte(buffer, 0);
1647 pm_buffer_append_byte(buffer, 0);
1651 pm_serialize_location(parser, &((
pm_range_node_t *)node)->operator_loc, buffer);
1655 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1661 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1665 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1673 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1679 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1684 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1691 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1692 pm_serialize_location(parser, &((
pm_rescue_node_t *)node)->keyword_loc, buffer);
1693 uint32_t exceptions_size = pm_sizet_to_u32(((
pm_rescue_node_t *)node)->exceptions.size);
1694 pm_buffer_append_varuint(buffer, exceptions_size);
1695 for (uint32_t index = 0; index < exceptions_size; index++) {
1699 pm_buffer_append_byte(buffer, 0);
1701 pm_buffer_append_byte(buffer, 1);
1702 pm_serialize_location(parser, &((
pm_rescue_node_t *)node)->operator_loc, buffer);
1705 pm_buffer_append_byte(buffer, 0);
1710 pm_buffer_append_byte(buffer, 0);
1715 pm_buffer_append_byte(buffer, 0);
1722 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1725 pm_buffer_append_byte(buffer, 0);
1727 pm_buffer_append_byte(buffer, 1);
1734 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1738 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1739 pm_serialize_location(parser, &((
pm_return_node_t *)node)->keyword_loc, buffer);
1741 pm_buffer_append_byte(buffer, 0);
1748 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1752 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1757 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1759 pm_buffer_append_varuint(buffer, locals_size);
1760 for (uint32_t index = 0; index < locals_size; index++) {
1767 pm_buffer_append_byte(buffer, 0);
1775 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1779 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1784 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1788 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1789 pm_serialize_location(parser, &((
pm_splat_node_t *)node)->operator_loc, buffer);
1791 pm_buffer_append_byte(buffer, 0);
1798 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1800 pm_buffer_append_varuint(buffer, body_size);
1801 for (uint32_t index = 0; index < body_size; index++) {
1807 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1809 pm_buffer_append_byte(buffer, 0);
1811 pm_buffer_append_byte(buffer, 1);
1812 pm_serialize_location(parser, &((
pm_string_node_t *)node)->opening_loc, buffer);
1814 pm_serialize_location(parser, &((
pm_string_node_t *)node)->content_loc, buffer);
1816 pm_buffer_append_byte(buffer, 0);
1818 pm_buffer_append_byte(buffer, 1);
1819 pm_serialize_location(parser, &((
pm_string_node_t *)node)->closing_loc, buffer);
1821 pm_serialize_string(parser, &((
pm_string_node_t *)node)->unescaped, buffer);
1825 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1826 pm_serialize_location(parser, &((
pm_super_node_t *)node)->keyword_loc, buffer);
1828 pm_buffer_append_byte(buffer, 0);
1830 pm_buffer_append_byte(buffer, 1);
1831 pm_serialize_location(parser, &((
pm_super_node_t *)node)->lparen_loc, buffer);
1834 pm_buffer_append_byte(buffer, 0);
1839 pm_buffer_append_byte(buffer, 0);
1841 pm_buffer_append_byte(buffer, 1);
1842 pm_serialize_location(parser, &((
pm_super_node_t *)node)->rparen_loc, buffer);
1845 pm_buffer_append_byte(buffer, 0);
1852 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1854 pm_buffer_append_byte(buffer, 0);
1856 pm_buffer_append_byte(buffer, 1);
1857 pm_serialize_location(parser, &((
pm_symbol_node_t *)node)->opening_loc, buffer);
1860 pm_buffer_append_byte(buffer, 0);
1862 pm_buffer_append_byte(buffer, 1);
1863 pm_serialize_location(parser, &((
pm_symbol_node_t *)node)->value_loc, buffer);
1866 pm_buffer_append_byte(buffer, 0);
1868 pm_buffer_append_byte(buffer, 1);
1869 pm_serialize_location(parser, &((
pm_symbol_node_t *)node)->closing_loc, buffer);
1871 pm_serialize_string(parser, &((
pm_symbol_node_t *)node)->unescaped, buffer);
1875 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1879 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1880 uint32_t names_size = pm_sizet_to_u32(((
pm_undef_node_t *)node)->names.size);
1881 pm_buffer_append_varuint(buffer, names_size);
1882 for (uint32_t index = 0; index < names_size; index++) {
1885 pm_serialize_location(parser, &((
pm_undef_node_t *)node)->keyword_loc, buffer);
1889 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1890 pm_serialize_location(parser, &((
pm_unless_node_t *)node)->keyword_loc, buffer);
1893 pm_buffer_append_byte(buffer, 0);
1895 pm_buffer_append_byte(buffer, 1);
1896 pm_serialize_location(parser, &((
pm_unless_node_t *)node)->then_keyword_loc, buffer);
1899 pm_buffer_append_byte(buffer, 0);
1904 pm_buffer_append_byte(buffer, 0);
1909 pm_buffer_append_byte(buffer, 0);
1911 pm_buffer_append_byte(buffer, 1);
1912 pm_serialize_location(parser, &((
pm_unless_node_t *)node)->end_keyword_loc, buffer);
1917 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1918 pm_serialize_location(parser, &((
pm_until_node_t *)node)->keyword_loc, buffer);
1920 pm_buffer_append_byte(buffer, 0);
1922 pm_buffer_append_byte(buffer, 1);
1923 pm_serialize_location(parser, &((
pm_until_node_t *)node)->do_keyword_loc, buffer);
1926 pm_buffer_append_byte(buffer, 0);
1928 pm_buffer_append_byte(buffer, 1);
1929 pm_serialize_location(parser, &((
pm_until_node_t *)node)->closing_loc, buffer);
1933 pm_buffer_append_byte(buffer, 0);
1940 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1941 pm_serialize_location(parser, &((
pm_when_node_t *)node)->keyword_loc, buffer);
1942 uint32_t conditions_size = pm_sizet_to_u32(((
pm_when_node_t *)node)->conditions.size);
1943 pm_buffer_append_varuint(buffer, conditions_size);
1944 for (uint32_t index = 0; index < conditions_size; index++) {
1948 pm_buffer_append_byte(buffer, 0);
1950 pm_buffer_append_byte(buffer, 1);
1951 pm_serialize_location(parser, &((
pm_when_node_t *)node)->then_keyword_loc, buffer);
1954 pm_buffer_append_byte(buffer, 0);
1961 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1962 pm_serialize_location(parser, &((
pm_while_node_t *)node)->keyword_loc, buffer);
1964 pm_buffer_append_byte(buffer, 0);
1966 pm_buffer_append_byte(buffer, 1);
1967 pm_serialize_location(parser, &((
pm_while_node_t *)node)->do_keyword_loc, buffer);
1970 pm_buffer_append_byte(buffer, 0);
1972 pm_buffer_append_byte(buffer, 1);
1973 pm_serialize_location(parser, &((
pm_while_node_t *)node)->closing_loc, buffer);
1977 pm_buffer_append_byte(buffer, 0);
1984 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1992 pm_buffer_append_varuint(buffer, (uint32_t) node->
flags);
1993 pm_serialize_location(parser, &((
pm_yield_node_t *)node)->keyword_loc, buffer);
1995 pm_buffer_append_byte(buffer, 0);
1997 pm_buffer_append_byte(buffer, 1);
1998 pm_serialize_location(parser, &((
pm_yield_node_t *)node)->lparen_loc, buffer);
2001 pm_buffer_append_byte(buffer, 0);
2006 pm_buffer_append_byte(buffer, 0);
2008 pm_buffer_append_byte(buffer, 1);
2009 pm_serialize_location(parser, &((
pm_yield_node_t *)node)->rparen_loc, buffer);
2018 uint32_t size = pm_sizet_to_u32(list->
size);
2019 pm_buffer_append_varuint(buffer, size);
2021 for (uint32_t i = 0; i < size; i++) {
2022 uint32_t offset = pm_sizet_to_u32(list->
offsets[i]);
2023 pm_buffer_append_varuint(buffer, offset);
2030 pm_buffer_append_byte(buffer, (uint8_t) comment->
type);
2033 pm_serialize_location(parser, &comment->
location, buffer);
2041 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2045 pm_serialize_comment(parser, comment, buffer);
2052 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(
magic_comment->key_start - parser->
start));
2053 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
magic_comment->key_length));
2056 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(
magic_comment->value_start - parser->
start));
2057 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(
magic_comment->value_length));
2062 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2073 pm_buffer_append_byte(buffer, 0);
2075 pm_buffer_append_byte(buffer, 1);
2076 pm_serialize_location(parser, &parser->
data_loc, buffer);
2083 pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->
diag_id);
2086 size_t message_length = strlen(diagnostic->
message);
2087 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(message_length));
2088 pm_buffer_append_string(buffer, diagnostic->
message, message_length);
2091 pm_serialize_location(parser, &diagnostic->
location, buffer);
2093 pm_buffer_append_byte(buffer, diagnostic->
level);
2098 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2102 pm_serialize_diagnostic(parser, diagnostic, buffer);
2111 size_t encoding_length = strlen(encoding->
name);
2112 pm_buffer_append_varuint(buffer, pm_sizet_to_u32(encoding_length));
2113 pm_buffer_append_string(buffer, encoding->
name, encoding_length);
2119 pm_buffer_append_varsint(buffer, parser->
start_line);
2120 pm_serialize_newline_list(&parser->
newline_list, buffer);
2123 pm_serialize_data_loc(parser, buffer);
2124 pm_serialize_diagnostic_list(parser, &parser->
error_list, buffer);
2125 pm_serialize_diagnostic_list(parser, &parser->
warning_list, buffer);
2128#line 275 "prism/templates/src/serialize.c.erb"
2134 pm_serialize_metadata(parser, buffer);
2138 size_t offset = buffer->
length;
2139 pm_buffer_append_zeroes(buffer, 4);
2145 pm_serialize_node(parser, node, buffer);
2149 uint32_t length = pm_sizet_to_u32(buffer->
length);
2150 memcpy(buffer->
value + offset, &length,
sizeof(uint32_t));
2161 if (bucket->
id != 0) {
2163 size_t buffer_offset = offset + ((((size_t)bucket->
id) - 1) * 8);
2171 uint32_t content_offset = pm_sizet_to_u32(buffer->
length);
2172 uint32_t owned_mask = (uint32_t) (1 << 31);
2174 assert(content_offset < owned_mask);
2175 content_offset |= owned_mask;
2177 memcpy(buffer->
value + buffer_offset, &content_offset, 4);
2178 pm_buffer_append_bytes(buffer, constant->
start, constant->
length);
2182 uint32_t source_offset = pm_ptrdifft_to_u32(constant->
start - parser->
start);
2183 memcpy(buffer->
value + buffer_offset, &source_offset, 4);
2187 uint32_t constant_length = pm_sizet_to_u32(constant->
length);
2188 memcpy(buffer->
value + buffer_offset + 4, &constant_length, 4);
2197 pm_buffer_append_varuint(buffer, token->type);
2198 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->start - parser->
start));
2199 pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
2200 pm_buffer_append_varuint(buffer, parser->
lex_state);
2209 pm_options_read(&options, data);
2212 pm_parser_init(&parser, source, size, &options);
2215 .
data = (
void *) buffer,
2216 .callback = serialize_token,
2223 pm_buffer_append_byte(buffer, 0);
2225 pm_serialize_metadata(&parser, buffer);
2227 pm_node_destroy(&parser, node);
2228 pm_parser_free(&parser);
2229 pm_options_free(&options);
2239 pm_options_read(&options, data);
2242 pm_parser_init(&parser, source, size, &options);
2245 .
data = (
void *) buffer,
2246 .callback = serialize_token,
2252 pm_buffer_append_byte(buffer, 0);
2253 pm_serialize(&parser, node, buffer);
2255 pm_node_destroy(&parser, node);
2256 pm_parser_free(&parser);
2257 pm_options_free(&options);
@ PM_DEFINED_NODE
DefinedNode.
@ PM_PRE_EXECUTION_NODE
PreExecutionNode.
@ PM_RETRY_NODE
RetryNode.
@ PM_CONSTANT_PATH_WRITE_NODE
ConstantPathWriteNode.
@ PM_INDEX_AND_WRITE_NODE
IndexAndWriteNode.
@ PM_SOURCE_LINE_NODE
SourceLineNode.
@ PM_UNLESS_NODE
UnlessNode.
@ PM_EMBEDDED_VARIABLE_NODE
EmbeddedVariableNode.
@ PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE
GlobalVariableOperatorWriteNode.
@ PM_GLOBAL_VARIABLE_READ_NODE
GlobalVariableReadNode.
@ PM_RATIONAL_NODE
RationalNode.
@ PM_YIELD_NODE
YieldNode.
@ PM_LOCAL_VARIABLE_AND_WRITE_NODE
LocalVariableAndWriteNode.
@ PM_CONSTANT_AND_WRITE_NODE
ConstantAndWriteNode.
@ PM_CLASS_NODE
ClassNode.
@ PM_FIND_PATTERN_NODE
FindPatternNode.
@ PM_CALL_OPERATOR_WRITE_NODE
CallOperatorWriteNode.
@ PM_MATCH_WRITE_NODE
MatchWriteNode.
@ PM_ARRAY_NODE
ArrayNode.
@ PM_CONSTANT_PATH_TARGET_NODE
ConstantPathTargetNode.
@ PM_PROGRAM_NODE
ProgramNode.
@ PM_MULTI_WRITE_NODE
MultiWriteNode.
@ PM_IMPLICIT_NODE
ImplicitNode.
@ PM_ARGUMENTS_NODE
ArgumentsNode.
@ PM_FORWARDING_SUPER_NODE
ForwardingSuperNode.
@ PM_WHILE_NODE
WhileNode.
@ PM_INTERPOLATED_STRING_NODE
InterpolatedStringNode.
@ PM_FALSE_NODE
FalseNode.
@ PM_FORWARDING_PARAMETER_NODE
ForwardingParameterNode.
@ PM_BLOCK_LOCAL_VARIABLE_NODE
BlockLocalVariableNode.
@ PM_UNTIL_NODE
UntilNode.
@ PM_MATCH_PREDICATE_NODE
MatchPredicateNode.
@ PM_X_STRING_NODE
XStringNode.
@ PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE
LocalVariableOperatorWriteNode.
@ PM_LOCAL_VARIABLE_OR_WRITE_NODE
LocalVariableOrWriteNode.
@ PM_INSTANCE_VARIABLE_AND_WRITE_NODE
InstanceVariableAndWriteNode.
@ PM_GLOBAL_VARIABLE_TARGET_NODE
GlobalVariableTargetNode.
@ PM_CONSTANT_TARGET_NODE
ConstantTargetNode.
@ PM_IT_LOCAL_VARIABLE_READ_NODE
ItLocalVariableReadNode.
@ PM_CONSTANT_PATH_AND_WRITE_NODE
ConstantPathAndWriteNode.
@ PM_BLOCK_PARAMETER_NODE
BlockParameterNode.
@ PM_CAPTURE_PATTERN_NODE
CapturePatternNode.
@ PM_SOURCE_FILE_NODE
SourceFileNode.
@ PM_NO_KEYWORDS_PARAMETER_NODE
NoKeywordsParameterNode.
@ PM_CONSTANT_PATH_OPERATOR_WRITE_NODE
ConstantPathOperatorWriteNode.
@ PM_MULTI_TARGET_NODE
MultiTargetNode.
@ PM_SPLAT_NODE
SplatNode.
@ PM_LAMBDA_NODE
LambdaNode.
@ PM_CLASS_VARIABLE_READ_NODE
ClassVariableReadNode.
@ PM_REQUIRED_KEYWORD_PARAMETER_NODE
RequiredKeywordParameterNode.
@ PM_CALL_TARGET_NODE
CallTargetNode.
@ PM_INTERPOLATED_MATCH_LAST_LINE_NODE
InterpolatedMatchLastLineNode.
@ PM_NUMBERED_PARAMETERS_NODE
NumberedParametersNode.
@ PM_SYMBOL_NODE
SymbolNode.
@ PM_RESCUE_MODIFIER_NODE
RescueModifierNode.
@ PM_ALIAS_METHOD_NODE
AliasMethodNode.
@ PM_MATCH_REQUIRED_NODE
MatchRequiredNode.
@ PM_FORWARDING_ARGUMENTS_NODE
ForwardingArgumentsNode.
@ PM_BACK_REFERENCE_READ_NODE
BackReferenceReadNode.
@ PM_SCOPE_NODE
A special kind of node used for compilation.
@ PM_BLOCK_ARGUMENT_NODE
BlockArgumentNode.
@ PM_MISSING_NODE
MissingNode.
@ PM_IMPLICIT_REST_NODE
ImplicitRestNode.
@ PM_ASSOC_SPLAT_NODE
AssocSplatNode.
@ PM_CLASS_VARIABLE_AND_WRITE_NODE
ClassVariableAndWriteNode.
@ PM_RANGE_NODE
RangeNode.
@ PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE
InstanceVariableOperatorWriteNode.
@ PM_LOCAL_VARIABLE_READ_NODE
LocalVariableReadNode.
@ PM_SHAREABLE_CONSTANT_NODE
ShareableConstantNode.
@ PM_INSTANCE_VARIABLE_OR_WRITE_NODE
InstanceVariableOrWriteNode.
@ PM_REGULAR_EXPRESSION_NODE
RegularExpressionNode.
@ PM_CLASS_VARIABLE_OR_WRITE_NODE
ClassVariableOrWriteNode.
@ PM_BLOCK_PARAMETERS_NODE
BlockParametersNode.
@ PM_CONSTANT_WRITE_NODE
ConstantWriteNode.
@ PM_HASH_PATTERN_NODE
HashPatternNode.
@ PM_INDEX_OPERATOR_WRITE_NODE
IndexOperatorWriteNode.
@ PM_UNDEF_NODE
UndefNode.
@ PM_ALTERNATION_PATTERN_NODE
AlternationPatternNode.
@ PM_ENSURE_NODE
EnsureNode.
@ PM_LOCAL_VARIABLE_WRITE_NODE
LocalVariableWriteNode.
@ PM_SINGLETON_CLASS_NODE
SingletonClassNode.
@ PM_KEYWORD_HASH_NODE
KeywordHashNode.
@ PM_PARENTHESES_NODE
ParenthesesNode.
@ PM_CLASS_VARIABLE_WRITE_NODE
ClassVariableWriteNode.
@ PM_POST_EXECUTION_NODE
PostExecutionNode.
@ PM_CONSTANT_OPERATOR_WRITE_NODE
ConstantOperatorWriteNode.
@ PM_RETURN_NODE
ReturnNode.
@ PM_MODULE_NODE
ModuleNode.
@ PM_ARRAY_PATTERN_NODE
ArrayPatternNode.
@ PM_SUPER_NODE
SuperNode.
@ PM_MATCH_LAST_LINE_NODE
MatchLastLineNode.
@ PM_CONSTANT_PATH_NODE
ConstantPathNode.
@ PM_INTERPOLATED_SYMBOL_NODE
InterpolatedSymbolNode.
@ PM_CALL_AND_WRITE_NODE
CallAndWriteNode.
@ PM_OPTIONAL_KEYWORD_PARAMETER_NODE
OptionalKeywordParameterNode.
@ PM_CLASS_VARIABLE_TARGET_NODE
ClassVariableTargetNode.
@ PM_CASE_MATCH_NODE
CaseMatchNode.
@ PM_BREAK_NODE
BreakNode.
@ PM_CALL_OR_WRITE_NODE
CallOrWriteNode.
@ PM_IMAGINARY_NODE
ImaginaryNode.
@ PM_CONSTANT_READ_NODE
ConstantReadNode.
@ PM_GLOBAL_VARIABLE_WRITE_NODE
GlobalVariableWriteNode.
@ PM_SOURCE_ENCODING_NODE
SourceEncodingNode.
@ PM_BEGIN_NODE
BeginNode.
@ PM_INTERPOLATED_X_STRING_NODE
InterpolatedXStringNode.
@ PM_INSTANCE_VARIABLE_READ_NODE
InstanceVariableReadNode.
@ PM_FLIP_FLOP_NODE
FlipFlopNode.
@ PM_PINNED_VARIABLE_NODE
PinnedVariableNode.
@ PM_REQUIRED_PARAMETER_NODE
RequiredParameterNode.
@ PM_INSTANCE_VARIABLE_WRITE_NODE
InstanceVariableWriteNode.
@ PM_INSTANCE_VARIABLE_TARGET_NODE
InstanceVariableTargetNode.
@ PM_GLOBAL_VARIABLE_AND_WRITE_NODE
GlobalVariableAndWriteNode.
@ PM_RESCUE_NODE
RescueNode.
@ PM_FLOAT_NODE
FloatNode.
@ PM_ASSOC_NODE
AssocNode.
@ PM_IT_PARAMETERS_NODE
ItParametersNode.
@ PM_INTEGER_NODE
IntegerNode.
@ PM_LOCAL_VARIABLE_TARGET_NODE
LocalVariableTargetNode.
@ PM_STRING_NODE
StringNode.
@ PM_INDEX_OR_WRITE_NODE
IndexOrWriteNode.
@ PM_ALIAS_GLOBAL_VARIABLE_NODE
AliasGlobalVariableNode.
@ PM_PARAMETERS_NODE
ParametersNode.
@ PM_NUMBERED_REFERENCE_READ_NODE
NumberedReferenceReadNode.
@ PM_CONSTANT_PATH_OR_WRITE_NODE
ConstantPathOrWriteNode.
@ PM_GLOBAL_VARIABLE_OR_WRITE_NODE
GlobalVariableOrWriteNode.
@ PM_CONSTANT_OR_WRITE_NODE
ConstantOrWriteNode.
@ PM_STATEMENTS_NODE
StatementsNode.
@ PM_OPTIONAL_PARAMETER_NODE
OptionalParameterNode.
@ PM_PINNED_EXPRESSION_NODE
PinnedExpressionNode.
@ PM_BLOCK_NODE
BlockNode.
@ PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE
ClassVariableOperatorWriteNode.
@ PM_REST_PARAMETER_NODE
RestParameterNode.
@ PM_EMBEDDED_STATEMENTS_NODE
EmbeddedStatementsNode.
@ PM_INTERPOLATED_REGULAR_EXPRESSION_NODE
InterpolatedRegularExpressionNode.
@ PM_INDEX_TARGET_NODE
IndexTargetNode.
@ PM_KEYWORD_REST_PARAMETER_NODE
KeywordRestParameterNode.
#define PM_NODE_TYPE(node)
Cast the type to an enum to allow the compiler to provide exhaustiveness checking.
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.
#define PRISM_EXPORTED_FUNCTION
By default, we compile with -fvisibility=hidden.
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_parser_t *parser, 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...
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 represents a range of bytes in the source string to which a node or token corresponds.
const uint8_t * start
A pointer to the start location of the range in the source.
const uint8_t * end
A pointer to the end location of the range in the source.
A list of offsets of newlines in a string.
size_t * offsets
The list of offsets.
size_t size
The number of offsets in the list.
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_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.
pm_newline_list_t newline_list
This is the list of newline offsets in the source file.
RequiredKeywordParameterNode.
A generic string type that can have various ownership semantics.
enum pm_string_t::@98 type
The type of the string.
This struct represents a token in the Ruby source.