debase-ruby_core_source 3.2.3 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/Rakefile +2 -1
  4. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ccan/list/list.h +4 -2
  5. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/dln.h +1 -0
  6. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/eval_intern.h +4 -2
  7. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/insns.inc +2 -0
  8. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/insns_info.inc +269 -187
  9. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/class.h +46 -0
  10. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/cont.h +3 -0
  11. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/encoding.h +3 -0
  12. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/error.h +3 -0
  13. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/gc.h +2 -0
  14. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/object.h +1 -0
  15. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/random.h +1 -0
  16. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/string.h +0 -1
  17. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/symbol.h +3 -0
  18. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/thread.h +3 -0
  19. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/transcode.h +3 -0
  20. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/variable.h +5 -3
  21. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/vm.h +5 -0
  22. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/iseq.h +5 -1
  23. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/method.h +0 -1
  24. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/optunifs.inc +1 -1
  25. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/parse.h +2 -2
  26. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/ast.h +4612 -0
  27. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/defines.h +94 -0
  28. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/diagnostic.h +297 -0
  29. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/encoding.h +248 -0
  30. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/extension.h +18 -0
  31. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/node.h +57 -0
  32. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/options.h +204 -0
  33. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/pack.h +152 -0
  34. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/parser.h +716 -0
  35. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/prettyprint.h +26 -0
  36. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/prism.h +272 -0
  37. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/regexp.h +33 -0
  38. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_buffer.h +146 -0
  39. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_char.h +205 -0
  40. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_constant_pool.h +191 -0
  41. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_list.h +97 -0
  42. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_memchr.h +29 -0
  43. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_newline_list.h +104 -0
  44. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_state_stack.h +42 -0
  45. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_string.h +150 -0
  46. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_string_list.h +44 -0
  47. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_strncasecmp.h +32 -0
  48. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/util/pm_strpbrk.h +43 -0
  49. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/prism/version.h +29 -0
  50. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/prism_compile.h +12 -1
  51. data/lib/debase/ruby_core_source/ruby-3.3.0-p0/revision.h +5 -0
  52. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/rjit.h +6 -8
  53. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/rjit_c.h +0 -1
  54. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/rubyparser.h +1 -1
  55. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/shape.h +2 -12
  56. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/thread_pthread.h +1 -1
  57. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/variable.h +2 -0
  58. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/version.h +1 -1
  59. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm.inc +189 -136
  60. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_callinfo.h +8 -1
  61. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_core.h +64 -5
  62. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_insnhelper.h +4 -14
  63. data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vmtc.inc +2 -0
  64. data/lib/debase/ruby_core_source/version.rb +1 -1
  65. metadata +148 -124
  66. data/lib/debase/ruby_core_source/ruby-3.3.0-preview3/revision.h +0 -5
  67. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/addr2line.h +0 -0
  68. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/builtin.h +0 -0
  69. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ccan/build_assert/build_assert.h +0 -0
  70. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ccan/check_type/check_type.h +0 -0
  71. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ccan/container_of/container_of.h +0 -0
  72. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ccan/str/str.h +0 -0
  73. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/constant.h +0 -0
  74. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/darray.h +0 -0
  75. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/debug_counter.h +0 -0
  76. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/encindex.h +0 -0
  77. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/hrtime.h +0 -0
  78. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/id.h +0 -0
  79. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/id_table.h +0 -0
  80. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/array.h +0 -0
  81. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/basic_operators.h +0 -0
  82. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/bignum.h +0 -0
  83. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/bits.h +0 -0
  84. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/cmdlineopt.h +0 -0
  85. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/compar.h +0 -0
  86. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/compile.h +0 -0
  87. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/compilers.h +0 -0
  88. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/complex.h +0 -0
  89. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/dir.h +0 -0
  90. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/enc.h +0 -0
  91. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/enum.h +0 -0
  92. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/enumerator.h +0 -0
  93. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/eval.h +0 -0
  94. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/file.h +0 -0
  95. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/fixnum.h +0 -0
  96. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/hash.h +0 -0
  97. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/imemo.h +0 -0
  98. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/inits.h +0 -0
  99. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/io.h +0 -0
  100. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/load.h +0 -0
  101. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/loadpath.h +0 -0
  102. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/math.h +0 -0
  103. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/missing.h +0 -0
  104. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/numeric.h +0 -0
  105. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/parse.h +0 -0
  106. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/proc.h +0 -0
  107. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/process.h +0 -0
  108. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/ractor.h +0 -0
  109. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/range.h +0 -0
  110. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/rational.h +0 -0
  111. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/re.h +0 -0
  112. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/ruby_parser.h +0 -0
  113. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/sanitizers.h +0 -0
  114. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/serial.h +0 -0
  115. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/signal.h +0 -0
  116. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/static_assert.h +0 -0
  117. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/struct.h +0 -0
  118. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/time.h +0 -0
  119. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/util.h +0 -0
  120. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal/warnings.h +0 -0
  121. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/internal.h +0 -0
  122. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/known_errors.inc +0 -0
  123. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/node.h +0 -0
  124. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/node_name.inc +0 -0
  125. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/optinsn.inc +0 -0
  126. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/parser_bits.h +0 -0
  127. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/parser_node.h +0 -0
  128. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/parser_st.h +0 -0
  129. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/parser_value.h +0 -0
  130. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/probes_helper.h +0 -0
  131. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ractor_core.h +0 -0
  132. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/regenc.h +0 -0
  133. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/regint.h +0 -0
  134. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/regparse.h +0 -0
  135. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ruby_assert.h +0 -0
  136. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/ruby_atomic.h +0 -0
  137. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/siphash.h +0 -0
  138. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/symbol.h +0 -0
  139. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/thread_none.h +0 -0
  140. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/thread_win32.h +0 -0
  141. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/timev.h +0 -0
  142. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/transcode_data.h +0 -0
  143. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_call_iseq_optimized.inc +0 -0
  144. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_debug.h +0 -0
  145. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_exec.h +0 -0
  146. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_opts.h +0 -0
  147. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/vm_sync.h +0 -0
  148. /data/lib/debase/ruby_core_source/{ruby-3.3.0-preview3 → ruby-3.3.0-p0}/yjit.h +0 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @file options.h
3
+ *
4
+ * The options that can be passed to parsing.
5
+ */
6
+ #ifndef PRISM_OPTIONS_H
7
+ #define PRISM_OPTIONS_H
8
+
9
+ #include "prism/defines.h"
10
+ #include "prism/util/pm_string.h"
11
+
12
+ #include <stdbool.h>
13
+ #include <stddef.h>
14
+ #include <stdint.h>
15
+
16
+ /**
17
+ * A scope of locals surrounding the code that is being parsed.
18
+ */
19
+ typedef struct pm_options_scope {
20
+ /** The number of locals in the scope. */
21
+ size_t locals_count;
22
+
23
+ /** The names of the locals in the scope. */
24
+ pm_string_t *locals;
25
+ } pm_options_scope_t;
26
+
27
+ /**
28
+ * The options that can be passed to the parser.
29
+ */
30
+ typedef struct {
31
+ /** The name of the file that is currently being parsed. */
32
+ pm_string_t filepath;
33
+
34
+ /**
35
+ * The line within the file that the parse starts on. This value is
36
+ * 0-indexed.
37
+ */
38
+ int32_t line;
39
+
40
+ /**
41
+ * The name of the encoding that the source file is in. Note that this must
42
+ * correspond to a name that can be found with Encoding.find in Ruby.
43
+ */
44
+ pm_string_t encoding;
45
+
46
+ /**
47
+ * The number of scopes surrounding the code that is being parsed.
48
+ */
49
+ size_t scopes_count;
50
+
51
+ /**
52
+ * The scopes surrounding the code that is being parsed. For most parses
53
+ * this will be NULL, but for evals it will be the locals that are in scope
54
+ * surrounding the eval.
55
+ */
56
+ pm_options_scope_t *scopes;
57
+
58
+ /** Whether or not the frozen string literal option has been set. */
59
+ bool frozen_string_literal;
60
+
61
+ /**
62
+ * Whether or not we should suppress warnings. This is purposefully negated
63
+ * so that the default is to not suppress warnings, which allows us to still
64
+ * create an options struct with zeroed memory.
65
+ */
66
+ bool suppress_warnings;
67
+ } pm_options_t;
68
+
69
+ /**
70
+ * Set the filepath option on the given options struct.
71
+ *
72
+ * @param options The options struct to set the filepath on.
73
+ * @param filepath The filepath to set.
74
+ */
75
+ PRISM_EXPORTED_FUNCTION void pm_options_filepath_set(pm_options_t *options, const char *filepath);
76
+
77
+ /**
78
+ * Set the line option on the given options struct.
79
+ *
80
+ * @param options The options struct to set the line on.
81
+ * @param line The line to set.
82
+ */
83
+ PRISM_EXPORTED_FUNCTION void pm_options_line_set(pm_options_t *options, int32_t line);
84
+
85
+ /**
86
+ * Set the encoding option on the given options struct.
87
+ *
88
+ * @param options The options struct to set the encoding on.
89
+ * @param encoding The encoding to set.
90
+ */
91
+ PRISM_EXPORTED_FUNCTION void pm_options_encoding_set(pm_options_t *options, const char *encoding);
92
+
93
+ /**
94
+ * Set the frozen string literal option on the given options struct.
95
+ *
96
+ * @param options The options struct to set the frozen string literal value on.
97
+ * @param frozen_string_literal The frozen string literal value to set.
98
+ */
99
+ PRISM_EXPORTED_FUNCTION void pm_options_frozen_string_literal_set(pm_options_t *options, bool frozen_string_literal);
100
+
101
+ /**
102
+ * Set the suppress warnings option on the given options struct.
103
+ *
104
+ * @param options The options struct to set the suppress warnings value on.
105
+ * @param suppress_warnings The suppress warnings value to set.
106
+ */
107
+ PRISM_EXPORTED_FUNCTION void pm_options_suppress_warnings_set(pm_options_t *options, bool suppress_warnings);
108
+
109
+ /**
110
+ * Allocate and zero out the scopes array on the given options struct.
111
+ *
112
+ * @param options The options struct to initialize the scopes array on.
113
+ * @param scopes_count The number of scopes to allocate.
114
+ */
115
+ PRISM_EXPORTED_FUNCTION void pm_options_scopes_init(pm_options_t *options, size_t scopes_count);
116
+
117
+ /**
118
+ * Return a pointer to the scope at the given index within the given options.
119
+ *
120
+ * @param options The options struct to get the scope from.
121
+ * @param index The index of the scope to get.
122
+ * @return A pointer to the scope at the given index.
123
+ */
124
+ PRISM_EXPORTED_FUNCTION const pm_options_scope_t * pm_options_scope_get(const pm_options_t *options, size_t index);
125
+
126
+ /**
127
+ * Create a new options scope struct. This will hold a set of locals that are in
128
+ * scope surrounding the code that is being parsed.
129
+ *
130
+ * @param scope The scope struct to initialize.
131
+ * @param locals_count The number of locals to allocate.
132
+ */
133
+ PRISM_EXPORTED_FUNCTION void pm_options_scope_init(pm_options_scope_t *scope, size_t locals_count);
134
+
135
+ /**
136
+ * Return a pointer to the local at the given index within the given scope.
137
+ *
138
+ * @param scope The scope struct to get the local from.
139
+ * @param index The index of the local to get.
140
+ * @return A pointer to the local at the given index.
141
+ */
142
+ PRISM_EXPORTED_FUNCTION const pm_string_t * pm_options_scope_local_get(const pm_options_scope_t *scope, size_t index);
143
+
144
+ /**
145
+ * Free the internal memory associated with the options.
146
+ *
147
+ * @param options The options struct whose internal memory should be freed.
148
+ */
149
+ PRISM_EXPORTED_FUNCTION void pm_options_free(pm_options_t *options);
150
+
151
+ /**
152
+ * Deserialize an options struct from the given binary string. This is used to
153
+ * pass options to the parser from an FFI call so that consumers of the library
154
+ * from an FFI perspective don't have to worry about the structure of our
155
+ * options structs. Since the source of these calls will be from Ruby
156
+ * implementation internals we assume it is from a trusted source.
157
+ *
158
+ * `data` is assumed to be a valid pointer pointing to well-formed data. The
159
+ * layout of this data should be the same every time, and is described below:
160
+ *
161
+ * | # bytes | field |
162
+ * | ------- | -------------------------- |
163
+ * | `4` | the length of the filepath |
164
+ * | ... | the filepath bytes |
165
+ * | `4` | the line number |
166
+ * | `4` | the length the encoding |
167
+ * | ... | the encoding bytes |
168
+ * | `1` | frozen string literal |
169
+ * | `1` | suppress warnings |
170
+ * | `4` | the number of scopes |
171
+ * | ... | the scopes |
172
+ *
173
+ * Each scope is layed out as follows:
174
+ *
175
+ * | # bytes | field |
176
+ * | ------- | -------------------------- |
177
+ * | `4` | the number of locals |
178
+ * | ... | the locals |
179
+ *
180
+ * Each local is layed out as follows:
181
+ *
182
+ * | # bytes | field |
183
+ * | ------- | -------------------------- |
184
+ * | `4` | the length of the local |
185
+ * | ... | the local bytes |
186
+ *
187
+ * Some additional things to note about this layout:
188
+ *
189
+ * * The filepath can have a length of 0, in which case we'll consider it an
190
+ * empty string.
191
+ * * The line number should be 0-indexed.
192
+ * * The encoding can have a length of 0, in which case we'll use the default
193
+ * encoding (UTF-8). If it's not 0, it should correspond to a name of an
194
+ * encoding that can be passed to `Encoding.find` in Ruby.
195
+ * * The frozen string literal and suppress warnings fields are booleans, so
196
+ * their values should be either 0 or 1.
197
+ * * The number of scopes can be 0.
198
+ *
199
+ * @param options The options struct to deserialize into.
200
+ * @param data The binary string to deserialize from.
201
+ */
202
+ void pm_options_read(pm_options_t *options, const char *data);
203
+
204
+ #endif
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @file pack.h
3
+ *
4
+ * A pack template string parser.
5
+ */
6
+ #ifndef PRISM_PACK_H
7
+ #define PRISM_PACK_H
8
+
9
+ #include "prism/defines.h"
10
+
11
+ #include <stdint.h>
12
+ #include <stdlib.h>
13
+
14
+ /** The version of the pack template language that we are parsing. */
15
+ typedef enum pm_pack_version {
16
+ PM_PACK_VERSION_3_2_0
17
+ } pm_pack_version;
18
+
19
+ /** The type of pack template we are parsing. */
20
+ typedef enum pm_pack_variant {
21
+ PM_PACK_VARIANT_PACK,
22
+ PM_PACK_VARIANT_UNPACK
23
+ } pm_pack_variant;
24
+
25
+ /** A directive within the pack template. */
26
+ typedef enum pm_pack_type {
27
+ PM_PACK_SPACE,
28
+ PM_PACK_COMMENT,
29
+ PM_PACK_INTEGER,
30
+ PM_PACK_UTF8,
31
+ PM_PACK_BER,
32
+ PM_PACK_FLOAT,
33
+ PM_PACK_STRING_SPACE_PADDED,
34
+ PM_PACK_STRING_NULL_PADDED,
35
+ PM_PACK_STRING_NULL_TERMINATED,
36
+ PM_PACK_STRING_MSB,
37
+ PM_PACK_STRING_LSB,
38
+ PM_PACK_STRING_HEX_HIGH,
39
+ PM_PACK_STRING_HEX_LOW,
40
+ PM_PACK_STRING_UU,
41
+ PM_PACK_STRING_MIME,
42
+ PM_PACK_STRING_BASE64,
43
+ PM_PACK_STRING_FIXED,
44
+ PM_PACK_STRING_POINTER,
45
+ PM_PACK_MOVE,
46
+ PM_PACK_BACK,
47
+ PM_PACK_NULL,
48
+ PM_PACK_END
49
+ } pm_pack_type;
50
+
51
+ /** The signness of a pack directive. */
52
+ typedef enum pm_pack_signed {
53
+ PM_PACK_UNSIGNED,
54
+ PM_PACK_SIGNED,
55
+ PM_PACK_SIGNED_NA
56
+ } pm_pack_signed;
57
+
58
+ /** The endianness of a pack directive. */
59
+ typedef enum pm_pack_endian {
60
+ PM_PACK_AGNOSTIC_ENDIAN,
61
+ PM_PACK_LITTLE_ENDIAN, // aka 'VAX', or 'V'
62
+ PM_PACK_BIG_ENDIAN, // aka 'network', or 'N'
63
+ PM_PACK_NATIVE_ENDIAN,
64
+ PM_PACK_ENDIAN_NA
65
+ } pm_pack_endian;
66
+
67
+ /** The size of an integer pack directive. */
68
+ typedef enum pm_pack_size {
69
+ PM_PACK_SIZE_SHORT,
70
+ PM_PACK_SIZE_INT,
71
+ PM_PACK_SIZE_LONG,
72
+ PM_PACK_SIZE_LONG_LONG,
73
+ PM_PACK_SIZE_8,
74
+ PM_PACK_SIZE_16,
75
+ PM_PACK_SIZE_32,
76
+ PM_PACK_SIZE_64,
77
+ PM_PACK_SIZE_P,
78
+ PM_PACK_SIZE_NA
79
+ } pm_pack_size;
80
+
81
+ /** The type of length of a pack directive. */
82
+ typedef enum pm_pack_length_type {
83
+ PM_PACK_LENGTH_FIXED,
84
+ PM_PACK_LENGTH_MAX,
85
+ PM_PACK_LENGTH_RELATIVE, // special case for unpack @*
86
+ PM_PACK_LENGTH_NA
87
+ } pm_pack_length_type;
88
+
89
+ /** The type of encoding for a pack template string. */
90
+ typedef enum pm_pack_encoding {
91
+ PM_PACK_ENCODING_START,
92
+ PM_PACK_ENCODING_ASCII_8BIT,
93
+ PM_PACK_ENCODING_US_ASCII,
94
+ PM_PACK_ENCODING_UTF_8
95
+ } pm_pack_encoding;
96
+
97
+ /** The result of parsing a pack template. */
98
+ typedef enum pm_pack_result {
99
+ PM_PACK_OK,
100
+ PM_PACK_ERROR_UNSUPPORTED_DIRECTIVE,
101
+ PM_PACK_ERROR_UNKNOWN_DIRECTIVE,
102
+ PM_PACK_ERROR_LENGTH_TOO_BIG,
103
+ PM_PACK_ERROR_BANG_NOT_ALLOWED,
104
+ PM_PACK_ERROR_DOUBLE_ENDIAN
105
+ } pm_pack_result;
106
+
107
+ /**
108
+ * Parse a single directive from a pack or unpack format string.
109
+ *
110
+ * @param variant (in) pack or unpack
111
+ * @param format (in, out) the start of the next directive to parse on calling,
112
+ * and advanced beyond the parsed directive on return, or as much of it as
113
+ * was consumed until an error was encountered
114
+ * @param format_end (in) the end of the format string
115
+ * @param type (out) the type of the directive
116
+ * @param signed_type (out) whether the value is signed
117
+ * @param endian (out) the endianness of the value
118
+ * @param size (out) the size of the value
119
+ * @param length_type (out) what kind of length is specified
120
+ * @param length (out) the length of the directive
121
+ * @param encoding (in, out) takes the current encoding of the string which
122
+ * would result from parsing the whole format string, and returns a possibly
123
+ * changed directive - the encoding should be `PM_PACK_ENCODING_START` when
124
+ * pm_pack_parse is called for the first directive in a format string
125
+ *
126
+ * @return `PM_PACK_OK` on success or `PM_PACK_ERROR_*` on error
127
+ * @note Consult Ruby documentation for the meaning of directives.
128
+ */
129
+ PRISM_EXPORTED_FUNCTION pm_pack_result
130
+ pm_pack_parse(
131
+ pm_pack_variant variant,
132
+ const char **format,
133
+ const char *format_end,
134
+ pm_pack_type *type,
135
+ pm_pack_signed *signed_type,
136
+ pm_pack_endian *endian,
137
+ pm_pack_size *size,
138
+ pm_pack_length_type *length_type,
139
+ uint64_t *length,
140
+ pm_pack_encoding *encoding
141
+ );
142
+
143
+ /**
144
+ * Prism abstracts sizes away from the native system - this converts an abstract
145
+ * size to a native size.
146
+ *
147
+ * @param size The abstract size to convert.
148
+ * @return The native size.
149
+ */
150
+ PRISM_EXPORTED_FUNCTION size_t pm_size_to_native(pm_pack_size size);
151
+
152
+ #endif