prism 2.0.0-arm-linux-musl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. checksums.yaml +7 -0
  2. data/BSDmakefile +58 -0
  3. data/CHANGELOG.md +881 -0
  4. data/CODE_OF_CONDUCT.md +76 -0
  5. data/CONTRIBUTING.md +58 -0
  6. data/LICENSE.md +7 -0
  7. data/Makefile +145 -0
  8. data/README.md +81 -0
  9. data/config.yml +4752 -0
  10. data/docs/build_system.md +119 -0
  11. data/docs/configuration.md +69 -0
  12. data/docs/cruby_compilation.md +27 -0
  13. data/docs/design.md +53 -0
  14. data/docs/encoding.md +121 -0
  15. data/docs/fuzzing.md +81 -0
  16. data/docs/heredocs.md +36 -0
  17. data/docs/javascript.md +133 -0
  18. data/docs/local_variable_depth.md +229 -0
  19. data/docs/mapping.md +117 -0
  20. data/docs/parser_translation.md +24 -0
  21. data/docs/parsing_rules.md +22 -0
  22. data/docs/releasing.md +147 -0
  23. data/docs/relocation.md +32 -0
  24. data/docs/ripper_translation.md +63 -0
  25. data/docs/ruby_api.md +45 -0
  26. data/docs/ruby_parser_translation.md +19 -0
  27. data/docs/serialization.md +244 -0
  28. data/docs/testing.md +72 -0
  29. data/ext/prism/api_node.c +7005 -0
  30. data/ext/prism/extconf.rb +126 -0
  31. data/ext/prism/extension.c +1768 -0
  32. data/ext/prism/extension.h +19 -0
  33. data/include/prism/arena.h +45 -0
  34. data/include/prism/arena.hpp +42 -0
  35. data/include/prism/ast.h +10381 -0
  36. data/include/prism/ast.hpp +641 -0
  37. data/include/prism/buffer.h +60 -0
  38. data/include/prism/buffer.hpp +55 -0
  39. data/include/prism/comments.h +72 -0
  40. data/include/prism/compiler/accel.h +26 -0
  41. data/include/prism/compiler/align.h +36 -0
  42. data/include/prism/compiler/assume.h +25 -0
  43. data/include/prism/compiler/branch.h +26 -0
  44. data/include/prism/compiler/bswap.h +46 -0
  45. data/include/prism/compiler/cplusplus.hpp +16 -0
  46. data/include/prism/compiler/endianness.h +34 -0
  47. data/include/prism/compiler/exceptions.hpp +17 -0
  48. data/include/prism/compiler/exported.h +24 -0
  49. data/include/prism/compiler/fallthrough.h +22 -0
  50. data/include/prism/compiler/filesystem.h +32 -0
  51. data/include/prism/compiler/flex_array.h +19 -0
  52. data/include/prism/compiler/force_inline.h +21 -0
  53. data/include/prism/compiler/format.h +27 -0
  54. data/include/prism/compiler/inline.h +17 -0
  55. data/include/prism/compiler/lifetimebound.hpp +25 -0
  56. data/include/prism/compiler/nodiscard.h +22 -0
  57. data/include/prism/compiler/nonnull.h +18 -0
  58. data/include/prism/compiler/unused.h +18 -0
  59. data/include/prism/constant_pool.h +106 -0
  60. data/include/prism/diagnostic.h +111 -0
  61. data/include/prism/errors_format.h +61 -0
  62. data/include/prism/excludes.h +29 -0
  63. data/include/prism/integer.h +41 -0
  64. data/include/prism/internal/allocator.h +68 -0
  65. data/include/prism/internal/allocator_debug.h +88 -0
  66. data/include/prism/internal/arena.h +108 -0
  67. data/include/prism/internal/bit.h +42 -0
  68. data/include/prism/internal/buffer.h +94 -0
  69. data/include/prism/internal/char.h +145 -0
  70. data/include/prism/internal/comments.h +53 -0
  71. data/include/prism/internal/constant_pool.h +152 -0
  72. data/include/prism/internal/diagnostic.h +389 -0
  73. data/include/prism/internal/encoding.h +242 -0
  74. data/include/prism/internal/integer.h +68 -0
  75. data/include/prism/internal/isinf.h +16 -0
  76. data/include/prism/internal/line_offset_list.h +34 -0
  77. data/include/prism/internal/list.h +62 -0
  78. data/include/prism/internal/magic_comments.h +23 -0
  79. data/include/prism/internal/memchr.h +15 -0
  80. data/include/prism/internal/node.h +42 -0
  81. data/include/prism/internal/options.h +232 -0
  82. data/include/prism/internal/parser.h +1004 -0
  83. data/include/prism/internal/regexp.h +26 -0
  84. data/include/prism/internal/serialize.h +39 -0
  85. data/include/prism/internal/source.h +72 -0
  86. data/include/prism/internal/static_literals.h +100 -0
  87. data/include/prism/internal/stringy.h +30 -0
  88. data/include/prism/internal/strncasecmp.h +18 -0
  89. data/include/prism/internal/strpbrk.h +33 -0
  90. data/include/prism/internal/tokens.h +11 -0
  91. data/include/prism/internal/xxh3.h +16 -0
  92. data/include/prism/json.h +40 -0
  93. data/include/prism/line_offset_list.h +69 -0
  94. data/include/prism/magic_comments.h +53 -0
  95. data/include/prism/node.h +139 -0
  96. data/include/prism/node.hpp +272 -0
  97. data/include/prism/node_type.hpp +38 -0
  98. data/include/prism/options.h +363 -0
  99. data/include/prism/options.hpp +43 -0
  100. data/include/prism/parser.h +433 -0
  101. data/include/prism/parser.hpp +274 -0
  102. data/include/prism/prettyprint.h +39 -0
  103. data/include/prism/serialize.h +123 -0
  104. data/include/prism/source.h +163 -0
  105. data/include/prism/stream.h +36 -0
  106. data/include/prism/string_query.h +82 -0
  107. data/include/prism/stringy.h +61 -0
  108. data/include/prism/stringy.hpp +31 -0
  109. data/include/prism/version.h +46 -0
  110. data/include/prism.h +123 -0
  111. data/include/prism.hpp +24 -0
  112. data/lib/prism/3.3/prism.so +0 -0
  113. data/lib/prism/3.4/prism.so +0 -0
  114. data/lib/prism/4.0/prism.so +0 -0
  115. data/lib/prism/compiler.rb +815 -0
  116. data/lib/prism/desugar_compiler.rb +463 -0
  117. data/lib/prism/dispatcher.rb +2383 -0
  118. data/lib/prism/dot_visitor.rb +4848 -0
  119. data/lib/prism/dsl.rb +1369 -0
  120. data/lib/prism/ffi.rb +746 -0
  121. data/lib/prism/inspect_visitor.rb +2425 -0
  122. data/lib/prism/lex_compat.rb +953 -0
  123. data/lib/prism/mutation_compiler.rb +780 -0
  124. data/lib/prism/node.rb +33940 -0
  125. data/lib/prism/node_ext.rb +504 -0
  126. data/lib/prism/node_find.rb +215 -0
  127. data/lib/prism/parse_result/errors.rb +72 -0
  128. data/lib/prism/parse_result/newlines.rb +423 -0
  129. data/lib/prism/parse_result.rb +1236 -0
  130. data/lib/prism/pattern.rb +314 -0
  131. data/lib/prism/polyfill/append_as_bytes.rb +15 -0
  132. data/lib/prism/polyfill/byteindex.rb +13 -0
  133. data/lib/prism/polyfill/scan_byte.rb +14 -0
  134. data/lib/prism/polyfill/unpack1.rb +14 -0
  135. data/lib/prism/polyfill/warn.rb +36 -0
  136. data/lib/prism/reflection.rb +427 -0
  137. data/lib/prism/relocation.rb +567 -0
  138. data/lib/prism/serialize.rb +4589 -0
  139. data/lib/prism/string_query.rb +54 -0
  140. data/lib/prism/translation/parser/builder.rb +70 -0
  141. data/lib/prism/translation/parser/compiler.rb +2226 -0
  142. data/lib/prism/translation/parser/lexer.rb +769 -0
  143. data/lib/prism/translation/parser.rb +376 -0
  144. data/lib/prism/translation/parser_current.rb +26 -0
  145. data/lib/prism/translation/parser_versions.rb +36 -0
  146. data/lib/prism/translation/ripper/filter.rb +53 -0
  147. data/lib/prism/translation/ripper/lexer.rb +133 -0
  148. data/lib/prism/translation/ripper/sexp.rb +118 -0
  149. data/lib/prism/translation/ripper/shim.rb +7 -0
  150. data/lib/prism/translation/ripper.rb +4278 -0
  151. data/lib/prism/translation/ruby_parser.rb +1721 -0
  152. data/lib/prism/translation.rb +20 -0
  153. data/lib/prism/visitor.rb +1440 -0
  154. data/lib/prism.rb +168 -0
  155. data/prism.gemspec +251 -0
  156. data/rbi/generated/prism/compiler.rbi +489 -0
  157. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  158. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  159. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  160. data/rbi/generated/prism/dsl.rbi +751 -0
  161. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  162. data/rbi/generated/prism/lex_compat.rbi +162 -0
  163. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  164. data/rbi/generated/prism/node.rbi +15143 -0
  165. data/rbi/generated/prism/node_ext.rbi +259 -0
  166. data/rbi/generated/prism/node_find.rbi +79 -0
  167. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  168. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  169. data/rbi/generated/prism/parse_result.rbi +776 -0
  170. data/rbi/generated/prism/pattern.rbi +134 -0
  171. data/rbi/generated/prism/reflection.rbi +89 -0
  172. data/rbi/generated/prism/relocation.rbi +329 -0
  173. data/rbi/generated/prism/serialize.rbi +185 -0
  174. data/rbi/generated/prism/string_query.rbi +43 -0
  175. data/rbi/generated/prism/translation.rbi +7 -0
  176. data/rbi/generated/prism/visitor.rbi +650 -0
  177. data/rbi/generated/prism.rbi +86 -0
  178. data/rbi/prism/translation/parser.rbi +11 -0
  179. data/rbi/prism/translation/parser_versions.rbi +28 -0
  180. data/rbi/prism/translation/ripper.rbi +15 -0
  181. data/rbi/rubyvm/node_find.rbi +14 -0
  182. data/sig/generated/prism/compiler.rbs +492 -0
  183. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  184. data/sig/generated/prism/dispatcher.rbs +1292 -0
  185. data/sig/generated/prism/dot_visitor.rbs +635 -0
  186. data/sig/generated/prism/dsl.rbs +928 -0
  187. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  188. data/sig/generated/prism/lex_compat.rbs +166 -0
  189. data/sig/generated/prism/mutation_compiler.rbs +464 -0
  190. data/sig/generated/prism/node.rbs +21632 -0
  191. data/sig/generated/prism/node_ext.rbs +290 -0
  192. data/sig/generated/prism/node_find.rbs +90 -0
  193. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  194. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  195. data/sig/generated/prism/parse_result.rbs +871 -0
  196. data/sig/generated/prism/pattern.rbs +156 -0
  197. data/sig/generated/prism/reflection.rbs +101 -0
  198. data/sig/generated/prism/relocation.rbs +428 -0
  199. data/sig/generated/prism/serialize.rbs +200 -0
  200. data/sig/generated/prism/string_query.rbs +43 -0
  201. data/sig/generated/prism/translation.rbs +8 -0
  202. data/sig/generated/prism/visitor.rbs +1111 -0
  203. data/sig/generated/prism.rbs +84 -0
  204. data/sig/manifest.yaml +2 -0
  205. data/src/arena.c +117 -0
  206. data/src/buffer.c +389 -0
  207. data/src/char.c +289 -0
  208. data/src/comments.c +454 -0
  209. data/src/constant_pool.c +406 -0
  210. data/src/diagnostic.c +894 -0
  211. data/src/encoding.c +5345 -0
  212. data/src/errors_format.c +519 -0
  213. data/src/integer.c +681 -0
  214. data/src/json.c +5733 -0
  215. data/src/line_offset_list.c +100 -0
  216. data/src/list.c +24 -0
  217. data/src/memchr.c +37 -0
  218. data/src/node.c +4363 -0
  219. data/src/options.c +445 -0
  220. data/src/parser.c +371 -0
  221. data/src/prettyprint.c +9024 -0
  222. data/src/prism.c +23901 -0
  223. data/src/regexp.c +1705 -0
  224. data/src/serialize.c +2660 -0
  225. data/src/source.c +524 -0
  226. data/src/static_literals.c +685 -0
  227. data/src/string_query.c +180 -0
  228. data/src/stringy.c +61 -0
  229. data/src/strncasecmp.c +37 -0
  230. data/src/strpbrk.c +447 -0
  231. data/src/tokens.c +724 -0
  232. data/src/xxh3.c +292 -0
  233. metadata +276 -0
data/src/serialize.c ADDED
@@ -0,0 +1,2660 @@
1
+ /*----------------------------------------------------------------------------*/
2
+ /* This file is generated by the templates/template.rb script and should not */
3
+ /* be modified manually. See */
4
+ /* templates/src/serialize.c.erb */
5
+ /* if you are looking to modify the */
6
+ /* template */
7
+ /*----------------------------------------------------------------------------*/
8
+
9
+ #include "prism/excludes.h"
10
+
11
+ /* We optionally support serializing to a binary string. For systems that do not
12
+ * want or need this functionality, it can be turned off with the
13
+ * PRISM_EXCLUDE_SERIALIZATION define. */
14
+ #ifdef PRISM_EXCLUDE_SERIALIZATION
15
+
16
+ /* Ensure this translation unit is never empty, even when serialization is
17
+ * excluded. */
18
+ typedef int pm_serialize_unused_t;
19
+
20
+ #else
21
+
22
+ #include "prism/compiler/branch.h"
23
+ #include "prism/compiler/inline.h"
24
+
25
+ #include "prism/internal/allocator.h"
26
+ #include "prism/internal/buffer.h"
27
+ #include "prism/internal/comments.h"
28
+ #include "prism/internal/diagnostic.h"
29
+ #include "prism/internal/encoding.h"
30
+ #include "prism/internal/list.h"
31
+ #include "prism/internal/magic_comments.h"
32
+ #include "prism/internal/options.h"
33
+ #include "prism/internal/parser.h"
34
+
35
+ #include "prism.h"
36
+ #include "prism/ast.h"
37
+ #include "prism/line_offset_list.h"
38
+
39
+ #include <assert.h>
40
+ #include <stdbool.h>
41
+ #include <stdio.h>
42
+ #include <stdlib.h>
43
+ #include <string.h>
44
+
45
+ static PRISM_INLINE uint32_t
46
+ pm_ptrdifft_to_u32(ptrdiff_t value) {
47
+ assert(value >= 0 && ((unsigned long) value) < UINT32_MAX);
48
+ return (uint32_t) value;
49
+ }
50
+
51
+ static PRISM_INLINE uint32_t
52
+ pm_sizet_to_u32(size_t value) {
53
+ assert(value < UINT32_MAX);
54
+ return (uint32_t) value;
55
+ }
56
+
57
+ static void
58
+ pm_serialize_location(const pm_location_t *location, pm_buffer_t *buffer) {
59
+ pm_buffer_append_varuint(buffer, location->start);
60
+ pm_buffer_append_varuint(buffer, location->length);
61
+ }
62
+
63
+ static void
64
+ pm_serialize_string(const pm_string_t *string, pm_buffer_t *buffer) {
65
+ uint32_t length = pm_sizet_to_u32(pm_string_length(string));
66
+ pm_buffer_append_varuint(buffer, length);
67
+ pm_buffer_append_bytes(buffer, pm_string_source(string), length);
68
+ }
69
+
70
+ static void
71
+ pm_serialize_integer(const pm_integer_t *integer, pm_buffer_t *buffer) {
72
+ pm_buffer_append_byte(buffer, integer->negative ? 1 : 0);
73
+ if (integer->values == NULL) {
74
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(1));
75
+ pm_buffer_append_varuint(buffer, integer->value);
76
+ } else {
77
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(integer->length));
78
+ for (size_t i = 0; i < integer->length; i++) {
79
+ pm_buffer_append_varuint(buffer, integer->values[i]);
80
+ }
81
+ }
82
+ }
83
+
84
+ /**
85
+ * The kinds of entries on the serialization stack.
86
+ */
87
+ typedef enum {
88
+ /** A node to serialize, or NULL for an absent optional node. */
89
+ PM_SERIALIZE_ENTRY_NODE,
90
+
91
+ /** Write the lazy marker and placeholders for its skip and length. */
92
+ PM_SERIALIZE_ENTRY_LAZY_HEADER,
93
+
94
+ /** Patch the skip, now that the lazy subtree is about to be written. */
95
+ PM_SERIALIZE_ENTRY_LAZY_START,
96
+
97
+ /** Patch the length, now that the lazy subtree has been written. */
98
+ PM_SERIALIZE_ENTRY_LAZY_END
99
+ } pm_serialize_entry_kind_t;
100
+
101
+ /**
102
+ * An entry on the serialization stack.
103
+ */
104
+ typedef struct {
105
+ /** The node to serialize, for NODE entries. */
106
+ const pm_node_t *node;
107
+
108
+ /**
109
+ * For NODE entries, the offset of the placeholders that follow the node's
110
+ * lazy marker. For LAZY_* entries, the index of the NODE entry that owns
111
+ * them, which stays valid because that entry is beneath them.
112
+ */
113
+ size_t offset;
114
+
115
+ /** The kind of this entry. */
116
+ pm_serialize_entry_kind_t kind;
117
+
118
+ /** Whether the children of this node have already been pushed. */
119
+ bool visited;
120
+ } pm_serialize_entry_t;
121
+
122
+ /**
123
+ * The explicit stack used to walk the tree, so that serializing deeply nested
124
+ * trees does not depend on the size of the C stack.
125
+ */
126
+ typedef struct {
127
+ /** The entries on the stack. */
128
+ pm_serialize_entry_t *entries;
129
+
130
+ /** The number of entries on the stack. */
131
+ size_t size;
132
+
133
+ /** The number of entries that fit in the allocated memory. */
134
+ size_t capacity;
135
+ } pm_serialize_stack_t;
136
+
137
+ /**
138
+ * Push an entry onto the serialization stack. This may reallocate the stack,
139
+ * which invalidates any pointers into it.
140
+ */
141
+ static void
142
+ pm_serialize_stack_push(pm_serialize_stack_t *stack, pm_serialize_entry_kind_t kind, const pm_node_t *node, size_t offset) {
143
+ if (PRISM_UNLIKELY(stack->size == stack->capacity)) {
144
+ size_t capacity = stack->capacity == 0 ? 64 : stack->capacity * 2;
145
+ pm_serialize_entry_t *entries = (pm_serialize_entry_t *) xrealloc_sized(stack->entries, capacity * sizeof(pm_serialize_entry_t), stack->capacity * sizeof(pm_serialize_entry_t));
146
+
147
+ if (PRISM_UNLIKELY(entries == NULL)) {
148
+ fprintf(stderr, "prism: out of memory; aborting\n");
149
+ abort();
150
+ }
151
+
152
+ stack->entries = entries;
153
+ stack->capacity = capacity;
154
+ }
155
+
156
+ stack->entries[stack->size++] = (pm_serialize_entry_t) { .node = node, .offset = offset, .kind = kind, .visited = false };
157
+ }
158
+
159
+ /**
160
+ * Serialize the tree rooted at the given node in post-order: the subtrees of a
161
+ * node's child fields are written in field order, followed by the node's own
162
+ * record. A loader can therefore build every node from a stack of already
163
+ * built children without recursing.
164
+ *
165
+ * The child subtrees of a node with a lazy field are preceded by the lazy
166
+ * marker, the byte length of the subtrees before the lazy field's subtree, and
167
+ * the byte length of the lazy field's subtree, so that a loader can skip it.
168
+ */
169
+ static void
170
+ pm_serialize_node(pm_node_t *root, pm_buffer_t *buffer) {
171
+ pm_serialize_stack_t stack = { 0 };
172
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, root, 0);
173
+
174
+ while (stack.size > 0) {
175
+ pm_serialize_entry_t *entry = &stack.entries[--stack.size];
176
+
177
+ switch (entry->kind) {
178
+ case PM_SERIALIZE_ENTRY_LAZY_HEADER: {
179
+ pm_buffer_append_byte(buffer, 255);
180
+ stack.entries[entry->offset].offset = buffer->length;
181
+ pm_buffer_append_zeroes(buffer, 8);
182
+ continue;
183
+ }
184
+ case PM_SERIALIZE_ENTRY_LAZY_START: {
185
+ size_t offset = stack.entries[entry->offset].offset;
186
+ uint32_t skip = pm_sizet_to_u32(buffer->length - offset - 8);
187
+ memcpy(buffer->value + offset, &skip, sizeof(uint32_t));
188
+ continue;
189
+ }
190
+ case PM_SERIALIZE_ENTRY_LAZY_END: {
191
+ size_t offset = stack.entries[entry->offset].offset;
192
+ uint32_t skip;
193
+ memcpy(&skip, buffer->value + offset, sizeof(uint32_t));
194
+
195
+ uint32_t length = pm_sizet_to_u32(buffer->length - offset - 8 - skip);
196
+ memcpy(buffer->value + offset + 4, &length, sizeof(uint32_t));
197
+ continue;
198
+ }
199
+ case PM_SERIALIZE_ENTRY_NODE:
200
+ break;
201
+ }
202
+
203
+ const pm_node_t *node = entry->node;
204
+
205
+ if (node == NULL) {
206
+ pm_buffer_append_byte(buffer, 0);
207
+ continue;
208
+ }
209
+
210
+ if (!entry->visited) {
211
+ /* Leave the node on the stack beneath its children, which are
212
+ * pushed in reverse field order so that they are popped, and
213
+ * therefore written, in field order. A node without children is
214
+ * written straight away instead. */
215
+ entry->visited = true;
216
+ size_t index = stack.size++;
217
+
218
+ switch (PM_NODE_TYPE(node)) {
219
+ case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
220
+ const pm_alias_global_variable_node_t *cast = (const pm_alias_global_variable_node_t *) node;
221
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->old_name, 0);
222
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->new_name, 0);
223
+ break;
224
+ }
225
+ case PM_ALIAS_METHOD_NODE: {
226
+ const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
227
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->old_name, 0);
228
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->new_name, 0);
229
+ break;
230
+ }
231
+ case PM_ALTERNATION_PATTERN_NODE: {
232
+ const pm_alternation_pattern_node_t *cast = (const pm_alternation_pattern_node_t *) node;
233
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
234
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
235
+ break;
236
+ }
237
+ case PM_AND_NODE: {
238
+ const pm_and_node_t *cast = (const pm_and_node_t *) node;
239
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
240
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
241
+ break;
242
+ }
243
+ case PM_ARGUMENTS_NODE: {
244
+ const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node;
245
+ for (size_t list_index = cast->arguments.size; list_index > 0; list_index--) {
246
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->arguments.nodes[list_index - 1], 0);
247
+ }
248
+ break;
249
+ }
250
+ case PM_ARRAY_NODE: {
251
+ const pm_array_node_t *cast = (const pm_array_node_t *) node;
252
+ for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
253
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
254
+ }
255
+ break;
256
+ }
257
+ case PM_ARRAY_PATTERN_NODE: {
258
+ const pm_array_pattern_node_t *cast = (const pm_array_pattern_node_t *) node;
259
+ for (size_t list_index = cast->posts.size; list_index > 0; list_index--) {
260
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->posts.nodes[list_index - 1], 0);
261
+ }
262
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
263
+ for (size_t list_index = cast->requireds.size; list_index > 0; list_index--) {
264
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->requireds.nodes[list_index - 1], 0);
265
+ }
266
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant, 0);
267
+ break;
268
+ }
269
+ case PM_ASSOC_NODE: {
270
+ const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
271
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
272
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->key, 0);
273
+ break;
274
+ }
275
+ case PM_ASSOC_SPLAT_NODE: {
276
+ const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
277
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
278
+ break;
279
+ }
280
+ case PM_BEGIN_NODE: {
281
+ const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
282
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->ensure_clause, 0);
283
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
284
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rescue_clause, 0);
285
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
286
+ break;
287
+ }
288
+ case PM_BLOCK_ARGUMENT_NODE: {
289
+ const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node;
290
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
291
+ break;
292
+ }
293
+ case PM_BLOCK_NODE: {
294
+ const pm_block_node_t *cast = (const pm_block_node_t *) node;
295
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
296
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
297
+ break;
298
+ }
299
+ case PM_BLOCK_PARAMETERS_NODE: {
300
+ const pm_block_parameters_node_t *cast = (const pm_block_parameters_node_t *) node;
301
+ for (size_t list_index = cast->locals.size; list_index > 0; list_index--) {
302
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->locals.nodes[list_index - 1], 0);
303
+ }
304
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
305
+ break;
306
+ }
307
+ case PM_BREAK_NODE: {
308
+ const pm_break_node_t *cast = (const pm_break_node_t *) node;
309
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
310
+ break;
311
+ }
312
+ case PM_CALL_AND_WRITE_NODE: {
313
+ const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node;
314
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
315
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
316
+ break;
317
+ }
318
+ case PM_CALL_NODE: {
319
+ const pm_call_node_t *cast = (const pm_call_node_t *) node;
320
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
321
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
322
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
323
+ break;
324
+ }
325
+ case PM_CALL_OPERATOR_WRITE_NODE: {
326
+ const pm_call_operator_write_node_t *cast = (const pm_call_operator_write_node_t *) node;
327
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
328
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
329
+ break;
330
+ }
331
+ case PM_CALL_OR_WRITE_NODE: {
332
+ const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node;
333
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
334
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
335
+ break;
336
+ }
337
+ case PM_CALL_TARGET_NODE: {
338
+ const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
339
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
340
+ break;
341
+ }
342
+ case PM_CAPTURE_PATTERN_NODE: {
343
+ const pm_capture_pattern_node_t *cast = (const pm_capture_pattern_node_t *) node;
344
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
345
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
346
+ break;
347
+ }
348
+ case PM_CASE_MATCH_NODE: {
349
+ const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
350
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
351
+ for (size_t list_index = cast->conditions.size; list_index > 0; list_index--) {
352
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->conditions.nodes[list_index - 1], 0);
353
+ }
354
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
355
+ break;
356
+ }
357
+ case PM_CASE_NODE: {
358
+ const pm_case_node_t *cast = (const pm_case_node_t *) node;
359
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
360
+ for (size_t list_index = cast->conditions.size; list_index > 0; list_index--) {
361
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->conditions.nodes[list_index - 1], 0);
362
+ }
363
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
364
+ break;
365
+ }
366
+ case PM_CLASS_NODE: {
367
+ const pm_class_node_t *cast = (const pm_class_node_t *) node;
368
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
369
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->superclass, 0);
370
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant_path, 0);
371
+ break;
372
+ }
373
+ case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
374
+ const pm_class_variable_and_write_node_t *cast = (const pm_class_variable_and_write_node_t *) node;
375
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
376
+ break;
377
+ }
378
+ case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
379
+ const pm_class_variable_operator_write_node_t *cast = (const pm_class_variable_operator_write_node_t *) node;
380
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
381
+ break;
382
+ }
383
+ case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
384
+ const pm_class_variable_or_write_node_t *cast = (const pm_class_variable_or_write_node_t *) node;
385
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
386
+ break;
387
+ }
388
+ case PM_CLASS_VARIABLE_WRITE_NODE: {
389
+ const pm_class_variable_write_node_t *cast = (const pm_class_variable_write_node_t *) node;
390
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
391
+ break;
392
+ }
393
+ case PM_CONSTANT_AND_WRITE_NODE: {
394
+ const pm_constant_and_write_node_t *cast = (const pm_constant_and_write_node_t *) node;
395
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
396
+ break;
397
+ }
398
+ case PM_CONSTANT_OPERATOR_WRITE_NODE: {
399
+ const pm_constant_operator_write_node_t *cast = (const pm_constant_operator_write_node_t *) node;
400
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
401
+ break;
402
+ }
403
+ case PM_CONSTANT_OR_WRITE_NODE: {
404
+ const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node;
405
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
406
+ break;
407
+ }
408
+ case PM_CONSTANT_PATH_AND_WRITE_NODE: {
409
+ const pm_constant_path_and_write_node_t *cast = (const pm_constant_path_and_write_node_t *) node;
410
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
411
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
412
+ break;
413
+ }
414
+ case PM_CONSTANT_PATH_NODE: {
415
+ const pm_constant_path_node_t *cast = (const pm_constant_path_node_t *) node;
416
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parent, 0);
417
+ break;
418
+ }
419
+ case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
420
+ const pm_constant_path_operator_write_node_t *cast = (const pm_constant_path_operator_write_node_t *) node;
421
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
422
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
423
+ break;
424
+ }
425
+ case PM_CONSTANT_PATH_OR_WRITE_NODE: {
426
+ const pm_constant_path_or_write_node_t *cast = (const pm_constant_path_or_write_node_t *) node;
427
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
428
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
429
+ break;
430
+ }
431
+ case PM_CONSTANT_PATH_TARGET_NODE: {
432
+ const pm_constant_path_target_node_t *cast = (const pm_constant_path_target_node_t *) node;
433
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parent, 0);
434
+ break;
435
+ }
436
+ case PM_CONSTANT_PATH_WRITE_NODE: {
437
+ const pm_constant_path_write_node_t *cast = (const pm_constant_path_write_node_t *) node;
438
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
439
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->target, 0);
440
+ break;
441
+ }
442
+ case PM_CONSTANT_WRITE_NODE: {
443
+ const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node;
444
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
445
+ break;
446
+ }
447
+ case PM_DEF_NODE: {
448
+ const pm_def_node_t *cast = (const pm_def_node_t *) node;
449
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_LAZY_END, NULL, index);
450
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
451
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_LAZY_START, NULL, index);
452
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
453
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
454
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_LAZY_HEADER, NULL, index);
455
+ break;
456
+ }
457
+ case PM_DEFINED_NODE: {
458
+ const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
459
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
460
+ break;
461
+ }
462
+ case PM_ELSE_NODE: {
463
+ const pm_else_node_t *cast = (const pm_else_node_t *) node;
464
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
465
+ break;
466
+ }
467
+ case PM_EMBEDDED_STATEMENTS_NODE: {
468
+ const pm_embedded_statements_node_t *cast = (const pm_embedded_statements_node_t *) node;
469
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
470
+ break;
471
+ }
472
+ case PM_EMBEDDED_VARIABLE_NODE: {
473
+ const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node;
474
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->variable, 0);
475
+ break;
476
+ }
477
+ case PM_ENSURE_NODE: {
478
+ const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
479
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
480
+ break;
481
+ }
482
+ case PM_ERROR_RECOVERY_NODE: {
483
+ const pm_error_recovery_node_t *cast = (const pm_error_recovery_node_t *) node;
484
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->unexpected, 0);
485
+ break;
486
+ }
487
+ case PM_FIND_PATTERN_NODE: {
488
+ const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
489
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
490
+ for (size_t list_index = cast->requireds.size; list_index > 0; list_index--) {
491
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->requireds.nodes[list_index - 1], 0);
492
+ }
493
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
494
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant, 0);
495
+ break;
496
+ }
497
+ case PM_FLIP_FLOP_NODE: {
498
+ const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
499
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
500
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
501
+ break;
502
+ }
503
+ case PM_FOR_NODE: {
504
+ const pm_for_node_t *cast = (const pm_for_node_t *) node;
505
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
506
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->collection, 0);
507
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->index, 0);
508
+ break;
509
+ }
510
+ case PM_FORWARDING_SUPER_NODE: {
511
+ const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node;
512
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
513
+ break;
514
+ }
515
+ case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
516
+ const pm_global_variable_and_write_node_t *cast = (const pm_global_variable_and_write_node_t *) node;
517
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
518
+ break;
519
+ }
520
+ case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
521
+ const pm_global_variable_operator_write_node_t *cast = (const pm_global_variable_operator_write_node_t *) node;
522
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
523
+ break;
524
+ }
525
+ case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
526
+ const pm_global_variable_or_write_node_t *cast = (const pm_global_variable_or_write_node_t *) node;
527
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
528
+ break;
529
+ }
530
+ case PM_GLOBAL_VARIABLE_WRITE_NODE: {
531
+ const pm_global_variable_write_node_t *cast = (const pm_global_variable_write_node_t *) node;
532
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
533
+ break;
534
+ }
535
+ case PM_HASH_NODE: {
536
+ const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
537
+ for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
538
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
539
+ }
540
+ break;
541
+ }
542
+ case PM_HASH_PATTERN_NODE: {
543
+ const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
544
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
545
+ for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
546
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
547
+ }
548
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant, 0);
549
+ break;
550
+ }
551
+ case PM_IF_NODE: {
552
+ const pm_if_node_t *cast = (const pm_if_node_t *) node;
553
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->subsequent, 0);
554
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
555
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
556
+ break;
557
+ }
558
+ case PM_IMAGINARY_NODE: {
559
+ const pm_imaginary_node_t *cast = (const pm_imaginary_node_t *) node;
560
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->numeric, 0);
561
+ break;
562
+ }
563
+ case PM_IMPLICIT_NODE: {
564
+ const pm_implicit_node_t *cast = (const pm_implicit_node_t *) node;
565
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
566
+ break;
567
+ }
568
+ case PM_IN_NODE: {
569
+ const pm_in_node_t *cast = (const pm_in_node_t *) node;
570
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
571
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->pattern, 0);
572
+ break;
573
+ }
574
+ case PM_INDEX_AND_WRITE_NODE: {
575
+ const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node;
576
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
577
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
578
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
579
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
580
+ break;
581
+ }
582
+ case PM_INDEX_OPERATOR_WRITE_NODE: {
583
+ const pm_index_operator_write_node_t *cast = (const pm_index_operator_write_node_t *) node;
584
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
585
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
586
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
587
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
588
+ break;
589
+ }
590
+ case PM_INDEX_OR_WRITE_NODE: {
591
+ const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node;
592
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
593
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
594
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
595
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
596
+ break;
597
+ }
598
+ case PM_INDEX_TARGET_NODE: {
599
+ const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
600
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
601
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
602
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->receiver, 0);
603
+ break;
604
+ }
605
+ case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
606
+ const pm_instance_variable_and_write_node_t *cast = (const pm_instance_variable_and_write_node_t *) node;
607
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
608
+ break;
609
+ }
610
+ case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
611
+ const pm_instance_variable_operator_write_node_t *cast = (const pm_instance_variable_operator_write_node_t *) node;
612
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
613
+ break;
614
+ }
615
+ case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
616
+ const pm_instance_variable_or_write_node_t *cast = (const pm_instance_variable_or_write_node_t *) node;
617
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
618
+ break;
619
+ }
620
+ case PM_INSTANCE_VARIABLE_WRITE_NODE: {
621
+ const pm_instance_variable_write_node_t *cast = (const pm_instance_variable_write_node_t *) node;
622
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
623
+ break;
624
+ }
625
+ case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
626
+ const pm_interpolated_match_last_line_node_t *cast = (const pm_interpolated_match_last_line_node_t *) node;
627
+ for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
628
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
629
+ }
630
+ break;
631
+ }
632
+ case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
633
+ const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) node;
634
+ for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
635
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
636
+ }
637
+ break;
638
+ }
639
+ case PM_INTERPOLATED_STRING_NODE: {
640
+ const pm_interpolated_string_node_t *cast = (const pm_interpolated_string_node_t *) node;
641
+ for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
642
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
643
+ }
644
+ break;
645
+ }
646
+ case PM_INTERPOLATED_SYMBOL_NODE: {
647
+ const pm_interpolated_symbol_node_t *cast = (const pm_interpolated_symbol_node_t *) node;
648
+ for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
649
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
650
+ }
651
+ break;
652
+ }
653
+ case PM_INTERPOLATED_X_STRING_NODE: {
654
+ const pm_interpolated_x_string_node_t *cast = (const pm_interpolated_x_string_node_t *) node;
655
+ for (size_t list_index = cast->parts.size; list_index > 0; list_index--) {
656
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->parts.nodes[list_index - 1], 0);
657
+ }
658
+ break;
659
+ }
660
+ case PM_KEYWORD_HASH_NODE: {
661
+ const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node;
662
+ for (size_t list_index = cast->elements.size; list_index > 0; list_index--) {
663
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->elements.nodes[list_index - 1], 0);
664
+ }
665
+ break;
666
+ }
667
+ case PM_LAMBDA_NODE: {
668
+ const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
669
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
670
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->parameters, 0);
671
+ break;
672
+ }
673
+ case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
674
+ const pm_local_variable_and_write_node_t *cast = (const pm_local_variable_and_write_node_t *) node;
675
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
676
+ break;
677
+ }
678
+ case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
679
+ const pm_local_variable_operator_write_node_t *cast = (const pm_local_variable_operator_write_node_t *) node;
680
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
681
+ break;
682
+ }
683
+ case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
684
+ const pm_local_variable_or_write_node_t *cast = (const pm_local_variable_or_write_node_t *) node;
685
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
686
+ break;
687
+ }
688
+ case PM_LOCAL_VARIABLE_WRITE_NODE: {
689
+ const pm_local_variable_write_node_t *cast = (const pm_local_variable_write_node_t *) node;
690
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
691
+ break;
692
+ }
693
+ case PM_MATCH_PREDICATE_NODE: {
694
+ const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node;
695
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->pattern, 0);
696
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
697
+ break;
698
+ }
699
+ case PM_MATCH_REQUIRED_NODE: {
700
+ const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node;
701
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->pattern, 0);
702
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
703
+ break;
704
+ }
705
+ case PM_MATCH_WRITE_NODE: {
706
+ const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
707
+ for (size_t list_index = cast->targets.size; list_index > 0; list_index--) {
708
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->targets.nodes[list_index - 1], 0);
709
+ }
710
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->call, 0);
711
+ break;
712
+ }
713
+ case PM_MODULE_NODE: {
714
+ const pm_module_node_t *cast = (const pm_module_node_t *) node;
715
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
716
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->constant_path, 0);
717
+ break;
718
+ }
719
+ case PM_MULTI_TARGET_NODE: {
720
+ const pm_multi_target_node_t *cast = (const pm_multi_target_node_t *) node;
721
+ for (size_t list_index = cast->rights.size; list_index > 0; list_index--) {
722
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->rights.nodes[list_index - 1], 0);
723
+ }
724
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
725
+ for (size_t list_index = cast->lefts.size; list_index > 0; list_index--) {
726
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->lefts.nodes[list_index - 1], 0);
727
+ }
728
+ break;
729
+ }
730
+ case PM_MULTI_WRITE_NODE: {
731
+ const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node;
732
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
733
+ for (size_t list_index = cast->rights.size; list_index > 0; list_index--) {
734
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->rights.nodes[list_index - 1], 0);
735
+ }
736
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
737
+ for (size_t list_index = cast->lefts.size; list_index > 0; list_index--) {
738
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->lefts.nodes[list_index - 1], 0);
739
+ }
740
+ break;
741
+ }
742
+ case PM_NEXT_NODE: {
743
+ const pm_next_node_t *cast = (const pm_next_node_t *) node;
744
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
745
+ break;
746
+ }
747
+ case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
748
+ const pm_optional_keyword_parameter_node_t *cast = (const pm_optional_keyword_parameter_node_t *) node;
749
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
750
+ break;
751
+ }
752
+ case PM_OPTIONAL_PARAMETER_NODE: {
753
+ const pm_optional_parameter_node_t *cast = (const pm_optional_parameter_node_t *) node;
754
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->value, 0);
755
+ break;
756
+ }
757
+ case PM_OR_NODE: {
758
+ const pm_or_node_t *cast = (const pm_or_node_t *) node;
759
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
760
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
761
+ break;
762
+ }
763
+ case PM_PARAMETERS_NODE: {
764
+ const pm_parameters_node_t *cast = (const pm_parameters_node_t *) node;
765
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
766
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->keyword_rest, 0);
767
+ for (size_t list_index = cast->keywords.size; list_index > 0; list_index--) {
768
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->keywords.nodes[list_index - 1], 0);
769
+ }
770
+ for (size_t list_index = cast->posts.size; list_index > 0; list_index--) {
771
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->posts.nodes[list_index - 1], 0);
772
+ }
773
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rest, 0);
774
+ for (size_t list_index = cast->optionals.size; list_index > 0; list_index--) {
775
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->optionals.nodes[list_index - 1], 0);
776
+ }
777
+ for (size_t list_index = cast->requireds.size; list_index > 0; list_index--) {
778
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->requireds.nodes[list_index - 1], 0);
779
+ }
780
+ break;
781
+ }
782
+ case PM_PARENTHESES_NODE: {
783
+ const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
784
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
785
+ break;
786
+ }
787
+ case PM_PINNED_EXPRESSION_NODE: {
788
+ const pm_pinned_expression_node_t *cast = (const pm_pinned_expression_node_t *) node;
789
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
790
+ break;
791
+ }
792
+ case PM_PINNED_VARIABLE_NODE: {
793
+ const pm_pinned_variable_node_t *cast = (const pm_pinned_variable_node_t *) node;
794
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->variable, 0);
795
+ break;
796
+ }
797
+ case PM_POST_EXECUTION_NODE: {
798
+ const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) node;
799
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
800
+ break;
801
+ }
802
+ case PM_PRE_EXECUTION_NODE: {
803
+ const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node;
804
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
805
+ break;
806
+ }
807
+ case PM_PROGRAM_NODE: {
808
+ const pm_program_node_t *cast = (const pm_program_node_t *) node;
809
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
810
+ break;
811
+ }
812
+ case PM_RANGE_NODE: {
813
+ const pm_range_node_t *cast = (const pm_range_node_t *) node;
814
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->right, 0);
815
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->left, 0);
816
+ break;
817
+ }
818
+ case PM_RESCUE_MODIFIER_NODE: {
819
+ const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node;
820
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->rescue_expression, 0);
821
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
822
+ break;
823
+ }
824
+ case PM_RESCUE_NODE: {
825
+ const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node;
826
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->subsequent, 0);
827
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
828
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->reference, 0);
829
+ for (size_t list_index = cast->exceptions.size; list_index > 0; list_index--) {
830
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->exceptions.nodes[list_index - 1], 0);
831
+ }
832
+ break;
833
+ }
834
+ case PM_RETURN_NODE: {
835
+ const pm_return_node_t *cast = (const pm_return_node_t *) node;
836
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
837
+ break;
838
+ }
839
+ case PM_SHAREABLE_CONSTANT_NODE: {
840
+ const pm_shareable_constant_node_t *cast = (const pm_shareable_constant_node_t *) node;
841
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->write, 0);
842
+ break;
843
+ }
844
+ case PM_SINGLETON_CLASS_NODE: {
845
+ const pm_singleton_class_node_t *cast = (const pm_singleton_class_node_t *) node;
846
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->body, 0);
847
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
848
+ break;
849
+ }
850
+ case PM_SPLAT_NODE: {
851
+ const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
852
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->expression, 0);
853
+ break;
854
+ }
855
+ case PM_STATEMENTS_NODE: {
856
+ const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
857
+ for (size_t list_index = cast->body.size; list_index > 0; list_index--) {
858
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->body.nodes[list_index - 1], 0);
859
+ }
860
+ break;
861
+ }
862
+ case PM_SUPER_NODE: {
863
+ const pm_super_node_t *cast = (const pm_super_node_t *) node;
864
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->block, 0);
865
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
866
+ break;
867
+ }
868
+ case PM_UNDEF_NODE: {
869
+ const pm_undef_node_t *cast = (const pm_undef_node_t *) node;
870
+ for (size_t list_index = cast->names.size; list_index > 0; list_index--) {
871
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->names.nodes[list_index - 1], 0);
872
+ }
873
+ break;
874
+ }
875
+ case PM_UNLESS_NODE: {
876
+ const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
877
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->else_clause, 0);
878
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
879
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
880
+ break;
881
+ }
882
+ case PM_UNTIL_NODE: {
883
+ const pm_until_node_t *cast = (const pm_until_node_t *) node;
884
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
885
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
886
+ break;
887
+ }
888
+ case PM_WHEN_NODE: {
889
+ const pm_when_node_t *cast = (const pm_when_node_t *) node;
890
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
891
+ for (size_t list_index = cast->conditions.size; list_index > 0; list_index--) {
892
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, cast->conditions.nodes[list_index - 1], 0);
893
+ }
894
+ break;
895
+ }
896
+ case PM_WHILE_NODE: {
897
+ const pm_while_node_t *cast = (const pm_while_node_t *) node;
898
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->statements, 0);
899
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->predicate, 0);
900
+ break;
901
+ }
902
+ case PM_YIELD_NODE: {
903
+ const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
904
+ pm_serialize_stack_push(&stack, PM_SERIALIZE_ENTRY_NODE, (const pm_node_t *) cast->arguments, 0);
905
+ break;
906
+ }
907
+ default:
908
+ break;
909
+ }
910
+
911
+ if (stack.size != index + 1) continue;
912
+ stack.size--;
913
+ }
914
+
915
+ pm_buffer_append_byte(buffer, (uint8_t) PM_NODE_TYPE(node));
916
+ pm_buffer_append_varuint(buffer, node->node_id);
917
+ pm_serialize_location(&node->location, buffer);
918
+
919
+ switch (PM_NODE_TYPE(node)) {
920
+ /* A ScopeNode is never part of the tree, so it has no fields to
921
+ * serialize. */
922
+ case PM_SCOPE_NODE:
923
+ break;
924
+ case PM_ALIAS_GLOBAL_VARIABLE_NODE: {
925
+ const pm_alias_global_variable_node_t *cast = (const pm_alias_global_variable_node_t *) node;
926
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
927
+ pm_serialize_location(&cast->keyword_loc, buffer);
928
+ break;
929
+ }
930
+ case PM_ALIAS_METHOD_NODE: {
931
+ const pm_alias_method_node_t *cast = (const pm_alias_method_node_t *) node;
932
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
933
+ pm_serialize_location(&cast->keyword_loc, buffer);
934
+ break;
935
+ }
936
+ case PM_ALTERNATION_PATTERN_NODE: {
937
+ const pm_alternation_pattern_node_t *cast = (const pm_alternation_pattern_node_t *) node;
938
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
939
+ pm_serialize_location(&cast->operator_loc, buffer);
940
+ break;
941
+ }
942
+ case PM_AND_NODE: {
943
+ const pm_and_node_t *cast = (const pm_and_node_t *) node;
944
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
945
+ pm_serialize_location(&cast->operator_loc, buffer);
946
+ break;
947
+ }
948
+ case PM_ARGUMENTS_NODE: {
949
+ const pm_arguments_node_t *cast = (const pm_arguments_node_t *) node;
950
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
951
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->arguments.size));
952
+ break;
953
+ }
954
+ case PM_ARRAY_NODE: {
955
+ const pm_array_node_t *cast = (const pm_array_node_t *) node;
956
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
957
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
958
+ if (cast->opening_loc.length == 0) {
959
+ pm_buffer_append_byte(buffer, 0);
960
+ } else {
961
+ pm_buffer_append_byte(buffer, 1);
962
+ pm_serialize_location(&cast->opening_loc, buffer);
963
+ }
964
+ if (cast->closing_loc.length == 0) {
965
+ pm_buffer_append_byte(buffer, 0);
966
+ } else {
967
+ pm_buffer_append_byte(buffer, 1);
968
+ pm_serialize_location(&cast->closing_loc, buffer);
969
+ }
970
+ break;
971
+ }
972
+ case PM_ARRAY_PATTERN_NODE: {
973
+ const pm_array_pattern_node_t *cast = (const pm_array_pattern_node_t *) node;
974
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
975
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->requireds.size));
976
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->posts.size));
977
+ if (cast->opening_loc.length == 0) {
978
+ pm_buffer_append_byte(buffer, 0);
979
+ } else {
980
+ pm_buffer_append_byte(buffer, 1);
981
+ pm_serialize_location(&cast->opening_loc, buffer);
982
+ }
983
+ if (cast->closing_loc.length == 0) {
984
+ pm_buffer_append_byte(buffer, 0);
985
+ } else {
986
+ pm_buffer_append_byte(buffer, 1);
987
+ pm_serialize_location(&cast->closing_loc, buffer);
988
+ }
989
+ break;
990
+ }
991
+ case PM_ASSOC_NODE: {
992
+ const pm_assoc_node_t *cast = (const pm_assoc_node_t *) node;
993
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
994
+ if (cast->operator_loc.length == 0) {
995
+ pm_buffer_append_byte(buffer, 0);
996
+ } else {
997
+ pm_buffer_append_byte(buffer, 1);
998
+ pm_serialize_location(&cast->operator_loc, buffer);
999
+ }
1000
+ break;
1001
+ }
1002
+ case PM_ASSOC_SPLAT_NODE: {
1003
+ const pm_assoc_splat_node_t *cast = (const pm_assoc_splat_node_t *) node;
1004
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1005
+ pm_serialize_location(&cast->operator_loc, buffer);
1006
+ break;
1007
+ }
1008
+ case PM_BACK_REFERENCE_READ_NODE: {
1009
+ const pm_back_reference_read_node_t *cast = (const pm_back_reference_read_node_t *) node;
1010
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1011
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1012
+ break;
1013
+ }
1014
+ case PM_BEGIN_NODE: {
1015
+ const pm_begin_node_t *cast = (const pm_begin_node_t *) node;
1016
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1017
+ if (cast->begin_keyword_loc.length == 0) {
1018
+ pm_buffer_append_byte(buffer, 0);
1019
+ } else {
1020
+ pm_buffer_append_byte(buffer, 1);
1021
+ pm_serialize_location(&cast->begin_keyword_loc, buffer);
1022
+ }
1023
+ if (cast->end_keyword_loc.length == 0) {
1024
+ pm_buffer_append_byte(buffer, 0);
1025
+ } else {
1026
+ pm_buffer_append_byte(buffer, 1);
1027
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1028
+ }
1029
+ break;
1030
+ }
1031
+ case PM_BLOCK_ARGUMENT_NODE: {
1032
+ const pm_block_argument_node_t *cast = (const pm_block_argument_node_t *) node;
1033
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1034
+ pm_serialize_location(&cast->operator_loc, buffer);
1035
+ break;
1036
+ }
1037
+ case PM_BLOCK_LOCAL_VARIABLE_NODE: {
1038
+ const pm_block_local_variable_node_t *cast = (const pm_block_local_variable_node_t *) node;
1039
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1040
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1041
+ break;
1042
+ }
1043
+ case PM_BLOCK_NODE: {
1044
+ const pm_block_node_t *cast = (const pm_block_node_t *) node;
1045
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1046
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1047
+ for (size_t index = 0; index < cast->locals.size; index++) {
1048
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1049
+ }
1050
+ pm_serialize_location(&cast->opening_loc, buffer);
1051
+ pm_serialize_location(&cast->closing_loc, buffer);
1052
+ break;
1053
+ }
1054
+ case PM_BLOCK_PARAMETER_NODE: {
1055
+ const pm_block_parameter_node_t *cast = (const pm_block_parameter_node_t *) node;
1056
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1057
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1058
+ if (cast->name_loc.length == 0) {
1059
+ pm_buffer_append_byte(buffer, 0);
1060
+ } else {
1061
+ pm_buffer_append_byte(buffer, 1);
1062
+ pm_serialize_location(&cast->name_loc, buffer);
1063
+ }
1064
+ pm_serialize_location(&cast->operator_loc, buffer);
1065
+ break;
1066
+ }
1067
+ case PM_BLOCK_PARAMETERS_NODE: {
1068
+ const pm_block_parameters_node_t *cast = (const pm_block_parameters_node_t *) node;
1069
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1070
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1071
+ if (cast->opening_loc.length == 0) {
1072
+ pm_buffer_append_byte(buffer, 0);
1073
+ } else {
1074
+ pm_buffer_append_byte(buffer, 1);
1075
+ pm_serialize_location(&cast->opening_loc, buffer);
1076
+ }
1077
+ if (cast->closing_loc.length == 0) {
1078
+ pm_buffer_append_byte(buffer, 0);
1079
+ } else {
1080
+ pm_buffer_append_byte(buffer, 1);
1081
+ pm_serialize_location(&cast->closing_loc, buffer);
1082
+ }
1083
+ break;
1084
+ }
1085
+ case PM_BREAK_NODE: {
1086
+ const pm_break_node_t *cast = (const pm_break_node_t *) node;
1087
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1088
+ pm_serialize_location(&cast->keyword_loc, buffer);
1089
+ break;
1090
+ }
1091
+ case PM_CALL_AND_WRITE_NODE: {
1092
+ const pm_call_and_write_node_t *cast = (const pm_call_and_write_node_t *) node;
1093
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1094
+ if (cast->call_operator_loc.length == 0) {
1095
+ pm_buffer_append_byte(buffer, 0);
1096
+ } else {
1097
+ pm_buffer_append_byte(buffer, 1);
1098
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1099
+ }
1100
+ if (cast->message_loc.length == 0) {
1101
+ pm_buffer_append_byte(buffer, 0);
1102
+ } else {
1103
+ pm_buffer_append_byte(buffer, 1);
1104
+ pm_serialize_location(&cast->message_loc, buffer);
1105
+ }
1106
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->read_name));
1107
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->write_name));
1108
+ pm_serialize_location(&cast->operator_loc, buffer);
1109
+ break;
1110
+ }
1111
+ case PM_CALL_NODE: {
1112
+ const pm_call_node_t *cast = (const pm_call_node_t *) node;
1113
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1114
+ if (cast->call_operator_loc.length == 0) {
1115
+ pm_buffer_append_byte(buffer, 0);
1116
+ } else {
1117
+ pm_buffer_append_byte(buffer, 1);
1118
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1119
+ }
1120
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1121
+ if (cast->message_loc.length == 0) {
1122
+ pm_buffer_append_byte(buffer, 0);
1123
+ } else {
1124
+ pm_buffer_append_byte(buffer, 1);
1125
+ pm_serialize_location(&cast->message_loc, buffer);
1126
+ }
1127
+ if (cast->opening_loc.length == 0) {
1128
+ pm_buffer_append_byte(buffer, 0);
1129
+ } else {
1130
+ pm_buffer_append_byte(buffer, 1);
1131
+ pm_serialize_location(&cast->opening_loc, buffer);
1132
+ }
1133
+ if (cast->closing_loc.length == 0) {
1134
+ pm_buffer_append_byte(buffer, 0);
1135
+ } else {
1136
+ pm_buffer_append_byte(buffer, 1);
1137
+ pm_serialize_location(&cast->closing_loc, buffer);
1138
+ }
1139
+ if (cast->equal_loc.length == 0) {
1140
+ pm_buffer_append_byte(buffer, 0);
1141
+ } else {
1142
+ pm_buffer_append_byte(buffer, 1);
1143
+ pm_serialize_location(&cast->equal_loc, buffer);
1144
+ }
1145
+ break;
1146
+ }
1147
+ case PM_CALL_OPERATOR_WRITE_NODE: {
1148
+ const pm_call_operator_write_node_t *cast = (const pm_call_operator_write_node_t *) node;
1149
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1150
+ if (cast->call_operator_loc.length == 0) {
1151
+ pm_buffer_append_byte(buffer, 0);
1152
+ } else {
1153
+ pm_buffer_append_byte(buffer, 1);
1154
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1155
+ }
1156
+ if (cast->message_loc.length == 0) {
1157
+ pm_buffer_append_byte(buffer, 0);
1158
+ } else {
1159
+ pm_buffer_append_byte(buffer, 1);
1160
+ pm_serialize_location(&cast->message_loc, buffer);
1161
+ }
1162
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->read_name));
1163
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->write_name));
1164
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1165
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1166
+ break;
1167
+ }
1168
+ case PM_CALL_OR_WRITE_NODE: {
1169
+ const pm_call_or_write_node_t *cast = (const pm_call_or_write_node_t *) node;
1170
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1171
+ if (cast->call_operator_loc.length == 0) {
1172
+ pm_buffer_append_byte(buffer, 0);
1173
+ } else {
1174
+ pm_buffer_append_byte(buffer, 1);
1175
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1176
+ }
1177
+ if (cast->message_loc.length == 0) {
1178
+ pm_buffer_append_byte(buffer, 0);
1179
+ } else {
1180
+ pm_buffer_append_byte(buffer, 1);
1181
+ pm_serialize_location(&cast->message_loc, buffer);
1182
+ }
1183
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->read_name));
1184
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->write_name));
1185
+ pm_serialize_location(&cast->operator_loc, buffer);
1186
+ break;
1187
+ }
1188
+ case PM_CALL_TARGET_NODE: {
1189
+ const pm_call_target_node_t *cast = (const pm_call_target_node_t *) node;
1190
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1191
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1192
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1193
+ pm_serialize_location(&cast->message_loc, buffer);
1194
+ break;
1195
+ }
1196
+ case PM_CAPTURE_PATTERN_NODE: {
1197
+ const pm_capture_pattern_node_t *cast = (const pm_capture_pattern_node_t *) node;
1198
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1199
+ pm_serialize_location(&cast->operator_loc, buffer);
1200
+ break;
1201
+ }
1202
+ case PM_CASE_MATCH_NODE: {
1203
+ const pm_case_match_node_t *cast = (const pm_case_match_node_t *) node;
1204
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1205
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->conditions.size));
1206
+ pm_serialize_location(&cast->case_keyword_loc, buffer);
1207
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1208
+ break;
1209
+ }
1210
+ case PM_CASE_NODE: {
1211
+ const pm_case_node_t *cast = (const pm_case_node_t *) node;
1212
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1213
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->conditions.size));
1214
+ pm_serialize_location(&cast->case_keyword_loc, buffer);
1215
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1216
+ break;
1217
+ }
1218
+ case PM_CLASS_NODE: {
1219
+ const pm_class_node_t *cast = (const pm_class_node_t *) node;
1220
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1221
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1222
+ for (size_t index = 0; index < cast->locals.size; index++) {
1223
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1224
+ }
1225
+ pm_serialize_location(&cast->class_keyword_loc, buffer);
1226
+ if (cast->inheritance_operator_loc.length == 0) {
1227
+ pm_buffer_append_byte(buffer, 0);
1228
+ } else {
1229
+ pm_buffer_append_byte(buffer, 1);
1230
+ pm_serialize_location(&cast->inheritance_operator_loc, buffer);
1231
+ }
1232
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1233
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1234
+ break;
1235
+ }
1236
+ case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
1237
+ const pm_class_variable_and_write_node_t *cast = (const pm_class_variable_and_write_node_t *) node;
1238
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1239
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1240
+ pm_serialize_location(&cast->name_loc, buffer);
1241
+ pm_serialize_location(&cast->operator_loc, buffer);
1242
+ break;
1243
+ }
1244
+ case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
1245
+ const pm_class_variable_operator_write_node_t *cast = (const pm_class_variable_operator_write_node_t *) node;
1246
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1247
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1248
+ pm_serialize_location(&cast->name_loc, buffer);
1249
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1250
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1251
+ break;
1252
+ }
1253
+ case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
1254
+ const pm_class_variable_or_write_node_t *cast = (const pm_class_variable_or_write_node_t *) node;
1255
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1256
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1257
+ pm_serialize_location(&cast->name_loc, buffer);
1258
+ pm_serialize_location(&cast->operator_loc, buffer);
1259
+ break;
1260
+ }
1261
+ case PM_CLASS_VARIABLE_READ_NODE: {
1262
+ const pm_class_variable_read_node_t *cast = (const pm_class_variable_read_node_t *) node;
1263
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1264
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1265
+ break;
1266
+ }
1267
+ case PM_CLASS_VARIABLE_TARGET_NODE: {
1268
+ const pm_class_variable_target_node_t *cast = (const pm_class_variable_target_node_t *) node;
1269
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1270
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1271
+ break;
1272
+ }
1273
+ case PM_CLASS_VARIABLE_WRITE_NODE: {
1274
+ const pm_class_variable_write_node_t *cast = (const pm_class_variable_write_node_t *) node;
1275
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1276
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1277
+ pm_serialize_location(&cast->name_loc, buffer);
1278
+ pm_serialize_location(&cast->operator_loc, buffer);
1279
+ break;
1280
+ }
1281
+ case PM_CONSTANT_AND_WRITE_NODE: {
1282
+ const pm_constant_and_write_node_t *cast = (const pm_constant_and_write_node_t *) node;
1283
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1284
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1285
+ pm_serialize_location(&cast->name_loc, buffer);
1286
+ pm_serialize_location(&cast->operator_loc, buffer);
1287
+ break;
1288
+ }
1289
+ case PM_CONSTANT_OPERATOR_WRITE_NODE: {
1290
+ const pm_constant_operator_write_node_t *cast = (const pm_constant_operator_write_node_t *) node;
1291
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1292
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1293
+ pm_serialize_location(&cast->name_loc, buffer);
1294
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1295
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1296
+ break;
1297
+ }
1298
+ case PM_CONSTANT_OR_WRITE_NODE: {
1299
+ const pm_constant_or_write_node_t *cast = (const pm_constant_or_write_node_t *) node;
1300
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1301
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1302
+ pm_serialize_location(&cast->name_loc, buffer);
1303
+ pm_serialize_location(&cast->operator_loc, buffer);
1304
+ break;
1305
+ }
1306
+ case PM_CONSTANT_PATH_AND_WRITE_NODE: {
1307
+ const pm_constant_path_and_write_node_t *cast = (const pm_constant_path_and_write_node_t *) node;
1308
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1309
+ pm_serialize_location(&cast->operator_loc, buffer);
1310
+ break;
1311
+ }
1312
+ case PM_CONSTANT_PATH_NODE: {
1313
+ const pm_constant_path_node_t *cast = (const pm_constant_path_node_t *) node;
1314
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1315
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1316
+ pm_serialize_location(&cast->delimiter_loc, buffer);
1317
+ pm_serialize_location(&cast->name_loc, buffer);
1318
+ break;
1319
+ }
1320
+ case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
1321
+ const pm_constant_path_operator_write_node_t *cast = (const pm_constant_path_operator_write_node_t *) node;
1322
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1323
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1324
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1325
+ break;
1326
+ }
1327
+ case PM_CONSTANT_PATH_OR_WRITE_NODE: {
1328
+ const pm_constant_path_or_write_node_t *cast = (const pm_constant_path_or_write_node_t *) node;
1329
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1330
+ pm_serialize_location(&cast->operator_loc, buffer);
1331
+ break;
1332
+ }
1333
+ case PM_CONSTANT_PATH_TARGET_NODE: {
1334
+ const pm_constant_path_target_node_t *cast = (const pm_constant_path_target_node_t *) node;
1335
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1336
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1337
+ pm_serialize_location(&cast->delimiter_loc, buffer);
1338
+ pm_serialize_location(&cast->name_loc, buffer);
1339
+ break;
1340
+ }
1341
+ case PM_CONSTANT_PATH_WRITE_NODE: {
1342
+ const pm_constant_path_write_node_t *cast = (const pm_constant_path_write_node_t *) node;
1343
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1344
+ pm_serialize_location(&cast->operator_loc, buffer);
1345
+ break;
1346
+ }
1347
+ case PM_CONSTANT_READ_NODE: {
1348
+ const pm_constant_read_node_t *cast = (const pm_constant_read_node_t *) node;
1349
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1350
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1351
+ break;
1352
+ }
1353
+ case PM_CONSTANT_TARGET_NODE: {
1354
+ const pm_constant_target_node_t *cast = (const pm_constant_target_node_t *) node;
1355
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1356
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1357
+ break;
1358
+ }
1359
+ case PM_CONSTANT_WRITE_NODE: {
1360
+ const pm_constant_write_node_t *cast = (const pm_constant_write_node_t *) node;
1361
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1362
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1363
+ pm_serialize_location(&cast->name_loc, buffer);
1364
+ pm_serialize_location(&cast->operator_loc, buffer);
1365
+ break;
1366
+ }
1367
+ case PM_DEF_NODE: {
1368
+ const pm_def_node_t *cast = (const pm_def_node_t *) node;
1369
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1370
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1371
+ pm_serialize_location(&cast->name_loc, buffer);
1372
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1373
+ for (size_t index = 0; index < cast->locals.size; index++) {
1374
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1375
+ }
1376
+ pm_serialize_location(&cast->def_keyword_loc, buffer);
1377
+ if (cast->operator_loc.length == 0) {
1378
+ pm_buffer_append_byte(buffer, 0);
1379
+ } else {
1380
+ pm_buffer_append_byte(buffer, 1);
1381
+ pm_serialize_location(&cast->operator_loc, buffer);
1382
+ }
1383
+ if (cast->lparen_loc.length == 0) {
1384
+ pm_buffer_append_byte(buffer, 0);
1385
+ } else {
1386
+ pm_buffer_append_byte(buffer, 1);
1387
+ pm_serialize_location(&cast->lparen_loc, buffer);
1388
+ }
1389
+ if (cast->rparen_loc.length == 0) {
1390
+ pm_buffer_append_byte(buffer, 0);
1391
+ } else {
1392
+ pm_buffer_append_byte(buffer, 1);
1393
+ pm_serialize_location(&cast->rparen_loc, buffer);
1394
+ }
1395
+ if (cast->equal_loc.length == 0) {
1396
+ pm_buffer_append_byte(buffer, 0);
1397
+ } else {
1398
+ pm_buffer_append_byte(buffer, 1);
1399
+ pm_serialize_location(&cast->equal_loc, buffer);
1400
+ }
1401
+ if (cast->end_keyword_loc.length == 0) {
1402
+ pm_buffer_append_byte(buffer, 0);
1403
+ } else {
1404
+ pm_buffer_append_byte(buffer, 1);
1405
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1406
+ }
1407
+ break;
1408
+ }
1409
+ case PM_DEFINED_NODE: {
1410
+ const pm_defined_node_t *cast = (const pm_defined_node_t *) node;
1411
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1412
+ if (cast->lparen_loc.length == 0) {
1413
+ pm_buffer_append_byte(buffer, 0);
1414
+ } else {
1415
+ pm_buffer_append_byte(buffer, 1);
1416
+ pm_serialize_location(&cast->lparen_loc, buffer);
1417
+ }
1418
+ if (cast->rparen_loc.length == 0) {
1419
+ pm_buffer_append_byte(buffer, 0);
1420
+ } else {
1421
+ pm_buffer_append_byte(buffer, 1);
1422
+ pm_serialize_location(&cast->rparen_loc, buffer);
1423
+ }
1424
+ pm_serialize_location(&cast->keyword_loc, buffer);
1425
+ break;
1426
+ }
1427
+ case PM_ELSE_NODE: {
1428
+ const pm_else_node_t *cast = (const pm_else_node_t *) node;
1429
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1430
+ pm_serialize_location(&cast->else_keyword_loc, buffer);
1431
+ if (cast->end_keyword_loc.length == 0) {
1432
+ pm_buffer_append_byte(buffer, 0);
1433
+ } else {
1434
+ pm_buffer_append_byte(buffer, 1);
1435
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1436
+ }
1437
+ break;
1438
+ }
1439
+ case PM_EMBEDDED_STATEMENTS_NODE: {
1440
+ const pm_embedded_statements_node_t *cast = (const pm_embedded_statements_node_t *) node;
1441
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1442
+ pm_serialize_location(&cast->opening_loc, buffer);
1443
+ pm_serialize_location(&cast->closing_loc, buffer);
1444
+ break;
1445
+ }
1446
+ case PM_EMBEDDED_VARIABLE_NODE: {
1447
+ const pm_embedded_variable_node_t *cast = (const pm_embedded_variable_node_t *) node;
1448
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1449
+ pm_serialize_location(&cast->operator_loc, buffer);
1450
+ break;
1451
+ }
1452
+ case PM_ENSURE_NODE: {
1453
+ const pm_ensure_node_t *cast = (const pm_ensure_node_t *) node;
1454
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1455
+ pm_serialize_location(&cast->ensure_keyword_loc, buffer);
1456
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1457
+ break;
1458
+ }
1459
+ case PM_ERROR_RECOVERY_NODE: {
1460
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1461
+ break;
1462
+ }
1463
+ case PM_FALSE_NODE: {
1464
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1465
+ break;
1466
+ }
1467
+ case PM_FIND_PATTERN_NODE: {
1468
+ const pm_find_pattern_node_t *cast = (const pm_find_pattern_node_t *) node;
1469
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1470
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->requireds.size));
1471
+ if (cast->opening_loc.length == 0) {
1472
+ pm_buffer_append_byte(buffer, 0);
1473
+ } else {
1474
+ pm_buffer_append_byte(buffer, 1);
1475
+ pm_serialize_location(&cast->opening_loc, buffer);
1476
+ }
1477
+ if (cast->closing_loc.length == 0) {
1478
+ pm_buffer_append_byte(buffer, 0);
1479
+ } else {
1480
+ pm_buffer_append_byte(buffer, 1);
1481
+ pm_serialize_location(&cast->closing_loc, buffer);
1482
+ }
1483
+ break;
1484
+ }
1485
+ case PM_FLIP_FLOP_NODE: {
1486
+ const pm_flip_flop_node_t *cast = (const pm_flip_flop_node_t *) node;
1487
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1488
+ pm_serialize_location(&cast->operator_loc, buffer);
1489
+ break;
1490
+ }
1491
+ case PM_FLOAT_NODE: {
1492
+ const pm_float_node_t *cast = (const pm_float_node_t *) node;
1493
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1494
+ pm_buffer_append_double(buffer, cast->value);
1495
+ break;
1496
+ }
1497
+ case PM_FOR_NODE: {
1498
+ const pm_for_node_t *cast = (const pm_for_node_t *) node;
1499
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1500
+ pm_serialize_location(&cast->for_keyword_loc, buffer);
1501
+ pm_serialize_location(&cast->in_keyword_loc, buffer);
1502
+ if (cast->do_keyword_loc.length == 0) {
1503
+ pm_buffer_append_byte(buffer, 0);
1504
+ } else {
1505
+ pm_buffer_append_byte(buffer, 1);
1506
+ pm_serialize_location(&cast->do_keyword_loc, buffer);
1507
+ }
1508
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1509
+ break;
1510
+ }
1511
+ case PM_FORWARDING_ARGUMENTS_NODE: {
1512
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1513
+ break;
1514
+ }
1515
+ case PM_FORWARDING_PARAMETER_NODE: {
1516
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1517
+ break;
1518
+ }
1519
+ case PM_FORWARDING_SUPER_NODE: {
1520
+ const pm_forwarding_super_node_t *cast = (const pm_forwarding_super_node_t *) node;
1521
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1522
+ pm_serialize_location(&cast->keyword_loc, buffer);
1523
+ break;
1524
+ }
1525
+ case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
1526
+ const pm_global_variable_and_write_node_t *cast = (const pm_global_variable_and_write_node_t *) node;
1527
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1528
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1529
+ pm_serialize_location(&cast->name_loc, buffer);
1530
+ pm_serialize_location(&cast->operator_loc, buffer);
1531
+ break;
1532
+ }
1533
+ case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
1534
+ const pm_global_variable_operator_write_node_t *cast = (const pm_global_variable_operator_write_node_t *) node;
1535
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1536
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1537
+ pm_serialize_location(&cast->name_loc, buffer);
1538
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1539
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1540
+ break;
1541
+ }
1542
+ case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
1543
+ const pm_global_variable_or_write_node_t *cast = (const pm_global_variable_or_write_node_t *) node;
1544
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1545
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1546
+ pm_serialize_location(&cast->name_loc, buffer);
1547
+ pm_serialize_location(&cast->operator_loc, buffer);
1548
+ break;
1549
+ }
1550
+ case PM_GLOBAL_VARIABLE_READ_NODE: {
1551
+ const pm_global_variable_read_node_t *cast = (const pm_global_variable_read_node_t *) node;
1552
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1553
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1554
+ break;
1555
+ }
1556
+ case PM_GLOBAL_VARIABLE_TARGET_NODE: {
1557
+ const pm_global_variable_target_node_t *cast = (const pm_global_variable_target_node_t *) node;
1558
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1559
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1560
+ break;
1561
+ }
1562
+ case PM_GLOBAL_VARIABLE_WRITE_NODE: {
1563
+ const pm_global_variable_write_node_t *cast = (const pm_global_variable_write_node_t *) node;
1564
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1565
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1566
+ pm_serialize_location(&cast->name_loc, buffer);
1567
+ pm_serialize_location(&cast->operator_loc, buffer);
1568
+ break;
1569
+ }
1570
+ case PM_HASH_NODE: {
1571
+ const pm_hash_node_t *cast = (const pm_hash_node_t *) node;
1572
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1573
+ pm_serialize_location(&cast->opening_loc, buffer);
1574
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
1575
+ pm_serialize_location(&cast->closing_loc, buffer);
1576
+ break;
1577
+ }
1578
+ case PM_HASH_PATTERN_NODE: {
1579
+ const pm_hash_pattern_node_t *cast = (const pm_hash_pattern_node_t *) node;
1580
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1581
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
1582
+ if (cast->opening_loc.length == 0) {
1583
+ pm_buffer_append_byte(buffer, 0);
1584
+ } else {
1585
+ pm_buffer_append_byte(buffer, 1);
1586
+ pm_serialize_location(&cast->opening_loc, buffer);
1587
+ }
1588
+ if (cast->closing_loc.length == 0) {
1589
+ pm_buffer_append_byte(buffer, 0);
1590
+ } else {
1591
+ pm_buffer_append_byte(buffer, 1);
1592
+ pm_serialize_location(&cast->closing_loc, buffer);
1593
+ }
1594
+ break;
1595
+ }
1596
+ case PM_IF_NODE: {
1597
+ const pm_if_node_t *cast = (const pm_if_node_t *) node;
1598
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1599
+ if (cast->if_keyword_loc.length == 0) {
1600
+ pm_buffer_append_byte(buffer, 0);
1601
+ } else {
1602
+ pm_buffer_append_byte(buffer, 1);
1603
+ pm_serialize_location(&cast->if_keyword_loc, buffer);
1604
+ }
1605
+ if (cast->then_keyword_loc.length == 0) {
1606
+ pm_buffer_append_byte(buffer, 0);
1607
+ } else {
1608
+ pm_buffer_append_byte(buffer, 1);
1609
+ pm_serialize_location(&cast->then_keyword_loc, buffer);
1610
+ }
1611
+ if (cast->end_keyword_loc.length == 0) {
1612
+ pm_buffer_append_byte(buffer, 0);
1613
+ } else {
1614
+ pm_buffer_append_byte(buffer, 1);
1615
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1616
+ }
1617
+ break;
1618
+ }
1619
+ case PM_IMAGINARY_NODE: {
1620
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1621
+ break;
1622
+ }
1623
+ case PM_IMPLICIT_NODE: {
1624
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1625
+ break;
1626
+ }
1627
+ case PM_IMPLICIT_REST_NODE: {
1628
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1629
+ break;
1630
+ }
1631
+ case PM_IN_NODE: {
1632
+ const pm_in_node_t *cast = (const pm_in_node_t *) node;
1633
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1634
+ pm_serialize_location(&cast->in_keyword_loc, buffer);
1635
+ if (cast->then_keyword_loc.length == 0) {
1636
+ pm_buffer_append_byte(buffer, 0);
1637
+ } else {
1638
+ pm_buffer_append_byte(buffer, 1);
1639
+ pm_serialize_location(&cast->then_keyword_loc, buffer);
1640
+ }
1641
+ break;
1642
+ }
1643
+ case PM_INDEX_AND_WRITE_NODE: {
1644
+ const pm_index_and_write_node_t *cast = (const pm_index_and_write_node_t *) node;
1645
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1646
+ if (cast->call_operator_loc.length == 0) {
1647
+ pm_buffer_append_byte(buffer, 0);
1648
+ } else {
1649
+ pm_buffer_append_byte(buffer, 1);
1650
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1651
+ }
1652
+ pm_serialize_location(&cast->opening_loc, buffer);
1653
+ pm_serialize_location(&cast->closing_loc, buffer);
1654
+ pm_serialize_location(&cast->operator_loc, buffer);
1655
+ break;
1656
+ }
1657
+ case PM_INDEX_OPERATOR_WRITE_NODE: {
1658
+ const pm_index_operator_write_node_t *cast = (const pm_index_operator_write_node_t *) node;
1659
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1660
+ if (cast->call_operator_loc.length == 0) {
1661
+ pm_buffer_append_byte(buffer, 0);
1662
+ } else {
1663
+ pm_buffer_append_byte(buffer, 1);
1664
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1665
+ }
1666
+ pm_serialize_location(&cast->opening_loc, buffer);
1667
+ pm_serialize_location(&cast->closing_loc, buffer);
1668
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1669
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1670
+ break;
1671
+ }
1672
+ case PM_INDEX_OR_WRITE_NODE: {
1673
+ const pm_index_or_write_node_t *cast = (const pm_index_or_write_node_t *) node;
1674
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1675
+ if (cast->call_operator_loc.length == 0) {
1676
+ pm_buffer_append_byte(buffer, 0);
1677
+ } else {
1678
+ pm_buffer_append_byte(buffer, 1);
1679
+ pm_serialize_location(&cast->call_operator_loc, buffer);
1680
+ }
1681
+ pm_serialize_location(&cast->opening_loc, buffer);
1682
+ pm_serialize_location(&cast->closing_loc, buffer);
1683
+ pm_serialize_location(&cast->operator_loc, buffer);
1684
+ break;
1685
+ }
1686
+ case PM_INDEX_TARGET_NODE: {
1687
+ const pm_index_target_node_t *cast = (const pm_index_target_node_t *) node;
1688
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1689
+ pm_serialize_location(&cast->opening_loc, buffer);
1690
+ pm_serialize_location(&cast->closing_loc, buffer);
1691
+ break;
1692
+ }
1693
+ case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1694
+ const pm_instance_variable_and_write_node_t *cast = (const pm_instance_variable_and_write_node_t *) node;
1695
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1696
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1697
+ pm_serialize_location(&cast->name_loc, buffer);
1698
+ pm_serialize_location(&cast->operator_loc, buffer);
1699
+ break;
1700
+ }
1701
+ case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1702
+ const pm_instance_variable_operator_write_node_t *cast = (const pm_instance_variable_operator_write_node_t *) node;
1703
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1704
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1705
+ pm_serialize_location(&cast->name_loc, buffer);
1706
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1707
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1708
+ break;
1709
+ }
1710
+ case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1711
+ const pm_instance_variable_or_write_node_t *cast = (const pm_instance_variable_or_write_node_t *) node;
1712
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1713
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1714
+ pm_serialize_location(&cast->name_loc, buffer);
1715
+ pm_serialize_location(&cast->operator_loc, buffer);
1716
+ break;
1717
+ }
1718
+ case PM_INSTANCE_VARIABLE_READ_NODE: {
1719
+ const pm_instance_variable_read_node_t *cast = (const pm_instance_variable_read_node_t *) node;
1720
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1721
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1722
+ break;
1723
+ }
1724
+ case PM_INSTANCE_VARIABLE_TARGET_NODE: {
1725
+ const pm_instance_variable_target_node_t *cast = (const pm_instance_variable_target_node_t *) node;
1726
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1727
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1728
+ break;
1729
+ }
1730
+ case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1731
+ const pm_instance_variable_write_node_t *cast = (const pm_instance_variable_write_node_t *) node;
1732
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1733
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1734
+ pm_serialize_location(&cast->name_loc, buffer);
1735
+ pm_serialize_location(&cast->operator_loc, buffer);
1736
+ break;
1737
+ }
1738
+ case PM_INTEGER_NODE: {
1739
+ const pm_integer_node_t *cast = (const pm_integer_node_t *) node;
1740
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1741
+ pm_serialize_integer(&cast->value, buffer);
1742
+ break;
1743
+ }
1744
+ case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1745
+ const pm_interpolated_match_last_line_node_t *cast = (const pm_interpolated_match_last_line_node_t *) node;
1746
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1747
+ pm_serialize_location(&cast->opening_loc, buffer);
1748
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1749
+ pm_serialize_location(&cast->closing_loc, buffer);
1750
+ break;
1751
+ }
1752
+ case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1753
+ const pm_interpolated_regular_expression_node_t *cast = (const pm_interpolated_regular_expression_node_t *) node;
1754
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1755
+ pm_serialize_location(&cast->opening_loc, buffer);
1756
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1757
+ pm_serialize_location(&cast->closing_loc, buffer);
1758
+ break;
1759
+ }
1760
+ case PM_INTERPOLATED_STRING_NODE: {
1761
+ const pm_interpolated_string_node_t *cast = (const pm_interpolated_string_node_t *) node;
1762
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1763
+ if (cast->opening_loc.length == 0) {
1764
+ pm_buffer_append_byte(buffer, 0);
1765
+ } else {
1766
+ pm_buffer_append_byte(buffer, 1);
1767
+ pm_serialize_location(&cast->opening_loc, buffer);
1768
+ }
1769
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1770
+ if (cast->closing_loc.length == 0) {
1771
+ pm_buffer_append_byte(buffer, 0);
1772
+ } else {
1773
+ pm_buffer_append_byte(buffer, 1);
1774
+ pm_serialize_location(&cast->closing_loc, buffer);
1775
+ }
1776
+ break;
1777
+ }
1778
+ case PM_INTERPOLATED_SYMBOL_NODE: {
1779
+ const pm_interpolated_symbol_node_t *cast = (const pm_interpolated_symbol_node_t *) node;
1780
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1781
+ if (cast->opening_loc.length == 0) {
1782
+ pm_buffer_append_byte(buffer, 0);
1783
+ } else {
1784
+ pm_buffer_append_byte(buffer, 1);
1785
+ pm_serialize_location(&cast->opening_loc, buffer);
1786
+ }
1787
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1788
+ if (cast->closing_loc.length == 0) {
1789
+ pm_buffer_append_byte(buffer, 0);
1790
+ } else {
1791
+ pm_buffer_append_byte(buffer, 1);
1792
+ pm_serialize_location(&cast->closing_loc, buffer);
1793
+ }
1794
+ break;
1795
+ }
1796
+ case PM_INTERPOLATED_X_STRING_NODE: {
1797
+ const pm_interpolated_x_string_node_t *cast = (const pm_interpolated_x_string_node_t *) node;
1798
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1799
+ pm_serialize_location(&cast->opening_loc, buffer);
1800
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->parts.size));
1801
+ pm_serialize_location(&cast->closing_loc, buffer);
1802
+ break;
1803
+ }
1804
+ case PM_IT_LOCAL_VARIABLE_READ_NODE: {
1805
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1806
+ break;
1807
+ }
1808
+ case PM_IT_PARAMETERS_NODE: {
1809
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1810
+ break;
1811
+ }
1812
+ case PM_KEYWORD_HASH_NODE: {
1813
+ const pm_keyword_hash_node_t *cast = (const pm_keyword_hash_node_t *) node;
1814
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1815
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->elements.size));
1816
+ break;
1817
+ }
1818
+ case PM_KEYWORD_REST_PARAMETER_NODE: {
1819
+ const pm_keyword_rest_parameter_node_t *cast = (const pm_keyword_rest_parameter_node_t *) node;
1820
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1821
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1822
+ if (cast->name_loc.length == 0) {
1823
+ pm_buffer_append_byte(buffer, 0);
1824
+ } else {
1825
+ pm_buffer_append_byte(buffer, 1);
1826
+ pm_serialize_location(&cast->name_loc, buffer);
1827
+ }
1828
+ pm_serialize_location(&cast->operator_loc, buffer);
1829
+ break;
1830
+ }
1831
+ case PM_LAMBDA_NODE: {
1832
+ const pm_lambda_node_t *cast = (const pm_lambda_node_t *) node;
1833
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1834
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1835
+ for (size_t index = 0; index < cast->locals.size; index++) {
1836
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1837
+ }
1838
+ pm_serialize_location(&cast->operator_loc, buffer);
1839
+ pm_serialize_location(&cast->opening_loc, buffer);
1840
+ pm_serialize_location(&cast->closing_loc, buffer);
1841
+ break;
1842
+ }
1843
+ case PM_LOCAL_VARIABLE_AND_WRITE_NODE: {
1844
+ const pm_local_variable_and_write_node_t *cast = (const pm_local_variable_and_write_node_t *) node;
1845
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1846
+ pm_serialize_location(&cast->name_loc, buffer);
1847
+ pm_serialize_location(&cast->operator_loc, buffer);
1848
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1849
+ pm_buffer_append_varuint(buffer, cast->depth);
1850
+ break;
1851
+ }
1852
+ case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1853
+ const pm_local_variable_operator_write_node_t *cast = (const pm_local_variable_operator_write_node_t *) node;
1854
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1855
+ pm_serialize_location(&cast->name_loc, buffer);
1856
+ pm_serialize_location(&cast->binary_operator_loc, buffer);
1857
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1858
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->binary_operator));
1859
+ pm_buffer_append_varuint(buffer, cast->depth);
1860
+ break;
1861
+ }
1862
+ case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1863
+ const pm_local_variable_or_write_node_t *cast = (const pm_local_variable_or_write_node_t *) node;
1864
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1865
+ pm_serialize_location(&cast->name_loc, buffer);
1866
+ pm_serialize_location(&cast->operator_loc, buffer);
1867
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1868
+ pm_buffer_append_varuint(buffer, cast->depth);
1869
+ break;
1870
+ }
1871
+ case PM_LOCAL_VARIABLE_READ_NODE: {
1872
+ const pm_local_variable_read_node_t *cast = (const pm_local_variable_read_node_t *) node;
1873
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1874
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1875
+ pm_buffer_append_varuint(buffer, cast->depth);
1876
+ break;
1877
+ }
1878
+ case PM_LOCAL_VARIABLE_TARGET_NODE: {
1879
+ const pm_local_variable_target_node_t *cast = (const pm_local_variable_target_node_t *) node;
1880
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1881
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1882
+ pm_buffer_append_varuint(buffer, cast->depth);
1883
+ break;
1884
+ }
1885
+ case PM_LOCAL_VARIABLE_WRITE_NODE: {
1886
+ const pm_local_variable_write_node_t *cast = (const pm_local_variable_write_node_t *) node;
1887
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1888
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1889
+ pm_buffer_append_varuint(buffer, cast->depth);
1890
+ pm_serialize_location(&cast->name_loc, buffer);
1891
+ pm_serialize_location(&cast->operator_loc, buffer);
1892
+ break;
1893
+ }
1894
+ case PM_MATCH_LAST_LINE_NODE: {
1895
+ const pm_match_last_line_node_t *cast = (const pm_match_last_line_node_t *) node;
1896
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1897
+ pm_serialize_location(&cast->opening_loc, buffer);
1898
+ pm_serialize_location(&cast->content_loc, buffer);
1899
+ pm_serialize_location(&cast->closing_loc, buffer);
1900
+ pm_serialize_string(&cast->unescaped, buffer);
1901
+ break;
1902
+ }
1903
+ case PM_MATCH_PREDICATE_NODE: {
1904
+ const pm_match_predicate_node_t *cast = (const pm_match_predicate_node_t *) node;
1905
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1906
+ pm_serialize_location(&cast->keyword_loc, buffer);
1907
+ break;
1908
+ }
1909
+ case PM_MATCH_REQUIRED_NODE: {
1910
+ const pm_match_required_node_t *cast = (const pm_match_required_node_t *) node;
1911
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1912
+ pm_serialize_location(&cast->operator_loc, buffer);
1913
+ break;
1914
+ }
1915
+ case PM_MATCH_WRITE_NODE: {
1916
+ const pm_match_write_node_t *cast = (const pm_match_write_node_t *) node;
1917
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1918
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->targets.size));
1919
+ break;
1920
+ }
1921
+ case PM_MODULE_NODE: {
1922
+ const pm_module_node_t *cast = (const pm_module_node_t *) node;
1923
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1924
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
1925
+ for (size_t index = 0; index < cast->locals.size; index++) {
1926
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
1927
+ }
1928
+ pm_serialize_location(&cast->module_keyword_loc, buffer);
1929
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
1930
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
1931
+ break;
1932
+ }
1933
+ case PM_MULTI_TARGET_NODE: {
1934
+ const pm_multi_target_node_t *cast = (const pm_multi_target_node_t *) node;
1935
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1936
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->lefts.size));
1937
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->rights.size));
1938
+ if (cast->lparen_loc.length == 0) {
1939
+ pm_buffer_append_byte(buffer, 0);
1940
+ } else {
1941
+ pm_buffer_append_byte(buffer, 1);
1942
+ pm_serialize_location(&cast->lparen_loc, buffer);
1943
+ }
1944
+ if (cast->rparen_loc.length == 0) {
1945
+ pm_buffer_append_byte(buffer, 0);
1946
+ } else {
1947
+ pm_buffer_append_byte(buffer, 1);
1948
+ pm_serialize_location(&cast->rparen_loc, buffer);
1949
+ }
1950
+ break;
1951
+ }
1952
+ case PM_MULTI_WRITE_NODE: {
1953
+ const pm_multi_write_node_t *cast = (const pm_multi_write_node_t *) node;
1954
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1955
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->lefts.size));
1956
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->rights.size));
1957
+ if (cast->lparen_loc.length == 0) {
1958
+ pm_buffer_append_byte(buffer, 0);
1959
+ } else {
1960
+ pm_buffer_append_byte(buffer, 1);
1961
+ pm_serialize_location(&cast->lparen_loc, buffer);
1962
+ }
1963
+ if (cast->rparen_loc.length == 0) {
1964
+ pm_buffer_append_byte(buffer, 0);
1965
+ } else {
1966
+ pm_buffer_append_byte(buffer, 1);
1967
+ pm_serialize_location(&cast->rparen_loc, buffer);
1968
+ }
1969
+ pm_serialize_location(&cast->operator_loc, buffer);
1970
+ break;
1971
+ }
1972
+ case PM_NEXT_NODE: {
1973
+ const pm_next_node_t *cast = (const pm_next_node_t *) node;
1974
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1975
+ pm_serialize_location(&cast->keyword_loc, buffer);
1976
+ break;
1977
+ }
1978
+ case PM_NIL_NODE: {
1979
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1980
+ break;
1981
+ }
1982
+ case PM_NO_BLOCK_PARAMETER_NODE: {
1983
+ const pm_no_block_parameter_node_t *cast = (const pm_no_block_parameter_node_t *) node;
1984
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1985
+ pm_serialize_location(&cast->operator_loc, buffer);
1986
+ pm_serialize_location(&cast->keyword_loc, buffer);
1987
+ break;
1988
+ }
1989
+ case PM_NO_KEYWORDS_PARAMETER_NODE: {
1990
+ const pm_no_keywords_parameter_node_t *cast = (const pm_no_keywords_parameter_node_t *) node;
1991
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1992
+ pm_serialize_location(&cast->operator_loc, buffer);
1993
+ pm_serialize_location(&cast->keyword_loc, buffer);
1994
+ break;
1995
+ }
1996
+ case PM_NUMBERED_PARAMETERS_NODE: {
1997
+ const pm_numbered_parameters_node_t *cast = (const pm_numbered_parameters_node_t *) node;
1998
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
1999
+ pm_buffer_append_byte(buffer, cast->maximum);
2000
+ break;
2001
+ }
2002
+ case PM_NUMBERED_REFERENCE_READ_NODE: {
2003
+ const pm_numbered_reference_read_node_t *cast = (const pm_numbered_reference_read_node_t *) node;
2004
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2005
+ pm_buffer_append_varuint(buffer, cast->number);
2006
+ break;
2007
+ }
2008
+ case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
2009
+ const pm_optional_keyword_parameter_node_t *cast = (const pm_optional_keyword_parameter_node_t *) node;
2010
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2011
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2012
+ pm_serialize_location(&cast->name_loc, buffer);
2013
+ break;
2014
+ }
2015
+ case PM_OPTIONAL_PARAMETER_NODE: {
2016
+ const pm_optional_parameter_node_t *cast = (const pm_optional_parameter_node_t *) node;
2017
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2018
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2019
+ pm_serialize_location(&cast->name_loc, buffer);
2020
+ pm_serialize_location(&cast->operator_loc, buffer);
2021
+ break;
2022
+ }
2023
+ case PM_OR_NODE: {
2024
+ const pm_or_node_t *cast = (const pm_or_node_t *) node;
2025
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2026
+ pm_serialize_location(&cast->operator_loc, buffer);
2027
+ break;
2028
+ }
2029
+ case PM_PARAMETERS_NODE: {
2030
+ const pm_parameters_node_t *cast = (const pm_parameters_node_t *) node;
2031
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2032
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->requireds.size));
2033
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->optionals.size));
2034
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->posts.size));
2035
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->keywords.size));
2036
+ break;
2037
+ }
2038
+ case PM_PARENTHESES_NODE: {
2039
+ const pm_parentheses_node_t *cast = (const pm_parentheses_node_t *) node;
2040
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2041
+ pm_serialize_location(&cast->opening_loc, buffer);
2042
+ pm_serialize_location(&cast->closing_loc, buffer);
2043
+ break;
2044
+ }
2045
+ case PM_PINNED_EXPRESSION_NODE: {
2046
+ const pm_pinned_expression_node_t *cast = (const pm_pinned_expression_node_t *) node;
2047
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2048
+ pm_serialize_location(&cast->operator_loc, buffer);
2049
+ pm_serialize_location(&cast->lparen_loc, buffer);
2050
+ pm_serialize_location(&cast->rparen_loc, buffer);
2051
+ break;
2052
+ }
2053
+ case PM_PINNED_VARIABLE_NODE: {
2054
+ const pm_pinned_variable_node_t *cast = (const pm_pinned_variable_node_t *) node;
2055
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2056
+ pm_serialize_location(&cast->operator_loc, buffer);
2057
+ break;
2058
+ }
2059
+ case PM_POST_EXECUTION_NODE: {
2060
+ const pm_post_execution_node_t *cast = (const pm_post_execution_node_t *) node;
2061
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2062
+ pm_serialize_location(&cast->keyword_loc, buffer);
2063
+ pm_serialize_location(&cast->opening_loc, buffer);
2064
+ pm_serialize_location(&cast->closing_loc, buffer);
2065
+ break;
2066
+ }
2067
+ case PM_PRE_EXECUTION_NODE: {
2068
+ const pm_pre_execution_node_t *cast = (const pm_pre_execution_node_t *) node;
2069
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2070
+ pm_serialize_location(&cast->keyword_loc, buffer);
2071
+ pm_serialize_location(&cast->opening_loc, buffer);
2072
+ pm_serialize_location(&cast->closing_loc, buffer);
2073
+ break;
2074
+ }
2075
+ case PM_PROGRAM_NODE: {
2076
+ const pm_program_node_t *cast = (const pm_program_node_t *) node;
2077
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2078
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
2079
+ for (size_t index = 0; index < cast->locals.size; index++) {
2080
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
2081
+ }
2082
+ break;
2083
+ }
2084
+ case PM_RANGE_NODE: {
2085
+ const pm_range_node_t *cast = (const pm_range_node_t *) node;
2086
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2087
+ pm_serialize_location(&cast->operator_loc, buffer);
2088
+ break;
2089
+ }
2090
+ case PM_RATIONAL_NODE: {
2091
+ const pm_rational_node_t *cast = (const pm_rational_node_t *) node;
2092
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2093
+ pm_serialize_integer(&cast->numerator, buffer);
2094
+ pm_serialize_integer(&cast->denominator, buffer);
2095
+ break;
2096
+ }
2097
+ case PM_REDO_NODE: {
2098
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2099
+ break;
2100
+ }
2101
+ case PM_REGULAR_EXPRESSION_NODE: {
2102
+ const pm_regular_expression_node_t *cast = (const pm_regular_expression_node_t *) node;
2103
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2104
+ pm_serialize_location(&cast->opening_loc, buffer);
2105
+ pm_serialize_location(&cast->content_loc, buffer);
2106
+ pm_serialize_location(&cast->closing_loc, buffer);
2107
+ pm_serialize_string(&cast->unescaped, buffer);
2108
+ break;
2109
+ }
2110
+ case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
2111
+ const pm_required_keyword_parameter_node_t *cast = (const pm_required_keyword_parameter_node_t *) node;
2112
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2113
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2114
+ pm_serialize_location(&cast->name_loc, buffer);
2115
+ break;
2116
+ }
2117
+ case PM_REQUIRED_PARAMETER_NODE: {
2118
+ const pm_required_parameter_node_t *cast = (const pm_required_parameter_node_t *) node;
2119
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2120
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2121
+ break;
2122
+ }
2123
+ case PM_RESCUE_MODIFIER_NODE: {
2124
+ const pm_rescue_modifier_node_t *cast = (const pm_rescue_modifier_node_t *) node;
2125
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2126
+ pm_serialize_location(&cast->keyword_loc, buffer);
2127
+ break;
2128
+ }
2129
+ case PM_RESCUE_NODE: {
2130
+ const pm_rescue_node_t *cast = (const pm_rescue_node_t *) node;
2131
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2132
+ pm_serialize_location(&cast->keyword_loc, buffer);
2133
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->exceptions.size));
2134
+ if (cast->operator_loc.length == 0) {
2135
+ pm_buffer_append_byte(buffer, 0);
2136
+ } else {
2137
+ pm_buffer_append_byte(buffer, 1);
2138
+ pm_serialize_location(&cast->operator_loc, buffer);
2139
+ }
2140
+ if (cast->then_keyword_loc.length == 0) {
2141
+ pm_buffer_append_byte(buffer, 0);
2142
+ } else {
2143
+ pm_buffer_append_byte(buffer, 1);
2144
+ pm_serialize_location(&cast->then_keyword_loc, buffer);
2145
+ }
2146
+ break;
2147
+ }
2148
+ case PM_REST_PARAMETER_NODE: {
2149
+ const pm_rest_parameter_node_t *cast = (const pm_rest_parameter_node_t *) node;
2150
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2151
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->name));
2152
+ if (cast->name_loc.length == 0) {
2153
+ pm_buffer_append_byte(buffer, 0);
2154
+ } else {
2155
+ pm_buffer_append_byte(buffer, 1);
2156
+ pm_serialize_location(&cast->name_loc, buffer);
2157
+ }
2158
+ pm_serialize_location(&cast->operator_loc, buffer);
2159
+ break;
2160
+ }
2161
+ case PM_RETRY_NODE: {
2162
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2163
+ break;
2164
+ }
2165
+ case PM_RETURN_NODE: {
2166
+ const pm_return_node_t *cast = (const pm_return_node_t *) node;
2167
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2168
+ pm_serialize_location(&cast->keyword_loc, buffer);
2169
+ break;
2170
+ }
2171
+ case PM_SELF_NODE: {
2172
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2173
+ break;
2174
+ }
2175
+ case PM_SHAREABLE_CONSTANT_NODE: {
2176
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2177
+ break;
2178
+ }
2179
+ case PM_SINGLETON_CLASS_NODE: {
2180
+ const pm_singleton_class_node_t *cast = (const pm_singleton_class_node_t *) node;
2181
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2182
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.size));
2183
+ for (size_t index = 0; index < cast->locals.size; index++) {
2184
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->locals.ids[index]));
2185
+ }
2186
+ pm_serialize_location(&cast->class_keyword_loc, buffer);
2187
+ pm_serialize_location(&cast->operator_loc, buffer);
2188
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
2189
+ break;
2190
+ }
2191
+ case PM_SOURCE_ENCODING_NODE: {
2192
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2193
+ break;
2194
+ }
2195
+ case PM_SOURCE_FILE_NODE: {
2196
+ const pm_source_file_node_t *cast = (const pm_source_file_node_t *) node;
2197
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2198
+ pm_serialize_string(&cast->filepath, buffer);
2199
+ break;
2200
+ }
2201
+ case PM_SOURCE_LINE_NODE: {
2202
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2203
+ break;
2204
+ }
2205
+ case PM_SPLAT_NODE: {
2206
+ const pm_splat_node_t *cast = (const pm_splat_node_t *) node;
2207
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2208
+ pm_serialize_location(&cast->operator_loc, buffer);
2209
+ break;
2210
+ }
2211
+ case PM_STATEMENTS_NODE: {
2212
+ const pm_statements_node_t *cast = (const pm_statements_node_t *) node;
2213
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2214
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->body.size));
2215
+ break;
2216
+ }
2217
+ case PM_STRING_NODE: {
2218
+ const pm_string_node_t *cast = (const pm_string_node_t *) node;
2219
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2220
+ if (cast->opening_loc.length == 0) {
2221
+ pm_buffer_append_byte(buffer, 0);
2222
+ } else {
2223
+ pm_buffer_append_byte(buffer, 1);
2224
+ pm_serialize_location(&cast->opening_loc, buffer);
2225
+ }
2226
+ pm_serialize_location(&cast->content_loc, buffer);
2227
+ if (cast->closing_loc.length == 0) {
2228
+ pm_buffer_append_byte(buffer, 0);
2229
+ } else {
2230
+ pm_buffer_append_byte(buffer, 1);
2231
+ pm_serialize_location(&cast->closing_loc, buffer);
2232
+ }
2233
+ pm_serialize_string(&cast->unescaped, buffer);
2234
+ break;
2235
+ }
2236
+ case PM_SUPER_NODE: {
2237
+ const pm_super_node_t *cast = (const pm_super_node_t *) node;
2238
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2239
+ pm_serialize_location(&cast->keyword_loc, buffer);
2240
+ if (cast->lparen_loc.length == 0) {
2241
+ pm_buffer_append_byte(buffer, 0);
2242
+ } else {
2243
+ pm_buffer_append_byte(buffer, 1);
2244
+ pm_serialize_location(&cast->lparen_loc, buffer);
2245
+ }
2246
+ if (cast->rparen_loc.length == 0) {
2247
+ pm_buffer_append_byte(buffer, 0);
2248
+ } else {
2249
+ pm_buffer_append_byte(buffer, 1);
2250
+ pm_serialize_location(&cast->rparen_loc, buffer);
2251
+ }
2252
+ break;
2253
+ }
2254
+ case PM_SYMBOL_NODE: {
2255
+ const pm_symbol_node_t *cast = (const pm_symbol_node_t *) node;
2256
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2257
+ if (cast->opening_loc.length == 0) {
2258
+ pm_buffer_append_byte(buffer, 0);
2259
+ } else {
2260
+ pm_buffer_append_byte(buffer, 1);
2261
+ pm_serialize_location(&cast->opening_loc, buffer);
2262
+ }
2263
+ pm_serialize_location(&cast->content_loc, buffer);
2264
+ if (cast->closing_loc.length == 0) {
2265
+ pm_buffer_append_byte(buffer, 0);
2266
+ } else {
2267
+ pm_buffer_append_byte(buffer, 1);
2268
+ pm_serialize_location(&cast->closing_loc, buffer);
2269
+ }
2270
+ pm_serialize_string(&cast->unescaped, buffer);
2271
+ break;
2272
+ }
2273
+ case PM_TRUE_NODE: {
2274
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2275
+ break;
2276
+ }
2277
+ case PM_UNDEF_NODE: {
2278
+ const pm_undef_node_t *cast = (const pm_undef_node_t *) node;
2279
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2280
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->names.size));
2281
+ pm_serialize_location(&cast->keyword_loc, buffer);
2282
+ break;
2283
+ }
2284
+ case PM_UNLESS_NODE: {
2285
+ const pm_unless_node_t *cast = (const pm_unless_node_t *) node;
2286
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2287
+ pm_serialize_location(&cast->unless_keyword_loc, buffer);
2288
+ if (cast->then_keyword_loc.length == 0) {
2289
+ pm_buffer_append_byte(buffer, 0);
2290
+ } else {
2291
+ pm_buffer_append_byte(buffer, 1);
2292
+ pm_serialize_location(&cast->then_keyword_loc, buffer);
2293
+ }
2294
+ if (cast->end_keyword_loc.length == 0) {
2295
+ pm_buffer_append_byte(buffer, 0);
2296
+ } else {
2297
+ pm_buffer_append_byte(buffer, 1);
2298
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
2299
+ }
2300
+ break;
2301
+ }
2302
+ case PM_UNTIL_NODE: {
2303
+ const pm_until_node_t *cast = (const pm_until_node_t *) node;
2304
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2305
+ pm_serialize_location(&cast->until_keyword_loc, buffer);
2306
+ if (cast->do_keyword_loc.length == 0) {
2307
+ pm_buffer_append_byte(buffer, 0);
2308
+ } else {
2309
+ pm_buffer_append_byte(buffer, 1);
2310
+ pm_serialize_location(&cast->do_keyword_loc, buffer);
2311
+ }
2312
+ if (cast->end_keyword_loc.length == 0) {
2313
+ pm_buffer_append_byte(buffer, 0);
2314
+ } else {
2315
+ pm_buffer_append_byte(buffer, 1);
2316
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
2317
+ }
2318
+ break;
2319
+ }
2320
+ case PM_WHEN_NODE: {
2321
+ const pm_when_node_t *cast = (const pm_when_node_t *) node;
2322
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2323
+ pm_serialize_location(&cast->when_keyword_loc, buffer);
2324
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(cast->conditions.size));
2325
+ if (cast->then_keyword_loc.length == 0) {
2326
+ pm_buffer_append_byte(buffer, 0);
2327
+ } else {
2328
+ pm_buffer_append_byte(buffer, 1);
2329
+ pm_serialize_location(&cast->then_keyword_loc, buffer);
2330
+ }
2331
+ break;
2332
+ }
2333
+ case PM_WHILE_NODE: {
2334
+ const pm_while_node_t *cast = (const pm_while_node_t *) node;
2335
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2336
+ pm_serialize_location(&cast->while_keyword_loc, buffer);
2337
+ if (cast->do_keyword_loc.length == 0) {
2338
+ pm_buffer_append_byte(buffer, 0);
2339
+ } else {
2340
+ pm_buffer_append_byte(buffer, 1);
2341
+ pm_serialize_location(&cast->do_keyword_loc, buffer);
2342
+ }
2343
+ if (cast->end_keyword_loc.length == 0) {
2344
+ pm_buffer_append_byte(buffer, 0);
2345
+ } else {
2346
+ pm_buffer_append_byte(buffer, 1);
2347
+ pm_serialize_location(&cast->end_keyword_loc, buffer);
2348
+ }
2349
+ break;
2350
+ }
2351
+ case PM_X_STRING_NODE: {
2352
+ const pm_x_string_node_t *cast = (const pm_x_string_node_t *) node;
2353
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2354
+ pm_serialize_location(&cast->opening_loc, buffer);
2355
+ pm_serialize_location(&cast->content_loc, buffer);
2356
+ pm_serialize_location(&cast->closing_loc, buffer);
2357
+ pm_serialize_string(&cast->unescaped, buffer);
2358
+ break;
2359
+ }
2360
+ case PM_YIELD_NODE: {
2361
+ const pm_yield_node_t *cast = (const pm_yield_node_t *) node;
2362
+ pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
2363
+ pm_serialize_location(&cast->keyword_loc, buffer);
2364
+ if (cast->lparen_loc.length == 0) {
2365
+ pm_buffer_append_byte(buffer, 0);
2366
+ } else {
2367
+ pm_buffer_append_byte(buffer, 1);
2368
+ pm_serialize_location(&cast->lparen_loc, buffer);
2369
+ }
2370
+ if (cast->rparen_loc.length == 0) {
2371
+ pm_buffer_append_byte(buffer, 0);
2372
+ } else {
2373
+ pm_buffer_append_byte(buffer, 1);
2374
+ pm_serialize_location(&cast->rparen_loc, buffer);
2375
+ }
2376
+ break;
2377
+ }
2378
+ }
2379
+ }
2380
+
2381
+ xfree_sized(stack.entries, stack.capacity * sizeof(pm_serialize_entry_t));
2382
+ }
2383
+
2384
+ /*
2385
+ * Serialize the given list of offsets to the given buffer.
2386
+ */
2387
+ void
2388
+ pm_serialize_line_offset_list(pm_line_offset_list_t *list, pm_buffer_t *buffer) {
2389
+ uint32_t size = pm_sizet_to_u32(list->size);
2390
+ pm_buffer_append_varuint(buffer, size);
2391
+
2392
+ for (uint32_t i = 0; i < size; i++) {
2393
+ uint32_t offset = pm_sizet_to_u32(list->offsets[i]);
2394
+ pm_buffer_append_varuint(buffer, offset);
2395
+ }
2396
+ }
2397
+
2398
+ static void
2399
+ pm_serialize_comment(pm_comment_t *comment, pm_buffer_t *buffer) {
2400
+ // serialize type
2401
+ pm_buffer_append_byte(buffer, (uint8_t) comment->type);
2402
+
2403
+ // serialize location
2404
+ pm_serialize_location(&comment->location, buffer);
2405
+ }
2406
+
2407
+ /**
2408
+ * Serialize the given list of comments to the given buffer.
2409
+ */
2410
+ void
2411
+ pm_serialize_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2412
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2413
+
2414
+ pm_comment_t *comment;
2415
+ for (comment = (pm_comment_t *) list->head; comment != NULL; comment = (pm_comment_t *) comment->node.next) {
2416
+ pm_serialize_comment(comment, buffer);
2417
+ }
2418
+ }
2419
+
2420
+ /**
2421
+ * Serialize the comments attached to each node. This is the number of nodes
2422
+ * that own comments, followed by each of those nodes' id, the number of
2423
+ * comments it owns, and the index of each of those comments in the comment
2424
+ * list.
2425
+ */
2426
+ static void
2427
+ pm_serialize_comment_attachments(const pm_comment_attachments_t *attachments, pm_buffer_t *buffer) {
2428
+ uint32_t count = 0;
2429
+ for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2430
+ if (attachments->ranges[node_id].length > 0) count++;
2431
+ }
2432
+
2433
+ pm_buffer_append_varuint(buffer, count);
2434
+
2435
+ for (uint32_t node_id = 0; node_id < attachments->ranges_size; node_id++) {
2436
+ pm_comment_range_t range = attachments->ranges[node_id];
2437
+ if (range.length == 0) continue;
2438
+
2439
+ pm_buffer_append_varuint(buffer, node_id);
2440
+ pm_buffer_append_varuint(buffer, range.length);
2441
+
2442
+ for (uint32_t index = 0; index < range.length; index++) {
2443
+ pm_buffer_append_varuint(buffer, attachments->attachments[range.index + index]);
2444
+ }
2445
+ }
2446
+ }
2447
+
2448
+ static void
2449
+ pm_serialize_magic_comment(pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
2450
+ // serialize key location
2451
+ pm_buffer_append_varuint(buffer, magic_comment->key.start);
2452
+ pm_buffer_append_varuint(buffer, magic_comment->key.length);
2453
+
2454
+ // serialize value location
2455
+ pm_buffer_append_varuint(buffer, magic_comment->value.start);
2456
+ pm_buffer_append_varuint(buffer, magic_comment->value.length);
2457
+ }
2458
+
2459
+ static void
2460
+ pm_serialize_magic_comment_list(pm_list_t *list, pm_buffer_t *buffer) {
2461
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2462
+
2463
+ pm_magic_comment_t *magic_comment;
2464
+ for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
2465
+ pm_serialize_magic_comment(magic_comment, buffer);
2466
+ }
2467
+ }
2468
+
2469
+ static void
2470
+ pm_serialize_data_loc(const pm_parser_t *parser, pm_buffer_t *buffer) {
2471
+ if (parser->data_loc.length == 0) {
2472
+ pm_buffer_append_byte(buffer, 0);
2473
+ } else {
2474
+ pm_buffer_append_byte(buffer, 1);
2475
+ pm_serialize_location(&parser->data_loc, buffer);
2476
+ }
2477
+ }
2478
+
2479
+ static void
2480
+ pm_serialize_diagnostic(pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
2481
+ // serialize the type
2482
+ pm_buffer_append_varuint(buffer, (uint32_t) diagnostic->diag_id);
2483
+
2484
+ // serialize message
2485
+ size_t message_length = strlen(diagnostic->message);
2486
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(message_length));
2487
+ pm_buffer_append_string(buffer, diagnostic->message, message_length);
2488
+
2489
+ // serialize location
2490
+ pm_serialize_location(&diagnostic->location, buffer);
2491
+
2492
+ pm_buffer_append_byte(buffer, diagnostic->level);
2493
+ }
2494
+
2495
+ static void
2496
+ pm_serialize_diagnostic_list(pm_list_t *list, pm_buffer_t *buffer) {
2497
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(pm_list_size(list)));
2498
+
2499
+ pm_diagnostic_t *diagnostic;
2500
+ for (diagnostic = (pm_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (pm_diagnostic_t *) diagnostic->node.next) {
2501
+ pm_serialize_diagnostic(diagnostic, buffer);
2502
+ }
2503
+ }
2504
+
2505
+ /**
2506
+ * Serialize the name of the encoding to the buffer.
2507
+ */
2508
+ void
2509
+ pm_serialize_encoding(const pm_encoding_t *encoding, pm_buffer_t *buffer) {
2510
+ size_t encoding_length = strlen(encoding->name);
2511
+ pm_buffer_append_varuint(buffer, pm_sizet_to_u32(encoding_length));
2512
+ pm_buffer_append_string(buffer, encoding->name, encoding_length);
2513
+ }
2514
+
2515
+ static void
2516
+ pm_serialize_metadata(pm_parser_t *parser, pm_buffer_t *buffer) {
2517
+ pm_serialize_encoding(parser->encoding, buffer);
2518
+ pm_buffer_append_varsint(buffer, parser->start_line);
2519
+ pm_buffer_append_uint64(buffer, pm_parser_checksum(parser));
2520
+ pm_serialize_line_offset_list(&parser->line_offsets, buffer);
2521
+ pm_serialize_comment_list(&parser->comment_list, buffer);
2522
+ pm_serialize_comment_attachments(&parser->comment_attachments, buffer);
2523
+ pm_serialize_magic_comment_list(&parser->magic_comment_list, buffer);
2524
+ pm_serialize_data_loc(parser, buffer);
2525
+ pm_serialize_diagnostic_list(&parser->error_list, buffer);
2526
+ pm_serialize_diagnostic_list(&parser->warning_list, buffer);
2527
+ pm_buffer_append_byte(buffer, (uint8_t) parser->continuable);
2528
+ }
2529
+
2530
+ #line 463 "prism/templates/src/serialize.c.erb"
2531
+ /**
2532
+ * Serialize the metadata, nodes, and constant pool.
2533
+ */
2534
+ void
2535
+ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
2536
+ pm_serialize_metadata(parser, buffer);
2537
+
2538
+ // Here we're going to leave space for the offset of the constant pool in
2539
+ // the buffer.
2540
+ size_t offset = buffer->length;
2541
+ pm_buffer_append_zeroes(buffer, 4);
2542
+
2543
+ // Next, encode the length of the constant pool.
2544
+ pm_buffer_append_varuint(buffer, parser->constant_pool.size);
2545
+
2546
+ // Now we're going to serialize the content of the node.
2547
+ pm_serialize_node(node, buffer);
2548
+
2549
+ // Now we're going to serialize the offset of the constant pool back where
2550
+ // we left space for it.
2551
+ uint32_t length = pm_sizet_to_u32(buffer->length);
2552
+ memcpy(buffer->value + offset, &length, sizeof(uint32_t));
2553
+
2554
+ // Now we're going to serialize the constant pool.
2555
+ offset = buffer->length;
2556
+ pm_buffer_append_zeroes(buffer, parser->constant_pool.size * 8);
2557
+
2558
+ for (uint32_t index = 0; index < parser->constant_pool.capacity; index++) {
2559
+ pm_constant_pool_bucket_t *bucket = &parser->constant_pool.buckets[index];
2560
+
2561
+ // If we find a constant at this index, serialize it at the correct
2562
+ // index in the buffer.
2563
+ if (bucket->id != 0) {
2564
+ pm_constant_t *constant = &parser->constant_pool.constants[bucket->id - 1];
2565
+ size_t buffer_offset = offset + ((((size_t)bucket->id) - 1) * 8);
2566
+
2567
+ // Write the constant contents into the buffer after the constant
2568
+ // pool. In place of the source offset, we store a buffer offset.
2569
+ uint32_t content_offset = pm_sizet_to_u32(buffer->length);
2570
+ memcpy(buffer->value + buffer_offset, &content_offset, 4);
2571
+ pm_buffer_append_bytes(buffer, constant->start, constant->length);
2572
+
2573
+ uint32_t constant_length = pm_sizet_to_u32(constant->length);
2574
+ memcpy(buffer->value + buffer_offset + 4, &constant_length, 4);
2575
+ }
2576
+ }
2577
+ }
2578
+
2579
+ static void
2580
+ serialize_token(pm_parser_t *parser, pm_token_t *token, void *data) {
2581
+ pm_buffer_t *buffer = (pm_buffer_t *) data;
2582
+
2583
+ pm_buffer_append_varuint(buffer, token->type);
2584
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
2585
+ pm_buffer_append_varuint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
2586
+ pm_buffer_append_varuint(buffer, parser->lex_state);
2587
+ }
2588
+
2589
+ /**
2590
+ * Lex the given source and serialize to the given buffer.
2591
+ */
2592
+ void
2593
+ pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2594
+ pm_options_t options = { 0 };
2595
+ pm_options_read(&options, data);
2596
+
2597
+ pm_arena_t arena = { 0 };
2598
+ pm_parser_t parser;
2599
+ pm_parser_init(&arena, &parser, source, size, &options);
2600
+
2601
+ pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2602
+ pm_parse(&parser);
2603
+
2604
+ // Append 0 to mark end of tokens.
2605
+ pm_buffer_append_byte(buffer, 0);
2606
+
2607
+ pm_serialize_metadata(&parser, buffer);
2608
+
2609
+ pm_parser_cleanup(&parser);
2610
+ pm_arena_cleanup(&arena);
2611
+ pm_options_cleanup(&options);
2612
+ }
2613
+
2614
+ /**
2615
+ * Parse and serialize both the AST and the tokens represented by the given
2616
+ * source to the given buffer.
2617
+ */
2618
+ void
2619
+ pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
2620
+ pm_options_t options = { 0 };
2621
+ pm_options_read(&options, data);
2622
+
2623
+ pm_arena_t arena = { 0 };
2624
+ pm_parser_t parser;
2625
+ pm_parser_init(&arena, &parser, source, size, &options);
2626
+
2627
+ pm_parser_lex_callback_set(&parser, serialize_token, buffer);
2628
+ pm_node_t *node = pm_parse(&parser);
2629
+
2630
+ pm_buffer_append_byte(buffer, 0);
2631
+ pm_serialize(&parser, node, buffer);
2632
+
2633
+ pm_parser_cleanup(&parser);
2634
+ pm_arena_cleanup(&arena);
2635
+ pm_options_cleanup(&options);
2636
+ }
2637
+
2638
+ /**
2639
+ * Parse the source and return true if it parses without errors or warnings.
2640
+ */
2641
+ bool
2642
+ pm_serialize_parse_success_p(const uint8_t *source, size_t size, const char *data) {
2643
+ pm_options_t options = { 0 };
2644
+ pm_options_read(&options, data);
2645
+
2646
+ pm_arena_t arena = { 0 };
2647
+ pm_parser_t parser;
2648
+ pm_parser_init(&arena, &parser, source, size, &options);
2649
+
2650
+ pm_parse(&parser);
2651
+
2652
+ bool result = parser.error_list.size == 0;
2653
+ pm_parser_cleanup(&parser);
2654
+ pm_arena_cleanup(&arena);
2655
+ pm_options_cleanup(&options);
2656
+
2657
+ return result;
2658
+ }
2659
+
2660
+ #endif