debase-ruby_core_source 3.3.5 → 3.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.idea/vcs.xml +28 -0
  4. data/CHANGELOG.md +8 -0
  5. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/addr2line.h +22 -0
  6. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/builtin.h +119 -0
  7. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ccan/build_assert/build_assert.h +40 -0
  8. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ccan/check_type/check_type.h +63 -0
  9. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ccan/container_of/container_of.h +142 -0
  10. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ccan/list/list.h +791 -0
  11. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ccan/str/str.h +17 -0
  12. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/constant.h +53 -0
  13. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/darray.h +209 -0
  14. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/debug_counter.h +423 -0
  15. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/dln.h +32 -0
  16. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/encindex.h +70 -0
  17. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/eval_intern.h +324 -0
  18. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/hrtime.h +237 -0
  19. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/id.h +347 -0
  20. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/id_table.h +39 -0
  21. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/insns.inc +265 -0
  22. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/insns_info.inc +9902 -0
  23. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/array.h +152 -0
  24. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/basic_operators.h +64 -0
  25. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/bignum.h +244 -0
  26. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/bits.h +568 -0
  27. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/class.h +283 -0
  28. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/cmdlineopt.h +65 -0
  29. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/compar.h +29 -0
  30. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/compile.h +34 -0
  31. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/compilers.h +107 -0
  32. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/complex.h +29 -0
  33. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/cont.h +35 -0
  34. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/dir.h +16 -0
  35. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/enc.h +19 -0
  36. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/encoding.h +36 -0
  37. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/enum.h +18 -0
  38. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/enumerator.h +21 -0
  39. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/error.h +218 -0
  40. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/eval.h +33 -0
  41. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/file.h +38 -0
  42. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/fixnum.h +184 -0
  43. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/gc.h +322 -0
  44. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/hash.h +192 -0
  45. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/imemo.h +261 -0
  46. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/inits.h +47 -0
  47. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/io.h +143 -0
  48. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/load.h +18 -0
  49. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/loadpath.h +16 -0
  50. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/math.h +23 -0
  51. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/missing.h +19 -0
  52. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/numeric.h +274 -0
  53. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/object.h +63 -0
  54. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/parse.h +129 -0
  55. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/proc.h +30 -0
  56. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/process.h +124 -0
  57. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/ractor.h +6 -0
  58. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/random.h +17 -0
  59. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/range.h +40 -0
  60. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/rational.h +71 -0
  61. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/re.h +28 -0
  62. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/ruby_parser.h +102 -0
  63. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/sanitizers.h +326 -0
  64. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/serial.h +23 -0
  65. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/signal.h +24 -0
  66. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/st.h +11 -0
  67. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/static_assert.h +16 -0
  68. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/string.h +186 -0
  69. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/struct.h +127 -0
  70. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/symbol.h +45 -0
  71. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/thread.h +85 -0
  72. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/time.h +34 -0
  73. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/transcode.h +23 -0
  74. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/util.h +27 -0
  75. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/variable.h +72 -0
  76. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/vm.h +137 -0
  77. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal/warnings.h +16 -0
  78. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/internal.h +108 -0
  79. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/iseq.h +340 -0
  80. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/known_errors.inc +1419 -0
  81. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/method.h +255 -0
  82. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/node.h +111 -0
  83. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/node_name.inc +224 -0
  84. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/optinsn.inc +128 -0
  85. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/optunifs.inc +43 -0
  86. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/parse.h +244 -0
  87. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/parser_bits.h +564 -0
  88. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/parser_node.h +32 -0
  89. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/parser_st.h +162 -0
  90. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/parser_value.h +106 -0
  91. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/ast.h +7524 -0
  92. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/defines.h +242 -0
  93. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/diagnostic.h +450 -0
  94. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/encoding.h +283 -0
  95. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/extension.h +19 -0
  96. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/node.h +129 -0
  97. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/options.h +396 -0
  98. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/pack.h +163 -0
  99. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/parser.h +933 -0
  100. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/prettyprint.h +34 -0
  101. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/prism.h +336 -0
  102. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/regexp.h +43 -0
  103. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/static_literals.h +121 -0
  104. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_buffer.h +218 -0
  105. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_char.h +204 -0
  106. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_constant_pool.h +218 -0
  107. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_integer.h +126 -0
  108. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_list.h +97 -0
  109. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_memchr.h +29 -0
  110. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_newline_list.h +113 -0
  111. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_string.h +190 -0
  112. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_strncasecmp.h +32 -0
  113. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/util/pm_strpbrk.h +46 -0
  114. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism/version.h +29 -0
  115. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/prism_compile.h +99 -0
  116. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/probes_helper.h +42 -0
  117. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ractor_core.h +382 -0
  118. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/regenc.h +254 -0
  119. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/regint.h +1006 -0
  120. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/regparse.h +371 -0
  121. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/revision.h +5 -0
  122. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/rjit.h +101 -0
  123. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/rjit_c.h +165 -0
  124. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ruby_assert.h +14 -0
  125. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/ruby_atomic.h +23 -0
  126. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/rubyparser.h +1350 -0
  127. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/shape.h +234 -0
  128. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/siphash.h +48 -0
  129. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/symbol.h +123 -0
  130. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/thread_none.h +21 -0
  131. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/thread_pthread.h +168 -0
  132. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/thread_win32.h +58 -0
  133. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/timev.h +58 -0
  134. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/transcode_data.h +138 -0
  135. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/variable.h +39 -0
  136. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/version.h +69 -0
  137. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm.inc +5840 -0
  138. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_call_iseq_optimized.inc +244 -0
  139. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_callinfo.h +627 -0
  140. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_core.h +2222 -0
  141. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_debug.h +124 -0
  142. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_exec.h +199 -0
  143. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_insnhelper.h +277 -0
  144. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_opts.h +67 -0
  145. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vm_sync.h +137 -0
  146. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/vmtc.inc +259 -0
  147. data/lib/debase/ruby_core_source/ruby-3.4.0-preview2/yjit.h +79 -0
  148. data/lib/debase/ruby_core_source/version.rb +1 -1
  149. metadata +150 -6
@@ -0,0 +1,99 @@
1
+ #include "prism/prism.h"
2
+ #include "ruby/encoding.h"
3
+
4
+ /**
5
+ * the getlocal and setlocal instructions require two parameters. level is how
6
+ * many hops up the iseq stack one needs to go before finding the correct local
7
+ * table. The index is the index in that table where our variable is.
8
+ *
9
+ * Because these are always calculated and used together, we'll bind them
10
+ * together as a tuple.
11
+ */
12
+ typedef struct pm_local_index_struct {
13
+ int index, level;
14
+ } pm_local_index_t;
15
+
16
+ // A declaration for the struct that lives in compile.c.
17
+ struct iseq_link_anchor;
18
+
19
+ // ScopeNodes are helper nodes, and will never be part of the AST. We manually
20
+ // declare them here to avoid generating them.
21
+ typedef struct pm_scope_node {
22
+ pm_node_t base;
23
+ struct pm_scope_node *previous;
24
+ pm_node_t *ast_node;
25
+ pm_node_t *parameters;
26
+ pm_node_t *body;
27
+ pm_constant_id_list_t locals;
28
+
29
+ const pm_parser_t *parser;
30
+ rb_encoding *encoding;
31
+
32
+ /**
33
+ * This is a pointer to the list of script lines for the ISEQs that will be
34
+ * associated with this scope node. It is only set if
35
+ * RubyVM.keep_script_lines is true. If it is set, it will be set to a
36
+ * pointer to an array that is always stack allocated (so no GC marking is
37
+ * needed by this struct). If it is not set, it will be NULL. It is
38
+ * inherited by all child scopes.
39
+ */
40
+ VALUE *script_lines;
41
+
42
+ /**
43
+ * This is the encoding of the actual filepath object that will be used when
44
+ * a __FILE__ node is compiled or when the path has to be set on a syntax
45
+ * error.
46
+ */
47
+ rb_encoding *filepath_encoding;
48
+
49
+ // The size of the local table on the iseq which includes locals and hidden
50
+ // variables.
51
+ int local_table_for_iseq_size;
52
+
53
+ ID *constants;
54
+ st_table *index_lookup_table;
55
+
56
+ // The current coverage setting, passed down through the various scopes.
57
+ int coverage_enabled;
58
+
59
+ /**
60
+ * This will only be set on the top-level scope node. It will contain all of
61
+ * the instructions pertaining to BEGIN{} nodes.
62
+ */
63
+ struct iseq_link_anchor *pre_execution_anchor;
64
+ } pm_scope_node_t;
65
+
66
+ void pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_t *previous);
67
+ void pm_scope_node_destroy(pm_scope_node_t *scope_node);
68
+
69
+ typedef struct {
70
+ /** The parser that will do the actual parsing. */
71
+ pm_parser_t parser;
72
+
73
+ /** The options that will be passed to the parser. */
74
+ pm_options_t options;
75
+
76
+ /** The input that represents the source to be parsed. */
77
+ pm_string_t input;
78
+
79
+ /** The resulting scope node that will hold the generated AST. */
80
+ pm_scope_node_t node;
81
+
82
+ /** Whether or not this parse result has performed its parsing yet. */
83
+ bool parsed;
84
+ } pm_parse_result_t;
85
+
86
+ VALUE pm_load_file(pm_parse_result_t *result, VALUE filepath, bool load_error);
87
+ VALUE pm_parse_file(pm_parse_result_t *result, VALUE filepath, VALUE *script_lines);
88
+ VALUE pm_load_parse_file(pm_parse_result_t *result, VALUE filepath, VALUE *script_lines);
89
+ VALUE pm_parse_string(pm_parse_result_t *result, VALUE source, VALUE filepath, VALUE *script_lines);
90
+ VALUE pm_parse_stdin(pm_parse_result_t *result);
91
+ void pm_parse_result_free(pm_parse_result_t *result);
92
+
93
+ rb_iseq_t *pm_iseq_new(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent, enum rb_iseq_type);
94
+ rb_iseq_t *pm_iseq_new_top(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent);
95
+ rb_iseq_t *pm_iseq_new_main(pm_scope_node_t *node, VALUE path, VALUE realpath, const rb_iseq_t *parent, int opt);
96
+ rb_iseq_t *pm_iseq_new_eval(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, int first_lineno, const rb_iseq_t *parent, int isolated_depth);
97
+ rb_iseq_t *pm_iseq_new_with_opt(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpath, int first_lineno, const rb_iseq_t *parent, int isolated_depth, enum rb_iseq_type, const rb_compile_option_t*);
98
+
99
+ VALUE pm_iseq_compile_node(rb_iseq_t *iseq, pm_scope_node_t *node);
@@ -0,0 +1,42 @@
1
+ #ifndef RUBY_PROBES_HELPER_H
2
+ #define RUBY_PROBES_HELPER_H
3
+
4
+ #include "ruby/ruby.h"
5
+
6
+ struct ruby_dtrace_method_hook_args {
7
+ const char *classname;
8
+ const char *methodname;
9
+ const char *filename;
10
+ int line_no;
11
+ volatile VALUE klass;
12
+ volatile VALUE name;
13
+ };
14
+
15
+ NOINLINE(int rb_dtrace_setup(rb_execution_context_t *, VALUE, ID, struct ruby_dtrace_method_hook_args *));
16
+
17
+ #define RUBY_DTRACE_METHOD_HOOK(name, ec, klazz, id) \
18
+ do { \
19
+ if (UNLIKELY(RUBY_DTRACE_##name##_ENABLED())) { \
20
+ struct ruby_dtrace_method_hook_args args; \
21
+ if (rb_dtrace_setup(ec, klazz, id, &args)) { \
22
+ RUBY_DTRACE_##name(args.classname, \
23
+ args.methodname, \
24
+ args.filename, \
25
+ args.line_no); \
26
+ } \
27
+ } \
28
+ } while (0)
29
+
30
+ #define RUBY_DTRACE_METHOD_ENTRY_HOOK(ec, klass, id) \
31
+ RUBY_DTRACE_METHOD_HOOK(METHOD_ENTRY, ec, klass, id)
32
+
33
+ #define RUBY_DTRACE_METHOD_RETURN_HOOK(ec, klass, id) \
34
+ RUBY_DTRACE_METHOD_HOOK(METHOD_RETURN, ec, klass, id)
35
+
36
+ #define RUBY_DTRACE_CMETHOD_ENTRY_HOOK(ec, klass, id) \
37
+ RUBY_DTRACE_METHOD_HOOK(CMETHOD_ENTRY, ec, klass, id)
38
+
39
+ #define RUBY_DTRACE_CMETHOD_RETURN_HOOK(ec, klass, id) \
40
+ RUBY_DTRACE_METHOD_HOOK(CMETHOD_RETURN, ec, klass, id)
41
+
42
+ #endif /* RUBY_PROBES_HELPER_H */
@@ -0,0 +1,382 @@
1
+ #include "internal/gc.h"
2
+ #include "ruby/ruby.h"
3
+ #include "ruby/ractor.h"
4
+ #include "vm_core.h"
5
+ #include "id_table.h"
6
+ #include "vm_debug.h"
7
+
8
+ #ifndef RACTOR_CHECK_MODE
9
+ #define RACTOR_CHECK_MODE (VM_CHECK_MODE || RUBY_DEBUG) && (SIZEOF_UINT64_T == SIZEOF_VALUE)
10
+ #endif
11
+
12
+ enum rb_ractor_basket_type {
13
+ // basket is empty
14
+ basket_type_none,
15
+
16
+ // value is available
17
+ basket_type_ref,
18
+ basket_type_copy,
19
+ basket_type_move,
20
+ basket_type_will,
21
+
22
+ // basket should be deleted
23
+ basket_type_deleted,
24
+
25
+ // basket is reserved
26
+ basket_type_reserved,
27
+
28
+ // take_basket is available
29
+ basket_type_take_basket,
30
+
31
+ // basket is keeping by yielding ractor
32
+ basket_type_yielding,
33
+ };
34
+
35
+ // per ractor taking configuration
36
+ struct rb_ractor_selector_take_config {
37
+ bool closed;
38
+ bool oneshot;
39
+ };
40
+
41
+ struct rb_ractor_basket {
42
+ union {
43
+ enum rb_ractor_basket_type e;
44
+ rb_atomic_t atomic;
45
+ } type;
46
+ VALUE sender;
47
+
48
+ union {
49
+ struct {
50
+ VALUE v;
51
+ bool exception;
52
+ } send;
53
+
54
+ struct {
55
+ struct rb_ractor_basket *basket;
56
+ struct rb_ractor_selector_take_config *config;
57
+ } take;
58
+ } p; // payload
59
+ };
60
+
61
+ static inline bool
62
+ basket_type_p(struct rb_ractor_basket *b, enum rb_ractor_basket_type type)
63
+ {
64
+ return b->type.e == type;
65
+ }
66
+
67
+ static inline bool
68
+ basket_none_p(struct rb_ractor_basket *b)
69
+ {
70
+ return basket_type_p(b, basket_type_none);
71
+ }
72
+
73
+ struct rb_ractor_queue {
74
+ struct rb_ractor_basket *baskets;
75
+ int start;
76
+ int cnt;
77
+ int size;
78
+ unsigned int serial;
79
+ unsigned int reserved_cnt;
80
+ };
81
+
82
+ enum rb_ractor_wait_status {
83
+ wait_none = 0x00,
84
+ wait_receiving = 0x01,
85
+ wait_taking = 0x02,
86
+ wait_yielding = 0x04,
87
+ wait_moving = 0x08,
88
+ };
89
+
90
+ enum rb_ractor_wakeup_status {
91
+ wakeup_none,
92
+ wakeup_by_send,
93
+ wakeup_by_yield,
94
+ wakeup_by_take,
95
+ wakeup_by_close,
96
+ wakeup_by_interrupt,
97
+ wakeup_by_retry,
98
+ };
99
+
100
+ struct rb_ractor_sync {
101
+ // ractor lock
102
+ rb_nativethread_lock_t lock;
103
+ #if RACTOR_CHECK_MODE > 0
104
+ VALUE locked_by;
105
+ #endif
106
+
107
+ bool incoming_port_closed;
108
+ bool outgoing_port_closed;
109
+
110
+ // All sent messages will be pushed into recv_queue
111
+ struct rb_ractor_queue recv_queue;
112
+
113
+ // The following ractors waiting for the yielding by this ractor
114
+ struct rb_ractor_queue takers_queue;
115
+
116
+ // Enabled if the ractor already terminated and not taken yet.
117
+ struct rb_ractor_basket will_basket;
118
+
119
+ struct ractor_wait {
120
+ enum rb_ractor_wait_status status;
121
+ enum rb_ractor_wakeup_status wakeup_status;
122
+ rb_thread_t *waiting_thread;
123
+ } wait;
124
+
125
+ #ifndef RUBY_THREAD_PTHREAD_H
126
+ rb_nativethread_cond_t cond;
127
+ #endif
128
+ };
129
+
130
+ // created
131
+ // | ready to run
132
+ // ====================== inserted to vm->ractor
133
+ // v
134
+ // blocking <---+ all threads are blocking
135
+ // | |
136
+ // v |
137
+ // running -----+
138
+ // | all threads are terminated.
139
+ // ====================== removed from vm->ractor
140
+ // v
141
+ // terminated
142
+ //
143
+ // status is protected by VM lock (global state)
144
+ enum ractor_status {
145
+ ractor_created,
146
+ ractor_running,
147
+ ractor_blocking,
148
+ ractor_terminated,
149
+ };
150
+
151
+ struct rb_ractor_struct {
152
+ struct rb_ractor_pub pub;
153
+
154
+ struct rb_ractor_sync sync;
155
+ VALUE receiving_mutex;
156
+
157
+ // vm wide barrier synchronization
158
+ rb_nativethread_cond_t barrier_wait_cond;
159
+
160
+ // thread management
161
+ struct {
162
+ struct ccan_list_head set;
163
+ unsigned int cnt;
164
+ unsigned int blocking_cnt;
165
+ unsigned int sleeper;
166
+ struct rb_thread_sched sched;
167
+ rb_execution_context_t *running_ec;
168
+ rb_thread_t *main;
169
+ } threads;
170
+ VALUE thgroup_default;
171
+
172
+ VALUE name;
173
+ VALUE loc;
174
+
175
+ enum ractor_status status_;
176
+
177
+ struct ccan_list_node vmlr_node;
178
+
179
+ // ractor local data
180
+
181
+ st_table *local_storage;
182
+ struct rb_id_table *idkey_local_storage;
183
+
184
+ VALUE r_stdin;
185
+ VALUE r_stdout;
186
+ VALUE r_stderr;
187
+ VALUE verbose;
188
+ VALUE debug;
189
+
190
+ void *newobj_cache;
191
+ }; // rb_ractor_t is defined in vm_core.h
192
+
193
+
194
+ static inline VALUE
195
+ rb_ractor_self(const rb_ractor_t *r)
196
+ {
197
+ return r->pub.self;
198
+ }
199
+
200
+ rb_ractor_t *rb_ractor_main_alloc(void);
201
+ void rb_ractor_main_setup(rb_vm_t *vm, rb_ractor_t *main_ractor, rb_thread_t *main_thread);
202
+ void rb_ractor_atexit(rb_execution_context_t *ec, VALUE result);
203
+ void rb_ractor_atexit_exception(rb_execution_context_t *ec);
204
+ void rb_ractor_teardown(rb_execution_context_t *ec);
205
+ void rb_ractor_receive_parameters(rb_execution_context_t *ec, rb_ractor_t *g, int len, VALUE *ptr);
206
+ void rb_ractor_send_parameters(rb_execution_context_t *ec, rb_ractor_t *g, VALUE args);
207
+
208
+ VALUE rb_thread_create_ractor(rb_ractor_t *g, VALUE args, VALUE proc); // defined in thread.c
209
+
210
+ int rb_ractor_living_thread_num(const rb_ractor_t *);
211
+ VALUE rb_ractor_thread_list(void);
212
+ bool rb_ractor_p(VALUE rv);
213
+
214
+ void rb_ractor_living_threads_init(rb_ractor_t *r);
215
+ void rb_ractor_living_threads_insert(rb_ractor_t *r, rb_thread_t *th);
216
+ void rb_ractor_living_threads_remove(rb_ractor_t *r, rb_thread_t *th);
217
+ void rb_ractor_blocking_threads_inc(rb_ractor_t *r, const char *file, int line); // TODO: file, line only for RUBY_DEBUG_LOG
218
+ void rb_ractor_blocking_threads_dec(rb_ractor_t *r, const char *file, int line); // TODO: file, line only for RUBY_DEBUG_LOG
219
+
220
+ void rb_ractor_vm_barrier_interrupt_running_thread(rb_ractor_t *r);
221
+ void rb_ractor_terminate_interrupt_main_thread(rb_ractor_t *r);
222
+ void rb_ractor_terminate_all(void);
223
+ bool rb_ractor_main_p_(void);
224
+ void rb_ractor_atfork(rb_vm_t *vm, rb_thread_t *th);
225
+
226
+ VALUE rb_ractor_ensure_shareable(VALUE obj, VALUE name);
227
+
228
+ RUBY_SYMBOL_EXPORT_BEGIN
229
+ void rb_ractor_finish_marking(void);
230
+
231
+ bool rb_ractor_shareable_p_continue(VALUE obj);
232
+
233
+ // THIS FUNCTION SHOULD NOT CALL WHILE INCREMENTAL MARKING!!
234
+ // This function is for T_DATA::free_func
235
+ void rb_ractor_local_storage_delkey(rb_ractor_local_key_t key);
236
+
237
+ RUBY_SYMBOL_EXPORT_END
238
+
239
+ static inline bool
240
+ rb_ractor_main_p(void)
241
+ {
242
+ if (ruby_single_main_ractor) {
243
+ return true;
244
+ }
245
+ else {
246
+ return rb_ractor_main_p_();
247
+ }
248
+ }
249
+
250
+ static inline bool
251
+ rb_ractor_status_p(rb_ractor_t *r, enum ractor_status status)
252
+ {
253
+ return r->status_ == status;
254
+ }
255
+
256
+ static inline void
257
+ rb_ractor_sleeper_threads_inc(rb_ractor_t *r)
258
+ {
259
+ r->threads.sleeper++;
260
+ }
261
+
262
+ static inline void
263
+ rb_ractor_sleeper_threads_dec(rb_ractor_t *r)
264
+ {
265
+ r->threads.sleeper--;
266
+ }
267
+
268
+ static inline void
269
+ rb_ractor_sleeper_threads_clear(rb_ractor_t *r)
270
+ {
271
+ r->threads.sleeper = 0;
272
+ }
273
+
274
+ static inline int
275
+ rb_ractor_sleeper_thread_num(rb_ractor_t *r)
276
+ {
277
+ return r->threads.sleeper;
278
+ }
279
+
280
+ static inline void
281
+ rb_ractor_thread_switch(rb_ractor_t *cr, rb_thread_t *th)
282
+ {
283
+ RUBY_DEBUG_LOG("th:%d->%u%s",
284
+ cr->threads.running_ec ? (int)rb_th_serial(cr->threads.running_ec->thread_ptr) : -1,
285
+ rb_th_serial(th), cr->threads.running_ec == th->ec ? " (same)" : "");
286
+
287
+ if (cr->threads.running_ec != th->ec) {
288
+ if (0) {
289
+ ruby_debug_printf("rb_ractor_thread_switch ec:%p->%p\n",
290
+ (void *)cr->threads.running_ec, (void *)th->ec);
291
+ }
292
+ }
293
+ else {
294
+ return;
295
+ }
296
+
297
+ if (cr->threads.running_ec != th->ec) {
298
+ th->running_time_us = 0;
299
+ }
300
+
301
+ cr->threads.running_ec = th->ec;
302
+
303
+ VM_ASSERT(cr == GET_RACTOR());
304
+ }
305
+
306
+ #define rb_ractor_set_current_ec(cr, ec) rb_ractor_set_current_ec_(cr, ec, __FILE__, __LINE__)
307
+
308
+ static inline void
309
+ rb_ractor_set_current_ec_(rb_ractor_t *cr, rb_execution_context_t *ec, const char *file, int line)
310
+ {
311
+ #ifdef RB_THREAD_LOCAL_SPECIFIER
312
+
313
+ # ifdef __APPLE__
314
+ rb_current_ec_set(ec);
315
+ # else
316
+ ruby_current_ec = ec;
317
+ # endif
318
+
319
+ #else
320
+ native_tls_set(ruby_current_ec_key, ec);
321
+ #endif
322
+ RUBY_DEBUG_LOG2(file, line, "ec:%p->%p", (void *)cr->threads.running_ec, (void *)ec);
323
+ VM_ASSERT(ec == NULL || cr->threads.running_ec != ec);
324
+ cr->threads.running_ec = ec;
325
+ }
326
+
327
+ void rb_vm_ractor_blocking_cnt_inc(rb_vm_t *vm, rb_ractor_t *cr, const char *file, int line);
328
+ void rb_vm_ractor_blocking_cnt_dec(rb_vm_t *vm, rb_ractor_t *cr, const char *file, int line);
329
+
330
+ static inline uint32_t
331
+ rb_ractor_id(const rb_ractor_t *r)
332
+ {
333
+ return r->pub.id;
334
+ }
335
+
336
+ #if RACTOR_CHECK_MODE > 0
337
+ # define RACTOR_BELONGING_ID(obj) (*(uint32_t *)(((uintptr_t)(obj)) + rb_gc_obj_slot_size(obj)))
338
+
339
+ uint32_t rb_ractor_current_id(void);
340
+
341
+ static inline void
342
+ rb_ractor_setup_belonging_to(VALUE obj, uint32_t rid)
343
+ {
344
+ RACTOR_BELONGING_ID(obj) = rid;
345
+ }
346
+
347
+ static inline uint32_t
348
+ rb_ractor_belonging(VALUE obj)
349
+ {
350
+ if (SPECIAL_CONST_P(obj) || RB_OBJ_SHAREABLE_P(obj)) {
351
+ return 0;
352
+ }
353
+ else {
354
+ return RACTOR_BELONGING_ID(obj);
355
+ }
356
+ }
357
+
358
+ static inline VALUE
359
+ rb_ractor_confirm_belonging(VALUE obj)
360
+ {
361
+ uint32_t id = rb_ractor_belonging(obj);
362
+
363
+ if (id == 0) {
364
+ if (UNLIKELY(!rb_ractor_shareable_p(obj))) {
365
+ rp(obj);
366
+ rb_bug("id == 0 but not shareable");
367
+ }
368
+ }
369
+ else if (UNLIKELY(id != rb_ractor_current_id())) {
370
+ if (rb_ractor_shareable_p(obj)) {
371
+ // ok
372
+ }
373
+ else {
374
+ rp(obj);
375
+ rb_bug("rb_ractor_confirm_belonging object-ractor id:%u, current-ractor id:%u", id, rb_ractor_current_id());
376
+ }
377
+ }
378
+ return obj;
379
+ }
380
+ #else
381
+ #define rb_ractor_confirm_belonging(obj) obj
382
+ #endif