debase-ruby_core_source 3.3.5 → 3.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.idea/vcs.xml +28 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +14 -0
  6. data/Rakefile +3 -1
  7. data/debase-ruby_core_source.gemspec +1 -0
  8. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/builtin.h +7 -1
  9. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/darray.h +22 -6
  10. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/debug_counter.h +1 -1
  11. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/dln.h +0 -2
  12. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/id.h +9 -0
  13. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/insns.inc +10 -2
  14. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/insns_info.inc +819 -312
  15. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/array.h +1 -0
  16. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/basic_operators.h +2 -0
  17. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/bits.h +82 -0
  18. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/class.h +1 -1
  19. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/encoding.h +2 -0
  20. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/error.h +28 -0
  21. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/fixnum.h +1 -0
  22. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/gc.h +24 -28
  23. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/hash.h +1 -0
  24. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/imemo.h +7 -1
  25. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/io.h +4 -1
  26. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/parse.h +16 -3
  27. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/proc.h +1 -0
  28. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/ractor.h +4 -0
  29. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/sanitizers.h +60 -39
  30. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/string.h +34 -18
  31. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/thread.h +29 -0
  32. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/vm.h +3 -3
  33. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/known_errors.inc +103 -103
  34. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/method.h +1 -0
  35. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/optunifs.inc +1 -1
  36. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/parse.h +5 -4
  37. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/ast.h +2156 -453
  38. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/defines.h +44 -7
  39. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/diagnostic.h +24 -6
  40. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/extension.h +2 -2
  41. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/node.h +0 -21
  42. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/options.h +94 -3
  43. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/parser.h +82 -40
  44. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/prism.h +47 -11
  45. data/lib/debase/ruby_core_source/ruby-3.4.0-p-1/prism/regexp.h +43 -0
  46. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/static_literals.h +3 -2
  47. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_char.h +1 -2
  48. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_constant_pool.h +0 -8
  49. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_integer.h +22 -15
  50. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_newline_list.h +11 -0
  51. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_string.h +28 -12
  52. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/version.h +3 -3
  53. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism_compile.h +23 -12
  54. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ractor_core.h +9 -20
  55. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/regint.h +0 -4
  56. data/lib/debase/ruby_core_source/ruby-3.4.0-p-1/revision.h +5 -0
  57. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/rubyparser.h +171 -250
  58. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/shape.h +2 -1
  59. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/symbol.h +6 -1
  60. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/thread_pthread.h +26 -25
  61. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/version.h +1 -1
  62. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm.inc +467 -207
  63. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_callinfo.h +24 -2
  64. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_core.h +62 -48
  65. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_insnhelper.h +7 -2
  66. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_sync.h +3 -3
  67. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vmtc.inc +10 -2
  68. data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/yjit.h +1 -0
  69. data/lib/debase/ruby_core_source/version.rb +1 -1
  70. data/lib/debase/ruby_core_source.rb +4 -2
  71. data/test/deduce_source_dir_test.rb +31 -0
  72. metadata +163 -150
  73. data/lib/debase/ruby_core_source/ruby-3.4.0-preview1/prism/regexp.h +0 -33
  74. data/lib/debase/ruby_core_source/ruby-3.4.0-preview1/prism/util/pm_string_list.h +0 -44
  75. data/lib/debase/ruby_core_source/ruby-3.4.0-preview1/revision.h +0 -5
  76. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/addr2line.h +0 -0
  77. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ccan/build_assert/build_assert.h +0 -0
  78. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ccan/check_type/check_type.h +0 -0
  79. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ccan/container_of/container_of.h +0 -0
  80. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ccan/list/list.h +0 -0
  81. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ccan/str/str.h +0 -0
  82. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/constant.h +0 -0
  83. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/encindex.h +0 -0
  84. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/eval_intern.h +0 -0
  85. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/hrtime.h +0 -0
  86. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/id_table.h +0 -0
  87. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/bignum.h +0 -0
  88. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/cmdlineopt.h +0 -0
  89. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/compar.h +0 -0
  90. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/compile.h +0 -0
  91. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/compilers.h +0 -0
  92. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/complex.h +0 -0
  93. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/cont.h +0 -0
  94. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/dir.h +0 -0
  95. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/enc.h +0 -0
  96. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/enum.h +0 -0
  97. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/enumerator.h +0 -0
  98. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/eval.h +0 -0
  99. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/file.h +0 -0
  100. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/inits.h +0 -0
  101. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/load.h +0 -0
  102. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/loadpath.h +0 -0
  103. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/math.h +0 -0
  104. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/missing.h +0 -0
  105. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/numeric.h +0 -0
  106. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/object.h +0 -0
  107. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/process.h +0 -0
  108. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/random.h +0 -0
  109. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/range.h +0 -0
  110. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/rational.h +0 -0
  111. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/re.h +0 -0
  112. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/ruby_parser.h +0 -0
  113. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/serial.h +0 -0
  114. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/signal.h +0 -0
  115. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/st.h +0 -0
  116. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/static_assert.h +0 -0
  117. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/struct.h +0 -0
  118. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/symbol.h +0 -0
  119. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/time.h +0 -0
  120. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/transcode.h +0 -0
  121. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/util.h +0 -0
  122. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/variable.h +0 -0
  123. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal/warnings.h +0 -0
  124. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/internal.h +0 -0
  125. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/iseq.h +0 -0
  126. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/node.h +0 -0
  127. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/node_name.inc +0 -0
  128. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/optinsn.inc +0 -0
  129. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/parser_bits.h +0 -0
  130. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/parser_node.h +0 -0
  131. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/parser_st.h +0 -0
  132. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/parser_value.h +0 -0
  133. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/encoding.h +0 -0
  134. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/pack.h +0 -0
  135. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/prettyprint.h +0 -0
  136. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_buffer.h +0 -0
  137. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_list.h +0 -0
  138. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_memchr.h +0 -0
  139. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_strncasecmp.h +0 -0
  140. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/prism/util/pm_strpbrk.h +0 -0
  141. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/probes_helper.h +0 -0
  142. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/regenc.h +0 -0
  143. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/regparse.h +0 -0
  144. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/rjit.h +0 -0
  145. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/rjit_c.h +0 -0
  146. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ruby_assert.h +0 -0
  147. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/ruby_atomic.h +0 -0
  148. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/siphash.h +0 -0
  149. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/thread_none.h +0 -0
  150. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/thread_win32.h +0 -0
  151. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/timev.h +0 -0
  152. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/transcode_data.h +0 -0
  153. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/variable.h +0 -0
  154. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_call_iseq_optimized.inc +0 -0
  155. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_debug.h +0 -0
  156. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_exec.h +0 -0
  157. /data/lib/debase/ruby_core_source/{ruby-3.4.0-preview1 → ruby-3.4.0-p-1}/vm_opts.h +0 -0
@@ -17,7 +17,7 @@ enum vm_call_flag_bits {
17
17
  VM_CALL_ARGS_BLOCKARG_bit, // m(&block)
18
18
  VM_CALL_FCALL_bit, // m(args) # receiver is self
19
19
  VM_CALL_VCALL_bit, // m # method call that looks like a local variable
20
- VM_CALL_ARGS_SIMPLE_bit, // (ci->flag & (SPLAT|BLOCKARG)) && blockiseq == NULL && ci->kw_arg == NULL
20
+ VM_CALL_ARGS_SIMPLE_bit, // !(ci->flag & (SPLAT|BLOCKARG|KWARG|KW_SPLAT|FORWARDING)) && !has_block_iseq
21
21
  VM_CALL_KWARG_bit, // has kwarg
22
22
  VM_CALL_KW_SPLAT_bit, // m(**opts)
23
23
  VM_CALL_TAILCALL_bit, // located at tail position
@@ -26,6 +26,7 @@ enum vm_call_flag_bits {
26
26
  VM_CALL_OPT_SEND_bit, // internal flag
27
27
  VM_CALL_KW_SPLAT_MUT_bit, // kw splat hash can be modified (to avoid allocating a new one)
28
28
  VM_CALL_ARGS_SPLAT_MUT_bit, // args splat can be modified (to avoid allocating a new one)
29
+ VM_CALL_FORWARDING_bit, // m(...)
29
30
  VM_CALL__END
30
31
  };
31
32
 
@@ -42,6 +43,7 @@ enum vm_call_flag_bits {
42
43
  #define VM_CALL_OPT_SEND (0x01 << VM_CALL_OPT_SEND_bit)
43
44
  #define VM_CALL_KW_SPLAT_MUT (0x01 << VM_CALL_KW_SPLAT_MUT_bit)
44
45
  #define VM_CALL_ARGS_SPLAT_MUT (0x01 << VM_CALL_ARGS_SPLAT_MUT_bit)
46
+ #define VM_CALL_FORWARDING (0x01 << VM_CALL_FORWARDING_bit)
45
47
 
46
48
  struct rb_callinfo_kwarg {
47
49
  int keyword_len;
@@ -240,6 +242,21 @@ vm_ci_new_runtime_(ID mid, unsigned int flag, unsigned int argc, const struct rb
240
242
 
241
243
  #define VM_CALLINFO_NOT_UNDER_GC IMEMO_FL_USER0
242
244
 
245
+ static inline bool
246
+ vm_ci_markable(const struct rb_callinfo *ci)
247
+ {
248
+ if (! ci) {
249
+ return false; /* or true? This is Qfalse... */
250
+ }
251
+ else if (vm_ci_packed_p(ci)) {
252
+ return true;
253
+ }
254
+ else {
255
+ VM_ASSERT(IMEMO_TYPE_P(ci, imemo_callinfo));
256
+ return ! FL_ANY_RAW((VALUE)ci, VM_CALLINFO_NOT_UNDER_GC);
257
+ }
258
+ }
259
+
243
260
  #define VM_CI_ON_STACK(mid_, flags_, argc_, kwarg_) \
244
261
  (struct rb_callinfo) { \
245
262
  .flags = T_IMEMO | \
@@ -318,6 +335,8 @@ vm_cc_new(VALUE klass,
318
335
  *((struct rb_callable_method_entry_struct **)&cc->cme_) = (struct rb_callable_method_entry_struct *)cme;
319
336
  *((vm_call_handler *)&cc->call_) = call;
320
337
 
338
+ VM_ASSERT(RB_TYPE_P(klass, T_CLASS) || RB_TYPE_P(klass, T_ICLASS));
339
+
321
340
  switch (type) {
322
341
  case cc_type_normal:
323
342
  break;
@@ -329,7 +348,10 @@ vm_cc_new(VALUE klass,
329
348
  break;
330
349
  }
331
350
 
332
- vm_cc_attr_index_initialize(cc, INVALID_SHAPE_ID);
351
+ if (cme->def->type == VM_METHOD_TYPE_ATTRSET || cme->def->type == VM_METHOD_TYPE_IVAR) {
352
+ vm_cc_attr_index_initialize(cc, INVALID_SHAPE_ID);
353
+ }
354
+
333
355
  RB_DEBUG_COUNTER_INC(cc_new);
334
356
  return cc;
335
357
  }
@@ -56,7 +56,8 @@
56
56
  #define RVALUE_SIZE (sizeof(struct RBasic) + sizeof(VALUE[RBIMPL_RVALUE_EMBED_LEN_MAX]))
57
57
 
58
58
  #if VM_CHECK_MODE > 0
59
- #define VM_ASSERT(/*expr, */...) RUBY_ASSERT_WHEN(VM_CHECK_MODE > 0, __VA_ARGS__)
59
+ #define VM_ASSERT(expr, ...) \
60
+ RUBY_ASSERT_MESG_WHEN(VM_CHECK_MODE > 0, expr, #expr RBIMPL_VA_OPT_ARGS(__VA_ARGS__))
60
61
  #define VM_UNREACHABLE(func) rb_bug(#func ": unreachable")
61
62
  #define RUBY_ASSERT_CRITICAL_SECTION
62
63
  #define RUBY_DEBUG_THREAD_SCHEDULE() rb_thread_schedule()
@@ -69,7 +70,30 @@
69
70
  #define RUBY_ASSERT_MUTEX_OWNED(mutex) VM_ASSERT(rb_mutex_owned_p(mutex))
70
71
 
71
72
  #if defined(RUBY_ASSERT_CRITICAL_SECTION)
72
- // TODO add documentation
73
+ /*
74
+ # Critical Section Assertions
75
+
76
+ These assertions are used to ensure that context switching does not occur between two points in the code. In theory,
77
+ such code should already be protected by a mutex, but these assertions are used to ensure that the mutex is held.
78
+
79
+ The specific case where it can be useful is where a mutex is held further up the call stack, and the code in question
80
+ may not directly hold the mutex. In this case, the critical section assertions can be used to ensure that the mutex is
81
+ held by someone else.
82
+
83
+ These assertions are only enabled when RUBY_ASSERT_CRITICAL_SECTION is defined, which is only defined if VM_CHECK_MODE
84
+ is set.
85
+
86
+ ## Example Usage
87
+
88
+ ```c
89
+ RUBY_ASSERT_CRITICAL_SECTION_ENTER();
90
+ // ... some code which does not invoke rb_vm_check_ints() ...
91
+ RUBY_ASSERT_CRITICAL_SECTION_LEAVE();
92
+ ```
93
+
94
+ If `rb_vm_check_ints()` is called between the `RUBY_ASSERT_CRITICAL_SECTION_ENTER()` and
95
+ `RUBY_ASSERT_CRITICAL_SECTION_LEAVE()`, a failed assertion will result.
96
+ */
73
97
  extern int ruby_assert_critical_section_entered;
74
98
  #define RUBY_ASSERT_CRITICAL_SECTION_ENTER() do{ruby_assert_critical_section_entered += 1;}while(false)
75
99
  #define RUBY_ASSERT_CRITICAL_SECTION_LEAVE() do{VM_ASSERT(ruby_assert_critical_section_entered > 0);ruby_assert_critical_section_entered -= 1;}while(false)
@@ -105,15 +129,6 @@ extern int ruby_assert_critical_section_entered;
105
129
  #include "vm_opts.h"
106
130
 
107
131
  #include "ruby/thread_native.h"
108
-
109
- #if USE_SHARED_GC
110
- typedef struct gc_function_map {
111
- void *(*objspace_alloc)(void);
112
- } rb_gc_function_map_t;
113
-
114
- #define rb_gc_functions (&GET_VM()->gc_functions_map)
115
- #endif
116
-
117
132
  /*
118
133
  * implementation selector of get_insn_info algorithm
119
134
  * 0: linear search
@@ -238,6 +253,8 @@ union ic_serial_entry {
238
253
  VALUE data[2];
239
254
  };
240
255
 
256
+ #define IMEMO_CONST_CACHE_SHAREABLE IMEMO_FL_USER0
257
+
241
258
  // imemo_constcache
242
259
  struct iseq_inline_constant_cache_entry {
243
260
  VALUE flags;
@@ -378,6 +395,8 @@ enum rb_builtin_attr {
378
395
  BUILTIN_ATTR_SINGLE_NOARG_LEAF = 0x02,
379
396
  // This attribute signals JIT to duplicate the iseq for each block iseq so that its `yield` will be monomorphic.
380
397
  BUILTIN_ATTR_INLINE_BLOCK = 0x04,
398
+ // The iseq acts like a C method in backtraces.
399
+ BUILTIN_ATTR_C_TRACE = 0x08,
381
400
  };
382
401
 
383
402
  typedef VALUE (*rb_jit_func_t)(struct rb_execution_context_struct *, struct rb_control_frame_struct *);
@@ -427,6 +446,7 @@ struct rb_iseq_constant_body {
427
446
  unsigned int anon_rest: 1;
428
447
  unsigned int anon_kwrest: 1;
429
448
  unsigned int use_block: 1;
449
+ unsigned int forwardable: 1;
430
450
  } flags;
431
451
 
432
452
  unsigned int size;
@@ -586,6 +606,12 @@ rb_iseq_check(const rb_iseq_t *iseq)
586
606
  return iseq;
587
607
  }
588
608
 
609
+ static inline bool
610
+ rb_iseq_attr_p(const rb_iseq_t *iseq, enum rb_builtin_attr attr)
611
+ {
612
+ return (ISEQ_BODY(iseq)->builtin_attrs & attr) == attr;
613
+ }
614
+
589
615
  static inline const rb_iseq_t *
590
616
  def_iseq_ptr(rb_method_definition_t *def)
591
617
  {
@@ -616,10 +642,9 @@ typedef struct rb_at_exit_list {
616
642
  struct rb_at_exit_list *next;
617
643
  } rb_at_exit_list;
618
644
 
619
- struct rb_objspace;
620
- struct rb_objspace *rb_objspace_alloc(void);
621
- void rb_objspace_free(struct rb_objspace *);
622
- void rb_objspace_call_finalizer(struct rb_objspace *);
645
+ void *rb_objspace_alloc(void);
646
+ void rb_objspace_free(void *objspace);
647
+ void rb_objspace_call_finalizer(void);
623
648
 
624
649
  typedef struct rb_hook_list_struct {
625
650
  struct rb_event_hook_struct *hooks;
@@ -743,9 +768,6 @@ typedef struct rb_vm_struct {
743
768
  VALUE cmd[RUBY_NSIG];
744
769
  } trap_list;
745
770
 
746
- /* relation table of ensure - rollback for callcc */
747
- struct st_table *ensure_rollback_table;
748
-
749
771
  /* postponed_job (async-signal-safe, and thread-safe) */
750
772
  struct rb_postponed_job_queue *postponed_job_queue;
751
773
 
@@ -759,10 +781,13 @@ typedef struct rb_vm_struct {
759
781
  VALUE coverages, me2counter;
760
782
  int coverage_mode;
761
783
 
762
- struct rb_objspace *objspace;
763
- #if USE_SHARED_GC
764
- rb_gc_function_map_t gc_functions_map;
765
- #endif
784
+ struct {
785
+ struct rb_objspace *objspace;
786
+ struct gc_mark_func_data_struct {
787
+ void *data;
788
+ void (*mark_func)(VALUE v, void *data);
789
+ } *mark_func_data;
790
+ } gc;
766
791
 
767
792
  rb_at_exit_list *at_exit;
768
793
 
@@ -774,13 +799,13 @@ typedef struct rb_vm_struct {
774
799
  struct rb_id_table *negative_cme_table;
775
800
  st_table *overloaded_cme_table; // cme -> overloaded_cme
776
801
  st_table *unused_block_warning_table;
777
- bool unused_block_warning_strict;
778
802
 
779
803
  // This id table contains a mapping from ID to ICs. It does this with ID
780
804
  // keys and nested st_tables as values. The nested tables have ICs as keys
781
805
  // and Qtrue as values. It is used when inline constant caches need to be
782
806
  // invalidated or ISEQs are being freed.
783
807
  struct rb_id_table *constant_cache;
808
+ ID inserting_constant_cache_id;
784
809
 
785
810
  #ifndef VM_GLOBAL_CC_CACHE_TABLE_SIZE
786
811
  #define VM_GLOBAL_CC_CACHE_TABLE_SIZE 1023
@@ -986,17 +1011,6 @@ struct rb_unblock_callback {
986
1011
 
987
1012
  struct rb_mutex_struct;
988
1013
 
989
- typedef struct rb_ensure_entry {
990
- VALUE marker;
991
- VALUE (*e_proc)(VALUE);
992
- VALUE data2;
993
- } rb_ensure_entry_t;
994
-
995
- typedef struct rb_ensure_list {
996
- struct rb_ensure_list *next;
997
- struct rb_ensure_entry entry;
998
- } rb_ensure_list_t;
999
-
1000
1014
  typedef struct rb_fiber_struct rb_fiber_t;
1001
1015
 
1002
1016
  struct rb_waiting_list {
@@ -1035,9 +1049,6 @@ struct rb_execution_context_struct {
1035
1049
  const VALUE *root_lep;
1036
1050
  VALUE root_svar;
1037
1051
 
1038
- /* ensure & callcc */
1039
- rb_ensure_list_t *ensure_list;
1040
-
1041
1052
  /* trace information */
1042
1053
  struct rb_trace_arg_struct *trace_arg;
1043
1054
 
@@ -1146,6 +1157,7 @@ typedef struct rb_thread_struct {
1146
1157
  struct rb_unblock_callback unblock;
1147
1158
  VALUE locking_mutex;
1148
1159
  struct rb_mutex_struct *keeping_mutexes;
1160
+ struct ccan_list_head interrupt_exec_tasks;
1149
1161
 
1150
1162
  struct rb_waiting_list *join_list;
1151
1163
 
@@ -1213,7 +1225,7 @@ rb_iseq_t *rb_iseq_new (const VALUE ast_value, VALUE name, VALUE path, V
1213
1225
  rb_iseq_t *rb_iseq_new_top (const VALUE ast_value, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent);
1214
1226
  rb_iseq_t *rb_iseq_new_main (const VALUE ast_value, VALUE path, VALUE realpath, const rb_iseq_t *parent, int opt);
1215
1227
  rb_iseq_t *rb_iseq_new_eval (const VALUE ast_value, VALUE name, VALUE path, VALUE realpath, int first_lineno, const rb_iseq_t *parent, int isolated_depth);
1216
- rb_iseq_t *rb_iseq_new_with_opt(const VALUE ast_value, VALUE name, VALUE path, VALUE realpath, int first_lineno, const rb_iseq_t *parent, int isolated_depth,
1228
+ rb_iseq_t *rb_iseq_new_with_opt( VALUE ast_value, VALUE name, VALUE path, VALUE realpath, int first_lineno, const rb_iseq_t *parent, int isolated_depth,
1217
1229
  enum rb_iseq_type, const rb_compile_option_t*,
1218
1230
  VALUE script_lines);
1219
1231
 
@@ -1296,6 +1308,15 @@ enum vm_check_match_type {
1296
1308
  #define VM_CHECKMATCH_TYPE_MASK 0x03
1297
1309
  #define VM_CHECKMATCH_ARRAY 0x04
1298
1310
 
1311
+ enum vm_opt_newarray_send_type {
1312
+ VM_OPT_NEWARRAY_SEND_MAX = 1,
1313
+ VM_OPT_NEWARRAY_SEND_MIN = 2,
1314
+ VM_OPT_NEWARRAY_SEND_HASH = 3,
1315
+ VM_OPT_NEWARRAY_SEND_PACK = 4,
1316
+ VM_OPT_NEWARRAY_SEND_PACK_BUFFER = 5,
1317
+ VM_OPT_NEWARRAY_SEND_INCLUDE_P = 6,
1318
+ };
1319
+
1299
1320
  enum vm_special_object_type {
1300
1321
  VM_SPECIAL_OBJECT_VMCORE = 1,
1301
1322
  VM_SPECIAL_OBJECT_CBASE,
@@ -1501,22 +1522,13 @@ VM_ENV_ESCAPED_P(const VALUE *ep)
1501
1522
  return VM_ENV_FLAGS(ep, VM_ENV_FLAG_ESCAPED) ? 1 : 0;
1502
1523
  }
1503
1524
 
1504
- #if VM_CHECK_MODE > 0
1505
- static inline int
1506
- vm_assert_env(VALUE obj)
1507
- {
1508
- VM_ASSERT(imemo_type_p(obj, imemo_env));
1509
- return 1;
1510
- }
1511
- #endif
1512
-
1513
1525
  RBIMPL_ATTR_NONNULL((1))
1514
1526
  static inline VALUE
1515
1527
  VM_ENV_ENVVAL(const VALUE *ep)
1516
1528
  {
1517
1529
  VALUE envval = ep[VM_ENV_DATA_INDEX_ENV];
1518
1530
  VM_ASSERT(VM_ENV_ESCAPED_P(ep));
1519
- VM_ASSERT(vm_assert_env(envval));
1531
+ VM_ASSERT(envval == Qundef || imemo_type_p(envval, imemo_env));
1520
1532
  return envval;
1521
1533
  }
1522
1534
 
@@ -1959,6 +1971,8 @@ rb_ec_vm_ptr(const rb_execution_context_t *ec)
1959
1971
  }
1960
1972
  }
1961
1973
 
1974
+ NOINLINE(struct rb_execution_context_struct *rb_current_ec_noinline(void));
1975
+
1962
1976
  static inline rb_execution_context_t *
1963
1977
  rb_current_execution_context(bool expect_ec)
1964
1978
  {
@@ -66,6 +66,11 @@ typedef enum call_type {
66
66
  CALL_FCALL_KW
67
67
  } call_type;
68
68
 
69
+ struct rb_forwarding_call_data {
70
+ struct rb_call_data cd;
71
+ CALL_INFO caller_ci;
72
+ };
73
+
69
74
  #if VM_COLLECT_USAGE_DETAILS
70
75
  enum vm_regan_regtype {
71
76
  VM_REGAN_PC = 0,
@@ -258,8 +263,8 @@ THROW_DATA_CONSUMED_SET(struct vm_throw_data *obj)
258
263
  static inline bool
259
264
  vm_call_cacheable(const struct rb_callinfo *ci, const struct rb_callcache *cc)
260
265
  {
261
- return (vm_ci_flag(ci) & VM_CALL_FCALL) ||
262
- METHOD_ENTRY_VISI(vm_cc_cme(cc)) != METHOD_VISI_PROTECTED;
266
+ return !(vm_ci_flag(ci) & VM_CALL_FORWARDING) && ((vm_ci_flag(ci) & VM_CALL_FCALL) ||
267
+ METHOD_ENTRY_VISI(vm_cc_cme(cc)) != METHOD_VISI_PROTECTED);
263
268
  }
264
269
  /* If this returns true, an optimized function returned by `vm_call_iseq_setup_func`
265
270
  can be used as a fastpath. */
@@ -21,9 +21,9 @@ void rb_vm_lock_body(LOCATION_ARGS);
21
21
  void rb_vm_unlock_body(LOCATION_ARGS);
22
22
 
23
23
  struct rb_ractor_struct;
24
- void rb_vm_lock_enter_body_cr(struct rb_ractor_struct *cr, unsigned int *lev APPEND_LOCATION_ARGS);
25
- void rb_vm_lock_enter_body_nb(unsigned int *lev APPEND_LOCATION_ARGS);
26
- void rb_vm_lock_enter_body(unsigned int *lev APPEND_LOCATION_ARGS);
24
+ NOINLINE(void rb_vm_lock_enter_body_cr(struct rb_ractor_struct *cr, unsigned int *lev APPEND_LOCATION_ARGS));
25
+ NOINLINE(void rb_vm_lock_enter_body_nb(unsigned int *lev APPEND_LOCATION_ARGS));
26
+ NOINLINE(void rb_vm_lock_enter_body(unsigned int *lev APPEND_LOCATION_ARGS));
27
27
  void rb_vm_lock_leave_body(unsigned int *lev APPEND_LOCATION_ARGS);
28
28
  void rb_vm_barrier(void);
29
29
 
@@ -64,7 +64,6 @@ static const void *const insns_address_table[] = {
64
64
  LABEL_PTR(toregexp),
65
65
  LABEL_PTR(intern),
66
66
  LABEL_PTR(newarray),
67
- LABEL_PTR(newarraykwsplat),
68
67
  LABEL_PTR(pushtoarraykwsplat),
69
68
  LABEL_PTR(duparray),
70
69
  LABEL_PTR(duphash),
@@ -93,13 +92,18 @@ static const void *const insns_address_table[] = {
93
92
  LABEL_PTR(definemethod),
94
93
  LABEL_PTR(definesmethod),
95
94
  LABEL_PTR(send),
95
+ LABEL_PTR(sendforward),
96
96
  LABEL_PTR(opt_send_without_block),
97
97
  LABEL_PTR(objtostring),
98
+ LABEL_PTR(opt_ary_freeze),
99
+ LABEL_PTR(opt_hash_freeze),
98
100
  LABEL_PTR(opt_str_freeze),
99
101
  LABEL_PTR(opt_nil_p),
100
102
  LABEL_PTR(opt_str_uminus),
103
+ LABEL_PTR(opt_duparray_send),
101
104
  LABEL_PTR(opt_newarray_send),
102
105
  LABEL_PTR(invokesuper),
106
+ LABEL_PTR(invokesuperforward),
103
107
  LABEL_PTR(invokeblock),
104
108
  LABEL_PTR(leave),
105
109
  LABEL_PTR(throw),
@@ -170,7 +174,6 @@ static const void *const insns_address_table[] = {
170
174
  LABEL_PTR(trace_toregexp),
171
175
  LABEL_PTR(trace_intern),
172
176
  LABEL_PTR(trace_newarray),
173
- LABEL_PTR(trace_newarraykwsplat),
174
177
  LABEL_PTR(trace_pushtoarraykwsplat),
175
178
  LABEL_PTR(trace_duparray),
176
179
  LABEL_PTR(trace_duphash),
@@ -199,13 +202,18 @@ static const void *const insns_address_table[] = {
199
202
  LABEL_PTR(trace_definemethod),
200
203
  LABEL_PTR(trace_definesmethod),
201
204
  LABEL_PTR(trace_send),
205
+ LABEL_PTR(trace_sendforward),
202
206
  LABEL_PTR(trace_opt_send_without_block),
203
207
  LABEL_PTR(trace_objtostring),
208
+ LABEL_PTR(trace_opt_ary_freeze),
209
+ LABEL_PTR(trace_opt_hash_freeze),
204
210
  LABEL_PTR(trace_opt_str_freeze),
205
211
  LABEL_PTR(trace_opt_nil_p),
206
212
  LABEL_PTR(trace_opt_str_uminus),
213
+ LABEL_PTR(trace_opt_duparray_send),
207
214
  LABEL_PTR(trace_opt_newarray_send),
208
215
  LABEL_PTR(trace_invokesuper),
216
+ LABEL_PTR(trace_invokesuperforward),
209
217
  LABEL_PTR(trace_invokeblock),
210
218
  LABEL_PTR(trace_leave),
211
219
  LABEL_PTR(trace_throw),
@@ -37,6 +37,7 @@ void rb_yjit_collect_binding_alloc(void);
37
37
  void rb_yjit_collect_binding_set(void);
38
38
  void rb_yjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec, bool jit_exception);
39
39
  void rb_yjit_init(bool yjit_enabled);
40
+ void rb_yjit_free_at_exit();
40
41
  void rb_yjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop);
41
42
  void rb_yjit_constant_state_changed(ID id);
42
43
  void rb_yjit_iseq_mark(void *payload);
@@ -1,5 +1,5 @@
1
1
  module Debase
2
2
  module RubyCoreSource
3
- VERSION = '3.3.5'
3
+ VERSION = '3.4.1'
4
4
  end
5
5
  end
@@ -3,6 +3,8 @@ require 'rbconfig'
3
3
 
4
4
  module Debase
5
5
  module RubyCoreSource
6
+ MOCK_RUBY_VERSION_KEY = "MOCK_RUBY_VERSION"
7
+
6
8
  REVISION_MAP = {
7
9
  # Add pre-release version here since they do not have patchlevel to refer to.
8
10
  # Revision can be found at `revision.h` of ruby sources.
@@ -54,7 +56,7 @@ module Debase
54
56
  expected_directory
55
57
  else
56
58
  # Fallback to an older version.
57
- ruby_version = Gem::Version.new(RUBY_VERSION)
59
+ ruby_version = Gem::Version.new(ENV[MOCK_RUBY_VERSION_KEY] || RUBY_VERSION)
58
60
  path, = Dir.glob(prefix + 'ruby-*').
59
61
  select { |d| File.directory?(d) }.
60
62
  map { |d| [d, ruby_source_dir_version(d)] }.
@@ -68,7 +70,7 @@ module Debase
68
70
  end
69
71
 
70
72
  def self.ruby_source_dir_version(dir)
71
- match = /ruby-([0-9\.]+)-((p|rc|preview)[0-9]+)\z/.match(dir)
73
+ match = /ruby-([0-9\.]+)-((p|rc|preview)-?[0-9]+)\z/.match(dir)
72
74
  Gem::Version.new("#{match[1]}.#{match[2]}")
73
75
  end
74
76
 
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ DIR_NAME = File.dirname(__FILE__)
4
+ $:.unshift File.join(DIR_NAME, "..", "lib")
5
+
6
+ require 'test/unit'
7
+ require 'debase/ruby_core_source'
8
+
9
+ class DeduceSourceDirTest < Test::Unit::TestCase
10
+
11
+ def test_deduce_source_dir
12
+ version_to_answer = {
13
+ "3.4.1" => "ruby-3.4.0-p-1",
14
+ "3.4.0" => "ruby-3.4.0-p-1",
15
+ "3.3.6" => "ruby-3.3.5-p100",
16
+ "3.3.5" => "ruby-3.3.5-p100",
17
+ "3.3.4" => "ruby-3.3.0-p0",
18
+ "3.3.3" => "ruby-3.3.0-p0",
19
+ "3.2.6" => "ruby-3.2.0-p0",
20
+ "3.1.6" => "ruby-3.1.0-p0",
21
+ "3.0.7" => "ruby-3.0.0-p0",
22
+ }
23
+
24
+ version_to_answer.each do |version, answer|
25
+ ENV[Debase::RubyCoreSource::MOCK_RUBY_VERSION_KEY] = version
26
+ result = Debase::RubyCoreSource.deduce_packaged_source_dir(version)
27
+ deduced_source_dir_name = result.split(File::SEPARATOR).last
28
+ assert_equal(answer, deduced_source_dir_name)
29
+ end
30
+ end
31
+ end