debase-ruby_core_source 0.10.7 → 0.10.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +1 -1
  4. data/Rakefile +6 -3
  5. data/debase-ruby_core_source.gemspec +2 -1
  6. data/lib/debase/ruby_core_source.rb +0 -1
  7. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/addr2line.h +0 -0
  8. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/builtin.h +78 -0
  9. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ccan/build_assert/build_assert.h +0 -0
  10. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ccan/check_type/check_type.h +0 -0
  11. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ccan/container_of/container_of.h +0 -0
  12. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ccan/list/list.h +0 -0
  13. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ccan/str/str.h +0 -0
  14. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/constant.h +0 -4
  15. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/debug_counter.h +21 -9
  16. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/dln.h +0 -0
  17. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/encindex.h +0 -0
  18. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/eval_intern.h +1 -3
  19. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/gc.h +2 -0
  20. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/hrtime.h +0 -0
  21. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/id.h +1 -3
  22. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/id_table.h +0 -0
  23. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/insns.inc +6 -2
  24. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/insns_info.inc +1471 -1888
  25. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/internal.h +106 -91
  26. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/iseq.h +5 -5
  27. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/known_errors.inc +0 -0
  28. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/method.h +1 -4
  29. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/mjit.h +3 -5
  30. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/mjit_compile.inc +768 -872
  31. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/node.h +4 -11
  32. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/node_name.inc +0 -2
  33. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/opt_sc.inc +109 -0
  34. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/optinsn.inc +0 -0
  35. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/optunifs.inc +43 -0
  36. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/parse.h +1 -1
  37. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/probes_helper.h +0 -0
  38. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/regenc.h +0 -0
  39. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/regint.h +0 -0
  40. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/regparse.h +0 -0
  41. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/revision.h +2 -0
  42. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ruby_assert.h +0 -0
  43. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/ruby_atomic.h +0 -0
  44. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/siphash.h +0 -0
  45. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/symbol.h +0 -0
  46. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/thread_pthread.h +0 -0
  47. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/thread_win32.h +0 -0
  48. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/timev.h +0 -0
  49. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/transcode_data.h +0 -0
  50. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/transient_heap.h +0 -0
  51. data/lib/debase/ruby_core_source/ruby-2.7.0-p0/variable.h +9 -0
  52. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/version.h +4 -4
  53. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm.inc +604 -407
  54. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm_call_iseq_optimized.inc +49 -49
  55. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm_core.h +42 -29
  56. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm_debug.h +0 -0
  57. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm_exec.h +0 -0
  58. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm_insnhelper.h +16 -4
  59. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vm_opts.h +2 -0
  60. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-2.7.0-p0}/vmtc.inc +6 -2
  61. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/addr2line.h +20 -0
  62. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/builtin.h +83 -0
  63. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ccan/build_assert/build_assert.h +40 -0
  64. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ccan/check_type/check_type.h +63 -0
  65. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ccan/container_of/container_of.h +142 -0
  66. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ccan/list/list.h +788 -0
  67. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ccan/str/str.h +16 -0
  68. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/constant.h +55 -0
  69. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/debug_counter.h +457 -0
  70. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/dln.h +36 -0
  71. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/encindex.h +70 -0
  72. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/eval_intern.h +323 -0
  73. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/gc.h +140 -0
  74. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/hrtime.h +168 -0
  75. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/id.h +290 -0
  76. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/id_table.h +36 -0
  77. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/insns.inc +249 -0
  78. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/insns_info.inc +8983 -0
  79. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal.h +107 -0
  80. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/array.h +119 -0
  81. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/bignum.h +246 -0
  82. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/bits.h +566 -0
  83. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/class.h +174 -0
  84. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/compar.h +50 -0
  85. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/compile.h +32 -0
  86. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/compilers.h +108 -0
  87. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/complex.h +29 -0
  88. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/cont.h +25 -0
  89. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/dir.h +17 -0
  90. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/enc.h +20 -0
  91. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/encoding.h +28 -0
  92. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/enum.h +19 -0
  93. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/enumerator.h +22 -0
  94. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/error.h +124 -0
  95. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/eval.h +33 -0
  96. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/file.h +39 -0
  97. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/fixnum.h +185 -0
  98. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/gc.h +161 -0
  99. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/hash.h +241 -0
  100. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/imemo.h +243 -0
  101. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/inits.h +51 -0
  102. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/io.h +35 -0
  103. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/load.h +19 -0
  104. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/loadpath.h +17 -0
  105. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/math.h +24 -0
  106. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/missing.h +19 -0
  107. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/numeric.h +255 -0
  108. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/object.h +83 -0
  109. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/parse.h +23 -0
  110. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/proc.h +33 -0
  111. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/process.h +136 -0
  112. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/random.h +17 -0
  113. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/range.h +41 -0
  114. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/rational.h +71 -0
  115. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/re.h +29 -0
  116. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/sanitizers.h +191 -0
  117. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/scheduler.h +44 -0
  118. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/serial.h +24 -0
  119. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/signal.h +22 -0
  120. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/static_assert.h +17 -0
  121. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/string.h +140 -0
  122. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/struct.h +154 -0
  123. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/symbol.h +41 -0
  124. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/thread.h +54 -0
  125. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/time.h +35 -0
  126. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/transcode.h +21 -0
  127. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/util.h +31 -0
  128. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/variable.h +84 -0
  129. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/vm.h +136 -0
  130. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/internal/warnings.h +17 -0
  131. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/iseq.h +305 -0
  132. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/known_errors.inc +791 -0
  133. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/method.h +245 -0
  134. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/mjit.h +220 -0
  135. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/mjit_compile.inc +8240 -0
  136. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/node.h +484 -0
  137. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/node_name.inc +210 -0
  138. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/opt_sc.inc +0 -0
  139. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/optinsn.inc +128 -0
  140. data/lib/debase/ruby_core_source/{ruby-2.7.0-preview2 → ruby-3.0.0-p0}/optunifs.inc +0 -0
  141. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/parse.h +211 -0
  142. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/probes_helper.h +44 -0
  143. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ractor_core.h +343 -0
  144. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/regenc.h +254 -0
  145. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/regint.h +938 -0
  146. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/regparse.h +370 -0
  147. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/revision.h +2 -0
  148. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ruby_assert.h +15 -0
  149. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/ruby_atomic.h +23 -0
  150. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/siphash.h +48 -0
  151. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/symbol.h +119 -0
  152. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/thread_pthread.h +115 -0
  153. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/thread_win32.h +61 -0
  154. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/timev.h +57 -0
  155. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/transcode_data.h +138 -0
  156. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/transient_heap.h +65 -0
  157. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/variable.h +22 -0
  158. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/version.h +89 -0
  159. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm.inc +5355 -0
  160. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_call_iseq_optimized.inc +244 -0
  161. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_callinfo.h +456 -0
  162. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_core.h +2023 -0
  163. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_debug.h +116 -0
  164. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_exec.h +196 -0
  165. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_insnhelper.h +257 -0
  166. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_opts.h +73 -0
  167. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vm_sync.h +136 -0
  168. data/lib/debase/ruby_core_source/ruby-3.0.0-p0/vmtc.inc +243 -0
  169. data/lib/debase/ruby_core_source/version.rb +1 -1
  170. metadata +181 -57
  171. data/lib/debase/ruby_core_source/ruby-2.7.0-preview2/revision.h +0 -2
@@ -116,6 +116,7 @@ struct iseq_compile_data {
116
116
  unsigned int ci_kw_index;
117
117
  const rb_compile_option_t *option;
118
118
  struct rb_id_table *ivar_cache_table;
119
+ const struct rb_builtin_function *builtin_function_table;
119
120
  #if OPT_SUPPORT_JOKE
120
121
  st_table *labels_table;
121
122
  #endif
@@ -155,6 +156,7 @@ iseq_imemo_alloc(void)
155
156
  VALUE rb_iseq_ibf_dump(const rb_iseq_t *iseq, VALUE opt);
156
157
  void rb_ibf_load_iseq_complete(rb_iseq_t *iseq);
157
158
  const rb_iseq_t *rb_iseq_ibf_load(VALUE str);
159
+ const rb_iseq_t *rb_iseq_ibf_load_bytes(const char *cstr, size_t);
158
160
  VALUE rb_iseq_ibf_load_extra_data(VALUE str);
159
161
  void rb_iseq_init_trace(rb_iseq_t *iseq);
160
162
  int rb_iseq_add_local_tracepoint_recursively(const rb_iseq_t *iseq, rb_event_flag_t turnon_events, VALUE tpval, unsigned int target_line);
@@ -170,7 +172,6 @@ RUBY_SYMBOL_EXPORT_BEGIN
170
172
  /* compile.c */
171
173
  VALUE rb_iseq_compile_node(rb_iseq_t *iseq, const NODE *node);
172
174
  VALUE rb_iseq_compile_callback(rb_iseq_t *iseq, const struct rb_iseq_new_with_callback_callback_func * ifunc);
173
- int rb_iseq_translate_threaded_code(rb_iseq_t *iseq);
174
175
  VALUE *rb_iseq_original_iseq(const rb_iseq_t *iseq);
175
176
  void rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc,
176
177
  VALUE locals, VALUE args,
@@ -180,13 +181,12 @@ void rb_iseq_mark_insn_storage(struct iseq_compile_data_storage *arena);
180
181
  /* iseq.c */
181
182
  VALUE rb_iseq_load(VALUE data, VALUE parent, VALUE opt);
182
183
  VALUE rb_iseq_parameters(const rb_iseq_t *iseq, int is_proc);
183
- struct st_table *ruby_insn_make_insn_table(void);
184
184
  unsigned int rb_iseq_line_no(const rb_iseq_t *iseq, size_t pos);
185
185
  void rb_iseq_trace_set(const rb_iseq_t *iseq, rb_event_flag_t turnon_events);
186
186
  void rb_iseq_trace_set_all(rb_event_flag_t turnon_events);
187
- void rb_iseq_trace_on_all(void);
188
187
  void rb_iseq_insns_info_encode_positions(const rb_iseq_t *iseq);
189
188
 
189
+ struct rb_iseq_constant_body *rb_iseq_constant_body_alloc(void);
190
190
  VALUE rb_iseqw_new(const rb_iseq_t *iseq);
191
191
  const rb_iseq_t *rb_iseqw_to_iseq(VALUE iseqw);
192
192
 
@@ -298,11 +298,11 @@ enum defined_type {
298
298
  DEFINED_EXPR,
299
299
  DEFINED_IVAR2,
300
300
  DEFINED_REF,
301
- DEFINED_FUNC
301
+ DEFINED_FUNC,
302
+ DEFINED_CONST_FROM
302
303
  };
303
304
 
304
305
  VALUE rb_iseq_defined_string(enum defined_type type);
305
- void rb_iseq_make_compile_option(struct rb_compile_option_struct *option, VALUE opt);
306
306
 
307
307
  /* vm.c */
308
308
  VALUE rb_iseq_local_variables(const rb_iseq_t *iseq);
@@ -177,6 +177,7 @@ struct rb_method_definition_struct {
177
177
  } body;
178
178
 
179
179
  ID original_id;
180
+ uintptr_t method_serial;
180
181
  };
181
182
 
182
183
  typedef struct rb_method_definition_struct rb_method_definition_t;
@@ -202,7 +203,6 @@ const rb_method_entry_t *rb_method_entry_with_refinements(VALUE klass, ID id, VA
202
203
  const rb_method_entry_t *rb_method_entry_without_refinements(VALUE klass, ID id, VALUE *defined_class);
203
204
  const rb_method_entry_t *rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me);
204
205
  RUBY_SYMBOL_EXPORT_BEGIN
205
- const rb_callable_method_entry_t *rb_resolve_refined_method_callable(VALUE refinements, const rb_callable_method_entry_t *me);
206
206
  const rb_method_entry_t *rb_resolve_me_location(const rb_method_entry_t *, VALUE[5]);
207
207
  RUBY_SYMBOL_EXPORT_END
208
208
 
@@ -215,11 +215,8 @@ int rb_method_entry_eq(const rb_method_entry_t *m1, const rb_method_entry_t *m2)
215
215
  st_index_t rb_hash_method_entry(st_index_t hash, const rb_method_entry_t *me);
216
216
 
217
217
  VALUE rb_method_entry_location(const rb_method_entry_t *me);
218
- VALUE rb_mod_method_location(VALUE mod, ID id);
219
- VALUE rb_obj_method_location(VALUE obj, ID id);
220
218
 
221
219
  void rb_free_method_entry(const rb_method_entry_t *me);
222
- void rb_sweep_method_entry(void *vm);
223
220
 
224
221
  const rb_method_entry_t *rb_method_entry_clone(const rb_method_entry_t *me);
225
222
  const rb_callable_method_entry_t *rb_method_entry_complement_defined_class(const rb_method_entry_t *src_me, ID called_id, VALUE defined_class);
@@ -43,6 +43,8 @@ struct mjit_options {
43
43
  // Disable compiler optimization and add debug symbols. It can be
44
44
  // very slow.
45
45
  char debug;
46
+ // Add arbitrary cflags.
47
+ char* debug_flags;
46
48
  // If not 0, all ISeqs are synchronously compiled. For testing.
47
49
  unsigned int wait;
48
50
  // Number of calls to trigger JIT compilation. For testing.
@@ -78,9 +80,7 @@ extern void rb_mjit_recompile_iseq(const rb_iseq_t *iseq);
78
80
  RUBY_SYMBOL_EXPORT_END
79
81
 
80
82
  extern bool mjit_compile(FILE *f, const rb_iseq_t *iseq, const char *funcname);
81
- extern void mjit_init(struct mjit_options *opts);
82
- extern void mjit_postponed_job_register_start_hook(void);
83
- extern void mjit_postponed_job_register_finish_hook(void);
83
+ extern void mjit_init(const struct mjit_options *opts);
84
84
  extern void mjit_gc_start_hook(void);
85
85
  extern void mjit_gc_exit_hook(void);
86
86
  extern void mjit_free_iseq(const rb_iseq_t *iseq);
@@ -164,8 +164,6 @@ void mjit_child_after_fork(void);
164
164
  #else // USE_MJIT
165
165
  static inline struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec){return NULL;}
166
166
  static inline void mjit_cont_free(struct mjit_cont *cont){}
167
- static inline void mjit_postponed_job_register_start_hook(void){}
168
- static inline void mjit_postponed_job_register_finish_hook(void){}
169
167
  static inline void mjit_gc_start_hook(void){}
170
168
  static inline void mjit_gc_exit_hook(void){}
171
169
  static inline void mjit_free_iseq(const rb_iseq_t *iseq){}
@@ -362,13 +362,13 @@ switch (insn) {
362
362
  #if OPT_IC_FOR_IVAR
363
363
  {
364
364
  MAYBE_UNUSED(ID id) = (ID)operands[0];
365
- MAYBE_UNUSED(IC ic) = (IC)operands[1];
366
- IC ic_copy = &(status->is_entries + ((union iseq_inline_storage_entry *)ic - body->is_entries))->cache;
365
+ MAYBE_UNUSED(IVC ic) = (IVC)operands[1];
366
+ IVC ic_copy = &(status->is_entries + ((union iseq_inline_storage_entry *)ic - body->is_entries))->iv_cache;
367
367
  if (!status->compile_info->disable_ivar_cache && ic_copy->ic_serial) {
368
368
  fprintf(f, "{\n");
369
369
  fprintf(f, " VALUE obj = GET_SELF();\n");
370
370
  fprintf(f, " const rb_serial_t ic_serial = (rb_serial_t)%"PRI_SERIALT_PREFIX"u;\n", ic_copy->ic_serial);
371
- fprintf(f, " const st_index_t index = %"PRIuSIZE";\n", ic_copy->ic_value.index);
371
+ fprintf(f, " const st_index_t index = %"PRIuSIZE";\n", ic_copy->index);
372
372
  fprintf(f, " VALUE val;\n");
373
373
  fprintf(f, " if (LIKELY(RB_TYPE_P(obj, T_OBJECT) && ic_serial == RCLASS_SERIAL(RBASIC(obj)->klass) && index < ROBJECT_NUMIV(obj) && (val = ROBJECT_IVPTR(obj)[index]) != Qundef)) {\n");
374
374
  fprintf(f, " stack[%d] = val;\n", b->stack_size);
@@ -389,18 +389,18 @@ switch (insn) {
389
389
  {
390
390
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
391
391
  MAYBE_UNUSED(ID id) = (ID)operands[0];
392
- MAYBE_UNUSED(IC ic) = (IC)operands[1];
392
+ MAYBE_UNUSED(IVC ic) = (IVC)operands[1];
393
393
  if (status->local_stack_p) {
394
394
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
395
395
  }
396
- fprintf(f, " MAYBE_UNUSED(IC) ic;\n");
397
396
  fprintf(f, " MAYBE_UNUSED(ID) id;\n");
397
+ fprintf(f, " MAYBE_UNUSED(IVC) ic;\n");
398
398
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
399
399
 
400
400
  fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
401
401
  comment_id(f, (ID)operands[0]);
402
402
  fprintf(f, "\n");
403
- fprintf(f, " ic = (IC)0x%"PRIxVALUE";", operands[1]);
403
+ fprintf(f, " ic = (IVC)0x%"PRIxVALUE";", operands[1]);
404
404
  fprintf(f, "\n");
405
405
  if (body->catch_except_p || TRUE) {
406
406
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -431,13 +431,13 @@ switch (insn) {
431
431
  #if OPT_IC_FOR_IVAR
432
432
  {
433
433
  MAYBE_UNUSED(ID id) = (ID)operands[0];
434
- MAYBE_UNUSED(IC ic) = (IC)operands[1];
435
- IC ic_copy = &(status->is_entries + ((union iseq_inline_storage_entry *)ic - body->is_entries))->cache;
434
+ MAYBE_UNUSED(IVC ic) = (IVC)operands[1];
435
+ IVC ic_copy = &(status->is_entries + ((union iseq_inline_storage_entry *)ic - body->is_entries))->iv_cache;
436
436
  if (!status->compile_info->disable_ivar_cache && ic_copy->ic_serial) {
437
437
  fprintf(f, "{\n");
438
438
  fprintf(f, " VALUE obj = GET_SELF();\n");
439
439
  fprintf(f, " const rb_serial_t ic_serial = (rb_serial_t)%"PRI_SERIALT_PREFIX"u;\n", ic_copy->ic_serial);
440
- fprintf(f, " const st_index_t index = %"PRIuSIZE";\n", ic_copy->ic_value.index);
440
+ fprintf(f, " const st_index_t index = %"PRIuSIZE";\n", ic_copy->index);
441
441
  fprintf(f, " VALUE val = stack[%d];\n", b->stack_size - 1);
442
442
  fprintf(f, " if (LIKELY(RB_TYPE_P(obj, T_OBJECT) && ic_serial == RCLASS_SERIAL(RBASIC(obj)->klass) && index < ROBJECT_NUMIV(obj) && !RB_OBJ_FROZEN(obj))) {\n");
443
443
  fprintf(f, " VALUE *ptr = ROBJECT_IVPTR(obj);\n");
@@ -459,18 +459,18 @@ switch (insn) {
459
459
  {
460
460
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
461
461
  MAYBE_UNUSED(ID id) = (ID)operands[0];
462
- MAYBE_UNUSED(IC ic) = (IC)operands[1];
462
+ MAYBE_UNUSED(IVC ic) = (IVC)operands[1];
463
463
  if (status->local_stack_p) {
464
464
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
465
465
  }
466
- fprintf(f, " MAYBE_UNUSED(IC) ic;\n");
467
466
  fprintf(f, " MAYBE_UNUSED(ID) id;\n");
467
+ fprintf(f, " MAYBE_UNUSED(IVC) ic;\n");
468
468
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
469
469
 
470
470
  fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
471
471
  comment_id(f, (ID)operands[0]);
472
472
  fprintf(f, "\n");
473
- fprintf(f, " ic = (IC)0x%"PRIxVALUE";", operands[1]);
473
+ fprintf(f, " ic = (IVC)0x%"PRIxVALUE";", operands[1]);
474
474
  fprintf(f, "\n");
475
475
  fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
476
476
  if (body->catch_except_p || TRUE) {
@@ -1780,39 +1780,6 @@ switch (insn) {
1780
1780
  }
1781
1781
  fprintf(f, "}\n");
1782
1782
  break;
1783
- case BIN(methodref):
1784
- fprintf(f, "{\n");
1785
- {
1786
- MAYBE_UNUSED(int pc_moved_p) = FALSE;
1787
- MAYBE_UNUSED(ID id) = (ID)operands[0];
1788
- if (status->local_stack_p) {
1789
- fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
1790
- }
1791
- fprintf(f, " MAYBE_UNUSED(ID) id;\n");
1792
- fprintf(f, " MAYBE_UNUSED(VALUE) ret, val;\n");
1793
-
1794
- fprintf(f, " id = (ID)0x%"PRIxVALUE";", operands[0]);
1795
- comment_id(f, (ID)operands[0]);
1796
- fprintf(f, "\n");
1797
- fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
1798
- if (body->catch_except_p || FALSE) {
1799
- fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
1800
- pc_moved_p = TRUE;
1801
- }
1802
- if (status->local_stack_p) {
1803
- }
1804
- else {
1805
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
1806
- }
1807
- fprintf(f, " {\n");
1808
- fprintf(f, " ret = rb_obj_method(val, ID2SYM(id));\n");
1809
- fprintf(f, " RB_OBJ_FREEZE_RAW(ret);\n");
1810
- fprintf(f, " }\n");
1811
- fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_methodref(id) - 1);
1812
- b->stack_size += attr_sp_inc_methodref(id);
1813
- }
1814
- fprintf(f, "}\n");
1815
- break;
1816
1783
  case BIN(definemethod):
1817
1784
  fprintf(f, "{\n");
1818
1785
  {
@@ -1916,12 +1883,12 @@ switch (insn) {
1916
1883
  case BIN(send):
1917
1884
  {
1918
1885
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
1919
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
1920
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
1921
- MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[2];
1922
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
1886
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
1887
+ MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[1];
1888
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
1923
1889
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
1924
1890
  const rb_iseq_t *iseq;
1891
+ const CALL_INFO ci = &cd->ci;
1925
1892
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
1926
1893
  argc += ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0); // simulate `vm_caller_setup_arg_block`'s `--reg_cfp->sp`
1927
1894
 
@@ -1935,7 +1902,7 @@ switch (insn) {
1935
1902
  }
1936
1903
 
1937
1904
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
1938
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
1905
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
1939
1906
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
1940
1907
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
1941
1908
  fprintf(f, " goto send_cancel;\n");
@@ -1948,7 +1915,7 @@ switch (insn) {
1948
1915
  if (status->local_stack_p) {
1949
1916
  {
1950
1917
  rb_snum_t i, push_size;
1951
- push_size = -attr_sp_inc_send(ci, cc, blockiseq) + 1 - 0;
1918
+ push_size = -attr_sp_inc_send(cd, blockiseq) + 1 - 0;
1952
1919
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
1953
1920
  for (i = 0; i < push_size; i++) {
1954
1921
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -1970,7 +1937,7 @@ switch (insn) {
1970
1937
  else {
1971
1938
  fprintf(f, " {\n");
1972
1939
  fprintf(f, " struct rb_calling_info calling;\n");
1973
- fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", operands[0], operands[2]);
1940
+ fprintf(f, " calling.block_handler = vm_caller_setup_arg_block(ec, reg_cfp, (CALL_INFO)0x%"PRIxVALUE", (rb_iseq_t *)0x%"PRIxVALUE", FALSE);\n", (VALUE)ci, (VALUE)blockiseq);
1974
1941
  fprintf(f, " calling.argc = %d;\n", ci->orig_argc);
1975
1942
  fprintf(f, " calling.recv = stack[%d];\n", b->stack_size - 1 - argc);
1976
1943
 
@@ -1994,7 +1961,7 @@ switch (insn) {
1994
1961
  fprintf(f, " }\n");
1995
1962
 
1996
1963
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
1997
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_send(ci, cc, blockiseq));
1964
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_send(cd, blockiseq));
1998
1965
  if (!pc_moved_p) {
1999
1966
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2000
1967
  }
@@ -2003,7 +1970,7 @@ switch (insn) {
2003
1970
  fprintf(f, " }\n");
2004
1971
  }
2005
1972
 
2006
- b->stack_size += attr_sp_inc_send(ci, cc, blockiseq);
1973
+ b->stack_size += attr_sp_inc_send(cd, blockiseq);
2007
1974
 
2008
1975
  fprintf(f, "}\n");
2009
1976
  break;
@@ -2013,23 +1980,19 @@ switch (insn) {
2013
1980
  fprintf(f, "{\n");
2014
1981
  {
2015
1982
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2016
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2017
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2018
- MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[2];
1983
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
1984
+ MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[1];
2019
1985
  if (status->local_stack_p) {
2020
1986
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2021
1987
  }
2022
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2023
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
1988
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2024
1989
  fprintf(f, " MAYBE_UNUSED(ISEQ) blockiseq;\n");
2025
1990
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2026
1991
 
2027
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2028
- comment_id(f, ((CALL_INFO)operands[0])->mid);
2029
- fprintf(f, "\n");
2030
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
1992
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
1993
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
2031
1994
  fprintf(f, "\n");
2032
- fprintf(f, " blockiseq = (ISEQ)0x%"PRIxVALUE";", operands[2]);
1995
+ fprintf(f, " blockiseq = (ISEQ)0x%"PRIxVALUE";", operands[1]);
2033
1996
  fprintf(f, "\n");
2034
1997
  if (body->catch_except_p || TRUE) {
2035
1998
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2038,7 +2001,7 @@ switch (insn) {
2038
2001
  if (status->local_stack_p) {
2039
2002
  {
2040
2003
  rb_snum_t i, push_size;
2041
- push_size = -attr_sp_inc_send(ci, cc, blockiseq) + 1 - 0;
2004
+ push_size = -attr_sp_inc_send(cd, blockiseq) + 1 - 0;
2042
2005
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2043
2006
  for (i = 0; i < push_size; i++) {
2044
2007
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2049,8 +2012,8 @@ switch (insn) {
2049
2012
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size - 0); /* POPN(INSN_ATTR(popn)); */
2050
2013
  }
2051
2014
  fprintf(f, " {\n");
2052
- fprintf(f, " VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), ci, blockiseq, false);\n");
2053
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
2015
+ fprintf(f, " VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), &cd->ci, blockiseq, false);\n");
2016
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
2054
2017
  fprintf(f, "\n");
2055
2018
  fprintf(f, " if (val == Qundef) {\n");
2056
2019
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -2062,27 +2025,27 @@ switch (insn) {
2062
2025
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
2063
2026
  fprintf(f, " }\n");
2064
2027
  fprintf(f, " }\n");
2065
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_send(ci, cc, blockiseq) - 1);
2028
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_send(cd, blockiseq) - 1);
2066
2029
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2067
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_send(ci, cc, blockiseq));
2030
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_send(cd, blockiseq));
2068
2031
  if (!pc_moved_p) {
2069
2032
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2070
2033
  }
2071
2034
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
2072
2035
  fprintf(f, " goto cancel;\n");
2073
2036
  fprintf(f, " }\n");
2074
- b->stack_size += attr_sp_inc_send(ci, cc, blockiseq);
2037
+ b->stack_size += attr_sp_inc_send(cd, blockiseq);
2075
2038
  }
2076
2039
  fprintf(f, "}\n");
2077
2040
  break;
2078
2041
  case BIN(opt_send_without_block):
2079
2042
  {
2080
2043
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2081
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2082
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2083
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
2044
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2045
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
2084
2046
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
2085
2047
  const rb_iseq_t *iseq;
2048
+ const CALL_INFO ci = &cd->ci;
2086
2049
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
2087
2050
 
2088
2051
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -2095,7 +2058,7 @@ switch (insn) {
2095
2058
  }
2096
2059
 
2097
2060
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
2098
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
2061
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
2099
2062
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2100
2063
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
2101
2064
  fprintf(f, " goto send_cancel;\n");
@@ -2108,7 +2071,7 @@ switch (insn) {
2108
2071
  if (status->local_stack_p) {
2109
2072
  {
2110
2073
  rb_snum_t i, push_size;
2111
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
2074
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
2112
2075
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2113
2076
  for (i = 0; i < push_size; i++) {
2114
2077
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2154,7 +2117,7 @@ switch (insn) {
2154
2117
  fprintf(f, " }\n");
2155
2118
 
2156
2119
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2157
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
2120
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
2158
2121
  if (!pc_moved_p) {
2159
2122
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2160
2123
  }
@@ -2163,7 +2126,7 @@ switch (insn) {
2163
2126
  fprintf(f, " }\n");
2164
2127
  }
2165
2128
 
2166
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
2129
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
2167
2130
 
2168
2131
  fprintf(f, "}\n");
2169
2132
  break;
@@ -2173,19 +2136,15 @@ switch (insn) {
2173
2136
  fprintf(f, "{\n");
2174
2137
  {
2175
2138
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2176
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2177
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2139
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2178
2140
  if (status->local_stack_p) {
2179
2141
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2180
2142
  }
2181
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2182
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2143
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2183
2144
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2184
2145
 
2185
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2186
- comment_id(f, ((CALL_INFO)operands[0])->mid);
2187
- fprintf(f, "\n");
2188
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2146
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
2147
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
2189
2148
  fprintf(f, "\n");
2190
2149
  if (body->catch_except_p || TRUE) {
2191
2150
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2194,7 +2153,7 @@ switch (insn) {
2194
2153
  if (status->local_stack_p) {
2195
2154
  {
2196
2155
  rb_snum_t i, push_size;
2197
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
2156
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
2198
2157
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2199
2158
  for (i = 0; i < push_size; i++) {
2200
2159
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2206,7 +2165,7 @@ switch (insn) {
2206
2165
  }
2207
2166
  fprintf(f, " {\n");
2208
2167
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
2209
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
2168
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
2210
2169
  fprintf(f, "\n");
2211
2170
  fprintf(f, " if (val == Qundef) {\n");
2212
2171
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -2218,16 +2177,16 @@ switch (insn) {
2218
2177
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
2219
2178
  fprintf(f, " }\n");
2220
2179
  fprintf(f, " }\n");
2221
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
2180
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
2222
2181
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2223
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
2182
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
2224
2183
  if (!pc_moved_p) {
2225
2184
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2226
2185
  }
2227
2186
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
2228
2187
  fprintf(f, " goto cancel;\n");
2229
2188
  fprintf(f, " }\n");
2230
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
2189
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
2231
2190
  }
2232
2191
  fprintf(f, "}\n");
2233
2192
  break;
@@ -2236,22 +2195,18 @@ switch (insn) {
2236
2195
  {
2237
2196
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2238
2197
  MAYBE_UNUSED(VALUE str) = (VALUE)operands[0];
2239
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
2240
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
2198
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[1];
2241
2199
  if (status->local_stack_p) {
2242
2200
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2243
2201
  }
2244
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2245
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2202
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2246
2203
  fprintf(f, " MAYBE_UNUSED(VALUE) str, val;\n");
2247
2204
 
2248
2205
  fprintf(f, " str = (VALUE)0x%"PRIxVALUE";", operands[0]);
2249
2206
  if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
2250
2207
  fprintf(f, "\n");
2251
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
2252
- comment_id(f, ((CALL_INFO)operands[1])->mid);
2253
- fprintf(f, "\n");
2254
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
2208
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[1]);
2209
+ comment_id(f, ((CALL_DATA)operands[1])->ci.mid);
2255
2210
  fprintf(f, "\n");
2256
2211
  if (body->catch_except_p || FALSE) {
2257
2212
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2275,20 +2230,20 @@ switch (insn) {
2275
2230
  fprintf(f, " goto cancel;\n");
2276
2231
  fprintf(f, " }\n");
2277
2232
  fprintf(f, " }\n");
2278
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_str_freeze(str, ci, cc) - 1);
2279
- b->stack_size += attr_sp_inc_opt_str_freeze(str, ci, cc);
2233
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_str_freeze(str, cd) - 1);
2234
+ b->stack_size += attr_sp_inc_opt_str_freeze(str, cd);
2280
2235
  }
2281
2236
  fprintf(f, "}\n");
2282
2237
  break;
2283
2238
  case BIN(opt_nil_p):
2284
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
2239
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
2285
2240
  {
2286
2241
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2287
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2288
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2289
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
2242
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2243
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
2290
2244
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
2291
2245
  const rb_iseq_t *iseq;
2246
+ const CALL_INFO ci = &cd->ci;
2292
2247
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
2293
2248
 
2294
2249
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -2301,7 +2256,7 @@ switch (insn) {
2301
2256
  }
2302
2257
 
2303
2258
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
2304
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
2259
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
2305
2260
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
2306
2261
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
2307
2262
  fprintf(f, " goto send_cancel;\n");
@@ -2314,7 +2269,7 @@ switch (insn) {
2314
2269
  if (status->local_stack_p) {
2315
2270
  {
2316
2271
  rb_snum_t i, push_size;
2317
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
2272
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
2318
2273
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2319
2274
  for (i = 0; i < push_size; i++) {
2320
2275
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2360,7 +2315,7 @@ switch (insn) {
2360
2315
  fprintf(f, " }\n");
2361
2316
 
2362
2317
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2363
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
2318
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
2364
2319
  if (!pc_moved_p) {
2365
2320
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2366
2321
  }
@@ -2369,7 +2324,7 @@ switch (insn) {
2369
2324
  fprintf(f, " }\n");
2370
2325
  }
2371
2326
 
2372
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
2327
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
2373
2328
 
2374
2329
  fprintf(f, "}\n");
2375
2330
  break;
@@ -2379,19 +2334,15 @@ switch (insn) {
2379
2334
  fprintf(f, "{\n");
2380
2335
  {
2381
2336
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2382
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2383
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2337
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2384
2338
  if (status->local_stack_p) {
2385
2339
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2386
2340
  }
2387
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2388
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2341
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2389
2342
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2390
2343
 
2391
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2392
- comment_id(f, ((CALL_INFO)operands[0])->mid);
2393
- fprintf(f, "\n");
2394
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2344
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
2345
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
2395
2346
  fprintf(f, "\n");
2396
2347
  if (body->catch_except_p || TRUE) {
2397
2348
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2400,7 +2351,7 @@ switch (insn) {
2400
2351
  if (status->local_stack_p) {
2401
2352
  {
2402
2353
  rb_snum_t i, push_size;
2403
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
2354
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
2404
2355
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2405
2356
  for (i = 0; i < push_size; i++) {
2406
2357
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2412,7 +2363,7 @@ switch (insn) {
2412
2363
  }
2413
2364
  fprintf(f, " {\n");
2414
2365
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
2415
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
2366
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
2416
2367
  fprintf(f, "\n");
2417
2368
  fprintf(f, " if (val == Qundef) {\n");
2418
2369
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -2424,16 +2375,16 @@ switch (insn) {
2424
2375
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
2425
2376
  fprintf(f, " }\n");
2426
2377
  fprintf(f, " }\n");
2427
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
2378
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
2428
2379
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2429
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
2380
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
2430
2381
  if (!pc_moved_p) {
2431
2382
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2432
2383
  }
2433
2384
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
2434
2385
  fprintf(f, " goto cancel;\n");
2435
2386
  fprintf(f, " }\n");
2436
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
2387
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
2437
2388
  }
2438
2389
  fprintf(f, "}\n");
2439
2390
  break;
@@ -2441,19 +2392,15 @@ switch (insn) {
2441
2392
  fprintf(f, "{\n");
2442
2393
  {
2443
2394
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2444
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2445
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2395
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2446
2396
  if (status->local_stack_p) {
2447
2397
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2448
2398
  }
2449
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2450
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2399
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2451
2400
  fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
2452
2401
 
2453
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2454
- comment_id(f, ((CALL_INFO)operands[0])->mid);
2455
- fprintf(f, "\n");
2456
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2402
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
2403
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
2457
2404
  fprintf(f, "\n");
2458
2405
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
2459
2406
  if (body->catch_except_p || FALSE) {
@@ -2466,7 +2413,7 @@ switch (insn) {
2466
2413
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
2467
2414
  }
2468
2415
  fprintf(f, " {\n");
2469
- fprintf(f, " val = vm_opt_nil_p(ci, cc, recv);\n");
2416
+ fprintf(f, " val = vm_opt_nil_p(cd, recv);\n");
2470
2417
  fprintf(f, "\n");
2471
2418
  fprintf(f, " if (val == Qundef) {\n");
2472
2419
  if (status->local_stack_p) {
@@ -2477,8 +2424,8 @@ switch (insn) {
2477
2424
  fprintf(f, " goto cancel;\n");
2478
2425
  fprintf(f, " }\n");
2479
2426
  fprintf(f, " }\n");
2480
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_nil_p(ci, cc) - 1);
2481
- b->stack_size += attr_sp_inc_opt_nil_p(ci, cc);
2427
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_nil_p(cd) - 1);
2428
+ b->stack_size += attr_sp_inc_opt_nil_p(cd);
2482
2429
  }
2483
2430
  fprintf(f, "}\n");
2484
2431
  break;
@@ -2487,22 +2434,18 @@ switch (insn) {
2487
2434
  {
2488
2435
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2489
2436
  MAYBE_UNUSED(VALUE str) = (VALUE)operands[0];
2490
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
2491
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
2437
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[1];
2492
2438
  if (status->local_stack_p) {
2493
2439
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2494
2440
  }
2495
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2496
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2441
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2497
2442
  fprintf(f, " MAYBE_UNUSED(VALUE) str, val;\n");
2498
2443
 
2499
2444
  fprintf(f, " str = (VALUE)0x%"PRIxVALUE";", operands[0]);
2500
2445
  if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
2501
2446
  fprintf(f, "\n");
2502
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
2503
- comment_id(f, ((CALL_INFO)operands[1])->mid);
2504
- fprintf(f, "\n");
2505
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
2447
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[1]);
2448
+ comment_id(f, ((CALL_DATA)operands[1])->ci.mid);
2506
2449
  fprintf(f, "\n");
2507
2450
  if (body->catch_except_p || FALSE) {
2508
2451
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2526,8 +2469,8 @@ switch (insn) {
2526
2469
  fprintf(f, " goto cancel;\n");
2527
2470
  fprintf(f, " }\n");
2528
2471
  fprintf(f, " }\n");
2529
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_str_uminus(str, ci, cc) - 1);
2530
- b->stack_size += attr_sp_inc_opt_str_uminus(str, ci, cc);
2472
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_str_uminus(str, cd) - 1);
2473
+ b->stack_size += attr_sp_inc_opt_str_uminus(str, cd);
2531
2474
  }
2532
2475
  fprintf(f, "}\n");
2533
2476
  break;
@@ -2613,23 +2556,19 @@ switch (insn) {
2613
2556
  fprintf(f, "{\n");
2614
2557
  {
2615
2558
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2616
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2617
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
2618
- MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[2];
2559
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2560
+ MAYBE_UNUSED(ISEQ blockiseq) = (ISEQ)operands[1];
2619
2561
  if (status->local_stack_p) {
2620
2562
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2621
2563
  }
2622
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
2623
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2564
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2624
2565
  fprintf(f, " MAYBE_UNUSED(ISEQ) blockiseq;\n");
2625
2566
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2626
2567
 
2627
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2628
- comment_id(f, ((CALL_INFO)operands[0])->mid);
2629
- fprintf(f, "\n");
2630
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
2568
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
2569
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
2631
2570
  fprintf(f, "\n");
2632
- fprintf(f, " blockiseq = (ISEQ)0x%"PRIxVALUE";", operands[2]);
2571
+ fprintf(f, " blockiseq = (ISEQ)0x%"PRIxVALUE";", operands[1]);
2633
2572
  fprintf(f, "\n");
2634
2573
  if (body->catch_except_p || TRUE) {
2635
2574
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2638,7 +2577,7 @@ switch (insn) {
2638
2577
  if (status->local_stack_p) {
2639
2578
  {
2640
2579
  rb_snum_t i, push_size;
2641
- push_size = -attr_sp_inc_invokesuper(ci, cc, blockiseq) + 1 - 0;
2580
+ push_size = -attr_sp_inc_invokesuper(cd, blockiseq) + 1 - 0;
2642
2581
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2643
2582
  for (i = 0; i < push_size; i++) {
2644
2583
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2649,8 +2588,8 @@ switch (insn) {
2649
2588
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size - 0); /* POPN(INSN_ATTR(popn)); */
2650
2589
  }
2651
2590
  fprintf(f, " {\n");
2652
- fprintf(f, " VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), ci, blockiseq, true);\n");
2653
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_super_method);\n");
2591
+ fprintf(f, " VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), &cd->ci, blockiseq, true);\n");
2592
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_super_method);\n");
2654
2593
  fprintf(f, "\n");
2655
2594
  fprintf(f, " if (val == Qundef) {\n");
2656
2595
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -2662,16 +2601,16 @@ switch (insn) {
2662
2601
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
2663
2602
  fprintf(f, " }\n");
2664
2603
  fprintf(f, " }\n");
2665
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_invokesuper(ci, cc, blockiseq) - 1);
2604
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_invokesuper(cd, blockiseq) - 1);
2666
2605
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2667
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_invokesuper(ci, cc, blockiseq));
2606
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_invokesuper(cd, blockiseq));
2668
2607
  if (!pc_moved_p) {
2669
2608
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2670
2609
  }
2671
2610
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
2672
2611
  fprintf(f, " goto cancel;\n");
2673
2612
  fprintf(f, " }\n");
2674
- b->stack_size += attr_sp_inc_invokesuper(ci, cc, blockiseq);
2613
+ b->stack_size += attr_sp_inc_invokesuper(cd, blockiseq);
2675
2614
  }
2676
2615
  fprintf(f, "}\n");
2677
2616
  break;
@@ -2679,15 +2618,15 @@ switch (insn) {
2679
2618
  fprintf(f, "{\n");
2680
2619
  {
2681
2620
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
2682
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
2621
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
2683
2622
  if (status->local_stack_p) {
2684
2623
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
2685
2624
  }
2686
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
2625
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
2687
2626
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
2688
2627
 
2689
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
2690
- comment_id(f, ((CALL_INFO)operands[0])->mid);
2628
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
2629
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
2691
2630
  fprintf(f, "\n");
2692
2631
  if (body->catch_except_p || TRUE) {
2693
2632
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -2696,7 +2635,7 @@ switch (insn) {
2696
2635
  if (status->local_stack_p) {
2697
2636
  {
2698
2637
  rb_snum_t i, push_size;
2699
- push_size = -attr_sp_inc_invokeblock(ci) + 1 - 0;
2638
+ push_size = -attr_sp_inc_invokeblock(cd) + 1 - 0;
2700
2639
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
2701
2640
  for (i = 0; i < push_size; i++) {
2702
2641
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -2707,12 +2646,12 @@ switch (insn) {
2707
2646
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size - 0); /* POPN(INSN_ATTR(popn)); */
2708
2647
  }
2709
2648
  fprintf(f, " {\n");
2710
- fprintf(f, " static struct rb_call_cache cc = {\n");
2711
- fprintf(f, " 0, 0, NULL, NULL, vm_invokeblock_i,\n");
2712
- fprintf(f, " };\n");
2649
+ fprintf(f, " if (UNLIKELY(cd->cc.call != vm_invokeblock_i)) {\n");
2650
+ fprintf(f, " cd->cc.call = vm_invokeblock_i; // check before setting to avoid CoW\n");
2651
+ fprintf(f, " }\n");
2713
2652
  fprintf(f, "\n");
2714
2653
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
2715
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, &cc, bh, vm_search_invokeblock);\n");
2654
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_invokeblock);\n");
2716
2655
  fprintf(f, "\n");
2717
2656
  fprintf(f, " if (val == Qundef) {\n");
2718
2657
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -2724,16 +2663,16 @@ switch (insn) {
2724
2663
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
2725
2664
  fprintf(f, " }\n");
2726
2665
  fprintf(f, " }\n");
2727
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_invokeblock(ci) - 1);
2666
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_invokeblock(cd) - 1);
2728
2667
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
2729
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_invokeblock(ci));
2668
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_invokeblock(cd));
2730
2669
  if (!pc_moved_p) {
2731
2670
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
2732
2671
  }
2733
2672
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
2734
2673
  fprintf(f, " goto cancel;\n");
2735
2674
  fprintf(f, " }\n");
2736
- b->stack_size += attr_sp_inc_invokeblock(ci);
2675
+ b->stack_size += attr_sp_inc_invokeblock(cd);
2737
2676
  }
2738
2677
  fprintf(f, "}\n");
2739
2678
  break;
@@ -2782,8 +2721,6 @@ switch (insn) {
2782
2721
  fprintf(f, " }\n");
2783
2722
  fprintf(f, " }\n");
2784
2723
  fprintf(f, "\n");
2785
- fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2786
- fprintf(f, "\n");
2787
2724
  fprintf(f, " if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {\n");
2788
2725
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
2789
2726
  fprintf(f, " rb_ec_thread_ptr(ec)->retval = val;\n");
@@ -2839,7 +2776,6 @@ switch (insn) {
2839
2776
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
2840
2777
  }
2841
2778
  fprintf(f, " {\n");
2842
- fprintf(f, " RUBY_VM_CHECK_INTS(ec);\n");
2843
2779
  fprintf(f, " val = vm_throw(ec, GET_CFP(), throw_state, throwobj);\n");
2844
2780
  fprintf(f, " THROW_EXCEPTION(val);\n");
2845
2781
  fprintf(f, " /* unreachable */\n");
@@ -3053,7 +2989,7 @@ switch (insn) {
3053
2989
  }
3054
2990
  fprintf(f, " {\n");
3055
2991
  fprintf(f, " if (vm_ic_hit_p(ic, GET_EP())) {\n");
3056
- fprintf(f, " val = ic->ic_value.value;\n");
2992
+ fprintf(f, " val = ic->value;\n");
3057
2993
  fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_getinlinecache(dst, ic) - 1);
3058
2994
  next_pos = pos + insn_len(insn) + (unsigned int)dst;
3059
2995
  fprintf(f, " goto label_%d;\n", next_pos);
@@ -3200,14 +3136,14 @@ switch (insn) {
3200
3136
  compile_insns(f, body, b->stack_size, pos + insn_len(insn), status);
3201
3137
  break;
3202
3138
  case BIN(opt_plus):
3203
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
3139
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
3204
3140
  {
3205
3141
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3206
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3207
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3208
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
3142
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3143
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
3209
3144
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
3210
3145
  const rb_iseq_t *iseq;
3146
+ const CALL_INFO ci = &cd->ci;
3211
3147
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
3212
3148
 
3213
3149
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -3220,7 +3156,7 @@ switch (insn) {
3220
3156
  }
3221
3157
 
3222
3158
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
3223
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
3159
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
3224
3160
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3225
3161
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
3226
3162
  fprintf(f, " goto send_cancel;\n");
@@ -3233,7 +3169,7 @@ switch (insn) {
3233
3169
  if (status->local_stack_p) {
3234
3170
  {
3235
3171
  rb_snum_t i, push_size;
3236
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3172
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3237
3173
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3238
3174
  for (i = 0; i < push_size; i++) {
3239
3175
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3279,7 +3215,7 @@ switch (insn) {
3279
3215
  fprintf(f, " }\n");
3280
3216
 
3281
3217
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3282
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3218
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3283
3219
  if (!pc_moved_p) {
3284
3220
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3285
3221
  }
@@ -3288,7 +3224,7 @@ switch (insn) {
3288
3224
  fprintf(f, " }\n");
3289
3225
  }
3290
3226
 
3291
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3227
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3292
3228
 
3293
3229
  fprintf(f, "}\n");
3294
3230
  break;
@@ -3298,19 +3234,15 @@ switch (insn) {
3298
3234
  fprintf(f, "{\n");
3299
3235
  {
3300
3236
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3301
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3302
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3237
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3303
3238
  if (status->local_stack_p) {
3304
3239
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3305
3240
  }
3306
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3307
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3241
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3308
3242
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
3309
3243
 
3310
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3311
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3312
- fprintf(f, "\n");
3313
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3244
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3245
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3314
3246
  fprintf(f, "\n");
3315
3247
  if (body->catch_except_p || TRUE) {
3316
3248
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -3319,7 +3251,7 @@ switch (insn) {
3319
3251
  if (status->local_stack_p) {
3320
3252
  {
3321
3253
  rb_snum_t i, push_size;
3322
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3254
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3323
3255
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3324
3256
  for (i = 0; i < push_size; i++) {
3325
3257
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3331,7 +3263,7 @@ switch (insn) {
3331
3263
  }
3332
3264
  fprintf(f, " {\n");
3333
3265
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
3334
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
3266
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
3335
3267
  fprintf(f, "\n");
3336
3268
  fprintf(f, " if (val == Qundef) {\n");
3337
3269
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -3343,16 +3275,16 @@ switch (insn) {
3343
3275
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
3344
3276
  fprintf(f, " }\n");
3345
3277
  fprintf(f, " }\n");
3346
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
3278
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
3347
3279
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3348
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3280
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3349
3281
  if (!pc_moved_p) {
3350
3282
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3351
3283
  }
3352
3284
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
3353
3285
  fprintf(f, " goto cancel;\n");
3354
3286
  fprintf(f, " }\n");
3355
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3287
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3356
3288
  }
3357
3289
  fprintf(f, "}\n");
3358
3290
  break;
@@ -3360,19 +3292,15 @@ switch (insn) {
3360
3292
  fprintf(f, "{\n");
3361
3293
  {
3362
3294
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3363
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3364
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3295
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3365
3296
  if (status->local_stack_p) {
3366
3297
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3367
3298
  }
3368
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3369
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3299
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3370
3300
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3371
3301
 
3372
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3373
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3374
- fprintf(f, "\n");
3375
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3302
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3303
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3376
3304
  fprintf(f, "\n");
3377
3305
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3378
3306
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -3397,20 +3325,20 @@ switch (insn) {
3397
3325
  fprintf(f, " goto cancel;\n");
3398
3326
  fprintf(f, " }\n");
3399
3327
  fprintf(f, " }\n");
3400
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_plus(ci, cc) - 1);
3401
- b->stack_size += attr_sp_inc_opt_plus(ci, cc);
3328
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_plus(cd) - 1);
3329
+ b->stack_size += attr_sp_inc_opt_plus(cd);
3402
3330
  }
3403
3331
  fprintf(f, "}\n");
3404
3332
  break;
3405
3333
  case BIN(opt_minus):
3406
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
3334
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
3407
3335
  {
3408
3336
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3409
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3410
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3411
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
3337
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3338
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
3412
3339
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
3413
3340
  const rb_iseq_t *iseq;
3341
+ const CALL_INFO ci = &cd->ci;
3414
3342
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
3415
3343
 
3416
3344
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -3423,7 +3351,7 @@ switch (insn) {
3423
3351
  }
3424
3352
 
3425
3353
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
3426
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
3354
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
3427
3355
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3428
3356
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
3429
3357
  fprintf(f, " goto send_cancel;\n");
@@ -3436,7 +3364,7 @@ switch (insn) {
3436
3364
  if (status->local_stack_p) {
3437
3365
  {
3438
3366
  rb_snum_t i, push_size;
3439
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3367
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3440
3368
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3441
3369
  for (i = 0; i < push_size; i++) {
3442
3370
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3482,7 +3410,7 @@ switch (insn) {
3482
3410
  fprintf(f, " }\n");
3483
3411
 
3484
3412
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3485
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3413
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3486
3414
  if (!pc_moved_p) {
3487
3415
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3488
3416
  }
@@ -3491,7 +3419,7 @@ switch (insn) {
3491
3419
  fprintf(f, " }\n");
3492
3420
  }
3493
3421
 
3494
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3422
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3495
3423
 
3496
3424
  fprintf(f, "}\n");
3497
3425
  break;
@@ -3501,19 +3429,15 @@ switch (insn) {
3501
3429
  fprintf(f, "{\n");
3502
3430
  {
3503
3431
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3504
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3505
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3432
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3506
3433
  if (status->local_stack_p) {
3507
3434
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3508
3435
  }
3509
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3510
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3436
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3511
3437
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
3512
3438
 
3513
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3514
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3515
- fprintf(f, "\n");
3516
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3439
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3440
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3517
3441
  fprintf(f, "\n");
3518
3442
  if (body->catch_except_p || TRUE) {
3519
3443
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -3522,7 +3446,7 @@ switch (insn) {
3522
3446
  if (status->local_stack_p) {
3523
3447
  {
3524
3448
  rb_snum_t i, push_size;
3525
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3449
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3526
3450
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3527
3451
  for (i = 0; i < push_size; i++) {
3528
3452
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3534,7 +3458,7 @@ switch (insn) {
3534
3458
  }
3535
3459
  fprintf(f, " {\n");
3536
3460
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
3537
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
3461
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
3538
3462
  fprintf(f, "\n");
3539
3463
  fprintf(f, " if (val == Qundef) {\n");
3540
3464
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -3546,16 +3470,16 @@ switch (insn) {
3546
3470
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
3547
3471
  fprintf(f, " }\n");
3548
3472
  fprintf(f, " }\n");
3549
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
3473
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
3550
3474
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3551
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3475
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3552
3476
  if (!pc_moved_p) {
3553
3477
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3554
3478
  }
3555
3479
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
3556
3480
  fprintf(f, " goto cancel;\n");
3557
3481
  fprintf(f, " }\n");
3558
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3482
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3559
3483
  }
3560
3484
  fprintf(f, "}\n");
3561
3485
  break;
@@ -3563,19 +3487,15 @@ switch (insn) {
3563
3487
  fprintf(f, "{\n");
3564
3488
  {
3565
3489
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3566
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3567
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3490
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3568
3491
  if (status->local_stack_p) {
3569
3492
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3570
3493
  }
3571
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3572
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3494
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3573
3495
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3574
3496
 
3575
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3576
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3577
- fprintf(f, "\n");
3578
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3497
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3498
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3579
3499
  fprintf(f, "\n");
3580
3500
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3581
3501
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -3600,20 +3520,20 @@ switch (insn) {
3600
3520
  fprintf(f, " goto cancel;\n");
3601
3521
  fprintf(f, " }\n");
3602
3522
  fprintf(f, " }\n");
3603
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_minus(ci, cc) - 1);
3604
- b->stack_size += attr_sp_inc_opt_minus(ci, cc);
3523
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_minus(cd) - 1);
3524
+ b->stack_size += attr_sp_inc_opt_minus(cd);
3605
3525
  }
3606
3526
  fprintf(f, "}\n");
3607
3527
  break;
3608
3528
  case BIN(opt_mult):
3609
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
3529
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
3610
3530
  {
3611
3531
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3612
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3613
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3614
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
3532
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3533
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
3615
3534
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
3616
3535
  const rb_iseq_t *iseq;
3536
+ const CALL_INFO ci = &cd->ci;
3617
3537
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
3618
3538
 
3619
3539
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -3626,7 +3546,7 @@ switch (insn) {
3626
3546
  }
3627
3547
 
3628
3548
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
3629
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
3549
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
3630
3550
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3631
3551
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
3632
3552
  fprintf(f, " goto send_cancel;\n");
@@ -3639,7 +3559,7 @@ switch (insn) {
3639
3559
  if (status->local_stack_p) {
3640
3560
  {
3641
3561
  rb_snum_t i, push_size;
3642
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3562
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3643
3563
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3644
3564
  for (i = 0; i < push_size; i++) {
3645
3565
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3685,7 +3605,7 @@ switch (insn) {
3685
3605
  fprintf(f, " }\n");
3686
3606
 
3687
3607
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3688
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3608
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3689
3609
  if (!pc_moved_p) {
3690
3610
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3691
3611
  }
@@ -3694,7 +3614,7 @@ switch (insn) {
3694
3614
  fprintf(f, " }\n");
3695
3615
  }
3696
3616
 
3697
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3617
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3698
3618
 
3699
3619
  fprintf(f, "}\n");
3700
3620
  break;
@@ -3704,19 +3624,15 @@ switch (insn) {
3704
3624
  fprintf(f, "{\n");
3705
3625
  {
3706
3626
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3707
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3708
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3627
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3709
3628
  if (status->local_stack_p) {
3710
3629
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3711
3630
  }
3712
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3713
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3631
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3714
3632
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
3715
3633
 
3716
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3717
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3718
- fprintf(f, "\n");
3719
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3634
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3635
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3720
3636
  fprintf(f, "\n");
3721
3637
  if (body->catch_except_p || TRUE) {
3722
3638
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -3725,7 +3641,7 @@ switch (insn) {
3725
3641
  if (status->local_stack_p) {
3726
3642
  {
3727
3643
  rb_snum_t i, push_size;
3728
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3644
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3729
3645
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3730
3646
  for (i = 0; i < push_size; i++) {
3731
3647
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3737,7 +3653,7 @@ switch (insn) {
3737
3653
  }
3738
3654
  fprintf(f, " {\n");
3739
3655
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
3740
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
3656
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
3741
3657
  fprintf(f, "\n");
3742
3658
  fprintf(f, " if (val == Qundef) {\n");
3743
3659
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -3749,16 +3665,16 @@ switch (insn) {
3749
3665
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
3750
3666
  fprintf(f, " }\n");
3751
3667
  fprintf(f, " }\n");
3752
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
3668
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
3753
3669
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3754
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3670
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3755
3671
  if (!pc_moved_p) {
3756
3672
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3757
3673
  }
3758
3674
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
3759
3675
  fprintf(f, " goto cancel;\n");
3760
3676
  fprintf(f, " }\n");
3761
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3677
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3762
3678
  }
3763
3679
  fprintf(f, "}\n");
3764
3680
  break;
@@ -3766,19 +3682,15 @@ switch (insn) {
3766
3682
  fprintf(f, "{\n");
3767
3683
  {
3768
3684
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3769
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3770
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3685
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3771
3686
  if (status->local_stack_p) {
3772
3687
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3773
3688
  }
3774
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3775
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3689
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3776
3690
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3777
3691
 
3778
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3779
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3780
- fprintf(f, "\n");
3781
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3692
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3693
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3782
3694
  fprintf(f, "\n");
3783
3695
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3784
3696
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -3803,20 +3715,20 @@ switch (insn) {
3803
3715
  fprintf(f, " goto cancel;\n");
3804
3716
  fprintf(f, " }\n");
3805
3717
  fprintf(f, " }\n");
3806
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_mult(ci, cc) - 1);
3807
- b->stack_size += attr_sp_inc_opt_mult(ci, cc);
3718
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_mult(cd) - 1);
3719
+ b->stack_size += attr_sp_inc_opt_mult(cd);
3808
3720
  }
3809
3721
  fprintf(f, "}\n");
3810
3722
  break;
3811
3723
  case BIN(opt_div):
3812
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
3724
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
3813
3725
  {
3814
3726
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3815
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3816
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3817
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
3727
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3728
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
3818
3729
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
3819
3730
  const rb_iseq_t *iseq;
3731
+ const CALL_INFO ci = &cd->ci;
3820
3732
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
3821
3733
 
3822
3734
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -3829,7 +3741,7 @@ switch (insn) {
3829
3741
  }
3830
3742
 
3831
3743
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
3832
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
3744
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
3833
3745
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
3834
3746
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
3835
3747
  fprintf(f, " goto send_cancel;\n");
@@ -3842,7 +3754,7 @@ switch (insn) {
3842
3754
  if (status->local_stack_p) {
3843
3755
  {
3844
3756
  rb_snum_t i, push_size;
3845
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3757
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3846
3758
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3847
3759
  for (i = 0; i < push_size; i++) {
3848
3760
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3888,7 +3800,7 @@ switch (insn) {
3888
3800
  fprintf(f, " }\n");
3889
3801
 
3890
3802
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3891
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3803
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3892
3804
  if (!pc_moved_p) {
3893
3805
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3894
3806
  }
@@ -3897,7 +3809,7 @@ switch (insn) {
3897
3809
  fprintf(f, " }\n");
3898
3810
  }
3899
3811
 
3900
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3812
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3901
3813
 
3902
3814
  fprintf(f, "}\n");
3903
3815
  break;
@@ -3907,19 +3819,15 @@ switch (insn) {
3907
3819
  fprintf(f, "{\n");
3908
3820
  {
3909
3821
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3910
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3911
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3822
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3912
3823
  if (status->local_stack_p) {
3913
3824
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3914
3825
  }
3915
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3916
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3826
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3917
3827
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
3918
3828
 
3919
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3920
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3921
- fprintf(f, "\n");
3922
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3829
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3830
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3923
3831
  fprintf(f, "\n");
3924
3832
  if (body->catch_except_p || TRUE) {
3925
3833
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -3928,7 +3836,7 @@ switch (insn) {
3928
3836
  if (status->local_stack_p) {
3929
3837
  {
3930
3838
  rb_snum_t i, push_size;
3931
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3839
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
3932
3840
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
3933
3841
  for (i = 0; i < push_size; i++) {
3934
3842
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -3940,7 +3848,7 @@ switch (insn) {
3940
3848
  }
3941
3849
  fprintf(f, " {\n");
3942
3850
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
3943
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
3851
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
3944
3852
  fprintf(f, "\n");
3945
3853
  fprintf(f, " if (val == Qundef) {\n");
3946
3854
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -3952,16 +3860,16 @@ switch (insn) {
3952
3860
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
3953
3861
  fprintf(f, " }\n");
3954
3862
  fprintf(f, " }\n");
3955
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
3863
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
3956
3864
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
3957
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
3865
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
3958
3866
  if (!pc_moved_p) {
3959
3867
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
3960
3868
  }
3961
3869
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
3962
3870
  fprintf(f, " goto cancel;\n");
3963
3871
  fprintf(f, " }\n");
3964
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
3872
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
3965
3873
  }
3966
3874
  fprintf(f, "}\n");
3967
3875
  break;
@@ -3969,19 +3877,15 @@ switch (insn) {
3969
3877
  fprintf(f, "{\n");
3970
3878
  {
3971
3879
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
3972
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
3973
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
3880
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3974
3881
  if (status->local_stack_p) {
3975
3882
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
3976
3883
  }
3977
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
3978
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
3884
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
3979
3885
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
3980
3886
 
3981
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
3982
- comment_id(f, ((CALL_INFO)operands[0])->mid);
3983
- fprintf(f, "\n");
3984
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
3887
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
3888
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
3985
3889
  fprintf(f, "\n");
3986
3890
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
3987
3891
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -4006,28 +3910,28 @@ switch (insn) {
4006
3910
  fprintf(f, " goto cancel;\n");
4007
3911
  fprintf(f, " }\n");
4008
3912
  fprintf(f, " }\n");
4009
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_div(ci, cc) - 1);
3913
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_div(cd) - 1);
4010
3914
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4011
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_div(ci, cc));
3915
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_div(cd));
4012
3916
  if (!pc_moved_p) {
4013
3917
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4014
3918
  }
4015
3919
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
4016
3920
  fprintf(f, " goto cancel;\n");
4017
3921
  fprintf(f, " }\n");
4018
- b->stack_size += attr_sp_inc_opt_div(ci, cc);
3922
+ b->stack_size += attr_sp_inc_opt_div(cd);
4019
3923
  }
4020
3924
  fprintf(f, "}\n");
4021
3925
  break;
4022
3926
  case BIN(opt_mod):
4023
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
3927
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
4024
3928
  {
4025
3929
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4026
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4027
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4028
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
3930
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
3931
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
4029
3932
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
4030
3933
  const rb_iseq_t *iseq;
3934
+ const CALL_INFO ci = &cd->ci;
4031
3935
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
4032
3936
 
4033
3937
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -4040,7 +3944,7 @@ switch (insn) {
4040
3944
  }
4041
3945
 
4042
3946
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
4043
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
3947
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
4044
3948
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
4045
3949
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4046
3950
  fprintf(f, " goto send_cancel;\n");
@@ -4053,7 +3957,7 @@ switch (insn) {
4053
3957
  if (status->local_stack_p) {
4054
3958
  {
4055
3959
  rb_snum_t i, push_size;
4056
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
3960
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4057
3961
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4058
3962
  for (i = 0; i < push_size; i++) {
4059
3963
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4099,7 +4003,7 @@ switch (insn) {
4099
4003
  fprintf(f, " }\n");
4100
4004
 
4101
4005
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4102
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4006
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4103
4007
  if (!pc_moved_p) {
4104
4008
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4105
4009
  }
@@ -4108,7 +4012,7 @@ switch (insn) {
4108
4012
  fprintf(f, " }\n");
4109
4013
  }
4110
4014
 
4111
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4015
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4112
4016
 
4113
4017
  fprintf(f, "}\n");
4114
4018
  break;
@@ -4118,19 +4022,15 @@ switch (insn) {
4118
4022
  fprintf(f, "{\n");
4119
4023
  {
4120
4024
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4121
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4122
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4025
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4123
4026
  if (status->local_stack_p) {
4124
4027
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4125
4028
  }
4126
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4127
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4029
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4128
4030
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4129
4031
 
4130
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4131
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4132
- fprintf(f, "\n");
4133
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4032
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4033
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4134
4034
  fprintf(f, "\n");
4135
4035
  if (body->catch_except_p || TRUE) {
4136
4036
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -4139,7 +4039,7 @@ switch (insn) {
4139
4039
  if (status->local_stack_p) {
4140
4040
  {
4141
4041
  rb_snum_t i, push_size;
4142
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4042
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4143
4043
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4144
4044
  for (i = 0; i < push_size; i++) {
4145
4045
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4151,7 +4051,7 @@ switch (insn) {
4151
4051
  }
4152
4052
  fprintf(f, " {\n");
4153
4053
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
4154
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
4054
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
4155
4055
  fprintf(f, "\n");
4156
4056
  fprintf(f, " if (val == Qundef) {\n");
4157
4057
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -4163,16 +4063,16 @@ switch (insn) {
4163
4063
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
4164
4064
  fprintf(f, " }\n");
4165
4065
  fprintf(f, " }\n");
4166
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
4066
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
4167
4067
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4168
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4068
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4169
4069
  if (!pc_moved_p) {
4170
4070
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4171
4071
  }
4172
4072
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
4173
4073
  fprintf(f, " goto cancel;\n");
4174
4074
  fprintf(f, " }\n");
4175
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4075
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4176
4076
  }
4177
4077
  fprintf(f, "}\n");
4178
4078
  break;
@@ -4180,19 +4080,15 @@ switch (insn) {
4180
4080
  fprintf(f, "{\n");
4181
4081
  {
4182
4082
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4183
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4184
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4083
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4185
4084
  if (status->local_stack_p) {
4186
4085
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4187
4086
  }
4188
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4189
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4087
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4190
4088
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
4191
4089
 
4192
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4193
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4194
- fprintf(f, "\n");
4195
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4090
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4091
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4196
4092
  fprintf(f, "\n");
4197
4093
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
4198
4094
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -4217,28 +4113,28 @@ switch (insn) {
4217
4113
  fprintf(f, " goto cancel;\n");
4218
4114
  fprintf(f, " }\n");
4219
4115
  fprintf(f, " }\n");
4220
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_mod(ci, cc) - 1);
4116
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_mod(cd) - 1);
4221
4117
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4222
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_mod(ci, cc));
4118
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_mod(cd));
4223
4119
  if (!pc_moved_p) {
4224
4120
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4225
4121
  }
4226
4122
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
4227
4123
  fprintf(f, " goto cancel;\n");
4228
4124
  fprintf(f, " }\n");
4229
- b->stack_size += attr_sp_inc_opt_mod(ci, cc);
4125
+ b->stack_size += attr_sp_inc_opt_mod(cd);
4230
4126
  }
4231
4127
  fprintf(f, "}\n");
4232
4128
  break;
4233
4129
  case BIN(opt_eq):
4234
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
4130
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
4235
4131
  {
4236
4132
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4237
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4238
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4239
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
4133
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4134
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
4240
4135
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
4241
4136
  const rb_iseq_t *iseq;
4137
+ const CALL_INFO ci = &cd->ci;
4242
4138
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
4243
4139
 
4244
4140
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -4251,7 +4147,7 @@ switch (insn) {
4251
4147
  }
4252
4148
 
4253
4149
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
4254
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
4150
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
4255
4151
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
4256
4152
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4257
4153
  fprintf(f, " goto send_cancel;\n");
@@ -4264,7 +4160,7 @@ switch (insn) {
4264
4160
  if (status->local_stack_p) {
4265
4161
  {
4266
4162
  rb_snum_t i, push_size;
4267
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4163
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4268
4164
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4269
4165
  for (i = 0; i < push_size; i++) {
4270
4166
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4310,7 +4206,7 @@ switch (insn) {
4310
4206
  fprintf(f, " }\n");
4311
4207
 
4312
4208
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4313
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4209
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4314
4210
  if (!pc_moved_p) {
4315
4211
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4316
4212
  }
@@ -4319,7 +4215,7 @@ switch (insn) {
4319
4215
  fprintf(f, " }\n");
4320
4216
  }
4321
4217
 
4322
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4218
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4323
4219
 
4324
4220
  fprintf(f, "}\n");
4325
4221
  break;
@@ -4329,19 +4225,15 @@ switch (insn) {
4329
4225
  fprintf(f, "{\n");
4330
4226
  {
4331
4227
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4332
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4333
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4228
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4334
4229
  if (status->local_stack_p) {
4335
4230
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4336
4231
  }
4337
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4338
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4232
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4339
4233
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4340
4234
 
4341
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4342
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4343
- fprintf(f, "\n");
4344
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4235
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4236
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4345
4237
  fprintf(f, "\n");
4346
4238
  if (body->catch_except_p || TRUE) {
4347
4239
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -4350,7 +4242,7 @@ switch (insn) {
4350
4242
  if (status->local_stack_p) {
4351
4243
  {
4352
4244
  rb_snum_t i, push_size;
4353
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4245
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4354
4246
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4355
4247
  for (i = 0; i < push_size; i++) {
4356
4248
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4362,7 +4254,7 @@ switch (insn) {
4362
4254
  }
4363
4255
  fprintf(f, " {\n");
4364
4256
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
4365
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
4257
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
4366
4258
  fprintf(f, "\n");
4367
4259
  fprintf(f, " if (val == Qundef) {\n");
4368
4260
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -4374,16 +4266,16 @@ switch (insn) {
4374
4266
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
4375
4267
  fprintf(f, " }\n");
4376
4268
  fprintf(f, " }\n");
4377
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
4269
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
4378
4270
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4379
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4271
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4380
4272
  if (!pc_moved_p) {
4381
4273
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4382
4274
  }
4383
4275
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
4384
4276
  fprintf(f, " goto cancel;\n");
4385
4277
  fprintf(f, " }\n");
4386
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4278
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4387
4279
  }
4388
4280
  fprintf(f, "}\n");
4389
4281
  break;
@@ -4391,19 +4283,15 @@ switch (insn) {
4391
4283
  fprintf(f, "{\n");
4392
4284
  {
4393
4285
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4394
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4395
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4286
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4396
4287
  if (status->local_stack_p) {
4397
4288
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4398
4289
  }
4399
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4400
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4290
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4401
4291
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
4402
4292
 
4403
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4404
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4405
- fprintf(f, "\n");
4406
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4293
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4294
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4407
4295
  fprintf(f, "\n");
4408
4296
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
4409
4297
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -4417,7 +4305,7 @@ switch (insn) {
4417
4305
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4418
4306
  }
4419
4307
  fprintf(f, " {\n");
4420
- fprintf(f, " val = opt_eq_func(recv, obj, ci, cc);\n");
4308
+ fprintf(f, " val = opt_eq_func(recv, obj, cd);\n");
4421
4309
  fprintf(f, "\n");
4422
4310
  fprintf(f, " if (val == Qundef) {\n");
4423
4311
  if (status->local_stack_p) {
@@ -4428,8 +4316,8 @@ switch (insn) {
4428
4316
  fprintf(f, " goto cancel;\n");
4429
4317
  fprintf(f, " }\n");
4430
4318
  fprintf(f, " }\n");
4431
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_eq(ci, cc) - 1);
4432
- b->stack_size += attr_sp_inc_opt_eq(ci, cc);
4319
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_eq(cd) - 1);
4320
+ b->stack_size += attr_sp_inc_opt_eq(cd);
4433
4321
  }
4434
4322
  fprintf(f, "}\n");
4435
4323
  break;
@@ -4437,26 +4325,19 @@ switch (insn) {
4437
4325
  fprintf(f, "{\n");
4438
4326
  {
4439
4327
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4440
- MAYBE_UNUSED(CALL_INFO ci_eq) = (CALL_INFO)operands[0];
4441
- MAYBE_UNUSED(CALL_CACHE cc_eq) = (CALL_CACHE)operands[1];
4442
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[2];
4443
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[3];
4328
+ MAYBE_UNUSED(CALL_DATA cd_eq) = (CALL_DATA)operands[0];
4329
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[1];
4444
4330
  if (status->local_stack_p) {
4445
4331
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4446
4332
  }
4447
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc, cc_eq;\n");
4448
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci, ci_eq;\n");
4333
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd, cd_eq;\n");
4449
4334
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
4450
4335
 
4451
- fprintf(f, " ci_eq = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4452
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4453
- fprintf(f, "\n");
4454
- fprintf(f, " cc_eq = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4336
+ fprintf(f, " cd_eq = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4337
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4455
4338
  fprintf(f, "\n");
4456
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[2]);
4457
- comment_id(f, ((CALL_INFO)operands[2])->mid);
4458
- fprintf(f, "\n");
4459
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[3]);
4339
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[1]);
4340
+ comment_id(f, ((CALL_DATA)operands[1])->ci.mid);
4460
4341
  fprintf(f, "\n");
4461
4342
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
4462
4343
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -4470,7 +4351,7 @@ switch (insn) {
4470
4351
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4471
4352
  }
4472
4353
  fprintf(f, " {\n");
4473
- fprintf(f, " val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);\n");
4354
+ fprintf(f, " val = vm_opt_neq(cd, cd_eq, recv, obj);\n");
4474
4355
  fprintf(f, "\n");
4475
4356
  fprintf(f, " if (val == Qundef) {\n");
4476
4357
  if (status->local_stack_p) {
@@ -4481,20 +4362,20 @@ switch (insn) {
4481
4362
  fprintf(f, " goto cancel;\n");
4482
4363
  fprintf(f, " }\n");
4483
4364
  fprintf(f, " }\n");
4484
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_neq(ci_eq, cc_eq, ci, cc) - 1);
4485
- b->stack_size += attr_sp_inc_opt_neq(ci_eq, cc_eq, ci, cc);
4365
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_neq(cd_eq, cd) - 1);
4366
+ b->stack_size += attr_sp_inc_opt_neq(cd_eq, cd);
4486
4367
  }
4487
4368
  fprintf(f, "}\n");
4488
4369
  break;
4489
4370
  case BIN(opt_lt):
4490
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
4371
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
4491
4372
  {
4492
4373
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4493
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4494
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4495
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
4374
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4375
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
4496
4376
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
4497
4377
  const rb_iseq_t *iseq;
4378
+ const CALL_INFO ci = &cd->ci;
4498
4379
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
4499
4380
 
4500
4381
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -4507,7 +4388,7 @@ switch (insn) {
4507
4388
  }
4508
4389
 
4509
4390
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
4510
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
4391
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
4511
4392
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
4512
4393
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4513
4394
  fprintf(f, " goto send_cancel;\n");
@@ -4520,7 +4401,7 @@ switch (insn) {
4520
4401
  if (status->local_stack_p) {
4521
4402
  {
4522
4403
  rb_snum_t i, push_size;
4523
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4404
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4524
4405
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4525
4406
  for (i = 0; i < push_size; i++) {
4526
4407
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4566,7 +4447,7 @@ switch (insn) {
4566
4447
  fprintf(f, " }\n");
4567
4448
 
4568
4449
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4569
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4450
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4570
4451
  if (!pc_moved_p) {
4571
4452
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4572
4453
  }
@@ -4575,7 +4456,7 @@ switch (insn) {
4575
4456
  fprintf(f, " }\n");
4576
4457
  }
4577
4458
 
4578
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4459
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4579
4460
 
4580
4461
  fprintf(f, "}\n");
4581
4462
  break;
@@ -4585,19 +4466,15 @@ switch (insn) {
4585
4466
  fprintf(f, "{\n");
4586
4467
  {
4587
4468
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4588
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4589
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4469
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4590
4470
  if (status->local_stack_p) {
4591
4471
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4592
4472
  }
4593
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4594
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4473
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4595
4474
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4596
4475
 
4597
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4598
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4599
- fprintf(f, "\n");
4600
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4476
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4477
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4601
4478
  fprintf(f, "\n");
4602
4479
  if (body->catch_except_p || TRUE) {
4603
4480
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -4606,7 +4483,7 @@ switch (insn) {
4606
4483
  if (status->local_stack_p) {
4607
4484
  {
4608
4485
  rb_snum_t i, push_size;
4609
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4486
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4610
4487
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4611
4488
  for (i = 0; i < push_size; i++) {
4612
4489
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4618,7 +4495,7 @@ switch (insn) {
4618
4495
  }
4619
4496
  fprintf(f, " {\n");
4620
4497
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
4621
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
4498
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
4622
4499
  fprintf(f, "\n");
4623
4500
  fprintf(f, " if (val == Qundef) {\n");
4624
4501
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -4630,16 +4507,16 @@ switch (insn) {
4630
4507
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
4631
4508
  fprintf(f, " }\n");
4632
4509
  fprintf(f, " }\n");
4633
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
4510
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
4634
4511
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4635
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4512
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4636
4513
  if (!pc_moved_p) {
4637
4514
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4638
4515
  }
4639
4516
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
4640
4517
  fprintf(f, " goto cancel;\n");
4641
4518
  fprintf(f, " }\n");
4642
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4519
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4643
4520
  }
4644
4521
  fprintf(f, "}\n");
4645
4522
  break;
@@ -4647,19 +4524,15 @@ switch (insn) {
4647
4524
  fprintf(f, "{\n");
4648
4525
  {
4649
4526
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4650
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4651
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4527
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4652
4528
  if (status->local_stack_p) {
4653
4529
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4654
4530
  }
4655
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4656
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4531
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4657
4532
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
4658
4533
 
4659
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4660
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4661
- fprintf(f, "\n");
4662
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4534
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4535
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4663
4536
  fprintf(f, "\n");
4664
4537
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
4665
4538
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -4684,20 +4557,20 @@ switch (insn) {
4684
4557
  fprintf(f, " goto cancel;\n");
4685
4558
  fprintf(f, " }\n");
4686
4559
  fprintf(f, " }\n");
4687
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_lt(ci, cc) - 1);
4688
- b->stack_size += attr_sp_inc_opt_lt(ci, cc);
4560
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_lt(cd) - 1);
4561
+ b->stack_size += attr_sp_inc_opt_lt(cd);
4689
4562
  }
4690
4563
  fprintf(f, "}\n");
4691
4564
  break;
4692
4565
  case BIN(opt_le):
4693
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
4566
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
4694
4567
  {
4695
4568
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4696
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4697
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4698
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
4569
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4570
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
4699
4571
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
4700
4572
  const rb_iseq_t *iseq;
4573
+ const CALL_INFO ci = &cd->ci;
4701
4574
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
4702
4575
 
4703
4576
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -4710,7 +4583,7 @@ switch (insn) {
4710
4583
  }
4711
4584
 
4712
4585
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
4713
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
4586
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
4714
4587
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
4715
4588
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4716
4589
  fprintf(f, " goto send_cancel;\n");
@@ -4723,7 +4596,7 @@ switch (insn) {
4723
4596
  if (status->local_stack_p) {
4724
4597
  {
4725
4598
  rb_snum_t i, push_size;
4726
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4599
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4727
4600
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4728
4601
  for (i = 0; i < push_size; i++) {
4729
4602
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4769,7 +4642,7 @@ switch (insn) {
4769
4642
  fprintf(f, " }\n");
4770
4643
 
4771
4644
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4772
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4645
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4773
4646
  if (!pc_moved_p) {
4774
4647
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4775
4648
  }
@@ -4778,7 +4651,7 @@ switch (insn) {
4778
4651
  fprintf(f, " }\n");
4779
4652
  }
4780
4653
 
4781
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4654
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4782
4655
 
4783
4656
  fprintf(f, "}\n");
4784
4657
  break;
@@ -4788,19 +4661,15 @@ switch (insn) {
4788
4661
  fprintf(f, "{\n");
4789
4662
  {
4790
4663
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4791
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4792
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4664
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4793
4665
  if (status->local_stack_p) {
4794
4666
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4795
4667
  }
4796
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4797
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4668
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4798
4669
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
4799
4670
 
4800
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4801
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4802
- fprintf(f, "\n");
4803
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4671
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4672
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4804
4673
  fprintf(f, "\n");
4805
4674
  if (body->catch_except_p || TRUE) {
4806
4675
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -4809,7 +4678,7 @@ switch (insn) {
4809
4678
  if (status->local_stack_p) {
4810
4679
  {
4811
4680
  rb_snum_t i, push_size;
4812
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4681
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4813
4682
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4814
4683
  for (i = 0; i < push_size; i++) {
4815
4684
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4821,7 +4690,7 @@ switch (insn) {
4821
4690
  }
4822
4691
  fprintf(f, " {\n");
4823
4692
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
4824
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
4693
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
4825
4694
  fprintf(f, "\n");
4826
4695
  fprintf(f, " if (val == Qundef) {\n");
4827
4696
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -4833,16 +4702,16 @@ switch (insn) {
4833
4702
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
4834
4703
  fprintf(f, " }\n");
4835
4704
  fprintf(f, " }\n");
4836
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
4705
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
4837
4706
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4838
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4707
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4839
4708
  if (!pc_moved_p) {
4840
4709
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4841
4710
  }
4842
4711
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
4843
4712
  fprintf(f, " goto cancel;\n");
4844
4713
  fprintf(f, " }\n");
4845
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4714
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4846
4715
  }
4847
4716
  fprintf(f, "}\n");
4848
4717
  break;
@@ -4850,19 +4719,15 @@ switch (insn) {
4850
4719
  fprintf(f, "{\n");
4851
4720
  {
4852
4721
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4853
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4854
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4722
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4855
4723
  if (status->local_stack_p) {
4856
4724
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4857
4725
  }
4858
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
4859
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4726
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
4860
4727
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
4861
4728
 
4862
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
4863
- comment_id(f, ((CALL_INFO)operands[0])->mid);
4864
- fprintf(f, "\n");
4865
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4729
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4730
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
4866
4731
  fprintf(f, "\n");
4867
4732
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
4868
4733
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -4887,20 +4752,20 @@ switch (insn) {
4887
4752
  fprintf(f, " goto cancel;\n");
4888
4753
  fprintf(f, " }\n");
4889
4754
  fprintf(f, " }\n");
4890
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_le(ci, cc) - 1);
4891
- b->stack_size += attr_sp_inc_opt_le(ci, cc);
4755
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_le(cd) - 1);
4756
+ b->stack_size += attr_sp_inc_opt_le(cd);
4892
4757
  }
4893
4758
  fprintf(f, "}\n");
4894
4759
  break;
4895
4760
  case BIN(opt_gt):
4896
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
4761
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
4897
4762
  {
4898
4763
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4899
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4900
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4901
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
4764
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4765
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
4902
4766
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
4903
4767
  const rb_iseq_t *iseq;
4768
+ const CALL_INFO ci = &cd->ci;
4904
4769
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
4905
4770
 
4906
4771
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -4913,7 +4778,7 @@ switch (insn) {
4913
4778
  }
4914
4779
 
4915
4780
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
4916
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
4781
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
4917
4782
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
4918
4783
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
4919
4784
  fprintf(f, " goto send_cancel;\n");
@@ -4926,7 +4791,7 @@ switch (insn) {
4926
4791
  if (status->local_stack_p) {
4927
4792
  {
4928
4793
  rb_snum_t i, push_size;
4929
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4794
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
4930
4795
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
4931
4796
  for (i = 0; i < push_size; i++) {
4932
4797
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -4972,7 +4837,7 @@ switch (insn) {
4972
4837
  fprintf(f, " }\n");
4973
4838
 
4974
4839
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
4975
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4840
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
4976
4841
  if (!pc_moved_p) {
4977
4842
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
4978
4843
  }
@@ -4981,7 +4846,7 @@ switch (insn) {
4981
4846
  fprintf(f, " }\n");
4982
4847
  }
4983
4848
 
4984
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4849
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
4985
4850
 
4986
4851
  fprintf(f, "}\n");
4987
4852
  break;
@@ -4991,19 +4856,15 @@ switch (insn) {
4991
4856
  fprintf(f, "{\n");
4992
4857
  {
4993
4858
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
4994
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
4995
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4859
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4996
4860
  if (status->local_stack_p) {
4997
4861
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
4998
4862
  }
4999
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5000
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4863
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5001
4864
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
5002
4865
 
5003
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5004
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5005
- fprintf(f, "\n");
5006
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4866
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4867
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5007
4868
  fprintf(f, "\n");
5008
4869
  if (body->catch_except_p || TRUE) {
5009
4870
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -5012,7 +4873,7 @@ switch (insn) {
5012
4873
  if (status->local_stack_p) {
5013
4874
  {
5014
4875
  rb_snum_t i, push_size;
5015
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4876
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5016
4877
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5017
4878
  for (i = 0; i < push_size; i++) {
5018
4879
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5024,7 +4885,7 @@ switch (insn) {
5024
4885
  }
5025
4886
  fprintf(f, " {\n");
5026
4887
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
5027
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
4888
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
5028
4889
  fprintf(f, "\n");
5029
4890
  fprintf(f, " if (val == Qundef) {\n");
5030
4891
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -5036,16 +4897,16 @@ switch (insn) {
5036
4897
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
5037
4898
  fprintf(f, " }\n");
5038
4899
  fprintf(f, " }\n");
5039
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
4900
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
5040
4901
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5041
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
4902
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5042
4903
  if (!pc_moved_p) {
5043
4904
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5044
4905
  }
5045
4906
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
5046
4907
  fprintf(f, " goto cancel;\n");
5047
4908
  fprintf(f, " }\n");
5048
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
4909
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5049
4910
  }
5050
4911
  fprintf(f, "}\n");
5051
4912
  break;
@@ -5053,19 +4914,15 @@ switch (insn) {
5053
4914
  fprintf(f, "{\n");
5054
4915
  {
5055
4916
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5056
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5057
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
4917
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5058
4918
  if (status->local_stack_p) {
5059
4919
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5060
4920
  }
5061
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5062
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
4921
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5063
4922
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
5064
4923
 
5065
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5066
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5067
- fprintf(f, "\n");
5068
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
4924
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
4925
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5069
4926
  fprintf(f, "\n");
5070
4927
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
5071
4928
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -5090,20 +4947,20 @@ switch (insn) {
5090
4947
  fprintf(f, " goto cancel;\n");
5091
4948
  fprintf(f, " }\n");
5092
4949
  fprintf(f, " }\n");
5093
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_gt(ci, cc) - 1);
5094
- b->stack_size += attr_sp_inc_opt_gt(ci, cc);
4950
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_gt(cd) - 1);
4951
+ b->stack_size += attr_sp_inc_opt_gt(cd);
5095
4952
  }
5096
4953
  fprintf(f, "}\n");
5097
4954
  break;
5098
4955
  case BIN(opt_ge):
5099
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
4956
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
5100
4957
  {
5101
4958
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5102
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5103
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5104
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
4959
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
4960
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
5105
4961
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
5106
4962
  const rb_iseq_t *iseq;
4963
+ const CALL_INFO ci = &cd->ci;
5107
4964
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
5108
4965
 
5109
4966
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -5116,7 +4973,7 @@ switch (insn) {
5116
4973
  }
5117
4974
 
5118
4975
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
5119
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
4976
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
5120
4977
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
5121
4978
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
5122
4979
  fprintf(f, " goto send_cancel;\n");
@@ -5129,7 +4986,7 @@ switch (insn) {
5129
4986
  if (status->local_stack_p) {
5130
4987
  {
5131
4988
  rb_snum_t i, push_size;
5132
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
4989
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5133
4990
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5134
4991
  for (i = 0; i < push_size; i++) {
5135
4992
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5175,7 +5032,7 @@ switch (insn) {
5175
5032
  fprintf(f, " }\n");
5176
5033
 
5177
5034
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5178
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5035
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5179
5036
  if (!pc_moved_p) {
5180
5037
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5181
5038
  }
@@ -5184,7 +5041,7 @@ switch (insn) {
5184
5041
  fprintf(f, " }\n");
5185
5042
  }
5186
5043
 
5187
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5044
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5188
5045
 
5189
5046
  fprintf(f, "}\n");
5190
5047
  break;
@@ -5194,19 +5051,15 @@ switch (insn) {
5194
5051
  fprintf(f, "{\n");
5195
5052
  {
5196
5053
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5197
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5198
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5054
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5199
5055
  if (status->local_stack_p) {
5200
5056
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5201
5057
  }
5202
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5203
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5058
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5204
5059
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
5205
5060
 
5206
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5207
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5208
- fprintf(f, "\n");
5209
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5061
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5062
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5210
5063
  fprintf(f, "\n");
5211
5064
  if (body->catch_except_p || TRUE) {
5212
5065
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -5215,7 +5068,7 @@ switch (insn) {
5215
5068
  if (status->local_stack_p) {
5216
5069
  {
5217
5070
  rb_snum_t i, push_size;
5218
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5071
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5219
5072
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5220
5073
  for (i = 0; i < push_size; i++) {
5221
5074
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5227,7 +5080,7 @@ switch (insn) {
5227
5080
  }
5228
5081
  fprintf(f, " {\n");
5229
5082
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
5230
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
5083
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
5231
5084
  fprintf(f, "\n");
5232
5085
  fprintf(f, " if (val == Qundef) {\n");
5233
5086
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -5239,16 +5092,16 @@ switch (insn) {
5239
5092
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
5240
5093
  fprintf(f, " }\n");
5241
5094
  fprintf(f, " }\n");
5242
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
5095
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
5243
5096
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5244
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5097
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5245
5098
  if (!pc_moved_p) {
5246
5099
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5247
5100
  }
5248
5101
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
5249
5102
  fprintf(f, " goto cancel;\n");
5250
5103
  fprintf(f, " }\n");
5251
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5104
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5252
5105
  }
5253
5106
  fprintf(f, "}\n");
5254
5107
  break;
@@ -5256,19 +5109,15 @@ switch (insn) {
5256
5109
  fprintf(f, "{\n");
5257
5110
  {
5258
5111
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5259
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5260
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5112
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5261
5113
  if (status->local_stack_p) {
5262
5114
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5263
5115
  }
5264
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5265
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5116
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5266
5117
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
5267
5118
 
5268
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5269
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5270
- fprintf(f, "\n");
5271
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5119
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5120
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5272
5121
  fprintf(f, "\n");
5273
5122
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
5274
5123
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -5293,20 +5142,20 @@ switch (insn) {
5293
5142
  fprintf(f, " goto cancel;\n");
5294
5143
  fprintf(f, " }\n");
5295
5144
  fprintf(f, " }\n");
5296
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_ge(ci, cc) - 1);
5297
- b->stack_size += attr_sp_inc_opt_ge(ci, cc);
5145
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_ge(cd) - 1);
5146
+ b->stack_size += attr_sp_inc_opt_ge(cd);
5298
5147
  }
5299
5148
  fprintf(f, "}\n");
5300
5149
  break;
5301
5150
  case BIN(opt_ltlt):
5302
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
5151
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
5303
5152
  {
5304
5153
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5305
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5306
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5307
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
5154
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5155
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
5308
5156
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
5309
5157
  const rb_iseq_t *iseq;
5158
+ const CALL_INFO ci = &cd->ci;
5310
5159
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
5311
5160
 
5312
5161
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -5319,7 +5168,7 @@ switch (insn) {
5319
5168
  }
5320
5169
 
5321
5170
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
5322
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
5171
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
5323
5172
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
5324
5173
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
5325
5174
  fprintf(f, " goto send_cancel;\n");
@@ -5332,7 +5181,7 @@ switch (insn) {
5332
5181
  if (status->local_stack_p) {
5333
5182
  {
5334
5183
  rb_snum_t i, push_size;
5335
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5184
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5336
5185
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5337
5186
  for (i = 0; i < push_size; i++) {
5338
5187
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5378,7 +5227,7 @@ switch (insn) {
5378
5227
  fprintf(f, " }\n");
5379
5228
 
5380
5229
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5381
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5230
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5382
5231
  if (!pc_moved_p) {
5383
5232
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5384
5233
  }
@@ -5387,7 +5236,7 @@ switch (insn) {
5387
5236
  fprintf(f, " }\n");
5388
5237
  }
5389
5238
 
5390
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5239
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5391
5240
 
5392
5241
  fprintf(f, "}\n");
5393
5242
  break;
@@ -5397,19 +5246,15 @@ switch (insn) {
5397
5246
  fprintf(f, "{\n");
5398
5247
  {
5399
5248
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5400
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5401
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5249
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5402
5250
  if (status->local_stack_p) {
5403
5251
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5404
5252
  }
5405
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5406
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5253
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5407
5254
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
5408
5255
 
5409
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5410
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5411
- fprintf(f, "\n");
5412
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5256
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5257
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5413
5258
  fprintf(f, "\n");
5414
5259
  if (body->catch_except_p || TRUE) {
5415
5260
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -5418,7 +5263,7 @@ switch (insn) {
5418
5263
  if (status->local_stack_p) {
5419
5264
  {
5420
5265
  rb_snum_t i, push_size;
5421
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5266
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5422
5267
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5423
5268
  for (i = 0; i < push_size; i++) {
5424
5269
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5430,7 +5275,7 @@ switch (insn) {
5430
5275
  }
5431
5276
  fprintf(f, " {\n");
5432
5277
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
5433
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
5278
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
5434
5279
  fprintf(f, "\n");
5435
5280
  fprintf(f, " if (val == Qundef) {\n");
5436
5281
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -5442,16 +5287,16 @@ switch (insn) {
5442
5287
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
5443
5288
  fprintf(f, " }\n");
5444
5289
  fprintf(f, " }\n");
5445
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
5290
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
5446
5291
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5447
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5292
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5448
5293
  if (!pc_moved_p) {
5449
5294
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5450
5295
  }
5451
5296
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
5452
5297
  fprintf(f, " goto cancel;\n");
5453
5298
  fprintf(f, " }\n");
5454
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5299
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5455
5300
  }
5456
5301
  fprintf(f, "}\n");
5457
5302
  break;
@@ -5459,19 +5304,15 @@ switch (insn) {
5459
5304
  fprintf(f, "{\n");
5460
5305
  {
5461
5306
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5462
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5463
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5307
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5464
5308
  if (status->local_stack_p) {
5465
5309
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5466
5310
  }
5467
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5468
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5311
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5469
5312
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
5470
5313
 
5471
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5472
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5473
- fprintf(f, "\n");
5474
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5314
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5315
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5475
5316
  fprintf(f, "\n");
5476
5317
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
5477
5318
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -5496,28 +5337,28 @@ switch (insn) {
5496
5337
  fprintf(f, " goto cancel;\n");
5497
5338
  fprintf(f, " }\n");
5498
5339
  fprintf(f, " }\n");
5499
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_ltlt(ci, cc) - 1);
5340
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_ltlt(cd) - 1);
5500
5341
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5501
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_ltlt(ci, cc));
5342
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_ltlt(cd));
5502
5343
  if (!pc_moved_p) {
5503
5344
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5504
5345
  }
5505
5346
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
5506
5347
  fprintf(f, " goto cancel;\n");
5507
5348
  fprintf(f, " }\n");
5508
- b->stack_size += attr_sp_inc_opt_ltlt(ci, cc);
5349
+ b->stack_size += attr_sp_inc_opt_ltlt(cd);
5509
5350
  }
5510
5351
  fprintf(f, "}\n");
5511
5352
  break;
5512
5353
  case BIN(opt_and):
5513
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
5354
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
5514
5355
  {
5515
5356
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5516
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5517
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5518
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
5357
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5358
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
5519
5359
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
5520
5360
  const rb_iseq_t *iseq;
5361
+ const CALL_INFO ci = &cd->ci;
5521
5362
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
5522
5363
 
5523
5364
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -5530,7 +5371,7 @@ switch (insn) {
5530
5371
  }
5531
5372
 
5532
5373
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
5533
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
5374
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
5534
5375
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
5535
5376
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
5536
5377
  fprintf(f, " goto send_cancel;\n");
@@ -5543,7 +5384,7 @@ switch (insn) {
5543
5384
  if (status->local_stack_p) {
5544
5385
  {
5545
5386
  rb_snum_t i, push_size;
5546
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5387
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5547
5388
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5548
5389
  for (i = 0; i < push_size; i++) {
5549
5390
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5589,7 +5430,7 @@ switch (insn) {
5589
5430
  fprintf(f, " }\n");
5590
5431
 
5591
5432
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5592
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5433
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5593
5434
  if (!pc_moved_p) {
5594
5435
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5595
5436
  }
@@ -5598,7 +5439,7 @@ switch (insn) {
5598
5439
  fprintf(f, " }\n");
5599
5440
  }
5600
5441
 
5601
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5442
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5602
5443
 
5603
5444
  fprintf(f, "}\n");
5604
5445
  break;
@@ -5608,19 +5449,15 @@ switch (insn) {
5608
5449
  fprintf(f, "{\n");
5609
5450
  {
5610
5451
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5611
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5612
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5452
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5613
5453
  if (status->local_stack_p) {
5614
5454
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5615
5455
  }
5616
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5617
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5456
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5618
5457
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
5619
5458
 
5620
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5621
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5622
- fprintf(f, "\n");
5623
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5459
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5460
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5624
5461
  fprintf(f, "\n");
5625
5462
  if (body->catch_except_p || TRUE) {
5626
5463
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -5629,7 +5466,7 @@ switch (insn) {
5629
5466
  if (status->local_stack_p) {
5630
5467
  {
5631
5468
  rb_snum_t i, push_size;
5632
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5469
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5633
5470
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5634
5471
  for (i = 0; i < push_size; i++) {
5635
5472
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5641,7 +5478,7 @@ switch (insn) {
5641
5478
  }
5642
5479
  fprintf(f, " {\n");
5643
5480
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
5644
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
5481
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
5645
5482
  fprintf(f, "\n");
5646
5483
  fprintf(f, " if (val == Qundef) {\n");
5647
5484
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -5653,16 +5490,16 @@ switch (insn) {
5653
5490
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
5654
5491
  fprintf(f, " }\n");
5655
5492
  fprintf(f, " }\n");
5656
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
5493
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
5657
5494
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5658
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5495
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5659
5496
  if (!pc_moved_p) {
5660
5497
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5661
5498
  }
5662
5499
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
5663
5500
  fprintf(f, " goto cancel;\n");
5664
5501
  fprintf(f, " }\n");
5665
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5502
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5666
5503
  }
5667
5504
  fprintf(f, "}\n");
5668
5505
  break;
@@ -5670,19 +5507,15 @@ switch (insn) {
5670
5507
  fprintf(f, "{\n");
5671
5508
  {
5672
5509
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5673
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5674
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5510
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5675
5511
  if (status->local_stack_p) {
5676
5512
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5677
5513
  }
5678
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5679
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5514
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5680
5515
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
5681
5516
 
5682
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5683
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5684
- fprintf(f, "\n");
5685
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5517
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5518
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5686
5519
  fprintf(f, "\n");
5687
5520
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
5688
5521
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -5707,20 +5540,20 @@ switch (insn) {
5707
5540
  fprintf(f, " goto cancel;\n");
5708
5541
  fprintf(f, " }\n");
5709
5542
  fprintf(f, " }\n");
5710
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_and(ci, cc) - 1);
5711
- b->stack_size += attr_sp_inc_opt_and(ci, cc);
5543
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_and(cd) - 1);
5544
+ b->stack_size += attr_sp_inc_opt_and(cd);
5712
5545
  }
5713
5546
  fprintf(f, "}\n");
5714
5547
  break;
5715
5548
  case BIN(opt_or):
5716
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
5549
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
5717
5550
  {
5718
5551
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5719
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5720
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5721
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
5552
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5553
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
5722
5554
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
5723
5555
  const rb_iseq_t *iseq;
5556
+ const CALL_INFO ci = &cd->ci;
5724
5557
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
5725
5558
 
5726
5559
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -5733,7 +5566,7 @@ switch (insn) {
5733
5566
  }
5734
5567
 
5735
5568
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
5736
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
5569
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
5737
5570
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
5738
5571
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
5739
5572
  fprintf(f, " goto send_cancel;\n");
@@ -5746,7 +5579,7 @@ switch (insn) {
5746
5579
  if (status->local_stack_p) {
5747
5580
  {
5748
5581
  rb_snum_t i, push_size;
5749
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5582
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5750
5583
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5751
5584
  for (i = 0; i < push_size; i++) {
5752
5585
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5792,7 +5625,7 @@ switch (insn) {
5792
5625
  fprintf(f, " }\n");
5793
5626
 
5794
5627
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5795
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5628
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5796
5629
  if (!pc_moved_p) {
5797
5630
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5798
5631
  }
@@ -5801,7 +5634,7 @@ switch (insn) {
5801
5634
  fprintf(f, " }\n");
5802
5635
  }
5803
5636
 
5804
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5637
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5805
5638
 
5806
5639
  fprintf(f, "}\n");
5807
5640
  break;
@@ -5811,19 +5644,15 @@ switch (insn) {
5811
5644
  fprintf(f, "{\n");
5812
5645
  {
5813
5646
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5814
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5815
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5647
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5816
5648
  if (status->local_stack_p) {
5817
5649
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5818
5650
  }
5819
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5820
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5651
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5821
5652
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
5822
5653
 
5823
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5824
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5825
- fprintf(f, "\n");
5826
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5654
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5655
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5827
5656
  fprintf(f, "\n");
5828
5657
  if (body->catch_except_p || TRUE) {
5829
5658
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -5832,7 +5661,7 @@ switch (insn) {
5832
5661
  if (status->local_stack_p) {
5833
5662
  {
5834
5663
  rb_snum_t i, push_size;
5835
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5664
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5836
5665
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5837
5666
  for (i = 0; i < push_size; i++) {
5838
5667
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5844,7 +5673,7 @@ switch (insn) {
5844
5673
  }
5845
5674
  fprintf(f, " {\n");
5846
5675
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
5847
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
5676
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
5848
5677
  fprintf(f, "\n");
5849
5678
  fprintf(f, " if (val == Qundef) {\n");
5850
5679
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -5856,16 +5685,16 @@ switch (insn) {
5856
5685
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
5857
5686
  fprintf(f, " }\n");
5858
5687
  fprintf(f, " }\n");
5859
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
5688
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
5860
5689
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5861
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5690
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5862
5691
  if (!pc_moved_p) {
5863
5692
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
5864
5693
  }
5865
5694
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
5866
5695
  fprintf(f, " goto cancel;\n");
5867
5696
  fprintf(f, " }\n");
5868
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5697
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
5869
5698
  }
5870
5699
  fprintf(f, "}\n");
5871
5700
  break;
@@ -5873,19 +5702,15 @@ switch (insn) {
5873
5702
  fprintf(f, "{\n");
5874
5703
  {
5875
5704
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5876
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5877
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5705
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5878
5706
  if (status->local_stack_p) {
5879
5707
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
5880
5708
  }
5881
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
5882
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5709
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
5883
5710
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
5884
5711
 
5885
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
5886
- comment_id(f, ((CALL_INFO)operands[0])->mid);
5887
- fprintf(f, "\n");
5888
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5712
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5713
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
5889
5714
  fprintf(f, "\n");
5890
5715
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
5891
5716
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -5910,20 +5735,20 @@ switch (insn) {
5910
5735
  fprintf(f, " goto cancel;\n");
5911
5736
  fprintf(f, " }\n");
5912
5737
  fprintf(f, " }\n");
5913
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_or(ci, cc) - 1);
5914
- b->stack_size += attr_sp_inc_opt_or(ci, cc);
5738
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_or(cd) - 1);
5739
+ b->stack_size += attr_sp_inc_opt_or(cd);
5915
5740
  }
5916
5741
  fprintf(f, "}\n");
5917
5742
  break;
5918
5743
  case BIN(opt_aref):
5919
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
5744
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
5920
5745
  {
5921
5746
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
5922
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
5923
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5924
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
5747
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5748
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
5925
5749
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
5926
5750
  const rb_iseq_t *iseq;
5751
+ const CALL_INFO ci = &cd->ci;
5927
5752
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
5928
5753
 
5929
5754
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -5936,7 +5761,7 @@ switch (insn) {
5936
5761
  }
5937
5762
 
5938
5763
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
5939
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
5764
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
5940
5765
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
5941
5766
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
5942
5767
  fprintf(f, " goto send_cancel;\n");
@@ -5949,7 +5774,7 @@ switch (insn) {
5949
5774
  if (status->local_stack_p) {
5950
5775
  {
5951
5776
  rb_snum_t i, push_size;
5952
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5777
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
5953
5778
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
5954
5779
  for (i = 0; i < push_size; i++) {
5955
5780
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -5995,7 +5820,7 @@ switch (insn) {
5995
5820
  fprintf(f, " }\n");
5996
5821
 
5997
5822
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
5998
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5823
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
5999
5824
  if (!pc_moved_p) {
6000
5825
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6001
5826
  }
@@ -6004,7 +5829,7 @@ switch (insn) {
6004
5829
  fprintf(f, " }\n");
6005
5830
  }
6006
5831
 
6007
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5832
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6008
5833
 
6009
5834
  fprintf(f, "}\n");
6010
5835
  break;
@@ -6014,19 +5839,15 @@ switch (insn) {
6014
5839
  fprintf(f, "{\n");
6015
5840
  {
6016
5841
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6017
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6018
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5842
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6019
5843
  if (status->local_stack_p) {
6020
5844
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6021
5845
  }
6022
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6023
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5846
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6024
5847
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
6025
5848
 
6026
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6027
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6028
- fprintf(f, "\n");
6029
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5849
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5850
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6030
5851
  fprintf(f, "\n");
6031
5852
  if (body->catch_except_p || TRUE) {
6032
5853
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -6035,7 +5856,7 @@ switch (insn) {
6035
5856
  if (status->local_stack_p) {
6036
5857
  {
6037
5858
  rb_snum_t i, push_size;
6038
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5859
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6039
5860
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6040
5861
  for (i = 0; i < push_size; i++) {
6041
5862
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6047,7 +5868,7 @@ switch (insn) {
6047
5868
  }
6048
5869
  fprintf(f, " {\n");
6049
5870
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
6050
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
5871
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
6051
5872
  fprintf(f, "\n");
6052
5873
  fprintf(f, " if (val == Qundef) {\n");
6053
5874
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -6059,16 +5880,16 @@ switch (insn) {
6059
5880
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
6060
5881
  fprintf(f, " }\n");
6061
5882
  fprintf(f, " }\n");
6062
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
5883
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
6063
5884
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6064
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
5885
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6065
5886
  if (!pc_moved_p) {
6066
5887
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6067
5888
  }
6068
5889
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6069
5890
  fprintf(f, " goto cancel;\n");
6070
5891
  fprintf(f, " }\n");
6071
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
5892
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6072
5893
  }
6073
5894
  fprintf(f, "}\n");
6074
5895
  break;
@@ -6076,19 +5897,15 @@ switch (insn) {
6076
5897
  fprintf(f, "{\n");
6077
5898
  {
6078
5899
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6079
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6080
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
5900
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6081
5901
  if (status->local_stack_p) {
6082
5902
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6083
5903
  }
6084
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6085
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
5904
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6086
5905
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, val;\n");
6087
5906
 
6088
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6089
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6090
- fprintf(f, "\n");
6091
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
5907
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
5908
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6092
5909
  fprintf(f, "\n");
6093
5910
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
6094
5911
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 1);
@@ -6113,28 +5930,28 @@ switch (insn) {
6113
5930
  fprintf(f, " goto cancel;\n");
6114
5931
  fprintf(f, " }\n");
6115
5932
  fprintf(f, " }\n");
6116
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aref(ci, cc) - 1);
5933
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aref(cd) - 1);
6117
5934
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6118
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aref(ci, cc));
5935
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aref(cd));
6119
5936
  if (!pc_moved_p) {
6120
5937
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6121
5938
  }
6122
5939
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6123
5940
  fprintf(f, " goto cancel;\n");
6124
5941
  fprintf(f, " }\n");
6125
- b->stack_size += attr_sp_inc_opt_aref(ci, cc);
5942
+ b->stack_size += attr_sp_inc_opt_aref(cd);
6126
5943
  }
6127
5944
  fprintf(f, "}\n");
6128
5945
  break;
6129
5946
  case BIN(opt_aset):
6130
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
5947
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
6131
5948
  {
6132
5949
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6133
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6134
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6135
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
5950
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
5951
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
6136
5952
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
6137
5953
  const rb_iseq_t *iseq;
5954
+ const CALL_INFO ci = &cd->ci;
6138
5955
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
6139
5956
 
6140
5957
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -6147,7 +5964,7 @@ switch (insn) {
6147
5964
  }
6148
5965
 
6149
5966
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
6150
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
5967
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
6151
5968
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
6152
5969
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
6153
5970
  fprintf(f, " goto send_cancel;\n");
@@ -6160,7 +5977,7 @@ switch (insn) {
6160
5977
  if (status->local_stack_p) {
6161
5978
  {
6162
5979
  rb_snum_t i, push_size;
6163
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
5980
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6164
5981
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6165
5982
  for (i = 0; i < push_size; i++) {
6166
5983
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6206,7 +6023,7 @@ switch (insn) {
6206
6023
  fprintf(f, " }\n");
6207
6024
 
6208
6025
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6209
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6026
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6210
6027
  if (!pc_moved_p) {
6211
6028
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6212
6029
  }
@@ -6215,7 +6032,7 @@ switch (insn) {
6215
6032
  fprintf(f, " }\n");
6216
6033
  }
6217
6034
 
6218
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6035
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6219
6036
 
6220
6037
  fprintf(f, "}\n");
6221
6038
  break;
@@ -6225,19 +6042,15 @@ switch (insn) {
6225
6042
  fprintf(f, "{\n");
6226
6043
  {
6227
6044
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6228
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6229
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6045
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6230
6046
  if (status->local_stack_p) {
6231
6047
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6232
6048
  }
6233
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6234
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6049
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6235
6050
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
6236
6051
 
6237
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6238
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6239
- fprintf(f, "\n");
6240
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6052
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6053
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6241
6054
  fprintf(f, "\n");
6242
6055
  if (body->catch_except_p || TRUE) {
6243
6056
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -6246,7 +6059,7 @@ switch (insn) {
6246
6059
  if (status->local_stack_p) {
6247
6060
  {
6248
6061
  rb_snum_t i, push_size;
6249
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6062
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6250
6063
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6251
6064
  for (i = 0; i < push_size; i++) {
6252
6065
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6258,7 +6071,7 @@ switch (insn) {
6258
6071
  }
6259
6072
  fprintf(f, " {\n");
6260
6073
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
6261
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
6074
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
6262
6075
  fprintf(f, "\n");
6263
6076
  fprintf(f, " if (val == Qundef) {\n");
6264
6077
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -6270,16 +6083,16 @@ switch (insn) {
6270
6083
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
6271
6084
  fprintf(f, " }\n");
6272
6085
  fprintf(f, " }\n");
6273
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
6086
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
6274
6087
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6275
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6088
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6276
6089
  if (!pc_moved_p) {
6277
6090
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6278
6091
  }
6279
6092
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6280
6093
  fprintf(f, " goto cancel;\n");
6281
6094
  fprintf(f, " }\n");
6282
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6095
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6283
6096
  }
6284
6097
  fprintf(f, "}\n");
6285
6098
  break;
@@ -6287,19 +6100,15 @@ switch (insn) {
6287
6100
  fprintf(f, "{\n");
6288
6101
  {
6289
6102
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6290
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6291
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6103
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6292
6104
  if (status->local_stack_p) {
6293
6105
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6294
6106
  }
6295
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6296
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6107
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6297
6108
  fprintf(f, " MAYBE_UNUSED(VALUE) obj, recv, set, val;\n");
6298
6109
 
6299
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6300
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6301
- fprintf(f, "\n");
6302
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6110
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6111
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6303
6112
  fprintf(f, "\n");
6304
6113
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 3);
6305
6114
  fprintf(f, " obj = stack[%d];\n", b->stack_size - 2);
@@ -6325,16 +6134,16 @@ switch (insn) {
6325
6134
  fprintf(f, " goto cancel;\n");
6326
6135
  fprintf(f, " }\n");
6327
6136
  fprintf(f, " }\n");
6328
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aset(ci, cc) - 1);
6137
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aset(cd) - 1);
6329
6138
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6330
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aset(ci, cc));
6139
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aset(cd));
6331
6140
  if (!pc_moved_p) {
6332
6141
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6333
6142
  }
6334
6143
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6335
6144
  fprintf(f, " goto cancel;\n");
6336
6145
  fprintf(f, " }\n");
6337
- b->stack_size += attr_sp_inc_opt_aset(ci, cc);
6146
+ b->stack_size += attr_sp_inc_opt_aset(cd);
6338
6147
  }
6339
6148
  fprintf(f, "}\n");
6340
6149
  break;
@@ -6343,22 +6152,18 @@ switch (insn) {
6343
6152
  {
6344
6153
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6345
6154
  MAYBE_UNUSED(VALUE key) = (VALUE)operands[0];
6346
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
6347
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
6155
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[1];
6348
6156
  if (status->local_stack_p) {
6349
6157
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6350
6158
  }
6351
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6352
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6159
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6353
6160
  fprintf(f, " MAYBE_UNUSED(VALUE) key, recv, val;\n");
6354
6161
 
6355
6162
  fprintf(f, " key = (VALUE)0x%"PRIxVALUE";", operands[0]);
6356
6163
  if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
6357
6164
  fprintf(f, "\n");
6358
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
6359
- comment_id(f, ((CALL_INFO)operands[1])->mid);
6360
- fprintf(f, "\n");
6361
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
6165
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[1]);
6166
+ comment_id(f, ((CALL_DATA)operands[1])->ci.mid);
6362
6167
  fprintf(f, "\n");
6363
6168
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 2);
6364
6169
  fprintf(f, " val = stack[%d];\n", b->stack_size - 1);
@@ -6391,16 +6196,16 @@ switch (insn) {
6391
6196
  fprintf(f, " goto cancel;\n");
6392
6197
  fprintf(f, " }\n");
6393
6198
  fprintf(f, " }\n");
6394
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aset_with(key, ci, cc) - 1);
6199
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aset_with(key, cd) - 1);
6395
6200
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6396
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aset_with(key, ci, cc));
6201
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aset_with(key, cd));
6397
6202
  if (!pc_moved_p) {
6398
6203
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6399
6204
  }
6400
6205
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6401
6206
  fprintf(f, " goto cancel;\n");
6402
6207
  fprintf(f, " }\n");
6403
- b->stack_size += attr_sp_inc_opt_aset_with(key, ci, cc);
6208
+ b->stack_size += attr_sp_inc_opt_aset_with(key, cd);
6404
6209
  }
6405
6210
  fprintf(f, "}\n");
6406
6211
  break;
@@ -6409,22 +6214,18 @@ switch (insn) {
6409
6214
  {
6410
6215
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6411
6216
  MAYBE_UNUSED(VALUE key) = (VALUE)operands[0];
6412
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[1];
6413
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[2];
6217
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[1];
6414
6218
  if (status->local_stack_p) {
6415
6219
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6416
6220
  }
6417
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6418
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6221
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6419
6222
  fprintf(f, " MAYBE_UNUSED(VALUE) key, recv, val;\n");
6420
6223
 
6421
6224
  fprintf(f, " key = (VALUE)0x%"PRIxVALUE";", operands[0]);
6422
6225
  if (SYMBOL_P((VALUE)operands[0])) comment_id(f, SYM2ID((VALUE)operands[0]));
6423
6226
  fprintf(f, "\n");
6424
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[1]);
6425
- comment_id(f, ((CALL_INFO)operands[1])->mid);
6426
- fprintf(f, "\n");
6427
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[2]);
6227
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[1]);
6228
+ comment_id(f, ((CALL_DATA)operands[1])->ci.mid);
6428
6229
  fprintf(f, "\n");
6429
6230
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
6430
6231
  if (body->catch_except_p || TRUE) {
@@ -6451,28 +6252,28 @@ switch (insn) {
6451
6252
  fprintf(f, " goto cancel;\n");
6452
6253
  fprintf(f, " }\n");
6453
6254
  fprintf(f, " }\n");
6454
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aref_with(key, ci, cc) - 1);
6255
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_aref_with(key, cd) - 1);
6455
6256
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6456
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aref_with(key, ci, cc));
6257
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_aref_with(key, cd));
6457
6258
  if (!pc_moved_p) {
6458
6259
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6459
6260
  }
6460
6261
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6461
6262
  fprintf(f, " goto cancel;\n");
6462
6263
  fprintf(f, " }\n");
6463
- b->stack_size += attr_sp_inc_opt_aref_with(key, ci, cc);
6264
+ b->stack_size += attr_sp_inc_opt_aref_with(key, cd);
6464
6265
  }
6465
6266
  fprintf(f, "}\n");
6466
6267
  break;
6467
6268
  case BIN(opt_length):
6468
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
6269
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
6469
6270
  {
6470
6271
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6471
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6472
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6473
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
6272
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6273
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
6474
6274
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
6475
6275
  const rb_iseq_t *iseq;
6276
+ const CALL_INFO ci = &cd->ci;
6476
6277
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
6477
6278
 
6478
6279
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -6485,7 +6286,7 @@ switch (insn) {
6485
6286
  }
6486
6287
 
6487
6288
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
6488
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
6289
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
6489
6290
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
6490
6291
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
6491
6292
  fprintf(f, " goto send_cancel;\n");
@@ -6498,7 +6299,7 @@ switch (insn) {
6498
6299
  if (status->local_stack_p) {
6499
6300
  {
6500
6301
  rb_snum_t i, push_size;
6501
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6302
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6502
6303
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6503
6304
  for (i = 0; i < push_size; i++) {
6504
6305
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6544,7 +6345,7 @@ switch (insn) {
6544
6345
  fprintf(f, " }\n");
6545
6346
 
6546
6347
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6547
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6348
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6548
6349
  if (!pc_moved_p) {
6549
6350
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6550
6351
  }
@@ -6553,7 +6354,7 @@ switch (insn) {
6553
6354
  fprintf(f, " }\n");
6554
6355
  }
6555
6356
 
6556
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6357
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6557
6358
 
6558
6359
  fprintf(f, "}\n");
6559
6360
  break;
@@ -6563,19 +6364,15 @@ switch (insn) {
6563
6364
  fprintf(f, "{\n");
6564
6365
  {
6565
6366
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6566
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6567
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6367
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6568
6368
  if (status->local_stack_p) {
6569
6369
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6570
6370
  }
6571
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6572
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6371
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6573
6372
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
6574
6373
 
6575
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6576
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6577
- fprintf(f, "\n");
6578
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6374
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6375
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6579
6376
  fprintf(f, "\n");
6580
6377
  if (body->catch_except_p || TRUE) {
6581
6378
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -6584,7 +6381,7 @@ switch (insn) {
6584
6381
  if (status->local_stack_p) {
6585
6382
  {
6586
6383
  rb_snum_t i, push_size;
6587
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6384
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6588
6385
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6589
6386
  for (i = 0; i < push_size; i++) {
6590
6387
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6596,7 +6393,7 @@ switch (insn) {
6596
6393
  }
6597
6394
  fprintf(f, " {\n");
6598
6395
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
6599
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
6396
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
6600
6397
  fprintf(f, "\n");
6601
6398
  fprintf(f, " if (val == Qundef) {\n");
6602
6399
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -6608,16 +6405,16 @@ switch (insn) {
6608
6405
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
6609
6406
  fprintf(f, " }\n");
6610
6407
  fprintf(f, " }\n");
6611
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
6408
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
6612
6409
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6613
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6410
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6614
6411
  if (!pc_moved_p) {
6615
6412
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6616
6413
  }
6617
6414
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6618
6415
  fprintf(f, " goto cancel;\n");
6619
6416
  fprintf(f, " }\n");
6620
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6417
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6621
6418
  }
6622
6419
  fprintf(f, "}\n");
6623
6420
  break;
@@ -6625,19 +6422,15 @@ switch (insn) {
6625
6422
  fprintf(f, "{\n");
6626
6423
  {
6627
6424
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6628
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6629
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6425
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6630
6426
  if (status->local_stack_p) {
6631
6427
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6632
6428
  }
6633
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6634
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6429
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6635
6430
  fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
6636
6431
 
6637
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6638
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6639
- fprintf(f, "\n");
6640
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6432
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6433
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6641
6434
  fprintf(f, "\n");
6642
6435
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
6643
6436
  if (body->catch_except_p || FALSE) {
@@ -6661,20 +6454,20 @@ switch (insn) {
6661
6454
  fprintf(f, " goto cancel;\n");
6662
6455
  fprintf(f, " }\n");
6663
6456
  fprintf(f, " }\n");
6664
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_length(ci, cc) - 1);
6665
- b->stack_size += attr_sp_inc_opt_length(ci, cc);
6457
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_length(cd) - 1);
6458
+ b->stack_size += attr_sp_inc_opt_length(cd);
6666
6459
  }
6667
6460
  fprintf(f, "}\n");
6668
6461
  break;
6669
6462
  case BIN(opt_size):
6670
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
6463
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
6671
6464
  {
6672
6465
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6673
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6674
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6675
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
6466
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6467
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
6676
6468
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
6677
6469
  const rb_iseq_t *iseq;
6470
+ const CALL_INFO ci = &cd->ci;
6678
6471
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
6679
6472
 
6680
6473
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -6687,7 +6480,7 @@ switch (insn) {
6687
6480
  }
6688
6481
 
6689
6482
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
6690
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
6483
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
6691
6484
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
6692
6485
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
6693
6486
  fprintf(f, " goto send_cancel;\n");
@@ -6700,7 +6493,7 @@ switch (insn) {
6700
6493
  if (status->local_stack_p) {
6701
6494
  {
6702
6495
  rb_snum_t i, push_size;
6703
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6496
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6704
6497
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6705
6498
  for (i = 0; i < push_size; i++) {
6706
6499
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6746,7 +6539,7 @@ switch (insn) {
6746
6539
  fprintf(f, " }\n");
6747
6540
 
6748
6541
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6749
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6542
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6750
6543
  if (!pc_moved_p) {
6751
6544
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6752
6545
  }
@@ -6755,7 +6548,7 @@ switch (insn) {
6755
6548
  fprintf(f, " }\n");
6756
6549
  }
6757
6550
 
6758
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6551
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6759
6552
 
6760
6553
  fprintf(f, "}\n");
6761
6554
  break;
@@ -6765,19 +6558,15 @@ switch (insn) {
6765
6558
  fprintf(f, "{\n");
6766
6559
  {
6767
6560
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6768
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6769
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6561
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6770
6562
  if (status->local_stack_p) {
6771
6563
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6772
6564
  }
6773
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6774
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6565
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6775
6566
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
6776
6567
 
6777
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6778
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6779
- fprintf(f, "\n");
6780
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6568
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6569
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6781
6570
  fprintf(f, "\n");
6782
6571
  if (body->catch_except_p || TRUE) {
6783
6572
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -6786,7 +6575,7 @@ switch (insn) {
6786
6575
  if (status->local_stack_p) {
6787
6576
  {
6788
6577
  rb_snum_t i, push_size;
6789
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6578
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6790
6579
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6791
6580
  for (i = 0; i < push_size; i++) {
6792
6581
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6798,7 +6587,7 @@ switch (insn) {
6798
6587
  }
6799
6588
  fprintf(f, " {\n");
6800
6589
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
6801
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
6590
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
6802
6591
  fprintf(f, "\n");
6803
6592
  fprintf(f, " if (val == Qundef) {\n");
6804
6593
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -6810,16 +6599,16 @@ switch (insn) {
6810
6599
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
6811
6600
  fprintf(f, " }\n");
6812
6601
  fprintf(f, " }\n");
6813
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
6602
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
6814
6603
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6815
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6604
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6816
6605
  if (!pc_moved_p) {
6817
6606
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6818
6607
  }
6819
6608
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
6820
6609
  fprintf(f, " goto cancel;\n");
6821
6610
  fprintf(f, " }\n");
6822
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6611
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6823
6612
  }
6824
6613
  fprintf(f, "}\n");
6825
6614
  break;
@@ -6827,19 +6616,15 @@ switch (insn) {
6827
6616
  fprintf(f, "{\n");
6828
6617
  {
6829
6618
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6830
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6831
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6619
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6832
6620
  if (status->local_stack_p) {
6833
6621
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6834
6622
  }
6835
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6836
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6623
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6837
6624
  fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
6838
6625
 
6839
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6840
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6841
- fprintf(f, "\n");
6842
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6626
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6627
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6843
6628
  fprintf(f, "\n");
6844
6629
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
6845
6630
  if (body->catch_except_p || FALSE) {
@@ -6863,20 +6648,20 @@ switch (insn) {
6863
6648
  fprintf(f, " goto cancel;\n");
6864
6649
  fprintf(f, " }\n");
6865
6650
  fprintf(f, " }\n");
6866
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_size(ci, cc) - 1);
6867
- b->stack_size += attr_sp_inc_opt_size(ci, cc);
6651
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_size(cd) - 1);
6652
+ b->stack_size += attr_sp_inc_opt_size(cd);
6868
6653
  }
6869
6654
  fprintf(f, "}\n");
6870
6655
  break;
6871
6656
  case BIN(opt_empty_p):
6872
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
6657
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
6873
6658
  {
6874
6659
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6875
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6876
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6877
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
6660
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6661
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
6878
6662
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
6879
6663
  const rb_iseq_t *iseq;
6664
+ const CALL_INFO ci = &cd->ci;
6880
6665
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
6881
6666
 
6882
6667
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -6889,7 +6674,7 @@ switch (insn) {
6889
6674
  }
6890
6675
 
6891
6676
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
6892
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
6677
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
6893
6678
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
6894
6679
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
6895
6680
  fprintf(f, " goto send_cancel;\n");
@@ -6902,7 +6687,7 @@ switch (insn) {
6902
6687
  if (status->local_stack_p) {
6903
6688
  {
6904
6689
  rb_snum_t i, push_size;
6905
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6690
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6906
6691
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6907
6692
  for (i = 0; i < push_size; i++) {
6908
6693
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -6948,7 +6733,7 @@ switch (insn) {
6948
6733
  fprintf(f, " }\n");
6949
6734
 
6950
6735
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
6951
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6736
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
6952
6737
  if (!pc_moved_p) {
6953
6738
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
6954
6739
  }
@@ -6957,7 +6742,7 @@ switch (insn) {
6957
6742
  fprintf(f, " }\n");
6958
6743
  }
6959
6744
 
6960
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6745
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
6961
6746
 
6962
6747
  fprintf(f, "}\n");
6963
6748
  break;
@@ -6967,19 +6752,15 @@ switch (insn) {
6967
6752
  fprintf(f, "{\n");
6968
6753
  {
6969
6754
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
6970
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
6971
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6755
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6972
6756
  if (status->local_stack_p) {
6973
6757
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
6974
6758
  }
6975
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
6976
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6759
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
6977
6760
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
6978
6761
 
6979
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
6980
- comment_id(f, ((CALL_INFO)operands[0])->mid);
6981
- fprintf(f, "\n");
6982
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6762
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6763
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
6983
6764
  fprintf(f, "\n");
6984
6765
  if (body->catch_except_p || TRUE) {
6985
6766
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -6988,7 +6769,7 @@ switch (insn) {
6988
6769
  if (status->local_stack_p) {
6989
6770
  {
6990
6771
  rb_snum_t i, push_size;
6991
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6772
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
6992
6773
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
6993
6774
  for (i = 0; i < push_size; i++) {
6994
6775
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7000,7 +6781,7 @@ switch (insn) {
7000
6781
  }
7001
6782
  fprintf(f, " {\n");
7002
6783
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
7003
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
6784
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
7004
6785
  fprintf(f, "\n");
7005
6786
  fprintf(f, " if (val == Qundef) {\n");
7006
6787
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -7012,16 +6793,16 @@ switch (insn) {
7012
6793
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
7013
6794
  fprintf(f, " }\n");
7014
6795
  fprintf(f, " }\n");
7015
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
6796
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
7016
6797
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7017
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6798
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7018
6799
  if (!pc_moved_p) {
7019
6800
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7020
6801
  }
7021
6802
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7022
6803
  fprintf(f, " goto cancel;\n");
7023
6804
  fprintf(f, " }\n");
7024
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6805
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7025
6806
  }
7026
6807
  fprintf(f, "}\n");
7027
6808
  break;
@@ -7029,19 +6810,15 @@ switch (insn) {
7029
6810
  fprintf(f, "{\n");
7030
6811
  {
7031
6812
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7032
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7033
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6813
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7034
6814
  if (status->local_stack_p) {
7035
6815
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7036
6816
  }
7037
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7038
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6817
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7039
6818
  fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
7040
6819
 
7041
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7042
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7043
- fprintf(f, "\n");
7044
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6820
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6821
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7045
6822
  fprintf(f, "\n");
7046
6823
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
7047
6824
  if (body->catch_except_p || FALSE) {
@@ -7065,20 +6842,20 @@ switch (insn) {
7065
6842
  fprintf(f, " goto cancel;\n");
7066
6843
  fprintf(f, " }\n");
7067
6844
  fprintf(f, " }\n");
7068
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_empty_p(ci, cc) - 1);
7069
- b->stack_size += attr_sp_inc_opt_empty_p(ci, cc);
6845
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_empty_p(cd) - 1);
6846
+ b->stack_size += attr_sp_inc_opt_empty_p(cd);
7070
6847
  }
7071
6848
  fprintf(f, "}\n");
7072
6849
  break;
7073
6850
  case BIN(opt_succ):
7074
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
6851
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
7075
6852
  {
7076
6853
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7077
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7078
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7079
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
6854
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
6855
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
7080
6856
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
7081
6857
  const rb_iseq_t *iseq;
6858
+ const CALL_INFO ci = &cd->ci;
7082
6859
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
7083
6860
 
7084
6861
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -7091,7 +6868,7 @@ switch (insn) {
7091
6868
  }
7092
6869
 
7093
6870
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
7094
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
6871
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
7095
6872
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
7096
6873
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7097
6874
  fprintf(f, " goto send_cancel;\n");
@@ -7104,7 +6881,7 @@ switch (insn) {
7104
6881
  if (status->local_stack_p) {
7105
6882
  {
7106
6883
  rb_snum_t i, push_size;
7107
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6884
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
7108
6885
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
7109
6886
  for (i = 0; i < push_size; i++) {
7110
6887
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7150,7 +6927,7 @@ switch (insn) {
7150
6927
  fprintf(f, " }\n");
7151
6928
 
7152
6929
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7153
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6930
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7154
6931
  if (!pc_moved_p) {
7155
6932
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7156
6933
  }
@@ -7159,7 +6936,7 @@ switch (insn) {
7159
6936
  fprintf(f, " }\n");
7160
6937
  }
7161
6938
 
7162
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6939
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7163
6940
 
7164
6941
  fprintf(f, "}\n");
7165
6942
  break;
@@ -7169,19 +6946,15 @@ switch (insn) {
7169
6946
  fprintf(f, "{\n");
7170
6947
  {
7171
6948
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7172
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7173
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
6949
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7174
6950
  if (status->local_stack_p) {
7175
6951
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7176
6952
  }
7177
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7178
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
6953
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7179
6954
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
7180
6955
 
7181
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7182
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7183
- fprintf(f, "\n");
7184
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
6956
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
6957
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7185
6958
  fprintf(f, "\n");
7186
6959
  if (body->catch_except_p || TRUE) {
7187
6960
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -7190,7 +6963,7 @@ switch (insn) {
7190
6963
  if (status->local_stack_p) {
7191
6964
  {
7192
6965
  rb_snum_t i, push_size;
7193
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
6966
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
7194
6967
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
7195
6968
  for (i = 0; i < push_size; i++) {
7196
6969
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7202,7 +6975,7 @@ switch (insn) {
7202
6975
  }
7203
6976
  fprintf(f, " {\n");
7204
6977
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
7205
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
6978
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
7206
6979
  fprintf(f, "\n");
7207
6980
  fprintf(f, " if (val == Qundef) {\n");
7208
6981
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -7214,16 +6987,16 @@ switch (insn) {
7214
6987
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
7215
6988
  fprintf(f, " }\n");
7216
6989
  fprintf(f, " }\n");
7217
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
6990
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
7218
6991
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7219
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
6992
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7220
6993
  if (!pc_moved_p) {
7221
6994
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7222
6995
  }
7223
6996
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7224
6997
  fprintf(f, " goto cancel;\n");
7225
6998
  fprintf(f, " }\n");
7226
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
6999
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7227
7000
  }
7228
7001
  fprintf(f, "}\n");
7229
7002
  break;
@@ -7231,19 +7004,15 @@ switch (insn) {
7231
7004
  fprintf(f, "{\n");
7232
7005
  {
7233
7006
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7234
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7235
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7007
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7236
7008
  if (status->local_stack_p) {
7237
7009
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7238
7010
  }
7239
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7240
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
7011
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7241
7012
  fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
7242
7013
 
7243
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7244
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7245
- fprintf(f, "\n");
7246
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
7014
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
7015
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7247
7016
  fprintf(f, "\n");
7248
7017
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
7249
7018
  if (body->catch_except_p || FALSE) {
@@ -7267,20 +7036,20 @@ switch (insn) {
7267
7036
  fprintf(f, " goto cancel;\n");
7268
7037
  fprintf(f, " }\n");
7269
7038
  fprintf(f, " }\n");
7270
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_succ(ci, cc) - 1);
7271
- b->stack_size += attr_sp_inc_opt_succ(ci, cc);
7039
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_succ(cd) - 1);
7040
+ b->stack_size += attr_sp_inc_opt_succ(cd);
7272
7041
  }
7273
7042
  fprintf(f, "}\n");
7274
7043
  break;
7275
7044
  case BIN(opt_not):
7276
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
7045
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
7277
7046
  {
7278
7047
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7279
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7280
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7281
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
7048
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7049
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
7282
7050
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
7283
7051
  const rb_iseq_t *iseq;
7052
+ const CALL_INFO ci = &cd->ci;
7284
7053
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
7285
7054
 
7286
7055
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -7293,7 +7062,7 @@ switch (insn) {
7293
7062
  }
7294
7063
 
7295
7064
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
7296
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
7065
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
7297
7066
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
7298
7067
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7299
7068
  fprintf(f, " goto send_cancel;\n");
@@ -7306,7 +7075,7 @@ switch (insn) {
7306
7075
  if (status->local_stack_p) {
7307
7076
  {
7308
7077
  rb_snum_t i, push_size;
7309
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
7078
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
7310
7079
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
7311
7080
  for (i = 0; i < push_size; i++) {
7312
7081
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7352,7 +7121,7 @@ switch (insn) {
7352
7121
  fprintf(f, " }\n");
7353
7122
 
7354
7123
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7355
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
7124
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7356
7125
  if (!pc_moved_p) {
7357
7126
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7358
7127
  }
@@ -7361,7 +7130,7 @@ switch (insn) {
7361
7130
  fprintf(f, " }\n");
7362
7131
  }
7363
7132
 
7364
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
7133
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7365
7134
 
7366
7135
  fprintf(f, "}\n");
7367
7136
  break;
@@ -7371,19 +7140,15 @@ switch (insn) {
7371
7140
  fprintf(f, "{\n");
7372
7141
  {
7373
7142
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7374
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7375
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7143
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7376
7144
  if (status->local_stack_p) {
7377
7145
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7378
7146
  }
7379
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7380
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
7147
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7381
7148
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
7382
7149
 
7383
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7384
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7385
- fprintf(f, "\n");
7386
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
7150
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
7151
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7387
7152
  fprintf(f, "\n");
7388
7153
  if (body->catch_except_p || TRUE) {
7389
7154
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -7392,7 +7157,7 @@ switch (insn) {
7392
7157
  if (status->local_stack_p) {
7393
7158
  {
7394
7159
  rb_snum_t i, push_size;
7395
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
7160
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
7396
7161
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
7397
7162
  for (i = 0; i < push_size; i++) {
7398
7163
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7404,7 +7169,7 @@ switch (insn) {
7404
7169
  }
7405
7170
  fprintf(f, " {\n");
7406
7171
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
7407
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
7172
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
7408
7173
  fprintf(f, "\n");
7409
7174
  fprintf(f, " if (val == Qundef) {\n");
7410
7175
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -7416,16 +7181,16 @@ switch (insn) {
7416
7181
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
7417
7182
  fprintf(f, " }\n");
7418
7183
  fprintf(f, " }\n");
7419
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
7184
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
7420
7185
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7421
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
7186
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7422
7187
  if (!pc_moved_p) {
7423
7188
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7424
7189
  }
7425
7190
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7426
7191
  fprintf(f, " goto cancel;\n");
7427
7192
  fprintf(f, " }\n");
7428
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
7193
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7429
7194
  }
7430
7195
  fprintf(f, "}\n");
7431
7196
  break;
@@ -7433,19 +7198,15 @@ switch (insn) {
7433
7198
  fprintf(f, "{\n");
7434
7199
  {
7435
7200
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7436
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7437
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7201
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7438
7202
  if (status->local_stack_p) {
7439
7203
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7440
7204
  }
7441
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7442
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
7205
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7443
7206
  fprintf(f, " MAYBE_UNUSED(VALUE) recv, val;\n");
7444
7207
 
7445
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7446
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7447
- fprintf(f, "\n");
7448
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
7208
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
7209
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7449
7210
  fprintf(f, "\n");
7450
7211
  fprintf(f, " recv = stack[%d];\n", b->stack_size - 1);
7451
7212
  if (body->catch_except_p || FALSE) {
@@ -7458,7 +7219,7 @@ switch (insn) {
7458
7219
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7459
7220
  }
7460
7221
  fprintf(f, " {\n");
7461
- fprintf(f, " val = vm_opt_not(ci, cc, recv);\n");
7222
+ fprintf(f, " val = vm_opt_not(cd, recv);\n");
7462
7223
  fprintf(f, "\n");
7463
7224
  fprintf(f, " if (val == Qundef) {\n");
7464
7225
  if (status->local_stack_p) {
@@ -7469,20 +7230,20 @@ switch (insn) {
7469
7230
  fprintf(f, " goto cancel;\n");
7470
7231
  fprintf(f, " }\n");
7471
7232
  fprintf(f, " }\n");
7472
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_not(ci, cc) - 1);
7473
- b->stack_size += attr_sp_inc_opt_not(ci, cc);
7233
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_not(cd) - 1);
7234
+ b->stack_size += attr_sp_inc_opt_not(cd);
7474
7235
  }
7475
7236
  fprintf(f, "}\n");
7476
7237
  break;
7477
7238
  case BIN(opt_regexpmatch2):
7478
- if (has_valid_method_type(status->cc_entries + ((CALL_CACHE)operands[1] - body->cc_entries))) {
7239
+ if (has_valid_method_type(status->cc_entries + call_data_index((CALL_DATA)operands[0], body))) {
7479
7240
  {
7480
7241
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7481
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7482
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7483
- CALL_CACHE cc_copy = status->cc_entries + (cc - body->cc_entries);
7242
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7243
+ CALL_CACHE cc_copy = status->cc_entries + call_data_index(cd, body);
7484
7244
  if (!status->compile_info->disable_send_cache && has_valid_method_type(cc_copy)) {
7485
7245
  const rb_iseq_t *iseq;
7246
+ const CALL_INFO ci = &cd->ci;
7486
7247
  unsigned int argc = ci->orig_argc; // this `argc` variable is for calculating a value's position on stack considering `blockarg`.
7487
7248
 
7488
7249
  if (!(ci->flag & VM_CALL_TAILCALL) // inlining non-tailcall path
@@ -7495,7 +7256,7 @@ switch (insn) {
7495
7256
  }
7496
7257
 
7497
7258
  fprintf(f, " if (UNLIKELY(GET_GLOBAL_METHOD_STATE() != %"PRI_SERIALT_PREFIX"u ||\n", cc_copy->method_state);
7498
- fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial);
7259
+ fprintf(f, " RCLASS_SERIAL(CLASS_OF(stack[%d])) != %"PRI_SERIALT_PREFIX"u)) {\n", b->stack_size - 1 - argc, cc_copy->class_serial[0]);
7499
7260
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", pos);
7500
7261
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7501
7262
  fprintf(f, " goto send_cancel;\n");
@@ -7508,7 +7269,7 @@ switch (insn) {
7508
7269
  if (status->local_stack_p) {
7509
7270
  {
7510
7271
  rb_snum_t i, push_size;
7511
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
7272
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
7512
7273
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
7513
7274
  for (i = 0; i < push_size; i++) {
7514
7275
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7554,7 +7315,7 @@ switch (insn) {
7554
7315
  fprintf(f, " }\n");
7555
7316
 
7556
7317
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7557
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
7318
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7558
7319
  if (!pc_moved_p) {
7559
7320
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7560
7321
  }
@@ -7563,7 +7324,7 @@ switch (insn) {
7563
7324
  fprintf(f, " }\n");
7564
7325
  }
7565
7326
 
7566
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
7327
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7567
7328
 
7568
7329
  fprintf(f, "}\n");
7569
7330
  break;
@@ -7573,19 +7334,15 @@ switch (insn) {
7573
7334
  fprintf(f, "{\n");
7574
7335
  {
7575
7336
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7576
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7577
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7337
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7578
7338
  if (status->local_stack_p) {
7579
7339
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7580
7340
  }
7581
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7582
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
7341
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7583
7342
  fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
7584
7343
 
7585
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7586
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7587
- fprintf(f, "\n");
7588
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
7344
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
7345
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7589
7346
  fprintf(f, "\n");
7590
7347
  if (body->catch_except_p || TRUE) {
7591
7348
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
@@ -7594,7 +7351,7 @@ switch (insn) {
7594
7351
  if (status->local_stack_p) {
7595
7352
  {
7596
7353
  rb_snum_t i, push_size;
7597
- push_size = -attr_sp_inc_opt_send_without_block(ci, cc) + 1 - 0;
7354
+ push_size = -attr_sp_inc_opt_send_without_block(cd) + 1 - 0;
7598
7355
  fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %ld;\n", push_size); /* POPN(INSN_ATTR(popn)); */
7599
7356
  for (i = 0; i < push_size; i++) {
7600
7357
  fprintf(f, " *(reg_cfp->sp + %ld) = stack[%ld];\n", i - push_size, (rb_snum_t)b->stack_size - push_size + i);
@@ -7606,7 +7363,7 @@ switch (insn) {
7606
7363
  }
7607
7364
  fprintf(f, " {\n");
7608
7365
  fprintf(f, " VALUE bh = VM_BLOCK_HANDLER_NONE;\n");
7609
- fprintf(f, " val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);\n");
7366
+ fprintf(f, " val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);\n");
7610
7367
  fprintf(f, "\n");
7611
7368
  fprintf(f, " if (val == Qundef) {\n");
7612
7369
  fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
@@ -7618,16 +7375,16 @@ switch (insn) {
7618
7375
  fprintf(f, " UNREACHABLE_RETURN(Qundef);\n");
7619
7376
  fprintf(f, " }\n");
7620
7377
  fprintf(f, " }\n");
7621
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc) - 1);
7378
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd) - 1);
7622
7379
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7623
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(ci, cc));
7380
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_send_without_block(cd));
7624
7381
  if (!pc_moved_p) {
7625
7382
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7626
7383
  }
7627
7384
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7628
7385
  fprintf(f, " goto cancel;\n");
7629
7386
  fprintf(f, " }\n");
7630
- b->stack_size += attr_sp_inc_opt_send_without_block(ci, cc);
7387
+ b->stack_size += attr_sp_inc_opt_send_without_block(cd);
7631
7388
  }
7632
7389
  fprintf(f, "}\n");
7633
7390
  break;
@@ -7635,19 +7392,15 @@ switch (insn) {
7635
7392
  fprintf(f, "{\n");
7636
7393
  {
7637
7394
  MAYBE_UNUSED(int pc_moved_p) = FALSE;
7638
- MAYBE_UNUSED(CALL_INFO ci) = (CALL_INFO)operands[0];
7639
- MAYBE_UNUSED(CALL_CACHE cc) = (CALL_CACHE)operands[1];
7395
+ MAYBE_UNUSED(CALL_DATA cd) = (CALL_DATA)operands[0];
7640
7396
  if (status->local_stack_p) {
7641
7397
  fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7642
7398
  }
7643
- fprintf(f, " MAYBE_UNUSED(CALL_CACHE) cc;\n");
7644
- fprintf(f, " MAYBE_UNUSED(CALL_INFO) ci;\n");
7399
+ fprintf(f, " MAYBE_UNUSED(CALL_DATA) cd;\n");
7645
7400
  fprintf(f, " MAYBE_UNUSED(VALUE) obj1, obj2, val;\n");
7646
7401
 
7647
- fprintf(f, " ci = (CALL_INFO)0x%"PRIxVALUE";", operands[0]);
7648
- comment_id(f, ((CALL_INFO)operands[0])->mid);
7649
- fprintf(f, "\n");
7650
- fprintf(f, " cc = (CALL_CACHE)0x%"PRIxVALUE";", operands[1]);
7402
+ fprintf(f, " cd = (CALL_DATA)0x%"PRIxVALUE";", operands[0]);
7403
+ comment_id(f, ((CALL_DATA)operands[0])->ci.mid);
7651
7404
  fprintf(f, "\n");
7652
7405
  fprintf(f, " obj2 = stack[%d];\n", b->stack_size - 2);
7653
7406
  fprintf(f, " obj1 = stack[%d];\n", b->stack_size - 1);
@@ -7672,19 +7425,162 @@ switch (insn) {
7672
7425
  fprintf(f, " goto cancel;\n");
7673
7426
  fprintf(f, " }\n");
7674
7427
  fprintf(f, " }\n");
7675
- fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch2(ci, cc) - 1);
7428
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch2(cd) - 1);
7676
7429
  fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7677
- fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch2(ci, cc));
7430
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_regexpmatch2(cd));
7678
7431
  if (!pc_moved_p) {
7679
7432
  fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7680
7433
  }
7681
7434
  fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7682
7435
  fprintf(f, " goto cancel;\n");
7683
7436
  fprintf(f, " }\n");
7684
- b->stack_size += attr_sp_inc_opt_regexpmatch2(ci, cc);
7437
+ b->stack_size += attr_sp_inc_opt_regexpmatch2(cd);
7685
7438
  }
7686
7439
  fprintf(f, "}\n");
7687
7440
  break;
7441
+ case BIN(invokebuiltin):
7442
+ fprintf(f, "{\n");
7443
+ {
7444
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
7445
+ MAYBE_UNUSED(RB_BUILTIN bf) = (RB_BUILTIN)operands[0];
7446
+ if (status->local_stack_p) {
7447
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7448
+ }
7449
+ fprintf(f, " MAYBE_UNUSED(RB_BUILTIN) bf;\n");
7450
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret;\n");
7451
+
7452
+ fprintf(f, " bf = (RB_BUILTIN)0x%"PRIxVALUE";", operands[0]);
7453
+ fprintf(f, "\n");
7454
+ if (body->catch_except_p || TRUE) {
7455
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
7456
+ pc_moved_p = TRUE;
7457
+ }
7458
+ if (status->local_stack_p) {
7459
+ }
7460
+ else {
7461
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7462
+ }
7463
+ fprintf(f, " {\n");
7464
+ fprintf(f, " ret = vm_invoke_builtin(ec, reg_cfp, bf, %s);\n",
7465
+ (status->local_stack_p ? "stack + (stack_size - (bf->argc))" : "STACK_ADDR_FROM_TOP(bf->argc)"));
7466
+ fprintf(f, " }\n");
7467
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_invokebuiltin(bf) - 1);
7468
+ fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7469
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_invokebuiltin(bf));
7470
+ if (!pc_moved_p) {
7471
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7472
+ }
7473
+ fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7474
+ fprintf(f, " goto cancel;\n");
7475
+ fprintf(f, " }\n");
7476
+ b->stack_size += attr_sp_inc_invokebuiltin(bf);
7477
+ }
7478
+ fprintf(f, "}\n");
7479
+ break;
7480
+ case BIN(opt_invokebuiltin_delegate):
7481
+ fprintf(f, "{\n");
7482
+ {
7483
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
7484
+ MAYBE_UNUSED(RB_BUILTIN bf) = (RB_BUILTIN)operands[0];
7485
+ MAYBE_UNUSED(rb_num_t index) = (rb_num_t)operands[1];
7486
+ if (status->local_stack_p) {
7487
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7488
+ }
7489
+ fprintf(f, " MAYBE_UNUSED(RB_BUILTIN) bf;\n");
7490
+ fprintf(f, " MAYBE_UNUSED(VALUE) ret;\n");
7491
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) index;\n");
7492
+
7493
+ fprintf(f, " bf = (RB_BUILTIN)0x%"PRIxVALUE";", operands[0]);
7494
+ fprintf(f, "\n");
7495
+ fprintf(f, " index = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
7496
+ fprintf(f, "\n");
7497
+ if (body->catch_except_p || TRUE) {
7498
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
7499
+ pc_moved_p = TRUE;
7500
+ }
7501
+ if (status->local_stack_p) {
7502
+ }
7503
+ else {
7504
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7505
+ }
7506
+ fprintf(f, " {\n");
7507
+ fprintf(f, " ret = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);\n");
7508
+ fprintf(f, " }\n");
7509
+ fprintf(f, " stack[%d] = ret;\n", b->stack_size + (int)attr_sp_inc_opt_invokebuiltin_delegate(bf, index) - 1);
7510
+ fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7511
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_invokebuiltin_delegate(bf, index));
7512
+ if (!pc_moved_p) {
7513
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7514
+ }
7515
+ fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7516
+ fprintf(f, " goto cancel;\n");
7517
+ fprintf(f, " }\n");
7518
+ b->stack_size += attr_sp_inc_opt_invokebuiltin_delegate(bf, index);
7519
+ }
7520
+ fprintf(f, "}\n");
7521
+ break;
7522
+ case BIN(opt_invokebuiltin_delegate_leave):
7523
+ fprintf(f, "{\n");
7524
+ {
7525
+ MAYBE_UNUSED(int pc_moved_p) = FALSE;
7526
+ MAYBE_UNUSED(RB_BUILTIN bf) = (RB_BUILTIN)operands[0];
7527
+ MAYBE_UNUSED(rb_num_t index) = (rb_num_t)operands[1];
7528
+ if (status->local_stack_p) {
7529
+ fprintf(f, " MAYBE_UNUSED(unsigned int) stack_size = %u;\n", b->stack_size);
7530
+ }
7531
+ fprintf(f, " MAYBE_UNUSED(RB_BUILTIN) bf;\n");
7532
+ fprintf(f, " MAYBE_UNUSED(VALUE) val;\n");
7533
+ fprintf(f, " MAYBE_UNUSED(rb_num_t) index;\n");
7534
+
7535
+ fprintf(f, " bf = (RB_BUILTIN)0x%"PRIxVALUE";", operands[0]);
7536
+ fprintf(f, "\n");
7537
+ fprintf(f, " index = (rb_num_t)0x%"PRIxVALUE";", operands[1]);
7538
+ fprintf(f, "\n");
7539
+ if (body->catch_except_p || TRUE) {
7540
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos); /* ADD_PC(INSN_ATTR(width)); */
7541
+ pc_moved_p = TRUE;
7542
+ }
7543
+ if (status->local_stack_p) {
7544
+ }
7545
+ else {
7546
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size);
7547
+ }
7548
+ fprintf(f, " {\n");
7549
+ fprintf(f, " val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);\n");
7550
+ fprintf(f, "\n");
7551
+ fprintf(f, " /* leave fastpath */\n");
7552
+ fprintf(f, " /* TracePoint/return should fallback this insn to opt_invokebuiltin_delegate */\n");
7553
+ fprintf(f, " if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {\n");
7554
+ fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
7555
+ fprintf(f, " rb_ec_thread_ptr(ec)->retval = val;\n");
7556
+ fprintf(f, " return 0;\n");
7557
+ fprintf(f, "#else\n");
7558
+ fprintf(f, " return val;\n");
7559
+ fprintf(f, "#endif\n");
7560
+ fprintf(f, " }\n");
7561
+ fprintf(f, " else {\n");
7562
+ fprintf(f, "#if OPT_CALL_THREADED_CODE\n");
7563
+ fprintf(f, " rb_ec_thread_ptr(ec)->retval = val;\n");
7564
+ fprintf(f, " return 0;\n");
7565
+ fprintf(f, "#else\n");
7566
+ fprintf(f, " return val;\n");
7567
+ fprintf(f, "#endif\n");
7568
+ fprintf(f, " }\n");
7569
+ fprintf(f, " }\n");
7570
+ fprintf(f, " stack[%d] = val;\n", b->stack_size + (int)attr_sp_inc_opt_invokebuiltin_delegate_leave(bf, index) - 1);
7571
+ fprintf(f, " if (UNLIKELY(!mjit_call_p)) {\n");
7572
+ fprintf(f, " reg_cfp->sp = vm_base_ptr(reg_cfp) + %d;\n", b->stack_size + (int)attr_sp_inc_opt_invokebuiltin_delegate_leave(bf, index));
7573
+ if (!pc_moved_p) {
7574
+ fprintf(f, " reg_cfp->pc = original_body_iseq + %d;\n", next_pos);
7575
+ }
7576
+ fprintf(f, " RB_DEBUG_COUNTER_INC(mjit_cancel_invalidate_all);\n");
7577
+ fprintf(f, " goto cancel;\n");
7578
+ fprintf(f, " }\n");
7579
+ b->stack_size += attr_sp_inc_opt_invokebuiltin_delegate_leave(bf, index);
7580
+ }
7581
+ fprintf(f, "}\n");
7582
+ b->finish_p = TRUE;
7583
+ break;
7688
7584
  case BIN(getlocal_WC_0):
7689
7585
  fprintf(f, "{\n");
7690
7586
  {