herb 0.11.1 → 0.11.2

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