prism 0.13.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
data/src/serialize.c CHANGED
@@ -179,6 +179,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
179
179
  break;
180
180
  }
181
181
  case PM_BACK_REFERENCE_READ_NODE: {
182
+ pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_back_reference_read_node_t *)node)->name));
182
183
  break;
183
184
  }
184
185
  case PM_BEGIN_NODE: {
@@ -312,26 +313,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
312
313
  pm_buffer_append_u8(buffer, 1);
313
314
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->message_loc, buffer);
314
315
  }
315
- if (((pm_call_and_write_node_t *)node)->opening_loc.start == NULL) {
316
- pm_buffer_append_u8(buffer, 0);
317
- } else {
318
- pm_buffer_append_u8(buffer, 1);
319
- pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->opening_loc, buffer);
320
- }
321
- if (((pm_call_and_write_node_t *)node)->arguments == NULL) {
322
- pm_buffer_append_u8(buffer, 0);
323
- } else {
324
- pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->arguments, buffer);
325
- }
326
- if (((pm_call_and_write_node_t *)node)->closing_loc.start == NULL) {
327
- pm_buffer_append_u8(buffer, 0);
328
- } else {
329
- pm_buffer_append_u8(buffer, 1);
330
- pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->closing_loc, buffer);
331
- }
332
- pm_buffer_append_u32(buffer, node->flags >> 2);
333
- pm_serialize_string(parser, &((pm_call_and_write_node_t *)node)->read_name, buffer);
334
- pm_serialize_string(parser, &((pm_call_and_write_node_t *)node)->write_name, buffer);
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));
335
319
  pm_serialize_location(parser, &((pm_call_and_write_node_t *)node)->operator_loc, buffer);
336
320
  pm_serialize_node(parser, (pm_node_t *)((pm_call_and_write_node_t *)node)->value, buffer);
337
321
  break;
@@ -376,8 +360,8 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
376
360
  } else {
377
361
  pm_serialize_node(parser, (pm_node_t *)((pm_call_node_t *)node)->block, buffer);
378
362
  }
379
- pm_buffer_append_u32(buffer, node->flags >> 2);
380
- pm_serialize_string(parser, &((pm_call_node_t *)node)->name, buffer);
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));
381
365
  break;
382
366
  }
383
367
  case PM_CALL_OPERATOR_WRITE_NODE: {
@@ -398,26 +382,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
398
382
  pm_buffer_append_u8(buffer, 1);
399
383
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->message_loc, buffer);
400
384
  }
401
- if (((pm_call_operator_write_node_t *)node)->opening_loc.start == NULL) {
402
- pm_buffer_append_u8(buffer, 0);
403
- } else {
404
- pm_buffer_append_u8(buffer, 1);
405
- pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->opening_loc, buffer);
406
- }
407
- if (((pm_call_operator_write_node_t *)node)->arguments == NULL) {
408
- pm_buffer_append_u8(buffer, 0);
409
- } else {
410
- pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->arguments, buffer);
411
- }
412
- if (((pm_call_operator_write_node_t *)node)->closing_loc.start == NULL) {
413
- pm_buffer_append_u8(buffer, 0);
414
- } else {
415
- pm_buffer_append_u8(buffer, 1);
416
- pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->closing_loc, buffer);
417
- }
418
- pm_buffer_append_u32(buffer, node->flags >> 2);
419
- pm_serialize_string(parser, &((pm_call_operator_write_node_t *)node)->read_name, buffer);
420
- pm_serialize_string(parser, &((pm_call_operator_write_node_t *)node)->write_name, buffer);
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));
421
388
  pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_call_operator_write_node_t *)node)->operator));
422
389
  pm_serialize_location(parser, &((pm_call_operator_write_node_t *)node)->operator_loc, buffer);
423
390
  pm_serialize_node(parser, (pm_node_t *)((pm_call_operator_write_node_t *)node)->value, buffer);
@@ -441,26 +408,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
441
408
  pm_buffer_append_u8(buffer, 1);
442
409
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->message_loc, buffer);
443
410
  }
444
- if (((pm_call_or_write_node_t *)node)->opening_loc.start == NULL) {
445
- pm_buffer_append_u8(buffer, 0);
446
- } else {
447
- pm_buffer_append_u8(buffer, 1);
448
- pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->opening_loc, buffer);
449
- }
450
- if (((pm_call_or_write_node_t *)node)->arguments == NULL) {
451
- pm_buffer_append_u8(buffer, 0);
452
- } else {
453
- pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->arguments, buffer);
454
- }
455
- if (((pm_call_or_write_node_t *)node)->closing_loc.start == NULL) {
456
- pm_buffer_append_u8(buffer, 0);
457
- } else {
458
- pm_buffer_append_u8(buffer, 1);
459
- pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->closing_loc, buffer);
460
- }
461
- pm_buffer_append_u32(buffer, node->flags >> 2);
462
- pm_serialize_string(parser, &((pm_call_or_write_node_t *)node)->read_name, buffer);
463
- pm_serialize_string(parser, &((pm_call_or_write_node_t *)node)->write_name, buffer);
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));
464
414
  pm_serialize_location(parser, &((pm_call_or_write_node_t *)node)->operator_loc, buffer);
465
415
  pm_serialize_node(parser, (pm_node_t *)((pm_call_or_write_node_t *)node)->value, buffer);
466
416
  break;
@@ -805,7 +755,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
805
755
  pm_serialize_node(parser, (pm_node_t *)((pm_flip_flop_node_t *)node)->right, buffer);
806
756
  }
807
757
  pm_serialize_location(parser, &((pm_flip_flop_node_t *)node)->operator_loc, buffer);
808
- pm_buffer_append_u32(buffer, node->flags >> 2);
758
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
809
759
  break;
810
760
  }
811
761
  case PM_FLOAT_NODE: {
@@ -971,6 +921,94 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
971
921
  }
972
922
  break;
973
923
  }
924
+ case PM_INDEX_AND_WRITE_NODE: {
925
+ if (((pm_index_and_write_node_t *)node)->receiver == NULL) {
926
+ pm_buffer_append_u8(buffer, 0);
927
+ } else {
928
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->receiver, buffer);
929
+ }
930
+ if (((pm_index_and_write_node_t *)node)->call_operator_loc.start == NULL) {
931
+ pm_buffer_append_u8(buffer, 0);
932
+ } else {
933
+ pm_buffer_append_u8(buffer, 1);
934
+ pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->call_operator_loc, buffer);
935
+ }
936
+ pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->opening_loc, buffer);
937
+ if (((pm_index_and_write_node_t *)node)->arguments == NULL) {
938
+ pm_buffer_append_u8(buffer, 0);
939
+ } else {
940
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->arguments, buffer);
941
+ }
942
+ pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->closing_loc, buffer);
943
+ if (((pm_index_and_write_node_t *)node)->block == NULL) {
944
+ pm_buffer_append_u8(buffer, 0);
945
+ } else {
946
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->block, buffer);
947
+ }
948
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
949
+ pm_serialize_location(parser, &((pm_index_and_write_node_t *)node)->operator_loc, buffer);
950
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_and_write_node_t *)node)->value, buffer);
951
+ break;
952
+ }
953
+ case PM_INDEX_OPERATOR_WRITE_NODE: {
954
+ if (((pm_index_operator_write_node_t *)node)->receiver == NULL) {
955
+ pm_buffer_append_u8(buffer, 0);
956
+ } else {
957
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->receiver, buffer);
958
+ }
959
+ if (((pm_index_operator_write_node_t *)node)->call_operator_loc.start == NULL) {
960
+ pm_buffer_append_u8(buffer, 0);
961
+ } else {
962
+ pm_buffer_append_u8(buffer, 1);
963
+ pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->call_operator_loc, buffer);
964
+ }
965
+ pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->opening_loc, buffer);
966
+ if (((pm_index_operator_write_node_t *)node)->arguments == NULL) {
967
+ pm_buffer_append_u8(buffer, 0);
968
+ } else {
969
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->arguments, buffer);
970
+ }
971
+ pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->closing_loc, buffer);
972
+ if (((pm_index_operator_write_node_t *)node)->block == NULL) {
973
+ pm_buffer_append_u8(buffer, 0);
974
+ } else {
975
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->block, buffer);
976
+ }
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));
979
+ pm_serialize_location(parser, &((pm_index_operator_write_node_t *)node)->operator_loc, buffer);
980
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_operator_write_node_t *)node)->value, buffer);
981
+ break;
982
+ }
983
+ case PM_INDEX_OR_WRITE_NODE: {
984
+ if (((pm_index_or_write_node_t *)node)->receiver == NULL) {
985
+ pm_buffer_append_u8(buffer, 0);
986
+ } else {
987
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->receiver, buffer);
988
+ }
989
+ if (((pm_index_or_write_node_t *)node)->call_operator_loc.start == NULL) {
990
+ pm_buffer_append_u8(buffer, 0);
991
+ } else {
992
+ pm_buffer_append_u8(buffer, 1);
993
+ pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->call_operator_loc, buffer);
994
+ }
995
+ pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->opening_loc, buffer);
996
+ if (((pm_index_or_write_node_t *)node)->arguments == NULL) {
997
+ pm_buffer_append_u8(buffer, 0);
998
+ } else {
999
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->arguments, buffer);
1000
+ }
1001
+ pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->closing_loc, buffer);
1002
+ if (((pm_index_or_write_node_t *)node)->block == NULL) {
1003
+ pm_buffer_append_u8(buffer, 0);
1004
+ } else {
1005
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->block, buffer);
1006
+ }
1007
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1008
+ pm_serialize_location(parser, &((pm_index_or_write_node_t *)node)->operator_loc, buffer);
1009
+ pm_serialize_node(parser, (pm_node_t *)((pm_index_or_write_node_t *)node)->value, buffer);
1010
+ break;
1011
+ }
974
1012
  case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
975
1013
  pm_buffer_append_u32(buffer, pm_sizet_to_u32(((pm_instance_variable_and_write_node_t *)node)->name));
976
1014
  pm_serialize_location(parser, &((pm_instance_variable_and_write_node_t *)node)->name_loc, buffer);
@@ -1009,7 +1047,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1009
1047
  break;
1010
1048
  }
1011
1049
  case PM_INTEGER_NODE: {
1012
- pm_buffer_append_u32(buffer, node->flags >> 2);
1050
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1013
1051
  break;
1014
1052
  }
1015
1053
  case PM_INTERPOLATED_MATCH_LAST_LINE_NODE: {
@@ -1020,7 +1058,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1020
1058
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_match_last_line_node_t *)node)->parts.nodes[index], buffer);
1021
1059
  }
1022
1060
  pm_serialize_location(parser, &((pm_interpolated_match_last_line_node_t *)node)->closing_loc, buffer);
1023
- pm_buffer_append_u32(buffer, node->flags >> 2);
1061
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1024
1062
  break;
1025
1063
  }
1026
1064
  case PM_INTERPOLATED_REGULAR_EXPRESSION_NODE: {
@@ -1031,7 +1069,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1031
1069
  pm_serialize_node(parser, (pm_node_t *) ((pm_interpolated_regular_expression_node_t *)node)->parts.nodes[index], buffer);
1032
1070
  }
1033
1071
  pm_serialize_location(parser, &((pm_interpolated_regular_expression_node_t *)node)->closing_loc, buffer);
1034
- pm_buffer_append_u32(buffer, node->flags >> 2);
1072
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1035
1073
  break;
1036
1074
  }
1037
1075
  case PM_INTERPOLATED_STRING_NODE: {
@@ -1182,7 +1220,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1182
1220
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->content_loc, buffer);
1183
1221
  pm_serialize_location(parser, &((pm_match_last_line_node_t *)node)->closing_loc, buffer);
1184
1222
  pm_serialize_string(parser, &((pm_match_last_line_node_t *)node)->unescaped, buffer);
1185
- pm_buffer_append_u32(buffer, node->flags >> 2);
1223
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1186
1224
  break;
1187
1225
  }
1188
1226
  case PM_MATCH_PREDICATE_NODE: {
@@ -1405,7 +1443,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1405
1443
  pm_serialize_node(parser, (pm_node_t *)((pm_range_node_t *)node)->right, buffer);
1406
1444
  }
1407
1445
  pm_serialize_location(parser, &((pm_range_node_t *)node)->operator_loc, buffer);
1408
- pm_buffer_append_u32(buffer, node->flags >> 2);
1446
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1409
1447
  break;
1410
1448
  }
1411
1449
  case PM_RATIONAL_NODE: {
@@ -1420,7 +1458,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1420
1458
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->content_loc, buffer);
1421
1459
  pm_serialize_location(parser, &((pm_regular_expression_node_t *)node)->closing_loc, buffer);
1422
1460
  pm_serialize_string(parser, &((pm_regular_expression_node_t *)node)->unescaped, buffer);
1423
- pm_buffer_append_u32(buffer, node->flags >> 2);
1461
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1424
1462
  break;
1425
1463
  }
1426
1464
  case PM_REQUIRED_DESTRUCTURED_PARAMETER_NODE: {
@@ -1549,7 +1587,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1549
1587
  break;
1550
1588
  }
1551
1589
  case PM_STRING_NODE: {
1552
- pm_buffer_append_u32(buffer, node->flags >> 2);
1590
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1553
1591
  if (((pm_string_node_t *)node)->opening_loc.start == NULL) {
1554
1592
  pm_buffer_append_u8(buffer, 0);
1555
1593
  } else {
@@ -1661,7 +1699,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1661
1699
  } else {
1662
1700
  pm_serialize_node(parser, (pm_node_t *)((pm_until_node_t *)node)->statements, buffer);
1663
1701
  }
1664
- pm_buffer_append_u32(buffer, node->flags >> 2);
1702
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1665
1703
  break;
1666
1704
  }
1667
1705
  case PM_WHEN_NODE: {
@@ -1692,7 +1730,7 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1692
1730
  } else {
1693
1731
  pm_serialize_node(parser, (pm_node_t *)((pm_while_node_t *)node)->statements, buffer);
1694
1732
  }
1695
- pm_buffer_append_u32(buffer, node->flags >> 2);
1733
+ pm_buffer_append_u32(buffer, (uint32_t)(node->flags & ~PM_NODE_FLAG_COMMON_MASK));
1696
1734
  break;
1697
1735
  }
1698
1736
  case PM_X_STRING_NODE: {
@@ -1746,6 +1784,27 @@ pm_serialize_comment_list(pm_parser_t *parser, pm_list_t *list, pm_buffer_t *buf
1746
1784
  }
1747
1785
  }
1748
1786
 
1787
+ static void
1788
+ pm_serialize_magic_comment(pm_parser_t *parser, pm_magic_comment_t *magic_comment, pm_buffer_t *buffer) {
1789
+ // 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));
1792
+
1793
+ // 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));
1796
+ }
1797
+
1798
+ static void
1799
+ 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)));
1801
+
1802
+ pm_magic_comment_t *magic_comment;
1803
+ for (magic_comment = (pm_magic_comment_t *) list->head; magic_comment != NULL; magic_comment = (pm_magic_comment_t *) magic_comment->node.next) {
1804
+ pm_serialize_magic_comment(parser, magic_comment, buffer);
1805
+ }
1806
+ }
1807
+
1749
1808
  static void
1750
1809
  pm_serialize_diagnostic(pm_parser_t *parser, pm_diagnostic_t *diagnostic, pm_buffer_t *buffer) {
1751
1810
  // serialize message
@@ -1775,11 +1834,12 @@ pm_serialize_encoding(pm_encoding_t *encoding, pm_buffer_t *buffer) {
1775
1834
  pm_buffer_append_str(buffer, encoding->name, encoding_length);
1776
1835
  }
1777
1836
 
1778
- #line 179 "serialize.c.erb"
1837
+ #line 200 "serialize.c.erb"
1779
1838
  void
1780
1839
  pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
1781
1840
  pm_serialize_encoding(&parser->encoding, buffer);
1782
1841
  pm_serialize_comment_list(parser, &parser->comment_list, buffer);
1842
+ pm_serialize_magic_comment_list(parser, &parser->magic_comment_list, buffer);
1783
1843
  pm_serialize_diagnostic_list(parser, &parser->error_list, buffer);
1784
1844
  pm_serialize_diagnostic_list(parser, &parser->warning_list, buffer);
1785
1845
 
@@ -1812,12 +1872,12 @@ pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer)
1812
1872
  pm_constant_t *constant = &parser->constant_pool.constants[bucket->id - 1];
1813
1873
  size_t buffer_offset = offset + ((((size_t)bucket->id) - 1) * 8);
1814
1874
 
1815
- if (bucket->owned) {
1816
- // Since this is an owned constant, we are going to write its
1817
- // contents into the buffer after the constant pool. So
1818
- // effectively in place of the source offset, we have a buffer
1819
- // offset. We will add a leading 1 to indicate that this is a
1820
- // buffer offset.
1875
+ if (bucket->type == PM_CONSTANT_POOL_BUCKET_OWNED || bucket->type == PM_CONSTANT_POOL_BUCKET_CONSTANT) {
1876
+ // Since this is an owned or constant constant, we are going to
1877
+ // write its contents into the buffer after the constant pool.
1878
+ // So effectively in place of the source offset, we have a
1879
+ // buffer offset. We will add a leading 1 to indicate that this
1880
+ // is a buffer offset.
1821
1881
  uint32_t content_offset = pm_sizet_to_u32(buffer->length);
1822
1882
  uint32_t owned_mask = (uint32_t) (1 << 31);
1823
1883
 
@@ -1868,6 +1928,7 @@ pm_lex_serialize(const uint8_t *source, size_t size, const char *filepath, pm_bu
1868
1928
 
1869
1929
  pm_serialize_encoding(&parser.encoding, buffer);
1870
1930
  pm_serialize_comment_list(&parser, &parser.comment_list, buffer);
1931
+ pm_serialize_magic_comment_list(&parser, &parser.magic_comment_list, buffer);
1871
1932
  pm_serialize_diagnostic_list(&parser, &parser.error_list, buffer);
1872
1933
  pm_serialize_diagnostic_list(&parser, &parser.warning_list, buffer);
1873
1934
 
data/src/util/pm_buffer.c CHANGED
@@ -1,24 +1,26 @@
1
1
  #include "prism/util/pm_buffer.h"
2
2
 
3
- #define PRISM_BUFFER_INITIAL_SIZE 1024
4
-
5
3
  // Return the size of the pm_buffer_t struct.
6
4
  size_t
7
5
  pm_buffer_sizeof(void) {
8
6
  return sizeof(pm_buffer_t);
9
7
  }
10
8
 
11
- // Initialize a pm_buffer_t with its default values.
9
+ // Initialize a pm_buffer_t with the given capacity.
12
10
  bool
13
- pm_buffer_init(pm_buffer_t *buffer) {
11
+ pm_buffer_init_capacity(pm_buffer_t *buffer, size_t capacity) {
14
12
  buffer->length = 0;
15
- buffer->capacity = PRISM_BUFFER_INITIAL_SIZE;
13
+ buffer->capacity = capacity;
16
14
 
17
- buffer->value = (char *) malloc(PRISM_BUFFER_INITIAL_SIZE);
15
+ buffer->value = (char *) malloc(capacity);
18
16
  return buffer->value != NULL;
19
17
  }
20
18
 
21
- #undef PRISM_BUFFER_INITIAL_SIZE
19
+ // Initialize a pm_buffer_t with its default values.
20
+ bool
21
+ pm_buffer_init(pm_buffer_t *buffer) {
22
+ return pm_buffer_init_capacity(buffer, 1024);
23
+ }
22
24
 
23
25
  // Return the value of the buffer.
24
26
  char *
@@ -154,9 +154,16 @@ pm_constant_pool_init(pm_constant_pool_t *pool, uint32_t capacity) {
154
154
  return true;
155
155
  }
156
156
 
157
+ // Return a pointer to the constant indicated by the given constant id.
158
+ pm_constant_t *
159
+ pm_constant_pool_id_to_constant(pm_constant_pool_t *pool, pm_constant_id_t constant_id) {
160
+ assert(constant_id > 0 && constant_id <= pool->size);
161
+ return &pool->constants[constant_id - 1];
162
+ }
163
+
157
164
  // Insert a constant into a constant pool and return its index in the pool.
158
165
  static inline pm_constant_id_t
159
- pm_constant_pool_insert(pm_constant_pool_t *pool, const uint8_t *start, size_t length, bool owned) {
166
+ pm_constant_pool_insert(pm_constant_pool_t *pool, const uint8_t *start, size_t length, pm_constant_pool_bucket_type_t type) {
160
167
  if (pool->size >= (pool->capacity / 4 * 3)) {
161
168
  if (!pm_constant_pool_resize(pool)) return 0;
162
169
  }
@@ -178,19 +185,19 @@ pm_constant_pool_insert(pm_constant_pool_t *pool, const uint8_t *start, size_t l
178
185
  // Since we have found a match, we need to check if this is
179
186
  // attempting to insert a shared or an owned constant. We want to
180
187
  // prefer shared constants since they don't require allocations.
181
- if (owned) {
188
+ if (type == PM_CONSTANT_POOL_BUCKET_OWNED) {
182
189
  // If we're attempting to insert an owned constant and we have
183
190
  // an existing constant, then either way we don't want the given
184
191
  // memory. Either it's duplicated with the existing constant or
185
192
  // it's not necessary because we have a shared version.
186
193
  free((void *) start);
187
- } else if (bucket->owned) {
194
+ } else if (bucket->type == PM_CONSTANT_POOL_BUCKET_OWNED) {
188
195
  // If we're attempting to insert a shared constant and the
189
196
  // existing constant is owned, then we can free the owned
190
197
  // constant and replace it with the shared constant.
191
198
  free((void *) constant->start);
192
199
  constant->start = start;
193
- bucket->owned = false;
200
+ bucket->type = PM_CONSTANT_POOL_BUCKET_DEFAULT;
194
201
  }
195
202
 
196
203
  return bucket->id;
@@ -202,15 +209,15 @@ pm_constant_pool_insert(pm_constant_pool_t *pool, const uint8_t *start, size_t l
202
209
  // IDs are allocated starting at 1, since the value 0 denotes a non-existant
203
210
  // constant.
204
211
  uint32_t id = ++pool->size;
205
- assert(pool->size < ((uint32_t) (1 << 31)));
212
+ assert(pool->size < ((uint32_t) (1 << 30)));
206
213
 
207
214
  *bucket = (pm_constant_pool_bucket_t) {
208
- .id = (unsigned int) (id & 0x7FFFFFFF),
209
- .owned = owned,
215
+ .id = (unsigned int) (id & 0x3fffffff),
216
+ .type = (unsigned int) (type & 0x3),
210
217
  .hash = hash
211
218
  };
212
219
 
213
- pool->constants[id - 1] = (pm_constant_t) {
220
+ pool->constants[id - 1] = (pm_constant_t) {
214
221
  .start = start,
215
222
  .length = length,
216
223
  };
@@ -222,7 +229,7 @@ pm_constant_pool_insert(pm_constant_pool_t *pool, const uint8_t *start, size_t l
222
229
  // if any potential calls to resize fail.
223
230
  pm_constant_id_t
224
231
  pm_constant_pool_insert_shared(pm_constant_pool_t *pool, const uint8_t *start, size_t length) {
225
- return pm_constant_pool_insert(pool, start, length, false);
232
+ return pm_constant_pool_insert(pool, start, length, PM_CONSTANT_POOL_BUCKET_DEFAULT);
226
233
  }
227
234
 
228
235
  // Insert a constant into a constant pool from memory that is now owned by the
@@ -230,7 +237,14 @@ pm_constant_pool_insert_shared(pm_constant_pool_t *pool, const uint8_t *start, s
230
237
  // resize fail.
231
238
  pm_constant_id_t
232
239
  pm_constant_pool_insert_owned(pm_constant_pool_t *pool, const uint8_t *start, size_t length) {
233
- return pm_constant_pool_insert(pool, start, length, true);
240
+ return pm_constant_pool_insert(pool, start, length, PM_CONSTANT_POOL_BUCKET_OWNED);
241
+ }
242
+
243
+ // Insert a constant into a constant pool from memory that is constant. Returns
244
+ // the id of the constant, or 0 if any potential calls to resize fail.
245
+ pm_constant_id_t
246
+ pm_constant_pool_insert_constant(pm_constant_pool_t *pool, const uint8_t *start, size_t length) {
247
+ return pm_constant_pool_insert(pool, start, length, PM_CONSTANT_POOL_BUCKET_CONSTANT);
234
248
  }
235
249
 
236
250
  // Free the memory associated with a constant pool.
@@ -242,7 +256,7 @@ pm_constant_pool_free(pm_constant_pool_t *pool) {
242
256
  pm_constant_pool_bucket_t *bucket = &pool->buckets[index];
243
257
 
244
258
  // If an id is set on this constant, then we know we have content here.
245
- if (bucket->id != 0 && bucket->owned) {
259
+ if (bucket->id != 0 && bucket->type == PM_CONSTANT_POOL_BUCKET_OWNED) {
246
260
  pm_constant_t *constant = &pool->constants[bucket->id - 1];
247
261
  free((void *) constant->start);
248
262
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-29 00:00:00.000000000 Z
11
+ date: 2023-10-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -33,6 +33,7 @@ files:
33
33
  - docs/fuzzing.md
34
34
  - docs/heredocs.md
35
35
  - docs/mapping.md
36
+ - docs/prism.png
36
37
  - docs/ripper.md
37
38
  - docs/ruby_api.md
38
39
  - docs/serialization.md
@@ -51,7 +52,6 @@ files:
51
52
  - include/prism/pack.h
52
53
  - include/prism/parser.h
53
54
  - include/prism/regexp.h
54
- - include/prism/unescape.h
55
55
  - include/prism/util/pm_buffer.h
56
56
  - include/prism/util/pm_char.h
57
57
  - include/prism/util/pm_constant_pool.h
@@ -99,7 +99,6 @@ files:
99
99
  - src/regexp.c
100
100
  - src/serialize.c
101
101
  - src/token_type.c
102
- - src/unescape.c
103
102
  - src/util/pm_buffer.c
104
103
  - src/util/pm_char.c
105
104
  - src/util/pm_constant_pool.c
@@ -1,48 +0,0 @@
1
- #ifndef PRISM_UNESCAPE_H
2
- #define PRISM_UNESCAPE_H
3
-
4
- #include "prism/defines.h"
5
- #include "prism/diagnostic.h"
6
- #include "prism/parser.h"
7
- #include "prism/util/pm_char.h"
8
- #include "prism/util/pm_list.h"
9
- #include "prism/util/pm_memchr.h"
10
- #include "prism/util/pm_string.h"
11
-
12
- #include <assert.h>
13
- #include <stdbool.h>
14
- #include <stdint.h>
15
- #include <string.h>
16
-
17
- // The type of unescape we are performing.
18
- typedef enum {
19
- // When we're creating a string inside of a list literal like %w, we
20
- // shouldn't escape anything.
21
- PM_UNESCAPE_NONE,
22
-
23
- // When we're unescaping a single-quoted string, we only need to unescape
24
- // single quotes and backslashes.
25
- PM_UNESCAPE_MINIMAL,
26
-
27
- // When we're unescaping a string list, in addition to MINIMAL, we need to
28
- // unescape whitespace.
29
- PM_UNESCAPE_WHITESPACE,
30
-
31
- // When we're unescaping a double-quoted string, we need to unescape all
32
- // escapes.
33
- PM_UNESCAPE_ALL,
34
- } pm_unescape_type_t;
35
-
36
- // Unescape the contents of the given token into the given string using the given unescape mode.
37
- PRISM_EXPORTED_FUNCTION void pm_unescape_manipulate_string(pm_parser_t *parser, pm_string_t *string, pm_unescape_type_t unescape_type);
38
- void pm_unescape_manipulate_char_literal(pm_parser_t *parser, pm_string_t *string, pm_unescape_type_t unescape_type);
39
-
40
- // Accepts a source string and a type of unescaping and returns the unescaped version.
41
- // The caller must pm_string_free(result); after calling this function.
42
- PRISM_EXPORTED_FUNCTION bool pm_unescape_string(const uint8_t *start, size_t length, pm_unescape_type_t unescape_type, pm_string_t *result);
43
-
44
- // Returns the number of bytes that encompass the first escape sequence in the
45
- // given string.
46
- size_t pm_unescape_calculate_difference(pm_parser_t *parser, const uint8_t *value, pm_unescape_type_t unescape_type, bool expect_single_codepoint);
47
-
48
- #endif