prism 0.15.1 → 0.17.0

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -1
  3. data/Makefile +12 -0
  4. data/README.md +3 -1
  5. data/config.yml +66 -50
  6. data/docs/configuration.md +2 -0
  7. data/docs/fuzzing.md +1 -1
  8. data/docs/javascript.md +90 -0
  9. data/docs/releasing.md +27 -0
  10. data/docs/ruby_api.md +2 -0
  11. data/docs/serialization.md +28 -29
  12. data/ext/prism/api_node.c +856 -826
  13. data/ext/prism/api_pack.c +20 -9
  14. data/ext/prism/extension.c +494 -119
  15. data/ext/prism/extension.h +1 -1
  16. data/include/prism/ast.h +3157 -747
  17. data/include/prism/defines.h +40 -8
  18. data/include/prism/diagnostic.h +36 -3
  19. data/include/prism/enc/pm_encoding.h +119 -28
  20. data/include/prism/node.h +38 -30
  21. data/include/prism/options.h +204 -0
  22. data/include/prism/pack.h +44 -33
  23. data/include/prism/parser.h +445 -199
  24. data/include/prism/prettyprint.h +26 -0
  25. data/include/prism/regexp.h +16 -2
  26. data/include/prism/util/pm_buffer.h +102 -18
  27. data/include/prism/util/pm_char.h +162 -48
  28. data/include/prism/util/pm_constant_pool.h +128 -34
  29. data/include/prism/util/pm_list.h +68 -38
  30. data/include/prism/util/pm_memchr.h +18 -3
  31. data/include/prism/util/pm_newline_list.h +71 -28
  32. data/include/prism/util/pm_state_stack.h +25 -7
  33. data/include/prism/util/pm_string.h +115 -27
  34. data/include/prism/util/pm_string_list.h +25 -6
  35. data/include/prism/util/pm_strncasecmp.h +32 -0
  36. data/include/prism/util/pm_strpbrk.h +31 -17
  37. data/include/prism/version.h +28 -3
  38. data/include/prism.h +229 -36
  39. data/lib/prism/compiler.rb +5 -5
  40. data/lib/prism/debug.rb +43 -13
  41. data/lib/prism/desugar_compiler.rb +1 -1
  42. data/lib/prism/dispatcher.rb +27 -26
  43. data/lib/prism/dsl.rb +16 -16
  44. data/lib/prism/ffi.rb +138 -61
  45. data/lib/prism/lex_compat.rb +26 -16
  46. data/lib/prism/mutation_compiler.rb +11 -11
  47. data/lib/prism/node.rb +426 -227
  48. data/lib/prism/node_ext.rb +23 -16
  49. data/lib/prism/node_inspector.rb +1 -1
  50. data/lib/prism/pack.rb +79 -40
  51. data/lib/prism/parse_result/comments.rb +7 -2
  52. data/lib/prism/parse_result/newlines.rb +4 -0
  53. data/lib/prism/parse_result.rb +157 -21
  54. data/lib/prism/pattern.rb +14 -3
  55. data/lib/prism/ripper_compat.rb +28 -10
  56. data/lib/prism/serialize.rb +935 -307
  57. data/lib/prism/visitor.rb +9 -5
  58. data/lib/prism.rb +20 -2
  59. data/prism.gemspec +11 -2
  60. data/rbi/prism.rbi +7305 -0
  61. data/rbi/prism_static.rbi +196 -0
  62. data/sig/prism.rbs +4468 -0
  63. data/sig/prism_static.rbs +123 -0
  64. data/src/diagnostic.c +56 -53
  65. data/src/enc/pm_big5.c +1 -0
  66. data/src/enc/pm_euc_jp.c +1 -0
  67. data/src/enc/pm_gbk.c +1 -0
  68. data/src/enc/pm_shift_jis.c +1 -0
  69. data/src/enc/pm_tables.c +316 -80
  70. data/src/enc/pm_unicode.c +54 -9
  71. data/src/enc/pm_windows_31j.c +1 -0
  72. data/src/node.c +357 -345
  73. data/src/options.c +170 -0
  74. data/src/prettyprint.c +7697 -1643
  75. data/src/prism.c +1964 -1125
  76. data/src/regexp.c +153 -95
  77. data/src/serialize.c +432 -397
  78. data/src/token_type.c +3 -1
  79. data/src/util/pm_buffer.c +88 -23
  80. data/src/util/pm_char.c +103 -57
  81. data/src/util/pm_constant_pool.c +52 -22
  82. data/src/util/pm_list.c +12 -4
  83. data/src/util/pm_memchr.c +5 -3
  84. data/src/util/pm_newline_list.c +25 -63
  85. data/src/util/pm_state_stack.c +9 -3
  86. data/src/util/pm_string.c +95 -85
  87. data/src/util/pm_string_list.c +14 -15
  88. data/src/util/pm_strncasecmp.c +10 -3
  89. data/src/util/pm_strpbrk.c +25 -19
  90. metadata +12 -3
  91. data/docs/prism.png +0 -0
data/src/serialize.c CHANGED
@@ -27,24 +27,24 @@ pm_serialize_location(pm_parser_t *parser, pm_location_t *location, pm_buffer_t
27
27
  assert(location->end);
28
28
  assert(location->start <= location->end);
29
29
 
30
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(location->start - parser->start));
31
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(location->end - location->start));
30
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(location->start - parser->start));
31
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(location->end - location->start));
32
32
  }
33
33
 
34
34
  static void
35
35
  pm_serialize_string(pm_parser_t *parser, pm_string_t *string, pm_buffer_t *buffer) {
36
36
  switch (string->type) {
37
37
  case PM_STRING_SHARED: {
38
- pm_buffer_append_u8(buffer, 1);
39
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(pm_string_source(string) - parser->start));
40
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(pm_string_length(string)));
38
+ pm_buffer_append_byte(buffer, 1);
39
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(pm_string_source(string) - parser->start));
40
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_string_length(string)));
41
41
  break;
42
42
  }
43
43
  case PM_STRING_OWNED:
44
44
  case PM_STRING_CONSTANT: {
45
45
  uint32_t length = pm_sizet_to_u32(pm_string_length(string));
46
- pm_buffer_append_u8(buffer, 2);
47
- pm_buffer_append_u32(buffer, length);
46
+ pm_buffer_append_byte(buffer, 2);
47
+ pm_buffer_append_varint(buffer, length);
48
48
  pm_buffer_append_bytes(buffer, pm_string_source(string), length);
49
49
  break;
50
50
  }
@@ -54,9 +54,9 @@ pm_serialize_string(pm_parser_t *parser, pm_string_t *string, pm_buffer_t *buffe
54
54
  }
55
55
  }
56
56
 
57
- void
57
+ static void
58
58
  pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
59
- pm_buffer_append_u8(buffer, (uint8_t) PM_NODE_TYPE(node));
59
+ pm_buffer_append_byte(buffer, (uint8_t) PM_NODE_TYPE(node));
60
60
 
61
61
  size_t offset = buffer->length;
62
62
 
@@ -93,63 +93,64 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
93
93
  }
94
94
  case PM_ARGUMENTS_NODE: {
95
95
  uint32_t arguments_size = pm_sizet_to_u32(((pm_arguments_node_t *)node)->arguments.size);
96
- pm_buffer_append_u32(buffer, arguments_size);
96
+ pm_buffer_append_varint(buffer, arguments_size);
97
97
  for (uint32_t index = 0; index < arguments_size; index++) {
98
98
  pm_serialize_node(parser, (pm_node_t *) ((pm_arguments_node_t *)node)->arguments.nodes[index], buffer);
99
99
  }
100
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
100
101
  break;
101
102
  }
102
103
  case PM_ARRAY_NODE: {
103
104
  uint32_t elements_size = pm_sizet_to_u32(((pm_array_node_t *)node)->elements.size);
104
- pm_buffer_append_u32(buffer, elements_size);
105
+ pm_buffer_append_varint(buffer, elements_size);
105
106
  for (uint32_t index = 0; index < elements_size; index++) {
106
107
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_node_t *)node)->elements.nodes[index], buffer);
107
108
  }
108
109
  if (((pm_array_node_t *)node)->opening_loc.start == NULL) {
109
- pm_buffer_append_u8(buffer, 0);
110
+ pm_buffer_append_byte(buffer, 0);
110
111
  } else {
111
- pm_buffer_append_u8(buffer, 1);
112
+ pm_buffer_append_byte(buffer, 1);
112
113
  pm_serialize_location(parser, &((pm_array_node_t *)node)->opening_loc, buffer);
113
114
  }
114
115
  if (((pm_array_node_t *)node)->closing_loc.start == NULL) {
115
- pm_buffer_append_u8(buffer, 0);
116
+ pm_buffer_append_byte(buffer, 0);
116
117
  } else {
117
- pm_buffer_append_u8(buffer, 1);
118
+ pm_buffer_append_byte(buffer, 1);
118
119
  pm_serialize_location(parser, &((pm_array_node_t *)node)->closing_loc, buffer);
119
120
  }
120
121
  break;
121
122
  }
122
123
  case PM_ARRAY_PATTERN_NODE: {
123
124
  if (((pm_array_pattern_node_t *)node)->constant == NULL) {
124
- pm_buffer_append_u8(buffer, 0);
125
+ pm_buffer_append_byte(buffer, 0);
125
126
  } else {
126
127
  pm_serialize_node(parser, (pm_node_t *)((pm_array_pattern_node_t *)node)->constant, buffer);
127
128
  }
128
129
  uint32_t requireds_size = pm_sizet_to_u32(((pm_array_pattern_node_t *)node)->requireds.size);
129
- pm_buffer_append_u32(buffer, requireds_size);
130
+ pm_buffer_append_varint(buffer, requireds_size);
130
131
  for (uint32_t index = 0; index < requireds_size; index++) {
131
132
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->requireds.nodes[index], buffer);
132
133
  }
133
134
  if (((pm_array_pattern_node_t *)node)->rest == NULL) {
134
- pm_buffer_append_u8(buffer, 0);
135
+ pm_buffer_append_byte(buffer, 0);
135
136
  } else {
136
137
  pm_serialize_node(parser, (pm_node_t *)((pm_array_pattern_node_t *)node)->rest, buffer);
137
138
  }
138
139
  uint32_t posts_size = pm_sizet_to_u32(((pm_array_pattern_node_t *)node)->posts.size);
139
- pm_buffer_append_u32(buffer, posts_size);
140
+ pm_buffer_append_varint(buffer, posts_size);
140
141
  for (uint32_t index = 0; index < posts_size; index++) {
141
142
  pm_serialize_node(parser, (pm_node_t *) ((pm_array_pattern_node_t *)node)->posts.nodes[index], buffer);
142
143
  }
143
144
  if (((pm_array_pattern_node_t *)node)->opening_loc.start == NULL) {
144
- pm_buffer_append_u8(buffer, 0);
145
+ pm_buffer_append_byte(buffer, 0);
145
146
  } else {
146
- pm_buffer_append_u8(buffer, 1);
147
+ pm_buffer_append_byte(buffer, 1);
147
148
  pm_serialize_location(parser, &((pm_array_pattern_node_t *)node)->opening_loc, buffer);
148
149
  }
149
150
  if (((pm_array_pattern_node_t *)node)->closing_loc.start == NULL) {
150
- pm_buffer_append_u8(buffer, 0);
151
+ pm_buffer_append_byte(buffer, 0);
151
152
  } else {
152
- pm_buffer_append_u8(buffer, 1);
153
+ pm_buffer_append_byte(buffer, 1);
153
154
  pm_serialize_location(parser, &((pm_array_pattern_node_t *)node)->closing_loc, buffer);
154
155
  }
155
156
  break;
@@ -157,21 +158,21 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
157
158
  case PM_ASSOC_NODE: {
158
159
  pm_serialize_node(parser, (pm_node_t *)((pm_assoc_node_t *)node)->key, buffer);
159
160
  if (((pm_assoc_node_t *)node)->value == NULL) {
160
- pm_buffer_append_u8(buffer, 0);
161
+ pm_buffer_append_byte(buffer, 0);
161
162
  } else {
162
163
  pm_serialize_node(parser, (pm_node_t *)((pm_assoc_node_t *)node)->value, buffer);
163
164
  }
164
165
  if (((pm_assoc_node_t *)node)->operator_loc.start == NULL) {
165
- pm_buffer_append_u8(buffer, 0);
166
+ pm_buffer_append_byte(buffer, 0);
166
167
  } else {
167
- pm_buffer_append_u8(buffer, 1);
168
+ pm_buffer_append_byte(buffer, 1);
168
169
  pm_serialize_location(parser, &((pm_assoc_node_t *)node)->operator_loc, buffer);
169
170
  }
170
171
  break;
171
172
  }
172
173
  case PM_ASSOC_SPLAT_NODE: {
173
174
  if (((pm_assoc_splat_node_t *)node)->value == NULL) {
174
- pm_buffer_append_u8(buffer, 0);
175
+ pm_buffer_append_byte(buffer, 0);
175
176
  } else {
176
177
  pm_serialize_node(parser, (pm_node_t *)((pm_assoc_splat_node_t *)node)->value, buffer);
177
178
  }
@@ -179,47 +180,47 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
179
180
  break;
180
181
  }
181
182
  case PM_BACK_REFERENCE_READ_NODE: {
182
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_back_reference_read_node_t *)node)->name));
183
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_back_reference_read_node_t *)node)->name));
183
184
  break;
184
185
  }
185
186
  case PM_BEGIN_NODE: {
186
187
  if (((pm_begin_node_t *)node)->begin_keyword_loc.start == NULL) {
187
- pm_buffer_append_u8(buffer, 0);
188
+ pm_buffer_append_byte(buffer, 0);
188
189
  } else {
189
- pm_buffer_append_u8(buffer, 1);
190
+ pm_buffer_append_byte(buffer, 1);
190
191
  pm_serialize_location(parser, &((pm_begin_node_t *)node)->begin_keyword_loc, buffer);
191
192
  }
192
193
  if (((pm_begin_node_t *)node)->statements == NULL) {
193
- pm_buffer_append_u8(buffer, 0);
194
+ pm_buffer_append_byte(buffer, 0);
194
195
  } else {
195
196
  pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->statements, buffer);
196
197
  }
197
198
  if (((pm_begin_node_t *)node)->rescue_clause == NULL) {
198
- pm_buffer_append_u8(buffer, 0);
199
+ pm_buffer_append_byte(buffer, 0);
199
200
  } else {
200
201
  pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->rescue_clause, buffer);
201
202
  }
202
203
  if (((pm_begin_node_t *)node)->else_clause == NULL) {
203
- pm_buffer_append_u8(buffer, 0);
204
+ pm_buffer_append_byte(buffer, 0);
204
205
  } else {
205
206
  pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->else_clause, buffer);
206
207
  }
207
208
  if (((pm_begin_node_t *)node)->ensure_clause == NULL) {
208
- pm_buffer_append_u8(buffer, 0);
209
+ pm_buffer_append_byte(buffer, 0);
209
210
  } else {
210
211
  pm_serialize_node(parser, (pm_node_t *)((pm_begin_node_t *)node)->ensure_clause, buffer);
211
212
  }
212
213
  if (((pm_begin_node_t *)node)->end_keyword_loc.start == NULL) {
213
- pm_buffer_append_u8(buffer, 0);
214
+ pm_buffer_append_byte(buffer, 0);
214
215
  } else {
215
- pm_buffer_append_u8(buffer, 1);
216
+ pm_buffer_append_byte(buffer, 1);
216
217
  pm_serialize_location(parser, &((pm_begin_node_t *)node)->end_keyword_loc, buffer);
217
218
  }
218
219
  break;
219
220
  }
220
221
  case PM_BLOCK_ARGUMENT_NODE: {
221
222
  if (((pm_block_argument_node_t *)node)->expression == NULL) {
222
- pm_buffer_append_u8(buffer, 0);
223
+ pm_buffer_append_byte(buffer, 0);
223
224
  } else {
224
225
  pm_serialize_node(parser, (pm_node_t *)((pm_block_argument_node_t *)node)->expression, buffer);
225
226
  }
@@ -227,22 +228,22 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
227
228
  break;
228
229
  }
229
230
  case PM_BLOCK_LOCAL_VARIABLE_NODE: {
230
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_block_local_variable_node_t *)node)->name));
231
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_block_local_variable_node_t *)node)->name));
231
232
  break;
232
233
  }
233
234
  case PM_BLOCK_NODE: {
234
235
  uint32_t locals_size = pm_sizet_to_u32(((pm_block_node_t *)node)->locals.size);
235
- pm_buffer_append_u32(buffer, locals_size);
236
+ pm_buffer_append_varint(buffer, locals_size);
236
237
  for (uint32_t index = 0; index < locals_size; index++) {
237
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_block_node_t *)node)->locals.ids[index]));
238
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_block_node_t *)node)->locals.ids[index]));
238
239
  }
239
240
  if (((pm_block_node_t *)node)->parameters == NULL) {
240
- pm_buffer_append_u8(buffer, 0);
241
+ pm_buffer_append_byte(buffer, 0);
241
242
  } else {
242
243
  pm_serialize_node(parser, (pm_node_t *)((pm_block_node_t *)node)->parameters, buffer);
243
244
  }
244
245
  if (((pm_block_node_t *)node)->body == NULL) {
245
- pm_buffer_append_u8(buffer, 0);
246
+ pm_buffer_append_byte(buffer, 0);
246
247
  } else {
247
248
  pm_serialize_node(parser, (pm_node_t *)((pm_block_node_t *)node)->body, buffer);
248
249
  }
@@ -251,11 +252,11 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
251
252
  break;
252
253
  }
253
254
  case PM_BLOCK_PARAMETER_NODE: {
254
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_block_parameter_node_t *)node)->name));
255
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_block_parameter_node_t *)node)->name));
255
256
  if (((pm_block_parameter_node_t *)node)->name_loc.start == NULL) {
256
- pm_buffer_append_u8(buffer, 0);
257
+ pm_buffer_append_byte(buffer, 0);
257
258
  } else {
258
- pm_buffer_append_u8(buffer, 1);
259
+ pm_buffer_append_byte(buffer, 1);
259
260
  pm_serialize_location(parser, &((pm_block_parameter_node_t *)node)->name_loc, buffer);
260
261
  }
261
262
  pm_serialize_location(parser, &((pm_block_parameter_node_t *)node)->operator_loc, buffer);
@@ -263,32 +264,32 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
263
264
  }
264
265
  case PM_BLOCK_PARAMETERS_NODE: {
265
266
  if (((pm_block_parameters_node_t *)node)->parameters == NULL) {
266
- pm_buffer_append_u8(buffer, 0);
267
+ pm_buffer_append_byte(buffer, 0);
267
268
  } else {
268
269
  pm_serialize_node(parser, (pm_node_t *)((pm_block_parameters_node_t *)node)->parameters, buffer);
269
270
  }
270
271
  uint32_t locals_size = pm_sizet_to_u32(((pm_block_parameters_node_t *)node)->locals.size);
271
- pm_buffer_append_u32(buffer, locals_size);
272
+ pm_buffer_append_varint(buffer, locals_size);
272
273
  for (uint32_t index = 0; index < locals_size; index++) {
273
274
  pm_serialize_node(parser, (pm_node_t *) ((pm_block_parameters_node_t *)node)->locals.nodes[index], buffer);
274
275
  }
275
276
  if (((pm_block_parameters_node_t *)node)->opening_loc.start == NULL) {
276
- pm_buffer_append_u8(buffer, 0);
277
+ pm_buffer_append_byte(buffer, 0);
277
278
  } else {
278
- pm_buffer_append_u8(buffer, 1);
279
+ pm_buffer_append_byte(buffer, 1);
279
280
  pm_serialize_location(parser, &((pm_block_parameters_node_t *)node)->opening_loc, buffer);
280
281
  }
281
282
  if (((pm_block_parameters_node_t *)node)->closing_loc.start == NULL) {
282
- pm_buffer_append_u8(buffer, 0);
283
+ pm_buffer_append_byte(buffer, 0);
283
284
  } else {
284
- pm_buffer_append_u8(buffer, 1);
285
+ pm_buffer_append_byte(buffer, 1);
285
286
  pm_serialize_location(parser, &((pm_block_parameters_node_t *)node)->closing_loc, buffer);
286
287
  }
287
288
  break;
288
289
  }
289
290
  case PM_BREAK_NODE: {
290
291
  if (((pm_break_node_t *)node)->arguments == NULL) {
291
- pm_buffer_append_u8(buffer, 0);
292
+ pm_buffer_append_byte(buffer, 0);
292
293
  } else {
293
294
  pm_serialize_node(parser, (pm_node_t *)((pm_break_node_t *)node)->arguments, buffer);
294
295
  }
@@ -297,120 +298,120 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
297
298
  }
298
299
  case PM_CALL_AND_WRITE_NODE: {
299
300
  if (((pm_call_and_write_node_t *)node)->receiver == NULL) {
300
- pm_buffer_append_u8(buffer, 0);
301
+ pm_buffer_append_byte(buffer, 0);
301
302
  } else {
302
303
  pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->receiver, buffer);
303
304
  }
304
305
  if (((pm_call_and_write_node_t *)node)->call_operator_loc.start == NULL) {
305
- pm_buffer_append_u8(buffer, 0);
306
+ pm_buffer_append_byte(buffer, 0);
306
307
  } else {
307
- pm_buffer_append_u8(buffer, 1);
308
+ pm_buffer_append_byte(buffer, 1);
308
309
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->call_operator_loc, buffer);
309
310
  }
310
311
  if (((pm_call_and_write_node_t *)node)->message_loc.start == NULL) {
311
- pm_buffer_append_u8(buffer, 0);
312
+ pm_buffer_append_byte(buffer, 0);
312
313
  } else {
313
- pm_buffer_append_u8(buffer, 1);
314
+ pm_buffer_append_byte(buffer, 1);
314
315
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->message_loc, buffer);
315
316
  }
316
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
317
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->read_name));
318
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->write_name));
317
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
318
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->read_name));
319
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_and_write_node_t *)node)->write_name));
319
320
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->operator_loc, buffer);
320
321
  pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->value, buffer);
321
322
  break;
322
323
  }
323
324
  case PM_CALL_NODE: {
324
325
  if (((pm_call_node_t *)node)->receiver == NULL) {
325
- pm_buffer_append_u8(buffer, 0);
326
+ pm_buffer_append_byte(buffer, 0);
326
327
  } else {
327
328
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->receiver, buffer);
328
329
  }
329
330
  if (((pm_call_node_t *)node)->call_operator_loc.start == NULL) {
330
- pm_buffer_append_u8(buffer, 0);
331
+ pm_buffer_append_byte(buffer, 0);
331
332
  } else {
332
- pm_buffer_append_u8(buffer, 1);
333
+ pm_buffer_append_byte(buffer, 1);
333
334
  pm_serialize_location(parser, &((pm_call_node_t *)node)->call_operator_loc, buffer);
334
335
  }
335
336
  if (((pm_call_node_t *)node)->message_loc.start == NULL) {
336
- pm_buffer_append_u8(buffer, 0);
337
+ pm_buffer_append_byte(buffer, 0);
337
338
  } else {
338
- pm_buffer_append_u8(buffer, 1);
339
+ pm_buffer_append_byte(buffer, 1);
339
340
  pm_serialize_location(parser, &((pm_call_node_t *)node)->message_loc, buffer);
340
341
  }
341
342
  if (((pm_call_node_t *)node)->opening_loc.start == NULL) {
342
- pm_buffer_append_u8(buffer, 0);
343
+ pm_buffer_append_byte(buffer, 0);
343
344
  } else {
344
- pm_buffer_append_u8(buffer, 1);
345
+ pm_buffer_append_byte(buffer, 1);
345
346
  pm_serialize_location(parser, &((pm_call_node_t *)node)->opening_loc, buffer);
346
347
  }
347
348
  if (((pm_call_node_t *)node)->arguments == NULL) {
348
- pm_buffer_append_u8(buffer, 0);
349
+ pm_buffer_append_byte(buffer, 0);
349
350
  } else {
350
351
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->arguments, buffer);
351
352
  }
352
353
  if (((pm_call_node_t *)node)->closing_loc.start == NULL) {
353
- pm_buffer_append_u8(buffer, 0);
354
+ pm_buffer_append_byte(buffer, 0);
354
355
  } else {
355
- pm_buffer_append_u8(buffer, 1);
356
+ pm_buffer_append_byte(buffer, 1);
356
357
  pm_serialize_location(parser, &((pm_call_node_t *)node)->closing_loc, buffer);
357
358
  }
358
359
  if (((pm_call_node_t *)node)->block == NULL) {
359
- pm_buffer_append_u8(buffer, 0);
360
+ pm_buffer_append_byte(buffer, 0);
360
361
  } else {
361
362
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->block, buffer);
362
363
  }
363
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
364
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_node_t *)node)->name));
364
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
365
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_node_t *)node)->name));
365
366
  break;
366
367
  }
367
368
  case PM_CALL_OPERATOR_WRITE_NODE: {
368
369
  if (((pm_call_operator_write_node_t *)node)->receiver == NULL) {
369
- pm_buffer_append_u8(buffer, 0);
370
+ pm_buffer_append_byte(buffer, 0);
370
371
  } else {
371
372
  pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->receiver, buffer);
372
373
  }
373
374
  if (((pm_call_operator_write_node_t *)node)->call_operator_loc.start == NULL) {
374
- pm_buffer_append_u8(buffer, 0);
375
+ pm_buffer_append_byte(buffer, 0);
375
376
  } else {
376
- pm_buffer_append_u8(buffer, 1);
377
+ pm_buffer_append_byte(buffer, 1);
377
378
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->call_operator_loc, buffer);
378
379
  }
379
380
  if (((pm_call_operator_write_node_t *)node)->message_loc.start == NULL) {
380
- pm_buffer_append_u8(buffer, 0);
381
+ pm_buffer_append_byte(buffer, 0);
381
382
  } else {
382
- pm_buffer_append_u8(buffer, 1);
383
+ pm_buffer_append_byte(buffer, 1);
383
384
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->message_loc, buffer);
384
385
  }
385
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
386
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->read_name));
387
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->write_name));
388
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->operator));
386
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
387
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->read_name));
388
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->write_name));
389
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->operator));
389
390
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->operator_loc, buffer);
390
391
  pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->value, buffer);
391
392
  break;
392
393
  }
393
394
  case PM_CALL_OR_WRITE_NODE: {
394
395
  if (((pm_call_or_write_node_t *)node)->receiver == NULL) {
395
- pm_buffer_append_u8(buffer, 0);
396
+ pm_buffer_append_byte(buffer, 0);
396
397
  } else {
397
398
  pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->receiver, buffer);
398
399
  }
399
400
  if (((pm_call_or_write_node_t *)node)->call_operator_loc.start == NULL) {
400
- pm_buffer_append_u8(buffer, 0);
401
+ pm_buffer_append_byte(buffer, 0);
401
402
  } else {
402
- pm_buffer_append_u8(buffer, 1);
403
+ pm_buffer_append_byte(buffer, 1);
403
404
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->call_operator_loc, buffer);
404
405
  }
405
406
  if (((pm_call_or_write_node_t *)node)->message_loc.start == NULL) {
406
- pm_buffer_append_u8(buffer, 0);
407
+ pm_buffer_append_byte(buffer, 0);
407
408
  } else {
408
- pm_buffer_append_u8(buffer, 1);
409
+ pm_buffer_append_byte(buffer, 1);
409
410
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->message_loc, buffer);
410
411
  }
411
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
412
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->read_name));
413
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->write_name));
412
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
413
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->read_name));
414
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_call_or_write_node_t *)node)->write_name));
414
415
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->operator_loc, buffer);
415
416
  pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->value, buffer);
416
417
  break;
@@ -423,17 +424,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
423
424
  }
424
425
  case PM_CASE_NODE: {
425
426
  if (((pm_case_node_t *)node)->predicate == NULL) {
426
- pm_buffer_append_u8(buffer, 0);
427
+ pm_buffer_append_byte(buffer, 0);
427
428
  } else {
428
429
  pm_serialize_node(parser, (pm_node_t *)((pm_case_node_t *)node)->predicate, buffer);
429
430
  }
430
431
  uint32_t conditions_size = pm_sizet_to_u32(((pm_case_node_t *)node)->conditions.size);
431
- pm_buffer_append_u32(buffer, conditions_size);
432
+ pm_buffer_append_varint(buffer, conditions_size);
432
433
  for (uint32_t index = 0; index < conditions_size; index++) {
433
434
  pm_serialize_node(parser, (pm_node_t *) ((pm_case_node_t *)node)->conditions.nodes[index], buffer);
434
435
  }
435
436
  if (((pm_case_node_t *)node)->consequent == NULL) {
436
- pm_buffer_append_u8(buffer, 0);
437
+ pm_buffer_append_byte(buffer, 0);
437
438
  } else {
438
439
  pm_serialize_node(parser, (pm_node_t *)((pm_case_node_t *)node)->consequent, buffer);
439
440
  }
@@ -443,91 +444,91 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
443
444
  }
444
445
  case PM_CLASS_NODE: {
445
446
  uint32_t locals_size = pm_sizet_to_u32(((pm_class_node_t *)node)->locals.size);
446
- pm_buffer_append_u32(buffer, locals_size);
447
+ pm_buffer_append_varint(buffer, locals_size);
447
448
  for (uint32_t index = 0; index < locals_size; index++) {
448
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->locals.ids[index]));
449
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->locals.ids[index]));
449
450
  }
450
451
  pm_serialize_location(parser, &((pm_class_node_t *)node)->class_keyword_loc, buffer);
451
452
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->constant_path, buffer);
452
453
  if (((pm_class_node_t *)node)->inheritance_operator_loc.start == NULL) {
453
- pm_buffer_append_u8(buffer, 0);
454
+ pm_buffer_append_byte(buffer, 0);
454
455
  } else {
455
- pm_buffer_append_u8(buffer, 1);
456
+ pm_buffer_append_byte(buffer, 1);
456
457
  pm_serialize_location(parser, &((pm_class_node_t *)node)->inheritance_operator_loc, buffer);
457
458
  }
458
459
  if (((pm_class_node_t *)node)->superclass == NULL) {
459
- pm_buffer_append_u8(buffer, 0);
460
+ pm_buffer_append_byte(buffer, 0);
460
461
  } else {
461
462
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->superclass, buffer);
462
463
  }
463
464
  if (((pm_class_node_t *)node)->body == NULL) {
464
- pm_buffer_append_u8(buffer, 0);
465
+ pm_buffer_append_byte(buffer, 0);
465
466
  } else {
466
467
  pm_serialize_node(parser, (pm_node_t *)((pm_class_node_t *)node)->body, buffer);
467
468
  }
468
469
  pm_serialize_location(parser, &((pm_class_node_t *)node)->end_keyword_loc, buffer);
469
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->name));
470
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_node_t *)node)->name));
470
471
  break;
471
472
  }
472
473
  case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
473
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_and_write_node_t *)node)->name));
474
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_and_write_node_t *)node)->name));
474
475
  pm_serialize_location(parser, &((pm_class_variable_and_write_node_t *)node)->name_loc, buffer);
475
476
  pm_serialize_location(parser, &((pm_class_variable_and_write_node_t *)node)->operator_loc, buffer);
476
477
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_and_write_node_t *)node)->value, buffer);
477
478
  break;
478
479
  }
479
480
  case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
480
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->name));
481
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->name));
481
482
  pm_serialize_location(parser, &((pm_class_variable_operator_write_node_t *)node)->name_loc, buffer);
482
483
  pm_serialize_location(parser, &((pm_class_variable_operator_write_node_t *)node)->operator_loc, buffer);
483
484
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_operator_write_node_t *)node)->value, buffer);
484
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->operator));
485
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_operator_write_node_t *)node)->operator));
485
486
  break;
486
487
  }
487
488
  case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
488
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_or_write_node_t *)node)->name));
489
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_or_write_node_t *)node)->name));
489
490
  pm_serialize_location(parser, &((pm_class_variable_or_write_node_t *)node)->name_loc, buffer);
490
491
  pm_serialize_location(parser, &((pm_class_variable_or_write_node_t *)node)->operator_loc, buffer);
491
492
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_or_write_node_t *)node)->value, buffer);
492
493
  break;
493
494
  }
494
495
  case PM_CLASS_VARIABLE_READ_NODE: {
495
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_read_node_t *)node)->name));
496
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_read_node_t *)node)->name));
496
497
  break;
497
498
  }
498
499
  case PM_CLASS_VARIABLE_TARGET_NODE: {
499
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_target_node_t *)node)->name));
500
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_target_node_t *)node)->name));
500
501
  break;
501
502
  }
502
503
  case PM_CLASS_VARIABLE_WRITE_NODE: {
503
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_class_variable_write_node_t *)node)->name));
504
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_class_variable_write_node_t *)node)->name));
504
505
  pm_serialize_location(parser, &((pm_class_variable_write_node_t *)node)->name_loc, buffer);
505
506
  pm_serialize_node(parser, (pm_node_t *)((pm_class_variable_write_node_t *)node)->value, buffer);
506
507
  if (((pm_class_variable_write_node_t *)node)->operator_loc.start == NULL) {
507
- pm_buffer_append_u8(buffer, 0);
508
+ pm_buffer_append_byte(buffer, 0);
508
509
  } else {
509
- pm_buffer_append_u8(buffer, 1);
510
+ pm_buffer_append_byte(buffer, 1);
510
511
  pm_serialize_location(parser, &((pm_class_variable_write_node_t *)node)->operator_loc, buffer);
511
512
  }
512
513
  break;
513
514
  }
514
515
  case PM_CONSTANT_AND_WRITE_NODE: {
515
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_and_write_node_t *)node)->name));
516
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_and_write_node_t *)node)->name));
516
517
  pm_serialize_location(parser, &((pm_constant_and_write_node_t *)node)->name_loc, buffer);
517
518
  pm_serialize_location(parser, &((pm_constant_and_write_node_t *)node)->operator_loc, buffer);
518
519
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_and_write_node_t *)node)->value, buffer);
519
520
  break;
520
521
  }
521
522
  case PM_CONSTANT_OPERATOR_WRITE_NODE: {
522
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->name));
523
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->name));
523
524
  pm_serialize_location(parser, &((pm_constant_operator_write_node_t *)node)->name_loc, buffer);
524
525
  pm_serialize_location(parser, &((pm_constant_operator_write_node_t *)node)->operator_loc, buffer);
525
526
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_operator_write_node_t *)node)->value, buffer);
526
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->operator));
527
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_operator_write_node_t *)node)->operator));
527
528
  break;
528
529
  }
529
530
  case PM_CONSTANT_OR_WRITE_NODE: {
530
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_or_write_node_t *)node)->name));
531
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_or_write_node_t *)node)->name));
531
532
  pm_serialize_location(parser, &((pm_constant_or_write_node_t *)node)->name_loc, buffer);
532
533
  pm_serialize_location(parser, &((pm_constant_or_write_node_t *)node)->operator_loc, buffer);
533
534
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_or_write_node_t *)node)->value, buffer);
@@ -541,7 +542,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
541
542
  }
542
543
  case PM_CONSTANT_PATH_NODE: {
543
544
  if (((pm_constant_path_node_t *)node)->parent == NULL) {
544
- pm_buffer_append_u8(buffer, 0);
545
+ pm_buffer_append_byte(buffer, 0);
545
546
  } else {
546
547
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_node_t *)node)->parent, buffer);
547
548
  }
@@ -553,7 +554,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
553
554
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->target, buffer);
554
555
  pm_serialize_location(parser, &((pm_constant_path_operator_write_node_t *)node)->operator_loc, buffer);
555
556
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_operator_write_node_t *)node)->value, buffer);
556
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_path_operator_write_node_t *)node)->operator));
557
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_path_operator_write_node_t *)node)->operator));
557
558
  break;
558
559
  }
559
560
  case PM_CONSTANT_PATH_OR_WRITE_NODE: {
@@ -564,7 +565,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
564
565
  }
565
566
  case PM_CONSTANT_PATH_TARGET_NODE: {
566
567
  if (((pm_constant_path_target_node_t *)node)->parent == NULL) {
567
- pm_buffer_append_u8(buffer, 0);
568
+ pm_buffer_append_byte(buffer, 0);
568
569
  } else {
569
570
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_path_target_node_t *)node)->parent, buffer);
570
571
  }
@@ -579,15 +580,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
579
580
  break;
580
581
  }
581
582
  case PM_CONSTANT_READ_NODE: {
582
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_read_node_t *)node)->name));
583
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_read_node_t *)node)->name));
583
584
  break;
584
585
  }
585
586
  case PM_CONSTANT_TARGET_NODE: {
586
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_target_node_t *)node)->name));
587
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_target_node_t *)node)->name));
587
588
  break;
588
589
  }
589
590
  case PM_CONSTANT_WRITE_NODE: {
590
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_constant_write_node_t *)node)->name));
591
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_constant_write_node_t *)node)->name));
591
592
  pm_serialize_location(parser, &((pm_constant_write_node_t *)node)->name_loc, buffer);
592
593
  pm_serialize_node(parser, (pm_node_t *)((pm_constant_write_node_t *)node)->value, buffer);
593
594
  pm_serialize_location(parser, &((pm_constant_write_node_t *)node)->operator_loc, buffer);
@@ -597,58 +598,58 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
597
598
  // serialize length
598
599
  // encoding of location u32s make us need to save this offset.
599
600
  size_t length_offset = buffer->length;
600
- pm_buffer_append_str(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
601
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->name));
601
+ pm_buffer_append_string(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
602
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->name));
602
603
  pm_serialize_location(parser, &((pm_def_node_t *)node)->name_loc, buffer);
603
604
  if (((pm_def_node_t *)node)->receiver == NULL) {
604
- pm_buffer_append_u8(buffer, 0);
605
+ pm_buffer_append_byte(buffer, 0);
605
606
  } else {
606
607
  pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->receiver, buffer);
607
608
  }
608
609
  if (((pm_def_node_t *)node)->parameters == NULL) {
609
- pm_buffer_append_u8(buffer, 0);
610
+ pm_buffer_append_byte(buffer, 0);
610
611
  } else {
611
612
  pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->parameters, buffer);
612
613
  }
613
614
  if (((pm_def_node_t *)node)->body == NULL) {
614
- pm_buffer_append_u8(buffer, 0);
615
+ pm_buffer_append_byte(buffer, 0);
615
616
  } else {
616
617
  pm_serialize_node(parser, (pm_node_t *)((pm_def_node_t *)node)->body, buffer);
617
618
  }
618
619
  uint32_t locals_size = pm_sizet_to_u32(((pm_def_node_t *)node)->locals.size);
619
- pm_buffer_append_u32(buffer, locals_size);
620
+ pm_buffer_append_varint(buffer, locals_size);
620
621
  for (uint32_t index = 0; index < locals_size; index++) {
621
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->locals.ids[index]));
622
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_def_node_t *)node)->locals.ids[index]));
622
623
  }
623
624
  pm_serialize_location(parser, &((pm_def_node_t *)node)->def_keyword_loc, buffer);
624
625
  if (((pm_def_node_t *)node)->operator_loc.start == NULL) {
625
- pm_buffer_append_u8(buffer, 0);
626
+ pm_buffer_append_byte(buffer, 0);
626
627
  } else {
627
- pm_buffer_append_u8(buffer, 1);
628
+ pm_buffer_append_byte(buffer, 1);
628
629
  pm_serialize_location(parser, &((pm_def_node_t *)node)->operator_loc, buffer);
629
630
  }
630
631
  if (((pm_def_node_t *)node)->lparen_loc.start == NULL) {
631
- pm_buffer_append_u8(buffer, 0);
632
+ pm_buffer_append_byte(buffer, 0);
632
633
  } else {
633
- pm_buffer_append_u8(buffer, 1);
634
+ pm_buffer_append_byte(buffer, 1);
634
635
  pm_serialize_location(parser, &((pm_def_node_t *)node)->lparen_loc, buffer);
635
636
  }
636
637
  if (((pm_def_node_t *)node)->rparen_loc.start == NULL) {
637
- pm_buffer_append_u8(buffer, 0);
638
+ pm_buffer_append_byte(buffer, 0);
638
639
  } else {
639
- pm_buffer_append_u8(buffer, 1);
640
+ pm_buffer_append_byte(buffer, 1);
640
641
  pm_serialize_location(parser, &((pm_def_node_t *)node)->rparen_loc, buffer);
641
642
  }
642
643
  if (((pm_def_node_t *)node)->equal_loc.start == NULL) {
643
- pm_buffer_append_u8(buffer, 0);
644
+ pm_buffer_append_byte(buffer, 0);
644
645
  } else {
645
- pm_buffer_append_u8(buffer, 1);
646
+ pm_buffer_append_byte(buffer, 1);
646
647
  pm_serialize_location(parser, &((pm_def_node_t *)node)->equal_loc, buffer);
647
648
  }
648
649
  if (((pm_def_node_t *)node)->end_keyword_loc.start == NULL) {
649
- pm_buffer_append_u8(buffer, 0);
650
+ pm_buffer_append_byte(buffer, 0);
650
651
  } else {
651
- pm_buffer_append_u8(buffer, 1);
652
+ pm_buffer_append_byte(buffer, 1);
652
653
  pm_serialize_location(parser, &((pm_def_node_t *)node)->end_keyword_loc, buffer);
653
654
  }
654
655
  // serialize length
@@ -658,16 +659,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
658
659
  }
659
660
  case PM_DEFINED_NODE: {
660
661
  if (((pm_defined_node_t *)node)->lparen_loc.start == NULL) {
661
- pm_buffer_append_u8(buffer, 0);
662
+ pm_buffer_append_byte(buffer, 0);
662
663
  } else {
663
- pm_buffer_append_u8(buffer, 1);
664
+ pm_buffer_append_byte(buffer, 1);
664
665
  pm_serialize_location(parser, &((pm_defined_node_t *)node)->lparen_loc, buffer);
665
666
  }
666
667
  pm_serialize_node(parser, (pm_node_t *)((pm_defined_node_t *)node)->value, buffer);
667
668
  if (((pm_defined_node_t *)node)->rparen_loc.start == NULL) {
668
- pm_buffer_append_u8(buffer, 0);
669
+ pm_buffer_append_byte(buffer, 0);
669
670
  } else {
670
- pm_buffer_append_u8(buffer, 1);
671
+ pm_buffer_append_byte(buffer, 1);
671
672
  pm_serialize_location(parser, &((pm_defined_node_t *)node)->rparen_loc, buffer);
672
673
  }
673
674
  pm_serialize_location(parser, &((pm_defined_node_t *)node)->keyword_loc, buffer);
@@ -676,14 +677,14 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
676
677
  case PM_ELSE_NODE: {
677
678
  pm_serialize_location(parser, &((pm_else_node_t *)node)->else_keyword_loc, buffer);
678
679
  if (((pm_else_node_t *)node)->statements == NULL) {
679
- pm_buffer_append_u8(buffer, 0);
680
+ pm_buffer_append_byte(buffer, 0);
680
681
  } else {
681
682
  pm_serialize_node(parser, (pm_node_t *)((pm_else_node_t *)node)->statements, buffer);
682
683
  }
683
684
  if (((pm_else_node_t *)node)->end_keyword_loc.start == NULL) {
684
- pm_buffer_append_u8(buffer, 0);
685
+ pm_buffer_append_byte(buffer, 0);
685
686
  } else {
686
- pm_buffer_append_u8(buffer, 1);
687
+ pm_buffer_append_byte(buffer, 1);
687
688
  pm_serialize_location(parser, &((pm_else_node_t *)node)->end_keyword_loc, buffer);
688
689
  }
689
690
  break;
@@ -691,7 +692,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
691
692
  case PM_EMBEDDED_STATEMENTS_NODE: {
692
693
  pm_serialize_location(parser, &((pm_embedded_statements_node_t *)node)->opening_loc, buffer);
693
694
  if (((pm_embedded_statements_node_t *)node)->statements == NULL) {
694
- pm_buffer_append_u8(buffer, 0);
695
+ pm_buffer_append_byte(buffer, 0);
695
696
  } else {
696
697
  pm_serialize_node(parser, (pm_node_t *)((pm_embedded_statements_node_t *)node)->statements, buffer);
697
698
  }
@@ -706,7 +707,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
706
707
  case PM_ENSURE_NODE: {
707
708
  pm_serialize_location(parser, &((pm_ensure_node_t *)node)->ensure_keyword_loc, buffer);
708
709
  if (((pm_ensure_node_t *)node)->statements == NULL) {
709
- pm_buffer_append_u8(buffer, 0);
710
+ pm_buffer_append_byte(buffer, 0);
710
711
  } else {
711
712
  pm_serialize_node(parser, (pm_node_t *)((pm_ensure_node_t *)node)->statements, buffer);
712
713
  }
@@ -718,44 +719,44 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
718
719
  }
719
720
  case PM_FIND_PATTERN_NODE: {
720
721
  if (((pm_find_pattern_node_t *)node)->constant == NULL) {
721
- pm_buffer_append_u8(buffer, 0);
722
+ pm_buffer_append_byte(buffer, 0);
722
723
  } else {
723
724
  pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->constant, buffer);
724
725
  }
725
726
  pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->left, buffer);
726
727
  uint32_t requireds_size = pm_sizet_to_u32(((pm_find_pattern_node_t *)node)->requireds.size);
727
- pm_buffer_append_u32(buffer, requireds_size);
728
+ pm_buffer_append_varint(buffer, requireds_size);
728
729
  for (uint32_t index = 0; index < requireds_size; index++) {
729
730
  pm_serialize_node(parser, (pm_node_t *) ((pm_find_pattern_node_t *)node)->requireds.nodes[index], buffer);
730
731
  }
731
732
  pm_serialize_node(parser, (pm_node_t *)((pm_find_pattern_node_t *)node)->right, buffer);
732
733
  if (((pm_find_pattern_node_t *)node)->opening_loc.start == NULL) {
733
- pm_buffer_append_u8(buffer, 0);
734
+ pm_buffer_append_byte(buffer, 0);
734
735
  } else {
735
- pm_buffer_append_u8(buffer, 1);
736
+ pm_buffer_append_byte(buffer, 1);
736
737
  pm_serialize_location(parser, &((pm_find_pattern_node_t *)node)->opening_loc, buffer);
737
738
  }
738
739
  if (((pm_find_pattern_node_t *)node)->closing_loc.start == NULL) {
739
- pm_buffer_append_u8(buffer, 0);
740
+ pm_buffer_append_byte(buffer, 0);
740
741
  } else {
741
- pm_buffer_append_u8(buffer, 1);
742
+ pm_buffer_append_byte(buffer, 1);
742
743
  pm_serialize_location(parser, &((pm_find_pattern_node_t *)node)->closing_loc, buffer);
743
744
  }
744
745
  break;
745
746
  }
746
747
  case PM_FLIP_FLOP_NODE: {
747
748
  if (((pm_flip_flop_node_t *)node)->left == NULL) {
748
- pm_buffer_append_u8(buffer, 0);
749
+ pm_buffer_append_byte(buffer, 0);
749
750
  } else {
750
751
  pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->left, buffer);
751
752
  }
752
753
  if (((pm_flip_flop_node_t *)node)->right == NULL) {
753
- pm_buffer_append_u8(buffer, 0);
754
+ pm_buffer_append_byte(buffer, 0);
754
755
  } else {
755
756
  pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->right, buffer);
756
757
  }
757
758
  pm_serialize_location(parser, &((pm_flip_flop_node_t *)node)->operator_loc, buffer);
758
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
759
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
759
760
  break;
760
761
  }
761
762
  case PM_FLOAT_NODE: {
@@ -765,16 +766,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
765
766
  pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->index, buffer);
766
767
  pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->collection, buffer);
767
768
  if (((pm_for_node_t *)node)->statements == NULL) {
768
- pm_buffer_append_u8(buffer, 0);
769
+ pm_buffer_append_byte(buffer, 0);
769
770
  } else {
770
771
  pm_serialize_node(parser, (pm_node_t *)((pm_for_node_t *)node)->statements, buffer);
771
772
  }
772
773
  pm_serialize_location(parser, &((pm_for_node_t *)node)->for_keyword_loc, buffer);
773
774
  pm_serialize_location(parser, &((pm_for_node_t *)node)->in_keyword_loc, buffer);
774
775
  if (((pm_for_node_t *)node)->do_keyword_loc.start == NULL) {
775
- pm_buffer_append_u8(buffer, 0);
776
+ pm_buffer_append_byte(buffer, 0);
776
777
  } else {
777
- pm_buffer_append_u8(buffer, 1);
778
+ pm_buffer_append_byte(buffer, 1);
778
779
  pm_serialize_location(parser, &((pm_for_node_t *)node)->do_keyword_loc, buffer);
779
780
  }
780
781
  pm_serialize_location(parser, &((pm_for_node_t *)node)->end_keyword_loc, buffer);
@@ -788,44 +789,44 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
788
789
  }
789
790
  case PM_FORWARDING_SUPER_NODE: {
790
791
  if (((pm_forwarding_super_node_t *)node)->block == NULL) {
791
- pm_buffer_append_u8(buffer, 0);
792
+ pm_buffer_append_byte(buffer, 0);
792
793
  } else {
793
794
  pm_serialize_node(parser, (pm_node_t *)((pm_forwarding_super_node_t *)node)->block, buffer);
794
795
  }
795
796
  break;
796
797
  }
797
798
  case PM_GLOBAL_VARIABLE_AND_WRITE_NODE: {
798
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_and_write_node_t *)node)->name));
799
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_and_write_node_t *)node)->name));
799
800
  pm_serialize_location(parser, &((pm_global_variable_and_write_node_t *)node)->name_loc, buffer);
800
801
  pm_serialize_location(parser, &((pm_global_variable_and_write_node_t *)node)->operator_loc, buffer);
801
802
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_and_write_node_t *)node)->value, buffer);
802
803
  break;
803
804
  }
804
805
  case PM_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
805
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->name));
806
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->name));
806
807
  pm_serialize_location(parser, &((pm_global_variable_operator_write_node_t *)node)->name_loc, buffer);
807
808
  pm_serialize_location(parser, &((pm_global_variable_operator_write_node_t *)node)->operator_loc, buffer);
808
809
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_operator_write_node_t *)node)->value, buffer);
809
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->operator));
810
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_operator_write_node_t *)node)->operator));
810
811
  break;
811
812
  }
812
813
  case PM_GLOBAL_VARIABLE_OR_WRITE_NODE: {
813
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_or_write_node_t *)node)->name));
814
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_or_write_node_t *)node)->name));
814
815
  pm_serialize_location(parser, &((pm_global_variable_or_write_node_t *)node)->name_loc, buffer);
815
816
  pm_serialize_location(parser, &((pm_global_variable_or_write_node_t *)node)->operator_loc, buffer);
816
817
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_or_write_node_t *)node)->value, buffer);
817
818
  break;
818
819
  }
819
820
  case PM_GLOBAL_VARIABLE_READ_NODE: {
820
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_read_node_t *)node)->name));
821
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_read_node_t *)node)->name));
821
822
  break;
822
823
  }
823
824
  case PM_GLOBAL_VARIABLE_TARGET_NODE: {
824
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_target_node_t *)node)->name));
825
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_target_node_t *)node)->name));
825
826
  break;
826
827
  }
827
828
  case PM_GLOBAL_VARIABLE_WRITE_NODE: {
828
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_global_variable_write_node_t *)node)->name));
829
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_global_variable_write_node_t *)node)->name));
829
830
  pm_serialize_location(parser, &((pm_global_variable_write_node_t *)node)->name_loc, buffer);
830
831
  pm_serialize_node(parser, (pm_node_t *)((pm_global_variable_write_node_t *)node)->value, buffer);
831
832
  pm_serialize_location(parser, &((pm_global_variable_write_node_t *)node)->operator_loc, buffer);
@@ -834,7 +835,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
834
835
  case PM_HASH_NODE: {
835
836
  pm_serialize_location(parser, &((pm_hash_node_t *)node)->opening_loc, buffer);
836
837
  uint32_t elements_size = pm_sizet_to_u32(((pm_hash_node_t *)node)->elements.size);
837
- pm_buffer_append_u32(buffer, elements_size);
838
+ pm_buffer_append_varint(buffer, elements_size);
838
839
  for (uint32_t index = 0; index < elements_size; index++) {
839
840
  pm_serialize_node(parser, (pm_node_t *) ((pm_hash_node_t *)node)->elements.nodes[index], buffer);
840
841
  }
@@ -843,56 +844,56 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
843
844
  }
844
845
  case PM_HASH_PATTERN_NODE: {
845
846
  if (((pm_hash_pattern_node_t *)node)->constant == NULL) {
846
- pm_buffer_append_u8(buffer, 0);
847
+ pm_buffer_append_byte(buffer, 0);
847
848
  } else {
848
849
  pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->constant, buffer);
849
850
  }
850
- uint32_t assocs_size = pm_sizet_to_u32(((pm_hash_pattern_node_t *)node)->assocs.size);
851
- pm_buffer_append_u32(buffer, assocs_size);
852
- for (uint32_t index = 0; index < assocs_size; index++) {
853
- pm_serialize_node(parser, (pm_node_t *) ((pm_hash_pattern_node_t *)node)->assocs.nodes[index], buffer);
851
+ uint32_t elements_size = pm_sizet_to_u32(((pm_hash_pattern_node_t *)node)->elements.size);
852
+ pm_buffer_append_varint(buffer, elements_size);
853
+ for (uint32_t index = 0; index < elements_size; index++) {
854
+ pm_serialize_node(parser, (pm_node_t *) ((pm_hash_pattern_node_t *)node)->elements.nodes[index], buffer);
854
855
  }
855
- if (((pm_hash_pattern_node_t *)node)->kwrest == NULL) {
856
- pm_buffer_append_u8(buffer, 0);
856
+ if (((pm_hash_pattern_node_t *)node)->rest == NULL) {
857
+ pm_buffer_append_byte(buffer, 0);
857
858
  } else {
858
- pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->kwrest, buffer);
859
+ pm_serialize_node(parser, (pm_node_t *)((pm_hash_pattern_node_t *)node)->rest, buffer);
859
860
  }
860
861
  if (((pm_hash_pattern_node_t *)node)->opening_loc.start == NULL) {
861
- pm_buffer_append_u8(buffer, 0);
862
+ pm_buffer_append_byte(buffer, 0);
862
863
  } else {
863
- pm_buffer_append_u8(buffer, 1);
864
+ pm_buffer_append_byte(buffer, 1);
864
865
  pm_serialize_location(parser, &((pm_hash_pattern_node_t *)node)->opening_loc, buffer);
865
866
  }
866
867
  if (((pm_hash_pattern_node_t *)node)->closing_loc.start == NULL) {
867
- pm_buffer_append_u8(buffer, 0);
868
+ pm_buffer_append_byte(buffer, 0);
868
869
  } else {
869
- pm_buffer_append_u8(buffer, 1);
870
+ pm_buffer_append_byte(buffer, 1);
870
871
  pm_serialize_location(parser, &((pm_hash_pattern_node_t *)node)->closing_loc, buffer);
871
872
  }
872
873
  break;
873
874
  }
874
875
  case PM_IF_NODE: {
875
876
  if (((pm_if_node_t *)node)->if_keyword_loc.start == NULL) {
876
- pm_buffer_append_u8(buffer, 0);
877
+ pm_buffer_append_byte(buffer, 0);
877
878
  } else {
878
- pm_buffer_append_u8(buffer, 1);
879
+ pm_buffer_append_byte(buffer, 1);
879
880
  pm_serialize_location(parser, &((pm_if_node_t *)node)->if_keyword_loc, buffer);
880
881
  }
881
882
  pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->predicate, buffer);
882
883
  if (((pm_if_node_t *)node)->statements == NULL) {
883
- pm_buffer_append_u8(buffer, 0);
884
+ pm_buffer_append_byte(buffer, 0);
884
885
  } else {
885
886
  pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->statements, buffer);
886
887
  }
887
888
  if (((pm_if_node_t *)node)->consequent == NULL) {
888
- pm_buffer_append_u8(buffer, 0);
889
+ pm_buffer_append_byte(buffer, 0);
889
890
  } else {
890
891
  pm_serialize_node(parser, (pm_node_t *)((pm_if_node_t *)node)->consequent, buffer);
891
892
  }
892
893
  if (((pm_if_node_t *)node)->end_keyword_loc.start == NULL) {
893
- pm_buffer_append_u8(buffer, 0);
894
+ pm_buffer_append_byte(buffer, 0);
894
895
  } else {
895
- pm_buffer_append_u8(buffer, 1);
896
+ pm_buffer_append_byte(buffer, 1);
896
897
  pm_serialize_location(parser, &((pm_if_node_t *)node)->end_keyword_loc, buffer);
897
898
  }
898
899
  break;
@@ -908,206 +909,206 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
908
909
  case PM_IN_NODE: {
909
910
  pm_serialize_node(parser, (pm_node_t *)((pm_in_node_t *)node)->pattern, buffer);
910
911
  if (((pm_in_node_t *)node)->statements == NULL) {
911
- pm_buffer_append_u8(buffer, 0);
912
+ pm_buffer_append_byte(buffer, 0);
912
913
  } else {
913
914
  pm_serialize_node(parser, (pm_node_t *)((pm_in_node_t *)node)->statements, buffer);
914
915
  }
915
916
  pm_serialize_location(parser, &((pm_in_node_t *)node)->in_loc, buffer);
916
917
  if (((pm_in_node_t *)node)->then_loc.start == NULL) {
917
- pm_buffer_append_u8(buffer, 0);
918
+ pm_buffer_append_byte(buffer, 0);
918
919
  } else {
919
- pm_buffer_append_u8(buffer, 1);
920
+ pm_buffer_append_byte(buffer, 1);
920
921
  pm_serialize_location(parser, &((pm_in_node_t *)node)->then_loc, buffer);
921
922
  }
922
923
  break;
923
924
  }
924
925
  case PM_INDEX_AND_WRITE_NODE: {
925
926
  if (((pm_index_and_write_node_t *)node)->receiver == NULL) {
926
- pm_buffer_append_u8(buffer, 0);
927
+ pm_buffer_append_byte(buffer, 0);
927
928
  } else {
928
929
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->receiver, buffer);
929
930
  }
930
931
  if (((pm_index_and_write_node_t *)node)->call_operator_loc.start == NULL) {
931
- pm_buffer_append_u8(buffer, 0);
932
+ pm_buffer_append_byte(buffer, 0);
932
933
  } else {
933
- pm_buffer_append_u8(buffer, 1);
934
+ pm_buffer_append_byte(buffer, 1);
934
935
  pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->call_operator_loc, buffer);
935
936
  }
936
937
  pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->opening_loc, buffer);
937
938
  if (((pm_index_and_write_node_t *)node)->arguments == NULL) {
938
- pm_buffer_append_u8(buffer, 0);
939
+ pm_buffer_append_byte(buffer, 0);
939
940
  } else {
940
941
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->arguments, buffer);
941
942
  }
942
943
  pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->closing_loc, buffer);
943
944
  if (((pm_index_and_write_node_t *)node)->block == NULL) {
944
- pm_buffer_append_u8(buffer, 0);
945
+ pm_buffer_append_byte(buffer, 0);
945
946
  } else {
946
947
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->block, buffer);
947
948
  }
948
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
949
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
949
950
  pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->operator_loc, buffer);
950
951
  pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->value, buffer);
951
952
  break;
952
953
  }
953
954
  case PM_INDEX_OPERATOR_WRITE_NODE: {
954
955
  if (((pm_index_operator_write_node_t *)node)->receiver == NULL) {
955
- pm_buffer_append_u8(buffer, 0);
956
+ pm_buffer_append_byte(buffer, 0);
956
957
  } else {
957
958
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->receiver, buffer);
958
959
  }
959
960
  if (((pm_index_operator_write_node_t *)node)->call_operator_loc.start == NULL) {
960
- pm_buffer_append_u8(buffer, 0);
961
+ pm_buffer_append_byte(buffer, 0);
961
962
  } else {
962
- pm_buffer_append_u8(buffer, 1);
963
+ pm_buffer_append_byte(buffer, 1);
963
964
  pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->call_operator_loc, buffer);
964
965
  }
965
966
  pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->opening_loc, buffer);
966
967
  if (((pm_index_operator_write_node_t *)node)->arguments == NULL) {
967
- pm_buffer_append_u8(buffer, 0);
968
+ pm_buffer_append_byte(buffer, 0);
968
969
  } else {
969
970
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->arguments, buffer);
970
971
  }
971
972
  pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->closing_loc, buffer);
972
973
  if (((pm_index_operator_write_node_t *)node)->block == NULL) {
973
- pm_buffer_append_u8(buffer, 0);
974
+ pm_buffer_append_byte(buffer, 0);
974
975
  } else {
975
976
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->block, buffer);
976
977
  }
977
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
978
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_index_operator_write_node_t *)node)->operator));
978
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
979
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_index_operator_write_node_t *)node)->operator));
979
980
  pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->operator_loc, buffer);
980
981
  pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->value, buffer);
981
982
  break;
982
983
  }
983
984
  case PM_INDEX_OR_WRITE_NODE: {
984
985
  if (((pm_index_or_write_node_t *)node)->receiver == NULL) {
985
- pm_buffer_append_u8(buffer, 0);
986
+ pm_buffer_append_byte(buffer, 0);
986
987
  } else {
987
988
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->receiver, buffer);
988
989
  }
989
990
  if (((pm_index_or_write_node_t *)node)->call_operator_loc.start == NULL) {
990
- pm_buffer_append_u8(buffer, 0);
991
+ pm_buffer_append_byte(buffer, 0);
991
992
  } else {
992
- pm_buffer_append_u8(buffer, 1);
993
+ pm_buffer_append_byte(buffer, 1);
993
994
  pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->call_operator_loc, buffer);
994
995
  }
995
996
  pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->opening_loc, buffer);
996
997
  if (((pm_index_or_write_node_t *)node)->arguments == NULL) {
997
- pm_buffer_append_u8(buffer, 0);
998
+ pm_buffer_append_byte(buffer, 0);
998
999
  } else {
999
1000
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->arguments, buffer);
1000
1001
  }
1001
1002
  pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->closing_loc, buffer);
1002
1003
  if (((pm_index_or_write_node_t *)node)->block == NULL) {
1003
- pm_buffer_append_u8(buffer, 0);
1004
+ pm_buffer_append_byte(buffer, 0);
1004
1005
  } else {
1005
1006
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->block, buffer);
1006
1007
  }
1007
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1008
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1008
1009
  pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->operator_loc, buffer);
1009
1010
  pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->value, buffer);
1010
1011
  break;
1011
1012
  }
1012
1013
  case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
1013
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
1014
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
1014
1015
  pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->name_loc, buffer);
1015
1016
  pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->operator_loc, buffer);
1016
1017
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_and_write_node_t *)node)->value, buffer);
1017
1018
  break;
1018
1019
  }
1019
1020
  case PM_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
1020
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->name));
1021
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->name));
1021
1022
  pm_serialize_location(parser, &((pm_instance_variable_operator_write_node_t *)node)->name_loc, buffer);
1022
1023
  pm_serialize_location(parser, &((pm_instance_variable_operator_write_node_t *)node)->operator_loc, buffer);
1023
1024
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_operator_write_node_t *)node)->value, buffer);
1024
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->operator));
1025
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_operator_write_node_t *)node)->operator));
1025
1026
  break;
1026
1027
  }
1027
1028
  case PM_INSTANCE_VARIABLE_OR_WRITE_NODE: {
1028
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_or_write_node_t *)node)->name));
1029
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_or_write_node_t *)node)->name));
1029
1030
  pm_serialize_location(parser, &((pm_instance_variable_or_write_node_t *)node)->name_loc, buffer);
1030
1031
  pm_serialize_location(parser, &((pm_instance_variable_or_write_node_t *)node)->operator_loc, buffer);
1031
1032
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_or_write_node_t *)node)->value, buffer);
1032
1033
  break;
1033
1034
  }
1034
1035
  case PM_INSTANCE_VARIABLE_READ_NODE: {
1035
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_read_node_t *)node)->name));
1036
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_read_node_t *)node)->name));
1036
1037
  break;
1037
1038
  }
1038
1039
  case PM_INSTANCE_VARIABLE_TARGET_NODE: {
1039
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_target_node_t *)node)->name));
1040
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_target_node_t *)node)->name));
1040
1041
  break;
1041
1042
  }
1042
1043
  case PM_INSTANCE_VARIABLE_WRITE_NODE: {
1043
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_write_node_t *)node)->name));
1044
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_instance_variable_write_node_t *)node)->name));
1044
1045
  pm_serialize_location(parser, &((pm_instance_variable_write_node_t *)node)->name_loc, buffer);
1045
1046
  pm_serialize_node(parser, (pm_node_t *)((pm_instance_variable_write_node_t *)node)->value, buffer);
1046
1047
  pm_serialize_location(parser, &((pm_instance_variable_write_node_t *)node)->operator_loc, buffer);
1047
1048
  break;
1048
1049
  }
1049
1050
  case PM_INTEGER_NODE: {
1050
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1051
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1051
1052
  break;
1052
1053
  }
1053
1054
  case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
1054
1055
  pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->opening_loc, buffer);
1055
1056
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_match_last_line_node_t *)node)->parts.size);
1056
- pm_buffer_append_u32(buffer, parts_size);
1057
+ pm_buffer_append_varint(buffer, parts_size);
1057
1058
  for (uint32_t index = 0; index < parts_size; index++) {
1058
1059
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_match_last_line_node_t *)node)->parts.nodes[index], buffer);
1059
1060
  }
1060
1061
  pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->closing_loc, buffer);
1061
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1062
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1062
1063
  break;
1063
1064
  }
1064
1065
  case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
1065
1066
  pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->opening_loc, buffer);
1066
1067
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_regular_expression_node_t *)node)->parts.size);
1067
- pm_buffer_append_u32(buffer, parts_size);
1068
+ pm_buffer_append_varint(buffer, parts_size);
1068
1069
  for (uint32_t index = 0; index < parts_size; index++) {
1069
1070
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
1070
1071
  }
1071
1072
  pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
1072
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1073
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1073
1074
  break;
1074
1075
  }
1075
1076
  case PM_INTERPOLATED_STRING_NODE: {
1076
1077
  if (((pm_interpolated_string_node_t *)node)->opening_loc.start == NULL) {
1077
- pm_buffer_append_u8(buffer, 0);
1078
+ pm_buffer_append_byte(buffer, 0);
1078
1079
  } else {
1079
- pm_buffer_append_u8(buffer, 1);
1080
+ pm_buffer_append_byte(buffer, 1);
1080
1081
  pm_serialize_location(parser, &((pm_interpolated_string_node_t *)node)->opening_loc, buffer);
1081
1082
  }
1082
1083
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_string_node_t *)node)->parts.size);
1083
- pm_buffer_append_u32(buffer, parts_size);
1084
+ pm_buffer_append_varint(buffer, parts_size);
1084
1085
  for (uint32_t index = 0; index < parts_size; index++) {
1085
1086
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_string_node_t *)node)->parts.nodes[index], buffer);
1086
1087
  }
1087
1088
  if (((pm_interpolated_string_node_t *)node)->closing_loc.start == NULL) {
1088
- pm_buffer_append_u8(buffer, 0);
1089
+ pm_buffer_append_byte(buffer, 0);
1089
1090
  } else {
1090
- pm_buffer_append_u8(buffer, 1);
1091
+ pm_buffer_append_byte(buffer, 1);
1091
1092
  pm_serialize_location(parser, &((pm_interpolated_string_node_t *)node)->closing_loc, buffer);
1092
1093
  }
1093
1094
  break;
1094
1095
  }
1095
1096
  case PM_INTERPOLATED_SYMBOL_NODE: {
1096
1097
  if (((pm_interpolated_symbol_node_t *)node)->opening_loc.start == NULL) {
1097
- pm_buffer_append_u8(buffer, 0);
1098
+ pm_buffer_append_byte(buffer, 0);
1098
1099
  } else {
1099
- pm_buffer_append_u8(buffer, 1);
1100
+ pm_buffer_append_byte(buffer, 1);
1100
1101
  pm_serialize_location(parser, &((pm_interpolated_symbol_node_t *)node)->opening_loc, buffer);
1101
1102
  }
1102
1103
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_symbol_node_t *)node)->parts.size);
1103
- pm_buffer_append_u32(buffer, parts_size);
1104
+ pm_buffer_append_varint(buffer, parts_size);
1104
1105
  for (uint32_t index = 0; index < parts_size; index++) {
1105
1106
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_symbol_node_t *)node)->parts.nodes[index], buffer);
1106
1107
  }
1107
1108
  if (((pm_interpolated_symbol_node_t *)node)->closing_loc.start == NULL) {
1108
- pm_buffer_append_u8(buffer, 0);
1109
+ pm_buffer_append_byte(buffer, 0);
1109
1110
  } else {
1110
- pm_buffer_append_u8(buffer, 1);
1111
+ pm_buffer_append_byte(buffer, 1);
1111
1112
  pm_serialize_location(parser, &((pm_interpolated_symbol_node_t *)node)->closing_loc, buffer);
1112
1113
  }
1113
1114
  break;
@@ -1115,7 +1116,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1115
1116
  case PM_INTERPOLATED_X_STRING_NODE: {
1116
1117
  pm_serialize_location(parser, &((pm_interpolated_x_string_node_t *)node)->opening_loc, buffer);
1117
1118
  uint32_t parts_size = pm_sizet_to_u32(((pm_interpolated_x_string_node_t *)node)->parts.size);
1118
- pm_buffer_append_u32(buffer, parts_size);
1119
+ pm_buffer_append_varint(buffer, parts_size);
1119
1120
  for (uint32_t index = 0; index < parts_size; index++) {
1120
1121
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_x_string_node_t *)node)->parts.nodes[index], buffer);
1121
1122
  }
@@ -1124,28 +1125,18 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1124
1125
  }
1125
1126
  case PM_KEYWORD_HASH_NODE: {
1126
1127
  uint32_t elements_size = pm_sizet_to_u32(((pm_keyword_hash_node_t *)node)->elements.size);
1127
- pm_buffer_append_u32(buffer, elements_size);
1128
+ pm_buffer_append_varint(buffer, elements_size);
1128
1129
  for (uint32_t index = 0; index < elements_size; index++) {
1129
1130
  pm_serialize_node(parser, (pm_node_t *) ((pm_keyword_hash_node_t *)node)->elements.nodes[index], buffer);
1130
1131
  }
1131
1132
  break;
1132
1133
  }
1133
- case PM_KEYWORD_PARAMETER_NODE: {
1134
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_keyword_parameter_node_t *)node)->name));
1135
- pm_serialize_location(parser, &((pm_keyword_parameter_node_t *)node)->name_loc, buffer);
1136
- if (((pm_keyword_parameter_node_t *)node)->value == NULL) {
1137
- pm_buffer_append_u8(buffer, 0);
1138
- } else {
1139
- pm_serialize_node(parser, (pm_node_t *)((pm_keyword_parameter_node_t *)node)->value, buffer);
1140
- }
1141
- break;
1142
- }
1143
1134
  case PM_KEYWORD_REST_PARAMETER_NODE: {
1144
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_keyword_rest_parameter_node_t *)node)->name));
1135
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_keyword_rest_parameter_node_t *)node)->name));
1145
1136
  if (((pm_keyword_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1146
- pm_buffer_append_u8(buffer, 0);
1137
+ pm_buffer_append_byte(buffer, 0);
1147
1138
  } else {
1148
- pm_buffer_append_u8(buffer, 1);
1139
+ pm_buffer_append_byte(buffer, 1);
1149
1140
  pm_serialize_location(parser, &((pm_keyword_rest_parameter_node_t *)node)->name_loc, buffer);
1150
1141
  }
1151
1142
  pm_serialize_location(parser, &((pm_keyword_rest_parameter_node_t *)node)->operator_loc, buffer);
@@ -1153,20 +1144,20 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1153
1144
  }
1154
1145
  case PM_LAMBDA_NODE: {
1155
1146
  uint32_t locals_size = pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.size);
1156
- pm_buffer_append_u32(buffer, locals_size);
1147
+ pm_buffer_append_varint(buffer, locals_size);
1157
1148
  for (uint32_t index = 0; index < locals_size; index++) {
1158
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.ids[index]));
1149
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_lambda_node_t *)node)->locals.ids[index]));
1159
1150
  }
1160
1151
  pm_serialize_location(parser, &((pm_lambda_node_t *)node)->operator_loc, buffer);
1161
1152
  pm_serialize_location(parser, &((pm_lambda_node_t *)node)->opening_loc, buffer);
1162
1153
  pm_serialize_location(parser, &((pm_lambda_node_t *)node)->closing_loc, buffer);
1163
1154
  if (((pm_lambda_node_t *)node)->parameters == NULL) {
1164
- pm_buffer_append_u8(buffer, 0);
1155
+ pm_buffer_append_byte(buffer, 0);
1165
1156
  } else {
1166
1157
  pm_serialize_node(parser, (pm_node_t *)((pm_lambda_node_t *)node)->parameters, buffer);
1167
1158
  }
1168
1159
  if (((pm_lambda_node_t *)node)->body == NULL) {
1169
- pm_buffer_append_u8(buffer, 0);
1160
+ pm_buffer_append_byte(buffer, 0);
1170
1161
  } else {
1171
1162
  pm_serialize_node(parser, (pm_node_t *)((pm_lambda_node_t *)node)->body, buffer);
1172
1163
  }
@@ -1176,40 +1167,40 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1176
1167
  pm_serialize_location(parser, &((pm_local_variable_and_write_node_t *)node)->name_loc, buffer);
1177
1168
  pm_serialize_location(parser, &((pm_local_variable_and_write_node_t *)node)->operator_loc, buffer);
1178
1169
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_and_write_node_t *)node)->value, buffer);
1179
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_and_write_node_t *)node)->name));
1180
- pm_buffer_append_u32(buffer, ((pm_local_variable_and_write_node_t *)node)->depth);
1170
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_and_write_node_t *)node)->name));
1171
+ pm_buffer_append_varint(buffer, ((pm_local_variable_and_write_node_t *)node)->depth);
1181
1172
  break;
1182
1173
  }
1183
1174
  case PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE: {
1184
1175
  pm_serialize_location(parser, &((pm_local_variable_operator_write_node_t *)node)->name_loc, buffer);
1185
1176
  pm_serialize_location(parser, &((pm_local_variable_operator_write_node_t *)node)->operator_loc, buffer);
1186
1177
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_operator_write_node_t *)node)->value, buffer);
1187
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->name));
1188
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->operator));
1189
- pm_buffer_append_u32(buffer, ((pm_local_variable_operator_write_node_t *)node)->depth);
1178
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->name));
1179
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_operator_write_node_t *)node)->operator));
1180
+ pm_buffer_append_varint(buffer, ((pm_local_variable_operator_write_node_t *)node)->depth);
1190
1181
  break;
1191
1182
  }
1192
1183
  case PM_LOCAL_VARIABLE_OR_WRITE_NODE: {
1193
1184
  pm_serialize_location(parser, &((pm_local_variable_or_write_node_t *)node)->name_loc, buffer);
1194
1185
  pm_serialize_location(parser, &((pm_local_variable_or_write_node_t *)node)->operator_loc, buffer);
1195
1186
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_or_write_node_t *)node)->value, buffer);
1196
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_or_write_node_t *)node)->name));
1197
- pm_buffer_append_u32(buffer, ((pm_local_variable_or_write_node_t *)node)->depth);
1187
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_or_write_node_t *)node)->name));
1188
+ pm_buffer_append_varint(buffer, ((pm_local_variable_or_write_node_t *)node)->depth);
1198
1189
  break;
1199
1190
  }
1200
1191
  case PM_LOCAL_VARIABLE_READ_NODE: {
1201
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_read_node_t *)node)->name));
1202
- pm_buffer_append_u32(buffer, ((pm_local_variable_read_node_t *)node)->depth);
1192
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_read_node_t *)node)->name));
1193
+ pm_buffer_append_varint(buffer, ((pm_local_variable_read_node_t *)node)->depth);
1203
1194
  break;
1204
1195
  }
1205
1196
  case PM_LOCAL_VARIABLE_TARGET_NODE: {
1206
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_target_node_t *)node)->name));
1207
- pm_buffer_append_u32(buffer, ((pm_local_variable_target_node_t *)node)->depth);
1197
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_target_node_t *)node)->name));
1198
+ pm_buffer_append_varint(buffer, ((pm_local_variable_target_node_t *)node)->depth);
1208
1199
  break;
1209
1200
  }
1210
1201
  case PM_LOCAL_VARIABLE_WRITE_NODE: {
1211
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_local_variable_write_node_t *)node)->name));
1212
- pm_buffer_append_u32(buffer, ((pm_local_variable_write_node_t *)node)->depth);
1202
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_local_variable_write_node_t *)node)->name));
1203
+ pm_buffer_append_varint(buffer, ((pm_local_variable_write_node_t *)node)->depth);
1213
1204
  pm_serialize_location(parser, &((pm_local_variable_write_node_t *)node)->name_loc, buffer);
1214
1205
  pm_serialize_node(parser, (pm_node_t *)((pm_local_variable_write_node_t *)node)->value, buffer);
1215
1206
  pm_serialize_location(parser, &((pm_local_variable_write_node_t *)node)->operator_loc, buffer);
@@ -1220,7 +1211,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1220
1211
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->content_loc, buffer);
1221
1212
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->closing_loc, buffer);
1222
1213
  pm_serialize_string(parser, &((pm_match_last_line_node_t *)node)->unescaped, buffer);
1223
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1214
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1224
1215
  break;
1225
1216
  }
1226
1217
  case PM_MATCH_PREDICATE_NODE: {
@@ -1238,9 +1229,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1238
1229
  case PM_MATCH_WRITE_NODE: {
1239
1230
  pm_serialize_node(parser, (pm_node_t *)((pm_match_write_node_t *)node)->call, buffer);
1240
1231
  uint32_t locals_size = pm_sizet_to_u32(((pm_match_write_node_t *)node)->locals.size);
1241
- pm_buffer_append_u32(buffer, locals_size);
1232
+ pm_buffer_append_varint(buffer, locals_size);
1242
1233
  for (uint32_t index = 0; index < locals_size; index++) {
1243
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_match_write_node_t *)node)->locals.ids[index]));
1234
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_match_write_node_t *)node)->locals.ids[index]));
1244
1235
  }
1245
1236
  break;
1246
1237
  }
@@ -1249,57 +1240,77 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1249
1240
  }
1250
1241
  case PM_MODULE_NODE: {
1251
1242
  uint32_t locals_size = pm_sizet_to_u32(((pm_module_node_t *)node)->locals.size);
1252
- pm_buffer_append_u32(buffer, locals_size);
1243
+ pm_buffer_append_varint(buffer, locals_size);
1253
1244
  for (uint32_t index = 0; index < locals_size; index++) {
1254
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->locals.ids[index]));
1245
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->locals.ids[index]));
1255
1246
  }
1256
1247
  pm_serialize_location(parser, &((pm_module_node_t *)node)->module_keyword_loc, buffer);
1257
1248
  pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->constant_path, buffer);
1258
1249
  if (((pm_module_node_t *)node)->body == NULL) {
1259
- pm_buffer_append_u8(buffer, 0);
1250
+ pm_buffer_append_byte(buffer, 0);
1260
1251
  } else {
1261
1252
  pm_serialize_node(parser, (pm_node_t *)((pm_module_node_t *)node)->body, buffer);
1262
1253
  }
1263
1254
  pm_serialize_location(parser, &((pm_module_node_t *)node)->end_keyword_loc, buffer);
1264
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->name));
1255
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_module_node_t *)node)->name));
1265
1256
  break;
1266
1257
  }
1267
1258
  case PM_MULTI_TARGET_NODE: {
1268
- uint32_t targets_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->targets.size);
1269
- pm_buffer_append_u32(buffer, targets_size);
1270
- for (uint32_t index = 0; index < targets_size; index++) {
1271
- pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->targets.nodes[index], buffer);
1259
+ uint32_t lefts_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->lefts.size);
1260
+ pm_buffer_append_varint(buffer, lefts_size);
1261
+ for (uint32_t index = 0; index < lefts_size; index++) {
1262
+ pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->lefts.nodes[index], buffer);
1263
+ }
1264
+ if (((pm_multi_target_node_t *)node)->rest == NULL) {
1265
+ pm_buffer_append_byte(buffer, 0);
1266
+ } else {
1267
+ pm_serialize_node(parser, (pm_node_t *)((pm_multi_target_node_t *)node)->rest, buffer);
1268
+ }
1269
+ uint32_t rights_size = pm_sizet_to_u32(((pm_multi_target_node_t *)node)->rights.size);
1270
+ pm_buffer_append_varint(buffer, rights_size);
1271
+ for (uint32_t index = 0; index < rights_size; index++) {
1272
+ pm_serialize_node(parser, (pm_node_t *) ((pm_multi_target_node_t *)node)->rights.nodes[index], buffer);
1272
1273
  }
1273
1274
  if (((pm_multi_target_node_t *)node)->lparen_loc.start == NULL) {
1274
- pm_buffer_append_u8(buffer, 0);
1275
+ pm_buffer_append_byte(buffer, 0);
1275
1276
  } else {
1276
- pm_buffer_append_u8(buffer, 1);
1277
+ pm_buffer_append_byte(buffer, 1);
1277
1278
  pm_serialize_location(parser, &((pm_multi_target_node_t *)node)->lparen_loc, buffer);
1278
1279
  }
1279
1280
  if (((pm_multi_target_node_t *)node)->rparen_loc.start == NULL) {
1280
- pm_buffer_append_u8(buffer, 0);
1281
+ pm_buffer_append_byte(buffer, 0);
1281
1282
  } else {
1282
- pm_buffer_append_u8(buffer, 1);
1283
+ pm_buffer_append_byte(buffer, 1);
1283
1284
  pm_serialize_location(parser, &((pm_multi_target_node_t *)node)->rparen_loc, buffer);
1284
1285
  }
1285
1286
  break;
1286
1287
  }
1287
1288
  case PM_MULTI_WRITE_NODE: {
1288
- uint32_t targets_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->targets.size);
1289
- pm_buffer_append_u32(buffer, targets_size);
1290
- for (uint32_t index = 0; index < targets_size; index++) {
1291
- pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->targets.nodes[index], buffer);
1289
+ uint32_t lefts_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->lefts.size);
1290
+ pm_buffer_append_varint(buffer, lefts_size);
1291
+ for (uint32_t index = 0; index < lefts_size; index++) {
1292
+ pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->lefts.nodes[index], buffer);
1293
+ }
1294
+ if (((pm_multi_write_node_t *)node)->rest == NULL) {
1295
+ pm_buffer_append_byte(buffer, 0);
1296
+ } else {
1297
+ pm_serialize_node(parser, (pm_node_t *)((pm_multi_write_node_t *)node)->rest, buffer);
1298
+ }
1299
+ uint32_t rights_size = pm_sizet_to_u32(((pm_multi_write_node_t *)node)->rights.size);
1300
+ pm_buffer_append_varint(buffer, rights_size);
1301
+ for (uint32_t index = 0; index < rights_size; index++) {
1302
+ pm_serialize_node(parser, (pm_node_t *) ((pm_multi_write_node_t *)node)->rights.nodes[index], buffer);
1292
1303
  }
1293
1304
  if (((pm_multi_write_node_t *)node)->lparen_loc.start == NULL) {
1294
- pm_buffer_append_u8(buffer, 0);
1305
+ pm_buffer_append_byte(buffer, 0);
1295
1306
  } else {
1296
- pm_buffer_append_u8(buffer, 1);
1307
+ pm_buffer_append_byte(buffer, 1);
1297
1308
  pm_serialize_location(parser, &((pm_multi_write_node_t *)node)->lparen_loc, buffer);
1298
1309
  }
1299
1310
  if (((pm_multi_write_node_t *)node)->rparen_loc.start == NULL) {
1300
- pm_buffer_append_u8(buffer, 0);
1311
+ pm_buffer_append_byte(buffer, 0);
1301
1312
  } else {
1302
- pm_buffer_append_u8(buffer, 1);
1313
+ pm_buffer_append_byte(buffer, 1);
1303
1314
  pm_serialize_location(parser, &((pm_multi_write_node_t *)node)->rparen_loc, buffer);
1304
1315
  }
1305
1316
  pm_serialize_location(parser, &((pm_multi_write_node_t *)node)->operator_loc, buffer);
@@ -1308,7 +1319,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1308
1319
  }
1309
1320
  case PM_NEXT_NODE: {
1310
1321
  if (((pm_next_node_t *)node)->arguments == NULL) {
1311
- pm_buffer_append_u8(buffer, 0);
1322
+ pm_buffer_append_byte(buffer, 0);
1312
1323
  } else {
1313
1324
  pm_serialize_node(parser, (pm_node_t *)((pm_next_node_t *)node)->arguments, buffer);
1314
1325
  }
@@ -1324,11 +1335,17 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1324
1335
  break;
1325
1336
  }
1326
1337
  case PM_NUMBERED_REFERENCE_READ_NODE: {
1327
- pm_buffer_append_u32(buffer, ((pm_numbered_reference_read_node_t *)node)->number);
1338
+ pm_buffer_append_varint(buffer, ((pm_numbered_reference_read_node_t *)node)->number);
1339
+ break;
1340
+ }
1341
+ case PM_OPTIONAL_KEYWORD_PARAMETER_NODE: {
1342
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_optional_keyword_parameter_node_t *)node)->name));
1343
+ pm_serialize_location(parser, &((pm_optional_keyword_parameter_node_t *)node)->name_loc, buffer);
1344
+ pm_serialize_node(parser, (pm_node_t *)((pm_optional_keyword_parameter_node_t *)node)->value, buffer);
1328
1345
  break;
1329
1346
  }
1330
1347
  case PM_OPTIONAL_PARAMETER_NODE: {
1331
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_optional_parameter_node_t *)node)->name));
1348
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_optional_parameter_node_t *)node)->name));
1332
1349
  pm_serialize_location(parser, &((pm_optional_parameter_node_t *)node)->name_loc, buffer);
1333
1350
  pm_serialize_location(parser, &((pm_optional_parameter_node_t *)node)->operator_loc, buffer);
1334
1351
  pm_serialize_node(parser, (pm_node_t *)((pm_optional_parameter_node_t *)node)->value, buffer);
@@ -1342,37 +1359,37 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1342
1359
  }
1343
1360
  case PM_PARAMETERS_NODE: {
1344
1361
  uint32_t requireds_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->requireds.size);
1345
- pm_buffer_append_u32(buffer, requireds_size);
1362
+ pm_buffer_append_varint(buffer, requireds_size);
1346
1363
  for (uint32_t index = 0; index < requireds_size; index++) {
1347
1364
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->requireds.nodes[index], buffer);
1348
1365
  }
1349
1366
  uint32_t optionals_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->optionals.size);
1350
- pm_buffer_append_u32(buffer, optionals_size);
1367
+ pm_buffer_append_varint(buffer, optionals_size);
1351
1368
  for (uint32_t index = 0; index < optionals_size; index++) {
1352
1369
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->optionals.nodes[index], buffer);
1353
1370
  }
1354
1371
  if (((pm_parameters_node_t *)node)->rest == NULL) {
1355
- pm_buffer_append_u8(buffer, 0);
1372
+ pm_buffer_append_byte(buffer, 0);
1356
1373
  } else {
1357
1374
  pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->rest, buffer);
1358
1375
  }
1359
1376
  uint32_t posts_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->posts.size);
1360
- pm_buffer_append_u32(buffer, posts_size);
1377
+ pm_buffer_append_varint(buffer, posts_size);
1361
1378
  for (uint32_t index = 0; index < posts_size; index++) {
1362
1379
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->posts.nodes[index], buffer);
1363
1380
  }
1364
1381
  uint32_t keywords_size = pm_sizet_to_u32(((pm_parameters_node_t *)node)->keywords.size);
1365
- pm_buffer_append_u32(buffer, keywords_size);
1382
+ pm_buffer_append_varint(buffer, keywords_size);
1366
1383
  for (uint32_t index = 0; index < keywords_size; index++) {
1367
1384
  pm_serialize_node(parser, (pm_node_t *) ((pm_parameters_node_t *)node)->keywords.nodes[index], buffer);
1368
1385
  }
1369
1386
  if (((pm_parameters_node_t *)node)->keyword_rest == NULL) {
1370
- pm_buffer_append_u8(buffer, 0);
1387
+ pm_buffer_append_byte(buffer, 0);
1371
1388
  } else {
1372
1389
  pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->keyword_rest, buffer);
1373
1390
  }
1374
1391
  if (((pm_parameters_node_t *)node)->block == NULL) {
1375
- pm_buffer_append_u8(buffer, 0);
1392
+ pm_buffer_append_byte(buffer, 0);
1376
1393
  } else {
1377
1394
  pm_serialize_node(parser, (pm_node_t *)((pm_parameters_node_t *)node)->block, buffer);
1378
1395
  }
@@ -1380,7 +1397,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1380
1397
  }
1381
1398
  case PM_PARENTHESES_NODE: {
1382
1399
  if (((pm_parentheses_node_t *)node)->body == NULL) {
1383
- pm_buffer_append_u8(buffer, 0);
1400
+ pm_buffer_append_byte(buffer, 0);
1384
1401
  } else {
1385
1402
  pm_serialize_node(parser, (pm_node_t *)((pm_parentheses_node_t *)node)->body, buffer);
1386
1403
  }
@@ -1402,7 +1419,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1402
1419
  }
1403
1420
  case PM_POST_EXECUTION_NODE: {
1404
1421
  if (((pm_post_execution_node_t *)node)->statements == NULL) {
1405
- pm_buffer_append_u8(buffer, 0);
1422
+ pm_buffer_append_byte(buffer, 0);
1406
1423
  } else {
1407
1424
  pm_serialize_node(parser, (pm_node_t *)((pm_post_execution_node_t *)node)->statements, buffer);
1408
1425
  }
@@ -1413,7 +1430,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1413
1430
  }
1414
1431
  case PM_PRE_EXECUTION_NODE: {
1415
1432
  if (((pm_pre_execution_node_t *)node)->statements == NULL) {
1416
- pm_buffer_append_u8(buffer, 0);
1433
+ pm_buffer_append_byte(buffer, 0);
1417
1434
  } else {
1418
1435
  pm_serialize_node(parser, (pm_node_t *)((pm_pre_execution_node_t *)node)->statements, buffer);
1419
1436
  }
@@ -1424,26 +1441,26 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1424
1441
  }
1425
1442
  case PM_PROGRAM_NODE: {
1426
1443
  uint32_t locals_size = pm_sizet_to_u32(((pm_program_node_t *)node)->locals.size);
1427
- pm_buffer_append_u32(buffer, locals_size);
1444
+ pm_buffer_append_varint(buffer, locals_size);
1428
1445
  for (uint32_t index = 0; index < locals_size; index++) {
1429
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_program_node_t *)node)->locals.ids[index]));
1446
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_program_node_t *)node)->locals.ids[index]));
1430
1447
  }
1431
1448
  pm_serialize_node(parser, (pm_node_t *)((pm_program_node_t *)node)->statements, buffer);
1432
1449
  break;
1433
1450
  }
1434
1451
  case PM_RANGE_NODE: {
1435
1452
  if (((pm_range_node_t *)node)->left == NULL) {
1436
- pm_buffer_append_u8(buffer, 0);
1453
+ pm_buffer_append_byte(buffer, 0);
1437
1454
  } else {
1438
1455
  pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->left, buffer);
1439
1456
  }
1440
1457
  if (((pm_range_node_t *)node)->right == NULL) {
1441
- pm_buffer_append_u8(buffer, 0);
1458
+ pm_buffer_append_byte(buffer, 0);
1442
1459
  } else {
1443
1460
  pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->right, buffer);
1444
1461
  }
1445
1462
  pm_serialize_location(parser, &((pm_range_node_t *)node)->operator_loc, buffer);
1446
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1463
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1447
1464
  break;
1448
1465
  }
1449
1466
  case PM_RATIONAL_NODE: {
@@ -1458,21 +1475,16 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1458
1475
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->content_loc, buffer);
1459
1476
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->closing_loc, buffer);
1460
1477
  pm_serialize_string(parser, &((pm_regular_expression_node_t *)node)->unescaped, buffer);
1461
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1478
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1462
1479
  break;
1463
1480
  }
1464
- case PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE: {
1465
- uint32_t parameters_size = pm_sizet_to_u32(((pm_required_destructured_parameter_node_t *)node)->parameters.size);
1466
- pm_buffer_append_u32(buffer, parameters_size);
1467
- for (uint32_t index = 0; index < parameters_size; index++) {
1468
- pm_serialize_node(parser, (pm_node_t *) ((pm_required_destructured_parameter_node_t *)node)->parameters.nodes[index], buffer);
1469
- }
1470
- pm_serialize_location(parser, &((pm_required_destructured_parameter_node_t *)node)->opening_loc, buffer);
1471
- pm_serialize_location(parser, &((pm_required_destructured_parameter_node_t *)node)->closing_loc, buffer);
1481
+ case PM_REQUIRED_KEYWORD_PARAMETER_NODE: {
1482
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_required_keyword_parameter_node_t *)node)->name));
1483
+ pm_serialize_location(parser, &((pm_required_keyword_parameter_node_t *)node)->name_loc, buffer);
1472
1484
  break;
1473
1485
  }
1474
1486
  case PM_REQUIRED_PARAMETER_NODE: {
1475
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_required_parameter_node_t *)node)->name));
1487
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_required_parameter_node_t *)node)->name));
1476
1488
  break;
1477
1489
  }
1478
1490
  case PM_RESCUE_MODIFIER_NODE: {
@@ -1484,39 +1496,39 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1484
1496
  case PM_RESCUE_NODE: {
1485
1497
  pm_serialize_location(parser, &((pm_rescue_node_t *)node)->keyword_loc, buffer);
1486
1498
  uint32_t exceptions_size = pm_sizet_to_u32(((pm_rescue_node_t *)node)->exceptions.size);
1487
- pm_buffer_append_u32(buffer, exceptions_size);
1499
+ pm_buffer_append_varint(buffer, exceptions_size);
1488
1500
  for (uint32_t index = 0; index < exceptions_size; index++) {
1489
1501
  pm_serialize_node(parser, (pm_node_t *) ((pm_rescue_node_t *)node)->exceptions.nodes[index], buffer);
1490
1502
  }
1491
1503
  if (((pm_rescue_node_t *)node)->operator_loc.start == NULL) {
1492
- pm_buffer_append_u8(buffer, 0);
1504
+ pm_buffer_append_byte(buffer, 0);
1493
1505
  } else {
1494
- pm_buffer_append_u8(buffer, 1);
1506
+ pm_buffer_append_byte(buffer, 1);
1495
1507
  pm_serialize_location(parser, &((pm_rescue_node_t *)node)->operator_loc, buffer);
1496
1508
  }
1497
1509
  if (((pm_rescue_node_t *)node)->reference == NULL) {
1498
- pm_buffer_append_u8(buffer, 0);
1510
+ pm_buffer_append_byte(buffer, 0);
1499
1511
  } else {
1500
1512
  pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->reference, buffer);
1501
1513
  }
1502
1514
  if (((pm_rescue_node_t *)node)->statements == NULL) {
1503
- pm_buffer_append_u8(buffer, 0);
1515
+ pm_buffer_append_byte(buffer, 0);
1504
1516
  } else {
1505
1517
  pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->statements, buffer);
1506
1518
  }
1507
1519
  if (((pm_rescue_node_t *)node)->consequent == NULL) {
1508
- pm_buffer_append_u8(buffer, 0);
1520
+ pm_buffer_append_byte(buffer, 0);
1509
1521
  } else {
1510
1522
  pm_serialize_node(parser, (pm_node_t *)((pm_rescue_node_t *)node)->consequent, buffer);
1511
1523
  }
1512
1524
  break;
1513
1525
  }
1514
1526
  case PM_REST_PARAMETER_NODE: {
1515
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_rest_parameter_node_t *)node)->name));
1527
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_rest_parameter_node_t *)node)->name));
1516
1528
  if (((pm_rest_parameter_node_t *)node)->name_loc.start == NULL) {
1517
- pm_buffer_append_u8(buffer, 0);
1529
+ pm_buffer_append_byte(buffer, 0);
1518
1530
  } else {
1519
- pm_buffer_append_u8(buffer, 1);
1531
+ pm_buffer_append_byte(buffer, 1);
1520
1532
  pm_serialize_location(parser, &((pm_rest_parameter_node_t *)node)->name_loc, buffer);
1521
1533
  }
1522
1534
  pm_serialize_location(parser, &((pm_rest_parameter_node_t *)node)->operator_loc, buffer);
@@ -1528,7 +1540,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1528
1540
  case PM_RETURN_NODE: {
1529
1541
  pm_serialize_location(parser, &((pm_return_node_t *)node)->keyword_loc, buffer);
1530
1542
  if (((pm_return_node_t *)node)->arguments == NULL) {
1531
- pm_buffer_append_u8(buffer, 0);
1543
+ pm_buffer_append_byte(buffer, 0);
1532
1544
  } else {
1533
1545
  pm_serialize_node(parser, (pm_node_t *)((pm_return_node_t *)node)->arguments, buffer);
1534
1546
  }
@@ -1539,15 +1551,15 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1539
1551
  }
1540
1552
  case PM_SINGLETON_CLASS_NODE: {
1541
1553
  uint32_t locals_size = pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.size);
1542
- pm_buffer_append_u32(buffer, locals_size);
1554
+ pm_buffer_append_varint(buffer, locals_size);
1543
1555
  for (uint32_t index = 0; index < locals_size; index++) {
1544
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.ids[index]));
1556
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(((pm_singleton_class_node_t *)node)->locals.ids[index]));
1545
1557
  }
1546
1558
  pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->class_keyword_loc, buffer);
1547
1559
  pm_serialize_location(parser, &((pm_singleton_class_node_t *)node)->operator_loc, buffer);
1548
1560
  pm_serialize_node(parser, (pm_node_t *)((pm_singleton_class_node_t *)node)->expression, buffer);
1549
1561
  if (((pm_singleton_class_node_t *)node)->body == NULL) {
1550
- pm_buffer_append_u8(buffer, 0);
1562
+ pm_buffer_append_byte(buffer, 0);
1551
1563
  } else {
1552
1564
  pm_serialize_node(parser, (pm_node_t *)((pm_singleton_class_node_t *)node)->body, buffer);
1553
1565
  }
@@ -1567,7 +1579,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1567
1579
  case PM_SPLAT_NODE: {
1568
1580
  pm_serialize_location(parser, &((pm_splat_node_t *)node)->operator_loc, buffer);
1569
1581
  if (((pm_splat_node_t *)node)->expression == NULL) {
1570
- pm_buffer_append_u8(buffer, 0);
1582
+ pm_buffer_append_byte(buffer, 0);
1571
1583
  } else {
1572
1584
  pm_serialize_node(parser, (pm_node_t *)((pm_splat_node_t *)node)->expression, buffer);
1573
1585
  }
@@ -1575,7 +1587,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1575
1587
  }
1576
1588
  case PM_STATEMENTS_NODE: {
1577
1589
  uint32_t body_size = pm_sizet_to_u32(((pm_statements_node_t *)node)->body.size);
1578
- pm_buffer_append_u32(buffer, body_size);
1590
+ pm_buffer_append_varint(buffer, body_size);
1579
1591
  for (uint32_t index = 0; index < body_size; index++) {
1580
1592
  pm_serialize_node(parser, (pm_node_t *) ((pm_statements_node_t *)node)->body.nodes[index], buffer);
1581
1593
  }
@@ -1587,18 +1599,18 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1587
1599
  break;
1588
1600
  }
1589
1601
  case PM_STRING_NODE: {
1590
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1602
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1591
1603
  if (((pm_string_node_t *)node)->opening_loc.start == NULL) {
1592
- pm_buffer_append_u8(buffer, 0);
1604
+ pm_buffer_append_byte(buffer, 0);
1593
1605
  } else {
1594
- pm_buffer_append_u8(buffer, 1);
1606
+ pm_buffer_append_byte(buffer, 1);
1595
1607
  pm_serialize_location(parser, &((pm_string_node_t *)node)->opening_loc, buffer);
1596
1608
  }
1597
1609
  pm_serialize_location(parser, &((pm_string_node_t *)node)->content_loc, buffer);
1598
1610
  if (((pm_string_node_t *)node)->closing_loc.start == NULL) {
1599
- pm_buffer_append_u8(buffer, 0);
1611
+ pm_buffer_append_byte(buffer, 0);
1600
1612
  } else {
1601
- pm_buffer_append_u8(buffer, 1);
1613
+ pm_buffer_append_byte(buffer, 1);
1602
1614
  pm_serialize_location(parser, &((pm_string_node_t *)node)->closing_loc, buffer);
1603
1615
  }
1604
1616
  pm_serialize_string(parser, &((pm_string_node_t *)node)->unescaped, buffer);
@@ -1607,24 +1619,24 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1607
1619
  case PM_SUPER_NODE: {
1608
1620
  pm_serialize_location(parser, &((pm_super_node_t *)node)->keyword_loc, buffer);
1609
1621
  if (((pm_super_node_t *)node)->lparen_loc.start == NULL) {
1610
- pm_buffer_append_u8(buffer, 0);
1622
+ pm_buffer_append_byte(buffer, 0);
1611
1623
  } else {
1612
- pm_buffer_append_u8(buffer, 1);
1624
+ pm_buffer_append_byte(buffer, 1);
1613
1625
  pm_serialize_location(parser, &((pm_super_node_t *)node)->lparen_loc, buffer);
1614
1626
  }
1615
1627
  if (((pm_super_node_t *)node)->arguments == NULL) {
1616
- pm_buffer_append_u8(buffer, 0);
1628
+ pm_buffer_append_byte(buffer, 0);
1617
1629
  } else {
1618
1630
  pm_serialize_node(parser, (pm_node_t *)((pm_super_node_t *)node)->arguments, buffer);
1619
1631
  }
1620
1632
  if (((pm_super_node_t *)node)->rparen_loc.start == NULL) {
1621
- pm_buffer_append_u8(buffer, 0);
1633
+ pm_buffer_append_byte(buffer, 0);
1622
1634
  } else {
1623
- pm_buffer_append_u8(buffer, 1);
1635
+ pm_buffer_append_byte(buffer, 1);
1624
1636
  pm_serialize_location(parser, &((pm_super_node_t *)node)->rparen_loc, buffer);
1625
1637
  }
1626
1638
  if (((pm_super_node_t *)node)->block == NULL) {
1627
- pm_buffer_append_u8(buffer, 0);
1639
+ pm_buffer_append_byte(buffer, 0);
1628
1640
  } else {
1629
1641
  pm_serialize_node(parser, (pm_node_t *)((pm_super_node_t *)node)->block, buffer);
1630
1642
  }
@@ -1632,21 +1644,21 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1632
1644
  }
1633
1645
  case PM_SYMBOL_NODE: {
1634
1646
  if (((pm_symbol_node_t *)node)->opening_loc.start == NULL) {
1635
- pm_buffer_append_u8(buffer, 0);
1647
+ pm_buffer_append_byte(buffer, 0);
1636
1648
  } else {
1637
- pm_buffer_append_u8(buffer, 1);
1649
+ pm_buffer_append_byte(buffer, 1);
1638
1650
  pm_serialize_location(parser, &((pm_symbol_node_t *)node)->opening_loc, buffer);
1639
1651
  }
1640
1652
  if (((pm_symbol_node_t *)node)->value_loc.start == NULL) {
1641
- pm_buffer_append_u8(buffer, 0);
1653
+ pm_buffer_append_byte(buffer, 0);
1642
1654
  } else {
1643
- pm_buffer_append_u8(buffer, 1);
1655
+ pm_buffer_append_byte(buffer, 1);
1644
1656
  pm_serialize_location(parser, &((pm_symbol_node_t *)node)->value_loc, buffer);
1645
1657
  }
1646
1658
  if (((pm_symbol_node_t *)node)->closing_loc.start == NULL) {
1647
- pm_buffer_append_u8(buffer, 0);
1659
+ pm_buffer_append_byte(buffer, 0);
1648
1660
  } else {
1649
- pm_buffer_append_u8(buffer, 1);
1661
+ pm_buffer_append_byte(buffer, 1);
1650
1662
  pm_serialize_location(parser, &((pm_symbol_node_t *)node)->closing_loc, buffer);
1651
1663
  }
1652
1664
  pm_serialize_string(parser, &((pm_symbol_node_t *)node)->unescaped, buffer);
@@ -1657,7 +1669,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1657
1669
  }
1658
1670
  case PM_UNDEF_NODE: {
1659
1671
  uint32_t names_size = pm_sizet_to_u32(((pm_undef_node_t *)node)->names.size);
1660
- pm_buffer_append_u32(buffer, names_size);
1672
+ pm_buffer_append_varint(buffer, names_size);
1661
1673
  for (uint32_t index = 0; index < names_size; index++) {
1662
1674
  pm_serialize_node(parser, (pm_node_t *) ((pm_undef_node_t *)node)->names.nodes[index], buffer);
1663
1675
  }
@@ -1668,19 +1680,19 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1668
1680
  pm_serialize_location(parser, &((pm_unless_node_t *)node)->keyword_loc, buffer);
1669
1681
  pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->predicate, buffer);
1670
1682
  if (((pm_unless_node_t *)node)->statements == NULL) {
1671
- pm_buffer_append_u8(buffer, 0);
1683
+ pm_buffer_append_byte(buffer, 0);
1672
1684
  } else {
1673
1685
  pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->statements, buffer);
1674
1686
  }
1675
1687
  if (((pm_unless_node_t *)node)->consequent == NULL) {
1676
- pm_buffer_append_u8(buffer, 0);
1688
+ pm_buffer_append_byte(buffer, 0);
1677
1689
  } else {
1678
1690
  pm_serialize_node(parser, (pm_node_t *)((pm_unless_node_t *)node)->consequent, buffer);
1679
1691
  }
1680
1692
  if (((pm_unless_node_t *)node)->end_keyword_loc.start == NULL) {
1681
- pm_buffer_append_u8(buffer, 0);
1693
+ pm_buffer_append_byte(buffer, 0);
1682
1694
  } else {
1683
- pm_buffer_append_u8(buffer, 1);
1695
+ pm_buffer_append_byte(buffer, 1);
1684
1696
  pm_serialize_location(parser, &((pm_unless_node_t *)node)->end_keyword_loc, buffer);
1685
1697
  }
1686
1698
  break;
@@ -1688,29 +1700,29 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1688
1700
  case PM_UNTIL_NODE: {
1689
1701
  pm_serialize_location(parser, &((pm_until_node_t *)node)->keyword_loc, buffer);
1690
1702
  if (((pm_until_node_t *)node)->closing_loc.start == NULL) {
1691
- pm_buffer_append_u8(buffer, 0);
1703
+ pm_buffer_append_byte(buffer, 0);
1692
1704
  } else {
1693
- pm_buffer_append_u8(buffer, 1);
1705
+ pm_buffer_append_byte(buffer, 1);
1694
1706
  pm_serialize_location(parser, &((pm_until_node_t *)node)->closing_loc, buffer);
1695
1707
  }
1696
1708
  pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->predicate, buffer);
1697
1709
  if (((pm_until_node_t *)node)->statements == NULL) {
1698
- pm_buffer_append_u8(buffer, 0);
1710
+ pm_buffer_append_byte(buffer, 0);
1699
1711
  } else {
1700
1712
  pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->statements, buffer);
1701
1713
  }
1702
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1714
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1703
1715
  break;
1704
1716
  }
1705
1717
  case PM_WHEN_NODE: {
1706
1718
  pm_serialize_location(parser, &((pm_when_node_t *)node)->keyword_loc, buffer);
1707
1719
  uint32_t conditions_size = pm_sizet_to_u32(((pm_when_node_t *)node)->conditions.size);
1708
- pm_buffer_append_u32(buffer, conditions_size);
1720
+ pm_buffer_append_varint(buffer, conditions_size);
1709
1721
  for (uint32_t index = 0; index < conditions_size; index++) {
1710
1722
  pm_serialize_node(parser, (pm_node_t *) ((pm_when_node_t *)node)->conditions.nodes[index], buffer);
1711
1723
  }
1712
1724
  if (((pm_when_node_t *)node)->statements == NULL) {
1713
- pm_buffer_append_u8(buffer, 0);
1725
+ pm_buffer_append_byte(buffer, 0);
1714
1726
  } else {
1715
1727
  pm_serialize_node(parser, (pm_node_t *)((pm_when_node_t *)node)->statements, buffer);
1716
1728
  }
@@ -1719,18 +1731,18 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1719
1731
  case PM_WHILE_NODE: {
1720
1732
  pm_serialize_location(parser, &((pm_while_node_t *)node)->keyword_loc, buffer);
1721
1733
  if (((pm_while_node_t *)node)->closing_loc.start == NULL) {
1722
- pm_buffer_append_u8(buffer, 0);
1734
+ pm_buffer_append_byte(buffer, 0);
1723
1735
  } else {
1724
- pm_buffer_append_u8(buffer, 1);
1736
+ pm_buffer_append_byte(buffer, 1);
1725
1737
  pm_serialize_location(parser, &((pm_while_node_t *)node)->closing_loc, buffer);
1726
1738
  }
1727
1739
  pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->predicate, buffer);
1728
1740
  if (((pm_while_node_t *)node)->statements == NULL) {
1729
- pm_buffer_append_u8(buffer, 0);
1741
+ pm_buffer_append_byte(buffer, 0);
1730
1742
  } else {
1731
1743
  pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->statements, buffer);
1732
1744
  }
1733
- pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1745
+ pm_buffer_append_varint(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1734
1746
  break;
1735
1747
  }
1736
1748
  case PM_X_STRING_NODE: {
@@ -1743,20 +1755,20 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1743
1755
  case PM_YIELD_NODE: {
1744
1756
  pm_serialize_location(parser, &((pm_yield_node_t *)node)->keyword_loc, buffer);
1745
1757
  if (((pm_yield_node_t *)node)->lparen_loc.start == NULL) {
1746
- pm_buffer_append_u8(buffer, 0);
1758
+ pm_buffer_append_byte(buffer, 0);
1747
1759
  } else {
1748
- pm_buffer_append_u8(buffer, 1);
1760
+ pm_buffer_append_byte(buffer, 1);
1749
1761
  pm_serialize_location(parser, &((pm_yield_node_t *)node)->lparen_loc, buffer);
1750
1762
  }
1751
1763
  if (((pm_yield_node_t *)node)->arguments == NULL) {
1752
- pm_buffer_append_u8(buffer, 0);
1764
+ pm_buffer_append_byte(buffer, 0);
1753
1765
  } else {
1754
1766
  pm_serialize_node(parser, (pm_node_t *)((pm_yield_node_t *)node)->arguments, buffer);
1755
1767
  }
1756
1768
  if (((pm_yield_node_t *)node)->rparen_loc.start == NULL) {
1757
- pm_buffer_append_u8(buffer, 0);
1769
+ pm_buffer_append_byte(buffer, 0);
1758
1770
  } else {
1759
- pm_buffer_append_u8(buffer, 1);
1771
+ pm_buffer_append_byte(buffer, 1);
1760
1772
  pm_serialize_location(parser, &((pm_yield_node_t *)node)->rparen_loc, buffer);
1761
1773
  }
1762
1774
  break;
@@ -1767,16 +1779,19 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1767
1779
  static void
1768
1780
  pm_serialize_comment(pm_parser_t *parser, pm_comment_t *comment, pm_buffer_t *buffer) {
1769
1781
  // serialize type
1770
- pm_buffer_append_u8(buffer, (uint8_t) comment->type);
1782
+ pm_buffer_append_byte(buffer, (uint8_t) comment->type);
1771
1783
 
1772
1784
  // serialize location
1773
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(comment->start - parser->start));
1774
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(comment->end - comment->start));
1785
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(comment->start - parser->start));
1786
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(comment->end - comment->start));
1775
1787
  }
1776
1788
 
1777
- static void
1789
+ /**
1790
+ * Serialize the given list of comments to the given buffer.
1791
+ */
1792
+ void
1778
1793
  pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
1779
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(pm_list_size(list)));
1794
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1780
1795
 
1781
1796
  pm_comment_t *comment;
1782
1797
  for (comment = (pm_comment_t *) list->head; comment != NULL; comment = (pm_comment_t *) comment->node.next) {
@@ -1787,17 +1802,17 @@ pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buf
1787
1802
  static void
1788
1803
  pm_serialize_magic_comment(pm_parser_t *parser, pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
1789
1804
  // serialize key location
1790
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(magic_comment->key_start - parser->start));
1791
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(magic_comment->key_length));
1805
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(magic_comment->key_start - parser->start));
1806
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(magic_comment->key_length));
1792
1807
 
1793
1808
  // serialize value location
1794
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(magic_comment->value_start - parser->start));
1795
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(magic_comment->value_length));
1809
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(magic_comment->value_start - parser->start));
1810
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(magic_comment->value_length));
1796
1811
  }
1797
1812
 
1798
1813
  static void
1799
1814
  pm_serialize_magic_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
1800
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(pm_list_size(list)));
1815
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1801
1816
 
1802
1817
  pm_magic_comment_t *magic_comment;
1803
1818
  for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
@@ -1809,17 +1824,17 @@ static void
1809
1824
  pm_serialize_diagnostic(pm_parser_t *parser, pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
1810
1825
  // serialize message
1811
1826
  size_t message_length = strlen(diagnostic->message);
1812
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(message_length));
1813
- pm_buffer_append_str(buffer, diagnostic->message, message_length);
1827
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(message_length));
1828
+ pm_buffer_append_string(buffer, diagnostic->message, message_length);
1814
1829
 
1815
1830
  // serialize location
1816
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(diagnostic->start - parser->start));
1817
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(diagnostic->end - diagnostic->start));
1831
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(diagnostic->start - parser->start));
1832
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(diagnostic->end - diagnostic->start));
1818
1833
  }
1819
1834
 
1820
1835
  static void
1821
1836
  pm_serialize_diagnostic_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buffer) {
1822
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(pm_list_size(list)));
1837
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(pm_list_size(list)));
1823
1838
 
1824
1839
  pm_diagnostic_t *diagnostic;
1825
1840
  for (diagnostic = (pm_diagnostic_t *) list->head; diagnostic != NULL; diagnostic = (pm_diagnostic_t *) diagnostic->node.next) {
@@ -1827,17 +1842,24 @@ pm_serialize_diagnostic_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *
1827
1842
  }
1828
1843
  }
1829
1844
 
1830
- static void
1845
+ /**
1846
+ * Serialize the name of the encoding to the buffer.
1847
+ */
1848
+ void
1831
1849
  pm_serialize_encoding(pm_encoding_t *encoding, pm_buffer_t *buffer) {
1832
1850
  size_t encoding_length = strlen(encoding->name);
1833
- pm_buffer_append_u32(buffer, pm_sizet_to_u32(encoding_length));
1834
- pm_buffer_append_str(buffer, encoding->name, encoding_length);
1851
+ pm_buffer_append_varint(buffer, pm_sizet_to_u32(encoding_length));
1852
+ pm_buffer_append_string(buffer, encoding->name, encoding_length);
1835
1853
  }
1836
1854
 
1837
- #line 200 "serialize.c.erb"
1855
+ #line 206 "serialize.c.erb"
1856
+ /**
1857
+ * Serialize the encoding, metadata, nodes, and constant pool.
1858
+ */
1838
1859
  void
1839
1860
  pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1840
1861
  pm_serialize_encoding(&parser->encoding, buffer);
1862
+ pm_buffer_append_varint(buffer, parser->start_line);
1841
1863
  pm_serialize_comment_list(parser, &parser->comment_list, buffer);
1842
1864
  pm_serialize_magic_comment_list(parser, &parser->magic_comment_list, buffer);
1843
1865
  pm_serialize_diagnostic_list(parser, &parser->error_list, buffer);
@@ -1849,7 +1871,7 @@ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer)
1849
1871
  pm_buffer_append_zeroes(buffer, 4);
1850
1872
 
1851
1873
  // Next, encode the length of the constant pool.
1852
- pm_buffer_append_u32(buffer, parser->constant_pool.size);
1874
+ pm_buffer_append_varint(buffer, parser->constant_pool.size);
1853
1875
 
1854
1876
  // Now we're going to serialize the content of the node.
1855
1877
  pm_serialize_node(parser, node, buffer);
@@ -1904,16 +1926,22 @@ static void
1904
1926
  serialize_token(void *data, pm_parser_t *parser, pm_token_t *token) {
1905
1927
  pm_buffer_t *buffer = (pm_buffer_t *) data;
1906
1928
 
1907
- pm_buffer_append_u32(buffer, token->type);
1908
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
1909
- pm_buffer_append_u32(buffer, pm_ptrdifft_to_u32(token->end - token->start));
1910
- pm_buffer_append_u32(buffer, parser->lex_state);
1929
+ pm_buffer_append_varint(buffer, token->type);
1930
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(token->start - parser->start));
1931
+ pm_buffer_append_varint(buffer, pm_ptrdifft_to_u32(token->end - token->start));
1932
+ pm_buffer_append_varint(buffer, parser->lex_state);
1911
1933
  }
1912
1934
 
1935
+ /**
1936
+ * Lex the given source and serialize to the given buffer.
1937
+ */
1913
1938
  PRISM_EXPORTED_FUNCTION void
1914
- pm_lex_serialize(const uint8_t *source, size_t size, const char *filepath, pm_buffer_t *buffer) {
1939
+ pm_serialize_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
1940
+ pm_options_t options = { 0 };
1941
+ if (data != NULL) pm_options_read(&options, data);
1942
+
1915
1943
  pm_parser_t parser;
1916
- pm_parser_init(&parser, source, size, filepath);
1944
+ pm_parser_init(&parser, source, size, &options);
1917
1945
 
1918
1946
  pm_lex_callback_t lex_callback = (pm_lex_callback_t) {
1919
1947
  .data = (void *) buffer,
@@ -1923,10 +1951,11 @@ pm_lex_serialize(const uint8_t *source, size_t size, const char *filepath, pm_bu
1923
1951
  parser.lex_callback = &lex_callback;
1924
1952
  pm_node_t *node = pm_parse(&parser);
1925
1953
 
1926
- // Append 0 to mark end of tokens
1927
- pm_buffer_append_u8(buffer, 0);
1954
+ // Append 0 to mark end of tokens.
1955
+ pm_buffer_append_byte(buffer, 0);
1928
1956
 
1929
1957
  pm_serialize_encoding(&parser.encoding, buffer);
1958
+ pm_buffer_append_varint(buffer, parser.start_line);
1930
1959
  pm_serialize_comment_list(&parser, &parser.comment_list, buffer);
1931
1960
  pm_serialize_magic_comment_list(&parser, &parser.magic_comment_list, buffer);
1932
1961
  pm_serialize_diagnostic_list(&parser, &parser.error_list, buffer);
@@ -1934,15 +1963,20 @@ pm_lex_serialize(const uint8_t *source, size_t size, const char *filepath, pm_bu
1934
1963
 
1935
1964
  pm_node_destroy(&parser, node);
1936
1965
  pm_parser_free(&parser);
1966
+ pm_options_free(&options);
1937
1967
  }
1938
1968
 
1939
- // Parse and serialize both the AST and the tokens represented by the given
1940
- // source to the given buffer.
1969
+ /**
1970
+ * Parse and serialize both the AST and the tokens represented by the given
1971
+ * source to the given buffer.
1972
+ */
1941
1973
  PRISM_EXPORTED_FUNCTION void
1942
- pm_parse_lex_serialize(const uint8_t *source, size_t size, pm_buffer_t *buffer, const char *metadata) {
1974
+ pm_serialize_parse_lex(pm_buffer_t *buffer, const uint8_t *source, size_t size, const char *data) {
1975
+ pm_options_t options = { 0 };
1976
+ if (data != NULL) pm_options_read(&options, data);
1977
+
1943
1978
  pm_parser_t parser;
1944
- pm_parser_init(&parser, source, size, NULL);
1945
- if (metadata) pm_parser_metadata(&parser, metadata);
1979
+ pm_parser_init(&parser, source, size, &options);
1946
1980
 
1947
1981
  pm_lex_callback_t lex_callback = (pm_lex_callback_t) {
1948
1982
  .data = (void *) buffer,
@@ -1952,9 +1986,10 @@ pm_parse_lex_serialize(const uint8_t *source, size_t size, pm_buffer_t *buffer,
1952
1986
  parser.lex_callback = &lex_callback;
1953
1987
  pm_node_t *node = pm_parse(&parser);
1954
1988
 
1955
- pm_buffer_append_u8(buffer, 0);
1989
+ pm_buffer_append_byte(buffer, 0);
1956
1990
  pm_serialize(&parser, node, buffer);
1957
1991
 
1958
1992
  pm_node_destroy(&parser, node);
1959
1993
  pm_parser_free(&parser);
1994
+ pm_options_free(&options);
1960
1995
  }