prism 0.24.0 → 0.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/BSDmakefile +58 -0
  3. data/CHANGELOG.md +50 -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 +2 -2
  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 +911 -815
  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 +8 -0
  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 +1 -1
  41. data/lib/prism/dispatcher.rb +29 -0
  42. data/lib/prism/dot_visitor.rb +87 -16
  43. data/lib/prism/dsl.rb +24 -12
  44. data/lib/prism/ffi.rb +67 -12
  45. data/lib/prism/lex_compat.rb +17 -15
  46. data/lib/prism/mutation_compiler.rb +11 -0
  47. data/lib/prism/node.rb +2096 -2499
  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 +78 -32
  53. data/lib/prism/pattern.rb +16 -4
  54. data/lib/prism/polyfill/string.rb +12 -0
  55. data/lib/prism/serialize.rb +439 -102
  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 +41 -13
  59. data/lib/prism/translation/parser.rb +119 -7
  60. data/lib/prism/translation/parser33.rb +1 -1
  61. data/lib/prism/translation/parser34.rb +1 -1
  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 +3212 -462
  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 +33 -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 +1294 -1385
  101. data/src/prism.c +3628 -1099
  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 +14 -5
  112. data/src/util/pm_string.c +134 -5
  113. data/src/util/pm_string_list.c +2 -2
  114. metadata +35 -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.24.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