prism 0.23.0 → 0.25.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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/BSDmakefile +58 -0
  3. data/CHANGELOG.md +65 -1
  4. data/Makefile +5 -2
  5. data/README.md +45 -6
  6. data/config.yml +499 -4
  7. data/docs/build_system.md +31 -0
  8. data/docs/configuration.md +2 -0
  9. data/docs/cruby_compilation.md +1 -1
  10. data/docs/parser_translation.md +14 -9
  11. data/docs/releasing.md +3 -3
  12. data/docs/ripper_translation.md +50 -0
  13. data/docs/ruby_api.md +1 -0
  14. data/docs/serialization.md +26 -5
  15. data/ext/prism/api_node.c +2342 -1801
  16. data/ext/prism/api_pack.c +9 -0
  17. data/ext/prism/extconf.rb +27 -11
  18. data/ext/prism/extension.c +313 -66
  19. data/ext/prism/extension.h +5 -4
  20. data/include/prism/ast.h +213 -64
  21. data/include/prism/defines.h +106 -2
  22. data/include/prism/diagnostic.h +134 -71
  23. data/include/prism/encoding.h +22 -4
  24. data/include/prism/node.h +93 -0
  25. data/include/prism/options.h +82 -7
  26. data/include/prism/pack.h +11 -0
  27. data/include/prism/parser.h +198 -53
  28. data/include/prism/prettyprint.h +8 -0
  29. data/include/prism/static_literals.h +118 -0
  30. data/include/prism/util/pm_buffer.h +65 -2
  31. data/include/prism/util/pm_constant_pool.h +18 -1
  32. data/include/prism/util/pm_integer.h +119 -0
  33. data/include/prism/util/pm_list.h +1 -1
  34. data/include/prism/util/pm_newline_list.h +12 -3
  35. data/include/prism/util/pm_string.h +26 -2
  36. data/include/prism/version.h +2 -2
  37. data/include/prism.h +59 -1
  38. data/lib/prism/compiler.rb +8 -1
  39. data/lib/prism/debug.rb +46 -3
  40. data/lib/prism/desugar_compiler.rb +225 -80
  41. data/lib/prism/dispatcher.rb +29 -0
  42. data/lib/prism/dot_visitor.rb +87 -16
  43. data/lib/prism/dsl.rb +315 -300
  44. data/lib/prism/ffi.rb +165 -84
  45. data/lib/prism/lex_compat.rb +17 -15
  46. data/lib/prism/mutation_compiler.rb +11 -0
  47. data/lib/prism/node.rb +4857 -3750
  48. data/lib/prism/node_ext.rb +77 -29
  49. data/lib/prism/pack.rb +4 -0
  50. data/lib/prism/parse_result/comments.rb +34 -17
  51. data/lib/prism/parse_result/newlines.rb +3 -1
  52. data/lib/prism/parse_result.rb +88 -34
  53. data/lib/prism/pattern.rb +16 -4
  54. data/lib/prism/polyfill/string.rb +12 -0
  55. data/lib/prism/serialize.rb +960 -327
  56. data/lib/prism/translation/parser/compiler.rb +152 -50
  57. data/lib/prism/translation/parser/lexer.rb +103 -22
  58. data/lib/prism/translation/parser/rubocop.rb +47 -11
  59. data/lib/prism/translation/parser.rb +134 -10
  60. data/lib/prism/translation/parser33.rb +12 -0
  61. data/lib/prism/translation/parser34.rb +12 -0
  62. data/lib/prism/translation/ripper/sexp.rb +125 -0
  63. data/lib/prism/translation/ripper/shim.rb +5 -0
  64. data/lib/prism/translation/ripper.rb +3248 -379
  65. data/lib/prism/translation/ruby_parser.rb +35 -18
  66. data/lib/prism/translation.rb +3 -1
  67. data/lib/prism/visitor.rb +10 -0
  68. data/lib/prism.rb +8 -2
  69. data/prism.gemspec +35 -4
  70. data/rbi/prism/compiler.rbi +14 -0
  71. data/rbi/prism/desugar_compiler.rbi +5 -0
  72. data/rbi/prism/mutation_compiler.rbi +5 -0
  73. data/rbi/prism/node.rbi +8221 -0
  74. data/rbi/prism/node_ext.rbi +102 -0
  75. data/rbi/prism/parse_result.rbi +304 -0
  76. data/rbi/prism/translation/parser/compiler.rbi +13 -0
  77. data/rbi/prism/translation/ripper/ripper_compiler.rbi +5 -0
  78. data/rbi/prism/translation/ripper.rbi +25 -0
  79. data/rbi/prism/translation/ruby_parser.rbi +11 -0
  80. data/rbi/prism/visitor.rbi +470 -0
  81. data/rbi/prism.rbi +39 -7749
  82. data/sig/prism/compiler.rbs +9 -0
  83. data/sig/prism/dispatcher.rbs +16 -0
  84. data/sig/prism/dot_visitor.rbs +6 -0
  85. data/sig/prism/dsl.rbs +462 -0
  86. data/sig/prism/mutation_compiler.rbs +158 -0
  87. data/sig/prism/node.rbs +3529 -0
  88. data/sig/prism/node_ext.rbs +78 -0
  89. data/sig/prism/pack.rbs +43 -0
  90. data/sig/prism/parse_result.rbs +127 -0
  91. data/sig/prism/pattern.rbs +13 -0
  92. data/sig/prism/serialize.rbs +7 -0
  93. data/sig/prism/visitor.rbs +168 -0
  94. data/sig/prism.rbs +188 -4767
  95. data/src/diagnostic.c +575 -230
  96. data/src/encoding.c +211 -108
  97. data/src/node.c +7526 -447
  98. data/src/options.c +36 -12
  99. data/src/pack.c +33 -17
  100. data/src/prettyprint.c +1297 -1388
  101. data/src/prism.c +3665 -1121
  102. data/src/regexp.c +17 -2
  103. data/src/serialize.c +47 -28
  104. data/src/static_literals.c +552 -0
  105. data/src/token_type.c +1 -0
  106. data/src/util/pm_buffer.c +147 -20
  107. data/src/util/pm_char.c +4 -4
  108. data/src/util/pm_constant_pool.c +35 -11
  109. data/src/util/pm_integer.c +629 -0
  110. data/src/util/pm_list.c +1 -1
  111. data/src/util/pm_newline_list.c +20 -8
  112. data/src/util/pm_string.c +134 -5
  113. data/src/util/pm_string_list.c +2 -2
  114. metadata +37 -6
  115. data/docs/ripper.md +0 -36
  116. data/rbi/prism_static.rbi +0 -207
  117. data/sig/prism_static.rbs +0 -201
@@ -1,15 +1,16 @@
1
1
  #ifndef PRISM_EXT_NODE_H
2
2
  #define PRISM_EXT_NODE_H
3
3
 
4
- #define EXPECTED_PRISM_VERSION "0.23.0"
4
+ #define EXPECTED_PRISM_VERSION "0.25.0"
5
5
 
6
6
  #include <ruby.h>
7
7
  #include <ruby/encoding.h>
8
8
  #include "prism.h"
9
9
 
10
- VALUE pm_source_new(pm_parser_t *parser, rb_encoding *encoding);
11
- VALUE pm_token_new(pm_parser_t *parser, pm_token_t *token, rb_encoding *encoding, VALUE source);
12
- VALUE pm_ast_new(pm_parser_t *parser, pm_node_t *node, rb_encoding *encoding, VALUE source);
10
+ VALUE pm_source_new(const pm_parser_t *parser, rb_encoding *encoding);
11
+ VALUE pm_token_new(const pm_parser_t *parser, const pm_token_t *token, rb_encoding *encoding, VALUE source);
12
+ VALUE pm_ast_new(const pm_parser_t *parser, const pm_node_t *node, rb_encoding *encoding, VALUE source);
13
+ VALUE pm_integer_new(const pm_integer_t *integer);
13
14
 
14
15
  void Init_prism_api_node(void);
15
16
  void Init_prism_pack(void);
data/include/prism/ast.h CHANGED
@@ -5,6 +5,7 @@
5
5
  /* if you are looking to modify the */
6
6
  /* template */
7
7
  /******************************************************************************/
8
+
8
9
  /**
9
10
  * @file ast.h
10
11
  *
@@ -15,6 +16,7 @@
15
16
 
16
17
  #include "prism/defines.h"
17
18
  #include "prism/util/pm_constant_pool.h"
19
+ #include "prism/util/pm_integer.h"
18
20
  #include "prism/util/pm_string.h"
19
21
 
20
22
  #include <assert.h>
@@ -829,188 +831,194 @@ enum pm_node_type {
829
831
  /** InterpolatedXStringNode */
830
832
  PM_INTERPOLATED_X_STRING_NODE = 87,
831
833
 
834
+ /** ItParametersNode */
835
+ PM_IT_PARAMETERS_NODE = 88,
836
+
832
837
  /** KeywordHashNode */
833
- PM_KEYWORD_HASH_NODE = 88,
838
+ PM_KEYWORD_HASH_NODE = 89,
834
839
 
835
840
  /** KeywordRestParameterNode */
836
- PM_KEYWORD_REST_PARAMETER_NODE = 89,
841
+ PM_KEYWORD_REST_PARAMETER_NODE = 90,
837
842
 
838
843
  /** LambdaNode */
839
- PM_LAMBDA_NODE = 90,
844
+ PM_LAMBDA_NODE = 91,
840
845
 
841
846
  /** LocalVariableAndWriteNode */
842
- PM_LOCAL_VARIABLE_AND_WRITE_NODE = 91,
847
+ PM_LOCAL_VARIABLE_AND_WRITE_NODE = 92,
843
848
 
844
849
  /** LocalVariableOperatorWriteNode */
845
- PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE = 92,
850
+ PM_LOCAL_VARIABLE_OPERATOR_WRITE_NODE = 93,
846
851
 
847
852
  /** LocalVariableOrWriteNode */
848
- PM_LOCAL_VARIABLE_OR_WRITE_NODE = 93,
853
+ PM_LOCAL_VARIABLE_OR_WRITE_NODE = 94,
849
854
 
850
855
  /** LocalVariableReadNode */
851
- PM_LOCAL_VARIABLE_READ_NODE = 94,
856
+ PM_LOCAL_VARIABLE_READ_NODE = 95,
852
857
 
853
858
  /** LocalVariableTargetNode */
854
- PM_LOCAL_VARIABLE_TARGET_NODE = 95,
859
+ PM_LOCAL_VARIABLE_TARGET_NODE = 96,
855
860
 
856
861
  /** LocalVariableWriteNode */
857
- PM_LOCAL_VARIABLE_WRITE_NODE = 96,
862
+ PM_LOCAL_VARIABLE_WRITE_NODE = 97,
858
863
 
859
864
  /** MatchLastLineNode */
860
- PM_MATCH_LAST_LINE_NODE = 97,
865
+ PM_MATCH_LAST_LINE_NODE = 98,
861
866
 
862
867
  /** MatchPredicateNode */
863
- PM_MATCH_PREDICATE_NODE = 98,
868
+ PM_MATCH_PREDICATE_NODE = 99,
864
869
 
865
870
  /** MatchRequiredNode */
866
- PM_MATCH_REQUIRED_NODE = 99,
871
+ PM_MATCH_REQUIRED_NODE = 100,
867
872
 
868
873
  /** MatchWriteNode */
869
- PM_MATCH_WRITE_NODE = 100,
874
+ PM_MATCH_WRITE_NODE = 101,
870
875
 
871
876
  /** MissingNode */
872
- PM_MISSING_NODE = 101,
877
+ PM_MISSING_NODE = 102,
873
878
 
874
879
  /** ModuleNode */
875
- PM_MODULE_NODE = 102,
880
+ PM_MODULE_NODE = 103,
876
881
 
877
882
  /** MultiTargetNode */
878
- PM_MULTI_TARGET_NODE = 103,
883
+ PM_MULTI_TARGET_NODE = 104,
879
884
 
880
885
  /** MultiWriteNode */
881
- PM_MULTI_WRITE_NODE = 104,
886
+ PM_MULTI_WRITE_NODE = 105,
882
887
 
883
888
  /** NextNode */
884
- PM_NEXT_NODE = 105,
889
+ PM_NEXT_NODE = 106,
885
890
 
886
891
  /** NilNode */
887
- PM_NIL_NODE = 106,
892
+ PM_NIL_NODE = 107,
888
893
 
889
894
  /** NoKeywordsParameterNode */
890
- PM_NO_KEYWORDS_PARAMETER_NODE = 107,
895
+ PM_NO_KEYWORDS_PARAMETER_NODE = 108,
891
896
 
892
897
  /** NumberedParametersNode */
893
- PM_NUMBERED_PARAMETERS_NODE = 108,
898
+ PM_NUMBERED_PARAMETERS_NODE = 109,
894
899
 
895
900
  /** NumberedReferenceReadNode */
896
- PM_NUMBERED_REFERENCE_READ_NODE = 109,
901
+ PM_NUMBERED_REFERENCE_READ_NODE = 110,
897
902
 
898
903
  /** OptionalKeywordParameterNode */
899
- PM_OPTIONAL_KEYWORD_PARAMETER_NODE = 110,
904
+ PM_OPTIONAL_KEYWORD_PARAMETER_NODE = 111,
900
905
 
901
906
  /** OptionalParameterNode */
902
- PM_OPTIONAL_PARAMETER_NODE = 111,
907
+ PM_OPTIONAL_PARAMETER_NODE = 112,
903
908
 
904
909
  /** OrNode */
905
- PM_OR_NODE = 112,
910
+ PM_OR_NODE = 113,
906
911
 
907
912
  /** ParametersNode */
908
- PM_PARAMETERS_NODE = 113,
913
+ PM_PARAMETERS_NODE = 114,
909
914
 
910
915
  /** ParenthesesNode */
911
- PM_PARENTHESES_NODE = 114,
916
+ PM_PARENTHESES_NODE = 115,
912
917
 
913
918
  /** PinnedExpressionNode */
914
- PM_PINNED_EXPRESSION_NODE = 115,
919
+ PM_PINNED_EXPRESSION_NODE = 116,
915
920
 
916
921
  /** PinnedVariableNode */
917
- PM_PINNED_VARIABLE_NODE = 116,
922
+ PM_PINNED_VARIABLE_NODE = 117,
918
923
 
919
924
  /** PostExecutionNode */
920
- PM_POST_EXECUTION_NODE = 117,
925
+ PM_POST_EXECUTION_NODE = 118,
921
926
 
922
927
  /** PreExecutionNode */
923
- PM_PRE_EXECUTION_NODE = 118,
928
+ PM_PRE_EXECUTION_NODE = 119,
924
929
 
925
930
  /** ProgramNode */
926
- PM_PROGRAM_NODE = 119,
931
+ PM_PROGRAM_NODE = 120,
927
932
 
928
933
  /** RangeNode */
929
- PM_RANGE_NODE = 120,
934
+ PM_RANGE_NODE = 121,
930
935
 
931
936
  /** RationalNode */
932
- PM_RATIONAL_NODE = 121,
937
+ PM_RATIONAL_NODE = 122,
933
938
 
934
939
  /** RedoNode */
935
- PM_REDO_NODE = 122,
940
+ PM_REDO_NODE = 123,
936
941
 
937
942
  /** RegularExpressionNode */
938
- PM_REGULAR_EXPRESSION_NODE = 123,
943
+ PM_REGULAR_EXPRESSION_NODE = 124,
939
944
 
940
945
  /** RequiredKeywordParameterNode */
941
- PM_REQUIRED_KEYWORD_PARAMETER_NODE = 124,
946
+ PM_REQUIRED_KEYWORD_PARAMETER_NODE = 125,
942
947
 
943
948
  /** RequiredParameterNode */
944
- PM_REQUIRED_PARAMETER_NODE = 125,
949
+ PM_REQUIRED_PARAMETER_NODE = 126,
945
950
 
946
951
  /** RescueModifierNode */
947
- PM_RESCUE_MODIFIER_NODE = 126,
952
+ PM_RESCUE_MODIFIER_NODE = 127,
948
953
 
949
954
  /** RescueNode */
950
- PM_RESCUE_NODE = 127,
955
+ PM_RESCUE_NODE = 128,
951
956
 
952
957
  /** RestParameterNode */
953
- PM_REST_PARAMETER_NODE = 128,
958
+ PM_REST_PARAMETER_NODE = 129,
954
959
 
955
960
  /** RetryNode */
956
- PM_RETRY_NODE = 129,
961
+ PM_RETRY_NODE = 130,
957
962
 
958
963
  /** ReturnNode */
959
- PM_RETURN_NODE = 130,
964
+ PM_RETURN_NODE = 131,
960
965
 
961
966
  /** SelfNode */
962
- PM_SELF_NODE = 131,
967
+ PM_SELF_NODE = 132,
968
+
969
+ /** ShareableConstantNode */
970
+ PM_SHAREABLE_CONSTANT_NODE = 133,
963
971
 
964
972
  /** SingletonClassNode */
965
- PM_SINGLETON_CLASS_NODE = 132,
973
+ PM_SINGLETON_CLASS_NODE = 134,
966
974
 
967
975
  /** SourceEncodingNode */
968
- PM_SOURCE_ENCODING_NODE = 133,
976
+ PM_SOURCE_ENCODING_NODE = 135,
969
977
 
970
978
  /** SourceFileNode */
971
- PM_SOURCE_FILE_NODE = 134,
979
+ PM_SOURCE_FILE_NODE = 136,
972
980
 
973
981
  /** SourceLineNode */
974
- PM_SOURCE_LINE_NODE = 135,
982
+ PM_SOURCE_LINE_NODE = 137,
975
983
 
976
984
  /** SplatNode */
977
- PM_SPLAT_NODE = 136,
985
+ PM_SPLAT_NODE = 138,
978
986
 
979
987
  /** StatementsNode */
980
- PM_STATEMENTS_NODE = 137,
988
+ PM_STATEMENTS_NODE = 139,
981
989
 
982
990
  /** StringNode */
983
- PM_STRING_NODE = 138,
991
+ PM_STRING_NODE = 140,
984
992
 
985
993
  /** SuperNode */
986
- PM_SUPER_NODE = 139,
994
+ PM_SUPER_NODE = 141,
987
995
 
988
996
  /** SymbolNode */
989
- PM_SYMBOL_NODE = 140,
997
+ PM_SYMBOL_NODE = 142,
990
998
 
991
999
  /** TrueNode */
992
- PM_TRUE_NODE = 141,
1000
+ PM_TRUE_NODE = 143,
993
1001
 
994
1002
  /** UndefNode */
995
- PM_UNDEF_NODE = 142,
1003
+ PM_UNDEF_NODE = 144,
996
1004
 
997
1005
  /** UnlessNode */
998
- PM_UNLESS_NODE = 143,
1006
+ PM_UNLESS_NODE = 145,
999
1007
 
1000
1008
  /** UntilNode */
1001
- PM_UNTIL_NODE = 144,
1009
+ PM_UNTIL_NODE = 146,
1002
1010
 
1003
1011
  /** WhenNode */
1004
- PM_WHEN_NODE = 145,
1012
+ PM_WHEN_NODE = 147,
1005
1013
 
1006
1014
  /** WhileNode */
1007
- PM_WHILE_NODE = 146,
1015
+ PM_WHILE_NODE = 148,
1008
1016
 
1009
1017
  /** XStringNode */
1010
- PM_X_STRING_NODE = 147,
1018
+ PM_X_STRING_NODE = 149,
1011
1019
 
1012
1020
  /** YieldNode */
1013
- PM_YIELD_NODE = 148,
1021
+ PM_YIELD_NODE = 150,
1014
1022
 
1015
1023
  /** A special kind of node used for compilation. */
1016
1024
  PM_SCOPE_NODE
@@ -2179,21 +2187,46 @@ typedef struct pm_class_variable_write_node {
2179
2187
 
2180
2188
  /**
2181
2189
  * ClassVariableWriteNode#name
2190
+ *
2191
+ * The name of the class variable, which is a `@@` followed by an [identifier](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#identifiers).
2192
+ *
2193
+ * @@abc = 123 # name `@@abc`
2194
+ *
2195
+ * @@_test = :test # name `@@_test`
2182
2196
  */
2183
2197
  pm_constant_id_t name;
2184
2198
 
2185
2199
  /**
2186
2200
  * ClassVariableWriteNode#name_loc
2201
+ *
2202
+ * The location of the variable name.
2203
+ *
2204
+ * @@foo = :bar
2205
+ * ^^^^^
2187
2206
  */
2188
2207
  pm_location_t name_loc;
2189
2208
 
2190
2209
  /**
2191
2210
  * ClassVariableWriteNode#value
2211
+ *
2212
+ * The value to assign to the class variable. Can be any node that
2213
+ * represents a non-void expression.
2214
+ *
2215
+ * @@foo = :bar
2216
+ * ^^^^
2217
+ *
2218
+ * @@_xyz = 123
2219
+ * ^^^
2192
2220
  */
2193
2221
  struct pm_node *value;
2194
2222
 
2195
2223
  /**
2196
2224
  * ClassVariableWriteNode#operator_loc
2225
+ *
2226
+ * The location of the `=` operator.
2227
+ *
2228
+ * @@foo = :bar
2229
+ * ^
2197
2230
  */
2198
2231
  pm_location_t operator_loc;
2199
2232
  } pm_class_variable_write_node_t;
@@ -2838,6 +2871,13 @@ typedef struct pm_flip_flop_node {
2838
2871
  typedef struct pm_float_node {
2839
2872
  /** The embedded base node. */
2840
2873
  pm_node_t base;
2874
+
2875
+ /**
2876
+ * FloatNode#value
2877
+ *
2878
+ * The value of the floating point number as a Float.
2879
+ */
2880
+ double value;
2841
2881
  } pm_float_node_t;
2842
2882
 
2843
2883
  /**
@@ -3675,21 +3715,46 @@ typedef struct pm_instance_variable_write_node {
3675
3715
 
3676
3716
  /**
3677
3717
  * InstanceVariableWriteNode#name
3718
+ *
3719
+ * The name of the instance variable, which is a `@` followed by an [identifier](https://github.com/ruby/prism/blob/main/docs/parsing_rules.md#identifiers).
3720
+ *
3721
+ * @x = :y # name `:@x`
3722
+ *
3723
+ * @_foo = "bar" # name `@_foo`
3678
3724
  */
3679
3725
  pm_constant_id_t name;
3680
3726
 
3681
3727
  /**
3682
3728
  * InstanceVariableWriteNode#name_loc
3729
+ *
3730
+ * The location of the variable name.
3731
+ *
3732
+ * @_x = 1
3733
+ * ^^^
3683
3734
  */
3684
3735
  pm_location_t name_loc;
3685
3736
 
3686
3737
  /**
3687
3738
  * InstanceVariableWriteNode#value
3739
+ *
3740
+ * The value to assign to the instance variable. Can be any node that
3741
+ * represents a non-void expression.
3742
+ *
3743
+ * @foo = :bar
3744
+ * ^^^^
3745
+ *
3746
+ * @_x = 1234
3747
+ * ^^^^
3688
3748
  */
3689
3749
  struct pm_node *value;
3690
3750
 
3691
3751
  /**
3692
3752
  * InstanceVariableWriteNode#operator_loc
3753
+ *
3754
+ * The location of the `=` operator.
3755
+ *
3756
+ * @x = y
3757
+ * ^
3693
3758
  */
3694
3759
  pm_location_t operator_loc;
3695
3760
  } pm_instance_variable_write_node_t;
@@ -3709,6 +3774,13 @@ typedef struct pm_instance_variable_write_node {
3709
3774
  typedef struct pm_integer_node {
3710
3775
  /** The embedded base node. */
3711
3776
  pm_node_t base;
3777
+
3778
+ /**
3779
+ * IntegerNode#value
3780
+ *
3781
+ * The value of the integer literal as a number.
3782
+ */
3783
+ pm_integer_t value;
3712
3784
  } pm_integer_node_t;
3713
3785
 
3714
3786
  /**
@@ -3793,6 +3865,9 @@ typedef struct pm_interpolated_regular_expression_node {
3793
3865
  * InterpolatedStringNode
3794
3866
  *
3795
3867
  * Type: PM_INTERPOLATED_STRING_NODE
3868
+ * Flags:
3869
+ * PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN
3870
+ * PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE
3796
3871
  *
3797
3872
  * @extends pm_node_t
3798
3873
  */
@@ -3870,6 +3945,18 @@ typedef struct pm_interpolated_x_string_node {
3870
3945
  pm_location_t closing_loc;
3871
3946
  } pm_interpolated_x_string_node_t;
3872
3947
 
3948
+ /**
3949
+ * ItParametersNode
3950
+ *
3951
+ * Type: PM_IT_PARAMETERS_NODE
3952
+ *
3953
+ * @extends pm_node_t
3954
+ */
3955
+ typedef struct pm_it_parameters_node {
3956
+ /** The embedded base node. */
3957
+ pm_node_t base;
3958
+ } pm_it_parameters_node_t;
3959
+
3873
3960
  /**
3874
3961
  * KeywordHashNode
3875
3962
  *
@@ -4524,13 +4611,13 @@ typedef struct pm_numbered_reference_read_node {
4524
4611
  /**
4525
4612
  * NumberedReferenceReadNode#number
4526
4613
  *
4527
- * The (1-indexed, from the left) number of the capture group. Numbered references that would overflow a `uint32` result in a `number` of exactly `2**32 - 1`.
4614
+ * The (1-indexed, from the left) number of the capture group. Numbered references that are too large result in this value being `0`.
4528
4615
  *
4529
4616
  * $1 # number `1`
4530
4617
  *
4531
4618
  * $5432 # number `5432`
4532
4619
  *
4533
- * $4294967296 # number `4294967295`
4620
+ * $4294967296 # number `0`
4534
4621
  */
4535
4622
  uint32_t number;
4536
4623
  } pm_numbered_reference_read_node_t;
@@ -5168,6 +5255,29 @@ typedef struct pm_self_node {
5168
5255
  pm_node_t base;
5169
5256
  } pm_self_node_t;
5170
5257
 
5258
+ /**
5259
+ * ShareableConstantNode
5260
+ *
5261
+ * Type: PM_SHAREABLE_CONSTANT_NODE
5262
+ * Flags:
5263
+ * PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL
5264
+ * PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING
5265
+ * PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY
5266
+ *
5267
+ * @extends pm_node_t
5268
+ */
5269
+ typedef struct pm_shareable_constant_node {
5270
+ /** The embedded base node. */
5271
+ pm_node_t base;
5272
+
5273
+ /**
5274
+ * ShareableConstantNode#write
5275
+ *
5276
+ * The constant write that should be modified with the shareability state.
5277
+ */
5278
+ struct pm_node *write;
5279
+ } pm_shareable_constant_node_t;
5280
+
5171
5281
  /**
5172
5282
  * SingletonClassNode
5173
5283
  *
@@ -5226,6 +5336,11 @@ typedef struct pm_source_encoding_node {
5226
5336
  * SourceFileNode
5227
5337
  *
5228
5338
  * Type: PM_SOURCE_FILE_NODE
5339
+ * Flags:
5340
+ * PM_STRING_FLAGS_FORCED_UTF8_ENCODING
5341
+ * PM_STRING_FLAGS_FORCED_BINARY_ENCODING
5342
+ * PM_STRING_FLAGS_FROZEN
5343
+ * PM_STRING_FLAGS_MUTABLE
5229
5344
  *
5230
5345
  * @extends pm_node_t
5231
5346
  */
@@ -5298,6 +5413,7 @@ typedef struct pm_statements_node {
5298
5413
  * PM_STRING_FLAGS_FORCED_UTF8_ENCODING
5299
5414
  * PM_STRING_FLAGS_FORCED_BINARY_ENCODING
5300
5415
  * PM_STRING_FLAGS_FROZEN
5416
+ * PM_STRING_FLAGS_MUTABLE
5301
5417
  *
5302
5418
  * @extends pm_node_t
5303
5419
  */
@@ -5530,6 +5646,11 @@ typedef struct pm_when_node {
5530
5646
  */
5531
5647
  struct pm_node_list conditions;
5532
5648
 
5649
+ /**
5650
+ * WhenNode#then_keyword_loc
5651
+ */
5652
+ pm_location_t then_keyword_loc;
5653
+
5533
5654
  /**
5534
5655
  * WhenNode#statements
5535
5656
  */
@@ -5698,6 +5819,17 @@ typedef enum pm_integer_base_flags {
5698
5819
  PM_INTEGER_BASE_FLAGS_HEXADECIMAL = 8,
5699
5820
  } pm_integer_base_flags_t;
5700
5821
 
5822
+ /**
5823
+ * Flags for interpolated string nodes that indicated mutability if they are also marked as literals.
5824
+ */
5825
+ typedef enum pm_interpolated_string_node_flags {
5826
+ /** frozen by virtue of a `frozen_string_literal: true` comment or `--enable-frozen-string-literal`; only for adjacent string literals like `'a' 'b'` */
5827
+ PM_INTERPOLATED_STRING_NODE_FLAGS_FROZEN = 1,
5828
+
5829
+ /** mutable by virtue of a `frozen_string_literal: false` comment or `--disable-frozen-string-literal`; only for adjacent string literals like `'a' 'b'` */
5830
+ PM_INTERPOLATED_STRING_NODE_FLAGS_MUTABLE = 2,
5831
+ } pm_interpolated_string_node_flags_t;
5832
+
5701
5833
  /**
5702
5834
  * Flags for keyword hash nodes.
5703
5835
  */
@@ -5768,6 +5900,20 @@ typedef enum pm_regular_expression_flags {
5768
5900
  PM_REGULAR_EXPRESSION_FLAGS_FORCED_US_ASCII_ENCODING = 1024,
5769
5901
  } pm_regular_expression_flags_t;
5770
5902
 
5903
+ /**
5904
+ * Flags for shareable constant nodes.
5905
+ */
5906
+ typedef enum pm_shareable_constant_node_flags {
5907
+ /** constant writes that should be modified with shareable constant value literal */
5908
+ PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL = 1,
5909
+
5910
+ /** constant writes that should be modified with shareable constant value experimental everything */
5911
+ PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING = 2,
5912
+
5913
+ /** constant writes that should be modified with shareable constant value experimental copy */
5914
+ PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY = 4,
5915
+ } pm_shareable_constant_node_flags_t;
5916
+
5771
5917
  /**
5772
5918
  * Flags for string nodes.
5773
5919
  */
@@ -5778,8 +5924,11 @@ typedef enum pm_string_flags {
5778
5924
  /** internal bytes forced the encoding to binary */
5779
5925
  PM_STRING_FLAGS_FORCED_BINARY_ENCODING = 2,
5780
5926
 
5781
- /** frozen by virtue of a `frozen_string_literal` comment */
5927
+ /** frozen by virtue of a `frozen_string_literal: true` comment or `--enable-frozen-string-literal` */
5782
5928
  PM_STRING_FLAGS_FROZEN = 4,
5929
+
5930
+ /** mutable by virtue of a `frozen_string_literal: false` comment or `--disable-frozen-string-literal` */
5931
+ PM_STRING_FLAGS_MUTABLE = 8,
5783
5932
  } pm_string_flags_t;
5784
5933
 
5785
5934
  /**
@@ -10,6 +10,8 @@
10
10
  #define PRISM_DEFINES_H
11
11
 
12
12
  #include <ctype.h>
13
+ #include <limits.h>
14
+ #include <math.h>
13
15
  #include <stdarg.h>
14
16
  #include <stddef.h>
15
17
  #include <stdint.h>
@@ -21,7 +23,6 @@
21
23
  * some platforms they aren't included unless this is already defined.
22
24
  */
23
25
  #define __STDC_FORMAT_MACROS
24
-
25
26
  #include <inttypes.h>
26
27
 
27
28
  /**
@@ -48,7 +49,11 @@
48
49
  * compiler-agnostic way.
49
50
  */
50
51
  #if defined(__GNUC__)
51
- # define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((format(printf, string_index, argument_index)))
52
+ # if defined(__MINGW_PRINTF_FORMAT)
53
+ # define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((format(__MINGW_PRINTF_FORMAT, string_index, argument_index)))
54
+ # else
55
+ # define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((format(printf, string_index, argument_index)))
56
+ # endif
52
57
  #elif defined(__clang__)
53
58
  # define PRISM_ATTRIBUTE_FORMAT(string_index, argument_index) __attribute__((__format__(__printf__, string_index, argument_index)))
54
59
  #else
@@ -99,4 +104,103 @@
99
104
  # define PM_STATIC_ASSERT(line, condition, message) typedef char PM_CONCATENATE(static_assert_, line)[(condition) ? 1 : -1]
100
105
  #endif
101
106
 
107
+ /**
108
+ * In general, libc for embedded systems does not support memory-mapped files.
109
+ * If the target platform is POSIX or Windows, we can map a file in memory and
110
+ * read it in a more efficient manner.
111
+ */
112
+ #ifdef _WIN32
113
+ # define PRISM_HAS_MMAP
114
+ #else
115
+ # include <unistd.h>
116
+ # ifdef _POSIX_MAPPED_FILES
117
+ # define PRISM_HAS_MMAP
118
+ # endif
119
+ #endif
120
+
121
+ /**
122
+ * isinf on Windows is defined as accepting a float, but on POSIX systems it
123
+ * accepts a float, a double, or a long double. We want to mirror this behavior
124
+ * on windows.
125
+ */
126
+ #ifdef _WIN32
127
+ # include <float.h>
128
+ # undef isinf
129
+ # define isinf(x) (sizeof(x) == sizeof(float) ? !_finitef(x) : !_finite(x))
130
+ #endif
131
+
132
+ /**
133
+ * If you build prism with a custom allocator, configure it with
134
+ * "-D PRISM_XALLOCATOR" to use your own allocator that defines xmalloc,
135
+ * xrealloc, xcalloc, and xfree.
136
+ *
137
+ * For example, your `prism_xallocator.h` file could look like this:
138
+ *
139
+ * ```
140
+ * #ifndef PRISM_XALLOCATOR_H
141
+ * #define PRISM_XALLOCATOR_H
142
+ * #define xmalloc my_malloc
143
+ * #define xrealloc my_realloc
144
+ * #define xcalloc my_calloc
145
+ * #define xfree my_free
146
+ * #endif
147
+ * ```
148
+ */
149
+ #ifdef PRISM_XALLOCATOR
150
+ #include "prism_xallocator.h"
151
+ #else
152
+ #ifndef xmalloc
153
+ /**
154
+ * The malloc function that should be used. This can be overridden with
155
+ * the PRISM_XALLOCATOR define.
156
+ */
157
+ #define xmalloc malloc
158
+ #endif
159
+
160
+ #ifndef xrealloc
161
+ /**
162
+ * The realloc function that should be used. This can be overridden with
163
+ * the PRISM_XALLOCATOR define.
164
+ */
165
+ #define xrealloc realloc
166
+ #endif
167
+
168
+ #ifndef xcalloc
169
+ /**
170
+ * The calloc function that should be used. This can be overridden with
171
+ * the PRISM_XALLOCATOR define.
172
+ */
173
+ #define xcalloc calloc
174
+ #endif
175
+
176
+ #ifndef xfree
177
+ /**
178
+ * The free function that should be used. This can be overridden with the
179
+ * PRISM_XALLOCATOR define.
180
+ */
181
+ #define xfree free
182
+ #endif
183
+ #endif
184
+
185
+ /**
186
+ * If PRISM_BUILD_MINIMAL is defined, then we're going to define every possible
187
+ * switch that will turn off certain features of prism.
188
+ */
189
+ #ifdef PRISM_BUILD_MINIMAL
190
+ /** Exclude the serialization API. */
191
+ #define PRISM_EXCLUDE_SERIALIZATION
192
+
193
+ /** Exclude the JSON serialization API. */
194
+ #define PRISM_EXCLUDE_JSON
195
+
196
+ /** Exclude the Array#pack parser API. */
197
+ #define PRISM_EXCLUDE_PACK
198
+
199
+ /** Exclude the prettyprint API. */
200
+ #define PRISM_EXCLUDE_PRETTYPRINT
201
+
202
+ /** Exclude the full set of encodings, using the minimal only. */
203
+ #define PRISM_ENCODING_EXCLUDE_FULL
204
+ #endif
205
+
102
206
  #endif