debase-ruby_core_source 0.10.7 → 0.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -122,7 +122,6 @@ enum node_type {
122
122
  NODE_DSYM,
123
123
  NODE_ATTRASGN,
124
124
  NODE_LAMBDA,
125
- NODE_METHREF,
126
125
  NODE_ARYPTN,
127
126
  NODE_HSHPTN,
128
127
  NODE_LAST
@@ -176,7 +175,7 @@ typedef struct RNode {
176
175
 
177
176
  #define RNODE(obj) (R_CAST(RNode)(obj))
178
177
 
179
- /* FL : 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: FINALIZE, 8: TAINT, 9: UNTRUSTED, 10: EXIVAR, 11: FREEZE */
178
+ /* FL : 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: FINALIZE, 8: UNUSED, 9: UNUSED, 10: EXIVAR, 11: FREEZE */
180
179
  /* NODE_FL: 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: NODE_FL_NEWLINE,
181
180
  * 8..14: nd_type,
182
181
  * 15..: nd_line
@@ -378,7 +377,6 @@ typedef struct RNode {
378
377
  #define NEW_PREEXE(b,loc) NEW_SCOPE(b,loc)
379
378
  #define NEW_POSTEXE(b,loc) NEW_NODE(NODE_POSTEXE,0,b,0,loc)
380
379
  #define NEW_ATTRASGN(r,m,a,loc) NEW_NODE(NODE_ATTRASGN,r,m,a,loc)
381
- #define NEW_METHREF(r,m,loc) NEW_NODE(NODE_METHREF,r,m,0,loc)
382
380
 
383
381
  #define NODE_SPECIAL_REQUIRED_KEYWORD ((NODE *)-1)
384
382
  #define NODE_REQUIRED_KEYWORD_P(node) ((node)->nd_value == NODE_SPECIAL_REQUIRED_KEYWORD)
@@ -416,22 +414,15 @@ void rb_ast_delete_node(rb_ast_t*, NODE *n);
416
414
  VALUE rb_parser_new(void);
417
415
  VALUE rb_parser_end_seen_p(VALUE);
418
416
  VALUE rb_parser_encoding(VALUE);
419
- VALUE rb_parser_get_yydebug(VALUE);
420
417
  VALUE rb_parser_set_yydebug(VALUE, VALUE);
421
418
  VALUE rb_parser_dump_tree(const NODE *node, int comment);
422
419
  void rb_parser_set_options(VALUE, int, int, int, int);
423
420
 
424
- rb_ast_t *rb_parser_compile_cstr(VALUE, const char*, const char*, int, int);
425
421
  rb_ast_t *rb_parser_compile_string(VALUE, const char*, VALUE, int);
426
- rb_ast_t *rb_parser_compile_file(VALUE, const char*, VALUE, int);
427
422
  rb_ast_t *rb_parser_compile_string_path(VALUE vparser, VALUE fname, VALUE src, int line);
428
423
  rb_ast_t *rb_parser_compile_file_path(VALUE vparser, VALUE fname, VALUE input, int line);
429
424
  rb_ast_t *rb_parser_compile_generic(VALUE vparser, VALUE (*lex_gets)(VALUE, int), VALUE fname, VALUE input, int line);
430
425
 
431
- rb_ast_t *rb_compile_cstr(const char*, const char*, int, int);
432
- rb_ast_t *rb_compile_string(const char*, VALUE, int);
433
- rb_ast_t *rb_compile_file(const char*, VALUE, int);
434
-
435
426
  void rb_node_init(NODE *n, enum node_type type, VALUE a0, VALUE a1, VALUE a2);
436
427
  const char *ruby_node_name(int node);
437
428
 
@@ -453,7 +444,9 @@ struct rb_args_info {
453
444
  NODE *kw_rest_arg;
454
445
 
455
446
  NODE *opt_args;
456
- int no_kwarg;
447
+ unsigned int no_kwarg: 1;
448
+ unsigned int ruby2_keywords: 1;
449
+
457
450
  VALUE imemo;
458
451
  };
459
452
 
@@ -202,8 +202,6 @@
202
202
  return "NODE_ATTRASGN";
203
203
  case NODE_LAMBDA:
204
204
  return "NODE_LAMBDA";
205
- case NODE_METHREF:
206
- return "NODE_METHREF";
207
205
  case NODE_ARYPTN:
208
206
  return "NODE_ARYPTN";
209
207
  case NODE_HSHPTN:
@@ -0,0 +1,109 @@
1
+ /* -*- C -*- */
2
+
3
+ /* This is an auto-generated file and is a part of the programming language
4
+ * Ruby. The person who created a program to generate this file (``I''
5
+ * hereafter) would like to refrain from defining licensing of this generated
6
+ * source code.
7
+ *
8
+ * This file consists of many small parts of codes copyrighted by each author,
9
+ * not only the ``I'' person. Those original authors agree with some
10
+ * open-source license. I believe that the license we agree is the condition
11
+ * mentioned in the file COPYING. It states "4. You may modify and include
12
+ * the part of the software into any other software ...". But the problem is,
13
+ * the license never makes it clear if such modified parts still remain in the
14
+ * same license, or not. The fact that we agree with the source code's
15
+ * licensing terms does not automatically define that of generated ones. This
16
+ * is the reason why this file is under an unclear situation. All what I know
17
+ * is that above provision guarantees this file to exist.
18
+ *
19
+ * Please let me hesitate to declare something about this nuanced contract. I
20
+ * am not in the position to take over other authors' license to merge into my
21
+ * one. Changing them to (say) GPLv3 is not doable by myself. Perhaps someday
22
+ * it might turn out to be okay to say this file is under a license. I wish
23
+ * the situation would become more clear in the future. */
24
+
25
+ /*******************************************************************/
26
+ /*******************************************************************/
27
+ /*******************************************************************/
28
+ /**
29
+ This file is for threaded code.
30
+
31
+ ----
32
+ This file is auto generated by insns2vm.rb
33
+ DO NOT TOUCH!
34
+
35
+ If you want to fix something, you must edit "tool/ruby_vm/views/opt_sc.inc.erb"
36
+ or tool/insns2vm.rb
37
+ */
38
+
39
+ #define SC_STATE_SIZE 6
40
+
41
+ #define SCS_XX 1
42
+ #define SCS_AX 2
43
+ #define SCS_BX 3
44
+ #define SCS_AB 4
45
+ #define SCS_BA 5
46
+
47
+ #define SC_ERROR 0xffffffff
48
+
49
+ static const VALUE sc_insn_info[][SC_STATE_SIZE] = {
50
+ #define NO_SC { SC_ERROR, SC_ERROR, SC_ERROR, SC_ERROR, SC_ERROR, SC_ERROR }
51
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
52
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
53
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
54
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
55
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
56
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
57
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
58
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
59
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
60
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
61
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
62
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
63
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
64
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
65
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
66
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
67
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
68
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
69
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
70
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
71
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
72
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
73
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
74
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
75
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
76
+ NO_SC, NO_SC, NO_SC, NO_SC, NO_SC, NO_SC,
77
+ #undef NO_SC
78
+ };
79
+
80
+ static const VALUE sc_insn_next[] = {
81
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
82
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
83
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
84
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
85
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
86
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
87
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
88
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
89
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
90
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
91
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
92
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
93
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
94
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
95
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
96
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
97
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
98
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
99
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
100
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
101
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
102
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
103
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
104
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
105
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
106
+ SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX, SCS_XX,
107
+ };
108
+
109
+ ASSERT_VM_INSTRUCTION_SIZE(sc_insn_next);
@@ -0,0 +1,43 @@
1
+ /* -*- C -*- */
2
+
3
+ /* This is an auto-generated file and is a part of the programming language
4
+ * Ruby. The person who created a program to generate this file (``I''
5
+ * hereafter) would like to refrain from defining licensing of this generated
6
+ * source code.
7
+ *
8
+ * This file consists of many small parts of codes copyrighted by each author,
9
+ * not only the ``I'' person. Those original authors agree with some
10
+ * open-source license. I believe that the license we agree is the condition
11
+ * mentioned in the file COPYING. It states "4. You may modify and include
12
+ * the part of the software into any other software ...". But the problem is,
13
+ * the license never makes it clear if such modified parts still remain in the
14
+ * same license, or not. The fact that we agree with the source code's
15
+ * licensing terms does not automatically define that of generated ones. This
16
+ * is the reason why this file is under an unclear situation. All what I know
17
+ * is that above provision guarantees this file to exist.
18
+ *
19
+ * Please let me hesitate to declare something about this nuanced contract. I
20
+ * am not in the position to take over other authors' license to merge into my
21
+ * one. Changing them to (say) GPLv3 is not doable by myself. Perhaps someday
22
+ * it might turn out to be okay to say this file is under a license. I wish
23
+ * the situation would become more clear in the future. */
24
+
25
+ /*******************************************************************/
26
+ /*******************************************************************/
27
+ /*******************************************************************/
28
+ /**
29
+ This file is for threaded code.
30
+
31
+ ----
32
+ This file is auto generated by insns2vm.rb
33
+ DO NOT TOUCH!
34
+
35
+ If you want to fix something, you must edit "tool/ruby_vm/views/optunifs.inc.erb"
36
+ or tool/insns2vm.rb
37
+ */
38
+
39
+ /* Let .bss section automatically initialize this variable */
40
+ /* cf. Section 6.7.8 of ISO/IEC 9899:1999 */
41
+ static const int *const *const unified_insns_data[206];
42
+
43
+ ASSERT_VM_INSTRUCTION_SIZE(unified_insns_data);
@@ -135,7 +135,6 @@ extern int yydebug;
135
135
  tRSHFT = 137,
136
136
  tANDDOT = 150,
137
137
  tCOLON2 = 147,
138
- tMETHREF = 151,
139
138
  tCOLON3 = 324,
140
139
  tOP_ASGN = 325,
141
140
  tASSOC = 326,
@@ -179,6 +178,7 @@ union YYSTYPE
179
178
  NODE *node;
180
179
  ID id;
181
180
  int num;
181
+ st_table *tbl;
182
182
  const struct vtable *vars;
183
183
  struct rb_strterm_struct *strterm;
184
184
 
@@ -0,0 +1,2 @@
1
+ #define RUBY_REVISION "647ee6f091"
2
+ #define RUBY_FULL_REVISION "647ee6f091eafcce70ffb75ddf7e121e192ab217"
@@ -0,0 +1,9 @@
1
+
2
+ /* per-object */
3
+
4
+ struct gen_ivtbl {
5
+ uint32_t numiv;
6
+ VALUE ivptr[FLEX_ARY_LEN];
7
+ };
8
+
9
+ struct st_table *rb_ivar_generic_ivtbl(void);
@@ -2,11 +2,11 @@
2
2
  # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
3
3
  #define RUBY_VERSION_TEENY 0
4
4
  #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
5
- #define RUBY_PATCHLEVEL -1
5
+ #define RUBY_PATCHLEVEL 0
6
6
 
7
7
  #define RUBY_RELEASE_YEAR 2019
8
- #define RUBY_RELEASE_MONTH 10
9
- #define RUBY_RELEASE_DAY 22
8
+ #define RUBY_RELEASE_MONTH 12
9
+ #define RUBY_RELEASE_DAY 25
10
10
 
11
11
  #include "ruby/version.h"
12
12
 
@@ -37,7 +37,7 @@
37
37
  #endif
38
38
 
39
39
  #if RUBY_PATCHLEVEL == -1
40
- #define RUBY_PATCHLEVEL_STR "preview2"
40
+ #define RUBY_PATCHLEVEL_STR "dev"
41
41
  #else
42
42
  #define RUBY_PATCHLEVEL_STR "p"STRINGIZE(RUBY_PATCHLEVEL)
43
43
  #endif
@@ -100,6 +100,8 @@ INSN_ENTRY(getlocal)
100
100
  CHECK_CANARY();
101
101
  INC_SP(INSN_ATTR(sp_inc));
102
102
  TOPN(0) = val;
103
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
104
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
103
105
  if (leaf) ADD_PC(INSN_ATTR(width));
104
106
  # undef INSN_ATTR
105
107
 
@@ -136,7 +138,7 @@ INSN_ENTRY(setlocal)
136
138
  RB_DEBUG_COUNTER_INC(lvar_set);
137
139
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);
138
140
  }
139
- # line 140 "vm.inc"
141
+ # line 142 "vm.inc"
140
142
  # undef NAME_OF_CURRENT_INSN
141
143
 
142
144
  /* ### Instruction trailers. ### */
@@ -189,7 +191,7 @@ INSN_ENTRY(getblockparam)
189
191
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
190
192
  }
191
193
  }
192
- # line 193 "vm.inc"
194
+ # line 195 "vm.inc"
193
195
  # undef NAME_OF_CURRENT_INSN
194
196
 
195
197
  /* ### Instruction trailers. ### */
@@ -197,6 +199,8 @@ INSN_ENTRY(getblockparam)
197
199
  CHECK_CANARY();
198
200
  INC_SP(INSN_ATTR(sp_inc));
199
201
  TOPN(0) = val;
202
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
203
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
200
204
  if (leaf) ADD_PC(INSN_ATTR(width));
201
205
  # undef INSN_ATTR
202
206
 
@@ -238,7 +242,7 @@ INSN_ENTRY(setblockparam)
238
242
 
239
243
  VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM);
240
244
  }
241
- # line 242 "vm.inc"
245
+ # line 246 "vm.inc"
242
246
  # undef NAME_OF_CURRENT_INSN
243
247
 
244
248
  /* ### Instruction trailers. ### */
@@ -312,7 +316,7 @@ INSN_ENTRY(getblockparamproxy)
312
316
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
313
317
  }
314
318
  }
315
- # line 316 "vm.inc"
319
+ # line 320 "vm.inc"
316
320
  # undef NAME_OF_CURRENT_INSN
317
321
 
318
322
  /* ### Instruction trailers. ### */
@@ -320,6 +324,8 @@ INSN_ENTRY(getblockparamproxy)
320
324
  CHECK_CANARY();
321
325
  INC_SP(INSN_ATTR(sp_inc));
322
326
  TOPN(0) = val;
327
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
328
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
323
329
  if (leaf) ADD_PC(INSN_ATTR(width));
324
330
  # undef INSN_ATTR
325
331
 
@@ -354,7 +360,7 @@ INSN_ENTRY(getspecial)
354
360
  {
355
361
  val = vm_getspecial(ec, GET_LEP(), key, type);
356
362
  }
357
- # line 358 "vm.inc"
363
+ # line 364 "vm.inc"
358
364
  # undef NAME_OF_CURRENT_INSN
359
365
 
360
366
  /* ### Instruction trailers. ### */
@@ -362,6 +368,8 @@ INSN_ENTRY(getspecial)
362
368
  CHECK_CANARY();
363
369
  INC_SP(INSN_ATTR(sp_inc));
364
370
  TOPN(0) = val;
371
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
372
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
365
373
  if (leaf) ADD_PC(INSN_ATTR(width));
366
374
  # undef INSN_ATTR
367
375
 
@@ -394,7 +402,7 @@ INSN_ENTRY(setspecial)
394
402
  {
395
403
  lep_svar_set(ec, GET_LEP(), key, obj);
396
404
  }
397
- # line 398 "vm.inc"
405
+ # line 406 "vm.inc"
398
406
  # undef NAME_OF_CURRENT_INSN
399
407
 
400
408
  /* ### Instruction trailers. ### */
@@ -417,7 +425,7 @@ INSN_ENTRY(getinstancevariable)
417
425
 
418
426
  /* ### Declare and assign variables. ### */
419
427
  ID id = (ID)GET_OPERAND(1);
420
- IC ic = (IC)GET_OPERAND(2);
428
+ IVC ic = (IVC)GET_OPERAND(2);
421
429
  # define INSN_ATTR(x) attr_ ## x ## _getinstancevariable(id, ic)
422
430
  bool leaf = INSN_ATTR(leaf);
423
431
  VALUE val;
@@ -435,7 +443,7 @@ INSN_ENTRY(getinstancevariable)
435
443
  {
436
444
  val = vm_getinstancevariable(GET_SELF(), id, ic);
437
445
  }
438
- # line 439 "vm.inc"
446
+ # line 447 "vm.inc"
439
447
  # undef NAME_OF_CURRENT_INSN
440
448
 
441
449
  /* ### Instruction trailers. ### */
@@ -443,6 +451,8 @@ INSN_ENTRY(getinstancevariable)
443
451
  CHECK_CANARY();
444
452
  INC_SP(INSN_ATTR(sp_inc));
445
453
  TOPN(0) = val;
454
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
455
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
446
456
  if (leaf) ADD_PC(INSN_ATTR(width));
447
457
  # undef INSN_ATTR
448
458
 
@@ -459,7 +469,7 @@ INSN_ENTRY(setinstancevariable)
459
469
 
460
470
  /* ### Declare and assign variables. ### */
461
471
  ID id = (ID)GET_OPERAND(1);
462
- IC ic = (IC)GET_OPERAND(2);
472
+ IVC ic = (IVC)GET_OPERAND(2);
463
473
  # define INSN_ATTR(x) attr_ ## x ## _setinstancevariable(id, ic)
464
474
  bool leaf = INSN_ATTR(leaf);
465
475
  VALUE val = TOPN(0);
@@ -477,7 +487,7 @@ INSN_ENTRY(setinstancevariable)
477
487
  {
478
488
  vm_setinstancevariable(GET_SELF(), id, val, ic);
479
489
  }
480
- # line 481 "vm.inc"
490
+ # line 491 "vm.inc"
481
491
  # undef NAME_OF_CURRENT_INSN
482
492
 
483
493
  /* ### Instruction trailers. ### */
@@ -516,7 +526,7 @@ INSN_ENTRY(getclassvariable)
516
526
  {
517
527
  val = rb_cvar_get(vm_get_cvar_base(vm_get_cref(GET_EP()), GET_CFP()), id);
518
528
  }
519
- # line 520 "vm.inc"
529
+ # line 530 "vm.inc"
520
530
  # undef NAME_OF_CURRENT_INSN
521
531
 
522
532
  /* ### Instruction trailers. ### */
@@ -524,6 +534,8 @@ INSN_ENTRY(getclassvariable)
524
534
  CHECK_CANARY();
525
535
  INC_SP(INSN_ATTR(sp_inc));
526
536
  TOPN(0) = val;
537
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
538
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
527
539
  if (leaf) ADD_PC(INSN_ATTR(width));
528
540
  # undef INSN_ATTR
529
541
 
@@ -557,7 +569,7 @@ INSN_ENTRY(setclassvariable)
557
569
  vm_ensure_not_refinement_module(GET_SELF());
558
570
  rb_cvar_set(vm_get_cvar_base(vm_get_cref(GET_EP()), GET_CFP()), id, val);
559
571
  }
560
- # line 561 "vm.inc"
572
+ # line 573 "vm.inc"
561
573
  # undef NAME_OF_CURRENT_INSN
562
574
 
563
575
  /* ### Instruction trailers. ### */
@@ -598,7 +610,7 @@ INSN_ENTRY(getconstant)
598
610
  {
599
611
  val = vm_get_ev_const(ec, klass, id, allow_nil == Qtrue, 0);
600
612
  }
601
- # line 602 "vm.inc"
613
+ # line 614 "vm.inc"
602
614
  # undef NAME_OF_CURRENT_INSN
603
615
 
604
616
  /* ### Instruction trailers. ### */
@@ -606,6 +618,8 @@ INSN_ENTRY(getconstant)
606
618
  CHECK_CANARY();
607
619
  INC_SP(INSN_ATTR(sp_inc));
608
620
  TOPN(0) = val;
621
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
622
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
609
623
  if (leaf) ADD_PC(INSN_ATTR(width));
610
624
  # undef INSN_ATTR
611
625
 
@@ -641,7 +655,7 @@ INSN_ENTRY(setconstant)
641
655
  vm_ensure_not_refinement_module(GET_SELF());
642
656
  rb_const_set(cbase, id, val);
643
657
  }
644
- # line 645 "vm.inc"
658
+ # line 659 "vm.inc"
645
659
  # undef NAME_OF_CURRENT_INSN
646
660
 
647
661
  /* ### Instruction trailers. ### */
@@ -681,7 +695,7 @@ INSN_ENTRY(getglobal)
681
695
  struct rb_global_entry *gentry = (void *)entry;
682
696
  val = rb_gvar_get(gentry);
683
697
  }
684
- # line 685 "vm.inc"
698
+ # line 699 "vm.inc"
685
699
  # undef NAME_OF_CURRENT_INSN
686
700
 
687
701
  /* ### Instruction trailers. ### */
@@ -689,6 +703,8 @@ INSN_ENTRY(getglobal)
689
703
  CHECK_CANARY();
690
704
  INC_SP(INSN_ATTR(sp_inc));
691
705
  TOPN(0) = val;
706
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
707
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
692
708
  if (leaf) ADD_PC(INSN_ATTR(width));
693
709
  # undef INSN_ATTR
694
710
 
@@ -722,7 +738,7 @@ INSN_ENTRY(setglobal)
722
738
  struct rb_global_entry *gentry = (void *)entry;
723
739
  rb_gvar_set(gentry, val);
724
740
  }
725
- # line 726 "vm.inc"
741
+ # line 742 "vm.inc"
726
742
  # undef NAME_OF_CURRENT_INSN
727
743
 
728
744
  /* ### Instruction trailers. ### */
@@ -759,7 +775,7 @@ INSN_ENTRY(putnil)
759
775
  {
760
776
  val = Qnil;
761
777
  }
762
- # line 763 "vm.inc"
778
+ # line 779 "vm.inc"
763
779
  # undef NAME_OF_CURRENT_INSN
764
780
 
765
781
  /* ### Instruction trailers. ### */
@@ -767,6 +783,8 @@ INSN_ENTRY(putnil)
767
783
  CHECK_CANARY();
768
784
  INC_SP(INSN_ATTR(sp_inc));
769
785
  TOPN(0) = val;
786
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
787
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
770
788
  if (leaf) ADD_PC(INSN_ATTR(width));
771
789
  # undef INSN_ATTR
772
790
 
@@ -797,7 +815,7 @@ INSN_ENTRY(putself)
797
815
  {
798
816
  val = GET_SELF();
799
817
  }
800
- # line 801 "vm.inc"
818
+ # line 819 "vm.inc"
801
819
  # undef NAME_OF_CURRENT_INSN
802
820
 
803
821
  /* ### Instruction trailers. ### */
@@ -805,6 +823,8 @@ INSN_ENTRY(putself)
805
823
  CHECK_CANARY();
806
824
  INC_SP(INSN_ATTR(sp_inc));
807
825
  TOPN(0) = val;
826
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
827
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
808
828
  if (leaf) ADD_PC(INSN_ATTR(width));
809
829
  # undef INSN_ATTR
810
830
 
@@ -833,6 +853,8 @@ INSN_ENTRY(putobject)
833
853
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
834
854
  INC_SP(INSN_ATTR(sp_inc));
835
855
  TOPN(0) = val;
856
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
857
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
836
858
  if (leaf) ADD_PC(INSN_ATTR(width));
837
859
  # undef INSN_ATTR
838
860
 
@@ -868,7 +890,7 @@ INSN_ENTRY(putspecialobject)
868
890
  type = (enum vm_special_object_type)value_type;
869
891
  val = vm_get_special_object(GET_EP(), type);
870
892
  }
871
- # line 872 "vm.inc"
893
+ # line 894 "vm.inc"
872
894
  # undef NAME_OF_CURRENT_INSN
873
895
 
874
896
  /* ### Instruction trailers. ### */
@@ -876,6 +898,8 @@ INSN_ENTRY(putspecialobject)
876
898
  CHECK_CANARY();
877
899
  INC_SP(INSN_ATTR(sp_inc));
878
900
  TOPN(0) = val;
901
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
902
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
879
903
  if (leaf) ADD_PC(INSN_ATTR(width));
880
904
  # undef INSN_ATTR
881
905
 
@@ -908,7 +932,7 @@ INSN_ENTRY(putstring)
908
932
  {
909
933
  val = rb_str_resurrect(str);
910
934
  }
911
- # line 912 "vm.inc"
935
+ # line 936 "vm.inc"
912
936
  # undef NAME_OF_CURRENT_INSN
913
937
 
914
938
  /* ### Instruction trailers. ### */
@@ -916,6 +940,8 @@ INSN_ENTRY(putstring)
916
940
  CHECK_CANARY();
917
941
  INC_SP(INSN_ATTR(sp_inc));
918
942
  TOPN(0) = val;
943
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
944
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
919
945
  if (leaf) ADD_PC(INSN_ATTR(width));
920
946
  # undef INSN_ATTR
921
947
 
@@ -948,7 +974,7 @@ INSN_ENTRY(concatstrings)
948
974
  {
949
975
  val = rb_str_concat_literals(num, STACK_ADDR_FROM_TOP(num));
950
976
  }
951
- # line 952 "vm.inc"
977
+ # line 978 "vm.inc"
952
978
  # undef NAME_OF_CURRENT_INSN
953
979
 
954
980
  /* ### Instruction trailers. ### */
@@ -956,6 +982,8 @@ INSN_ENTRY(concatstrings)
956
982
  CHECK_CANARY();
957
983
  INC_SP(INSN_ATTR(sp_inc));
958
984
  TOPN(0) = val;
985
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
986
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
959
987
  if (leaf) ADD_PC(INSN_ATTR(width));
960
988
  # undef INSN_ATTR
961
989
 
@@ -987,7 +1015,7 @@ INSN_ENTRY(tostring)
987
1015
  {
988
1016
  val = rb_obj_as_string_result(str, val);
989
1017
  }
990
- # line 991 "vm.inc"
1018
+ # line 1019 "vm.inc"
991
1019
  # undef NAME_OF_CURRENT_INSN
992
1020
 
993
1021
  /* ### Instruction trailers. ### */
@@ -995,6 +1023,8 @@ INSN_ENTRY(tostring)
995
1023
  CHECK_CANARY();
996
1024
  INC_SP(INSN_ATTR(sp_inc));
997
1025
  TOPN(0) = val;
1026
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1027
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
998
1028
  if (leaf) ADD_PC(INSN_ATTR(width));
999
1029
  # undef INSN_ATTR
1000
1030
 
@@ -1027,7 +1057,7 @@ INSN_ENTRY(freezestring)
1027
1057
  {
1028
1058
  vm_freezestring(str, debug_info);
1029
1059
  }
1030
- # line 1031 "vm.inc"
1060
+ # line 1061 "vm.inc"
1031
1061
  # undef NAME_OF_CURRENT_INSN
1032
1062
 
1033
1063
  /* ### Instruction trailers. ### */
@@ -1035,6 +1065,8 @@ INSN_ENTRY(freezestring)
1035
1065
  CHECK_CANARY();
1036
1066
  INC_SP(INSN_ATTR(sp_inc));
1037
1067
  TOPN(0) = str;
1068
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1069
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1038
1070
  if (leaf) ADD_PC(INSN_ATTR(width));
1039
1071
  # undef INSN_ATTR
1040
1072
 
@@ -1071,7 +1103,7 @@ INSN_ENTRY(toregexp)
1071
1103
  val = rb_reg_new_ary(ary, (int)opt);
1072
1104
  rb_ary_clear(ary);
1073
1105
  }
1074
- # line 1075 "vm.inc"
1106
+ # line 1107 "vm.inc"
1075
1107
  # undef NAME_OF_CURRENT_INSN
1076
1108
 
1077
1109
  /* ### Instruction trailers. ### */
@@ -1079,6 +1111,8 @@ INSN_ENTRY(toregexp)
1079
1111
  CHECK_CANARY();
1080
1112
  INC_SP(INSN_ATTR(sp_inc));
1081
1113
  TOPN(0) = val;
1114
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1115
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1082
1116
  if (leaf) ADD_PC(INSN_ATTR(width));
1083
1117
  # undef INSN_ATTR
1084
1118
 
@@ -1110,7 +1144,7 @@ INSN_ENTRY(intern)
1110
1144
  {
1111
1145
  sym = rb_str_intern(str);
1112
1146
  }
1113
- # line 1114 "vm.inc"
1147
+ # line 1148 "vm.inc"
1114
1148
  # undef NAME_OF_CURRENT_INSN
1115
1149
 
1116
1150
  /* ### Instruction trailers. ### */
@@ -1118,6 +1152,8 @@ INSN_ENTRY(intern)
1118
1152
  CHECK_CANARY();
1119
1153
  INC_SP(INSN_ATTR(sp_inc));
1120
1154
  TOPN(0) = sym;
1155
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1156
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1121
1157
  if (leaf) ADD_PC(INSN_ATTR(width));
1122
1158
  # undef INSN_ATTR
1123
1159
 
@@ -1150,7 +1186,7 @@ INSN_ENTRY(newarray)
1150
1186
  {
1151
1187
  val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num));
1152
1188
  }
1153
- # line 1154 "vm.inc"
1189
+ # line 1190 "vm.inc"
1154
1190
  # undef NAME_OF_CURRENT_INSN
1155
1191
 
1156
1192
  /* ### Instruction trailers. ### */
@@ -1158,6 +1194,8 @@ INSN_ENTRY(newarray)
1158
1194
  CHECK_CANARY();
1159
1195
  INC_SP(INSN_ATTR(sp_inc));
1160
1196
  TOPN(0) = val;
1197
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1198
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1161
1199
  if (leaf) ADD_PC(INSN_ATTR(width));
1162
1200
  # undef INSN_ATTR
1163
1201
 
@@ -1195,7 +1233,7 @@ INSN_ENTRY(newarraykwsplat)
1195
1233
  val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num));
1196
1234
  }
1197
1235
  }
1198
- # line 1199 "vm.inc"
1236
+ # line 1237 "vm.inc"
1199
1237
  # undef NAME_OF_CURRENT_INSN
1200
1238
 
1201
1239
  /* ### Instruction trailers. ### */
@@ -1203,6 +1241,8 @@ INSN_ENTRY(newarraykwsplat)
1203
1241
  CHECK_CANARY();
1204
1242
  INC_SP(INSN_ATTR(sp_inc));
1205
1243
  TOPN(0) = val;
1244
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1245
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1206
1246
  if (leaf) ADD_PC(INSN_ATTR(width));
1207
1247
  # undef INSN_ATTR
1208
1248
 
@@ -1236,7 +1276,7 @@ INSN_ENTRY(duparray)
1236
1276
  RUBY_DTRACE_CREATE_HOOK(ARRAY, RARRAY_LEN(ary));
1237
1277
  val = rb_ary_resurrect(ary);
1238
1278
  }
1239
- # line 1240 "vm.inc"
1279
+ # line 1280 "vm.inc"
1240
1280
  # undef NAME_OF_CURRENT_INSN
1241
1281
 
1242
1282
  /* ### Instruction trailers. ### */
@@ -1244,6 +1284,8 @@ INSN_ENTRY(duparray)
1244
1284
  CHECK_CANARY();
1245
1285
  INC_SP(INSN_ATTR(sp_inc));
1246
1286
  TOPN(0) = val;
1287
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1288
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1247
1289
  if (leaf) ADD_PC(INSN_ATTR(width));
1248
1290
  # undef INSN_ATTR
1249
1291
 
@@ -1277,7 +1319,7 @@ INSN_ENTRY(duphash)
1277
1319
  RUBY_DTRACE_CREATE_HOOK(HASH, RHASH_SIZE(hash) << 1);
1278
1320
  val = rb_hash_resurrect(hash);
1279
1321
  }
1280
- # line 1281 "vm.inc"
1322
+ # line 1323 "vm.inc"
1281
1323
  # undef NAME_OF_CURRENT_INSN
1282
1324
 
1283
1325
  /* ### Instruction trailers. ### */
@@ -1285,6 +1327,8 @@ INSN_ENTRY(duphash)
1285
1327
  CHECK_CANARY();
1286
1328
  INC_SP(INSN_ATTR(sp_inc));
1287
1329
  TOPN(0) = val;
1330
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1331
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1288
1332
  if (leaf) ADD_PC(INSN_ATTR(width));
1289
1333
  # undef INSN_ATTR
1290
1334
 
@@ -1318,7 +1362,7 @@ INSN_ENTRY(expandarray)
1318
1362
  {
1319
1363
  vm_expandarray(GET_SP(), ary, num, (int)flag);
1320
1364
  }
1321
- # line 1322 "vm.inc"
1365
+ # line 1366 "vm.inc"
1322
1366
  # undef NAME_OF_CURRENT_INSN
1323
1367
 
1324
1368
  /* ### Instruction trailers. ### */
@@ -1356,7 +1400,7 @@ INSN_ENTRY(concatarray)
1356
1400
  {
1357
1401
  ary = vm_concat_array(ary1, ary2);
1358
1402
  }
1359
- # line 1360 "vm.inc"
1403
+ # line 1404 "vm.inc"
1360
1404
  # undef NAME_OF_CURRENT_INSN
1361
1405
 
1362
1406
  /* ### Instruction trailers. ### */
@@ -1364,6 +1408,8 @@ INSN_ENTRY(concatarray)
1364
1408
  CHECK_CANARY();
1365
1409
  INC_SP(INSN_ATTR(sp_inc));
1366
1410
  TOPN(0) = ary;
1411
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1412
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1367
1413
  if (leaf) ADD_PC(INSN_ATTR(width));
1368
1414
  # undef INSN_ATTR
1369
1415
 
@@ -1397,7 +1443,7 @@ INSN_ENTRY(splatarray)
1397
1443
  {
1398
1444
  obj = vm_splat_array(flag, ary);
1399
1445
  }
1400
- # line 1401 "vm.inc"
1446
+ # line 1447 "vm.inc"
1401
1447
  # undef NAME_OF_CURRENT_INSN
1402
1448
 
1403
1449
  /* ### Instruction trailers. ### */
@@ -1405,6 +1451,8 @@ INSN_ENTRY(splatarray)
1405
1451
  CHECK_CANARY();
1406
1452
  INC_SP(INSN_ATTR(sp_inc));
1407
1453
  TOPN(0) = obj;
1454
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1455
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1408
1456
  if (leaf) ADD_PC(INSN_ATTR(width));
1409
1457
  # undef INSN_ATTR
1410
1458
 
@@ -1443,7 +1491,7 @@ INSN_ENTRY(newhash)
1443
1491
  rb_hash_bulk_insert(num, STACK_ADDR_FROM_TOP(num), val);
1444
1492
  }
1445
1493
  }
1446
- # line 1447 "vm.inc"
1494
+ # line 1495 "vm.inc"
1447
1495
  # undef NAME_OF_CURRENT_INSN
1448
1496
 
1449
1497
  /* ### Instruction trailers. ### */
@@ -1451,6 +1499,8 @@ INSN_ENTRY(newhash)
1451
1499
  CHECK_CANARY();
1452
1500
  INC_SP(INSN_ATTR(sp_inc));
1453
1501
  TOPN(0) = val;
1502
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1503
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1454
1504
  if (leaf) ADD_PC(INSN_ATTR(width));
1455
1505
  # undef INSN_ATTR
1456
1506
 
@@ -1485,7 +1535,7 @@ INSN_ENTRY(newrange)
1485
1535
  {
1486
1536
  val = rb_range_new(low, high, (int)flag);
1487
1537
  }
1488
- # line 1489 "vm.inc"
1538
+ # line 1539 "vm.inc"
1489
1539
  # undef NAME_OF_CURRENT_INSN
1490
1540
 
1491
1541
  /* ### Instruction trailers. ### */
@@ -1493,6 +1543,8 @@ INSN_ENTRY(newrange)
1493
1543
  CHECK_CANARY();
1494
1544
  INC_SP(INSN_ATTR(sp_inc));
1495
1545
  TOPN(0) = val;
1546
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1547
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1496
1548
  if (leaf) ADD_PC(INSN_ATTR(width));
1497
1549
  # undef INSN_ATTR
1498
1550
 
@@ -1524,7 +1576,7 @@ INSN_ENTRY(pop)
1524
1576
  (void)val;
1525
1577
  /* none */
1526
1578
  }
1527
- # line 1528 "vm.inc"
1579
+ # line 1580 "vm.inc"
1528
1580
  # undef NAME_OF_CURRENT_INSN
1529
1581
 
1530
1582
  /* ### Instruction trailers. ### */
@@ -1563,7 +1615,7 @@ INSN_ENTRY(dup)
1563
1615
  {
1564
1616
  val1 = val2 = val;
1565
1617
  }
1566
- # line 1567 "vm.inc"
1618
+ # line 1619 "vm.inc"
1567
1619
  # undef NAME_OF_CURRENT_INSN
1568
1620
 
1569
1621
  /* ### Instruction trailers. ### */
@@ -1571,7 +1623,11 @@ INSN_ENTRY(dup)
1571
1623
  CHECK_CANARY();
1572
1624
  INC_SP(INSN_ATTR(sp_inc));
1573
1625
  TOPN(0) = val2;
1626
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1627
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1574
1628
  TOPN(1) = val1;
1629
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_NONE));
1630
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_MOVED));
1575
1631
  if (leaf) ADD_PC(INSN_ATTR(width));
1576
1632
  # undef INSN_ATTR
1577
1633
 
@@ -1605,7 +1661,7 @@ INSN_ENTRY(dupn)
1605
1661
 
1606
1662
  MEMCPY(dst, src, VALUE, n);
1607
1663
  }
1608
- # line 1609 "vm.inc"
1664
+ # line 1665 "vm.inc"
1609
1665
  # undef NAME_OF_CURRENT_INSN
1610
1666
 
1611
1667
  /* ### Instruction trailers. ### */
@@ -1639,7 +1695,11 @@ INSN_ENTRY(swap)
1639
1695
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
1640
1696
  INC_SP(INSN_ATTR(sp_inc));
1641
1697
  TOPN(0) = val;
1698
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1699
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1642
1700
  TOPN(1) = obj;
1701
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_NONE));
1702
+ VM_ASSERT(!RB_TYPE_P(TOPN(1), T_MOVED));
1643
1703
  if (leaf) ADD_PC(INSN_ATTR(width));
1644
1704
  # undef INSN_ATTR
1645
1705
 
@@ -1678,7 +1738,7 @@ INSN_ENTRY(reverse)
1678
1738
  TOPN(i) = v0;
1679
1739
  }
1680
1740
  }
1681
- # line 1682 "vm.inc"
1741
+ # line 1742 "vm.inc"
1682
1742
  # undef NAME_OF_CURRENT_INSN
1683
1743
 
1684
1744
  /* ### Instruction trailers. ### */
@@ -1716,7 +1776,7 @@ INSN_ENTRY(topn)
1716
1776
  {
1717
1777
  val = TOPN(n);
1718
1778
  }
1719
- # line 1720 "vm.inc"
1779
+ # line 1780 "vm.inc"
1720
1780
  # undef NAME_OF_CURRENT_INSN
1721
1781
 
1722
1782
  /* ### Instruction trailers. ### */
@@ -1724,6 +1784,8 @@ INSN_ENTRY(topn)
1724
1784
  CHECK_CANARY();
1725
1785
  INC_SP(INSN_ATTR(sp_inc));
1726
1786
  TOPN(0) = val;
1787
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1788
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1727
1789
  if (leaf) ADD_PC(INSN_ATTR(width));
1728
1790
  # undef INSN_ATTR
1729
1791
 
@@ -1756,7 +1818,7 @@ INSN_ENTRY(setn)
1756
1818
  {
1757
1819
  TOPN(n) = val;
1758
1820
  }
1759
- # line 1760 "vm.inc"
1821
+ # line 1822 "vm.inc"
1760
1822
  # undef NAME_OF_CURRENT_INSN
1761
1823
 
1762
1824
  /* ### Instruction trailers. ### */
@@ -1764,6 +1826,8 @@ INSN_ENTRY(setn)
1764
1826
  CHECK_CANARY();
1765
1827
  INC_SP(INSN_ATTR(sp_inc));
1766
1828
  TOPN(0) = val;
1829
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1830
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1767
1831
  if (leaf) ADD_PC(INSN_ATTR(width));
1768
1832
  # undef INSN_ATTR
1769
1833
 
@@ -1828,7 +1892,7 @@ INSN_ENTRY(defined)
1828
1892
  {
1829
1893
  val = vm_defined(ec, GET_CFP(), op_type, obj, needstr, v);
1830
1894
  }
1831
- # line 1832 "vm.inc"
1895
+ # line 1896 "vm.inc"
1832
1896
  # undef NAME_OF_CURRENT_INSN
1833
1897
 
1834
1898
  /* ### Instruction trailers. ### */
@@ -1836,6 +1900,8 @@ INSN_ENTRY(defined)
1836
1900
  CHECK_CANARY();
1837
1901
  INC_SP(INSN_ATTR(sp_inc));
1838
1902
  TOPN(0) = val;
1903
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1904
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1839
1905
  if (leaf) ADD_PC(INSN_ATTR(width));
1840
1906
  # undef INSN_ATTR
1841
1907
 
@@ -1870,7 +1936,7 @@ INSN_ENTRY(checkmatch)
1870
1936
  {
1871
1937
  result = vm_check_match(ec, target, pattern, flag);
1872
1938
  }
1873
- # line 1874 "vm.inc"
1939
+ # line 1940 "vm.inc"
1874
1940
  # undef NAME_OF_CURRENT_INSN
1875
1941
 
1876
1942
  /* ### Instruction trailers. ### */
@@ -1878,6 +1944,8 @@ INSN_ENTRY(checkmatch)
1878
1944
  CHECK_CANARY();
1879
1945
  INC_SP(INSN_ATTR(sp_inc));
1880
1946
  TOPN(0) = result;
1947
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1948
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1881
1949
  if (leaf) ADD_PC(INSN_ATTR(width));
1882
1950
  # undef INSN_ATTR
1883
1951
 
@@ -1912,7 +1980,7 @@ INSN_ENTRY(checkkeyword)
1912
1980
  {
1913
1981
  ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());
1914
1982
  }
1915
- # line 1916 "vm.inc"
1983
+ # line 1984 "vm.inc"
1916
1984
  # undef NAME_OF_CURRENT_INSN
1917
1985
 
1918
1986
  /* ### Instruction trailers. ### */
@@ -1920,6 +1988,8 @@ INSN_ENTRY(checkkeyword)
1920
1988
  CHECK_CANARY();
1921
1989
  INC_SP(INSN_ATTR(sp_inc));
1922
1990
  TOPN(0) = ret;
1991
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
1992
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1923
1993
  if (leaf) ADD_PC(INSN_ATTR(width));
1924
1994
  # undef INSN_ATTR
1925
1995
 
@@ -1953,7 +2023,7 @@ INSN_ENTRY(checktype)
1953
2023
  {
1954
2024
  ret = (TYPE(val) == (int)type) ? Qtrue : Qfalse;
1955
2025
  }
1956
- # line 1957 "vm.inc"
2026
+ # line 2027 "vm.inc"
1957
2027
  # undef NAME_OF_CURRENT_INSN
1958
2028
 
1959
2029
  /* ### Instruction trailers. ### */
@@ -1961,6 +2031,8 @@ INSN_ENTRY(checktype)
1961
2031
  CHECK_CANARY();
1962
2032
  INC_SP(INSN_ATTR(sp_inc));
1963
2033
  TOPN(0) = ret;
2034
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2035
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
1964
2036
  if (leaf) ADD_PC(INSN_ATTR(width));
1965
2037
  # undef INSN_ATTR
1966
2038
 
@@ -1968,48 +2040,6 @@ INSN_ENTRY(checktype)
1968
2040
  END_INSN(checktype);
1969
2041
  }
1970
2042
 
1971
- /* insn methodref(id)(val)(ret) */
1972
- INSN_ENTRY(methodref)
1973
- {
1974
- /* ### Declare that we have just entered into an instruction. ### */
1975
- START_OF_ORIGINAL_INSN(methodref);
1976
- DEBUG_ENTER_INSN("methodref");
1977
-
1978
- /* ### Declare and assign variables. ### */
1979
- ID id = (ID)GET_OPERAND(1);
1980
- # define INSN_ATTR(x) attr_ ## x ## _methodref(id)
1981
- bool leaf = INSN_ATTR(leaf);
1982
- VALUE val = TOPN(0);
1983
- VALUE ret;
1984
-
1985
- /* ### Instruction preambles. ### */
1986
- if (! leaf) ADD_PC(INSN_ATTR(width));
1987
- SETUP_CANARY();
1988
- COLLECT_USAGE_INSN(INSN_ATTR(bin));
1989
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id);
1990
-
1991
- /* ### Here we do the instruction body. ### */
1992
- # define NAME_OF_CURRENT_INSN methodref
1993
- # line 728 "insns.def"
1994
- {
1995
- ret = rb_obj_method(val, ID2SYM(id));
1996
- RB_OBJ_FREEZE_RAW(ret);
1997
- }
1998
- # line 1999 "vm.inc"
1999
- # undef NAME_OF_CURRENT_INSN
2000
-
2001
- /* ### Instruction trailers. ### */
2002
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
2003
- CHECK_CANARY();
2004
- INC_SP(INSN_ATTR(sp_inc));
2005
- TOPN(0) = ret;
2006
- if (leaf) ADD_PC(INSN_ATTR(width));
2007
- # undef INSN_ATTR
2008
-
2009
- /* ### Leave the instruction. ### */
2010
- END_INSN(methodref);
2011
- }
2012
-
2013
2043
  /* insn defineclass(id, class_iseq, flags)(cbase, super)(val) */
2014
2044
  INSN_ENTRY(defineclass)
2015
2045
  {
@@ -2038,7 +2068,7 @@ INSN_ENTRY(defineclass)
2038
2068
 
2039
2069
  /* ### Here we do the instruction body. ### */
2040
2070
  # define NAME_OF_CURRENT_INSN defineclass
2041
- # line 745 "insns.def"
2071
+ # line 734 "insns.def"
2042
2072
  {
2043
2073
  VALUE klass = vm_find_or_create_class_by_id(id, flags, cbase, super);
2044
2074
 
@@ -2054,7 +2084,7 @@ INSN_ENTRY(defineclass)
2054
2084
  RESTORE_REGS();
2055
2085
  NEXT_INSN();
2056
2086
  }
2057
- # line 2058 "vm.inc"
2087
+ # line 2088 "vm.inc"
2058
2088
  # undef NAME_OF_CURRENT_INSN
2059
2089
 
2060
2090
  /* ### Instruction trailers. ### */
@@ -2091,11 +2121,11 @@ INSN_ENTRY(definemethod)
2091
2121
 
2092
2122
  /* ### Here we do the instruction body. ### */
2093
2123
  # define NAME_OF_CURRENT_INSN definemethod
2094
- # line 766 "insns.def"
2124
+ # line 755 "insns.def"
2095
2125
  {
2096
2126
  vm_define_method(ec, Qnil, id, (VALUE)iseq, FALSE);
2097
2127
  }
2098
- # line 2099 "vm.inc"
2128
+ # line 2129 "vm.inc"
2099
2129
  # undef NAME_OF_CURRENT_INSN
2100
2130
 
2101
2131
  /* ### Instruction trailers. ### */
@@ -2132,11 +2162,11 @@ INSN_ENTRY(definesmethod)
2132
2162
 
2133
2163
  /* ### Here we do the instruction body. ### */
2134
2164
  # define NAME_OF_CURRENT_INSN definesmethod
2135
- # line 775 "insns.def"
2165
+ # line 764 "insns.def"
2136
2166
  {
2137
2167
  vm_define_method(ec, obj, id, (VALUE)iseq, TRUE);
2138
2168
  }
2139
- # line 2140 "vm.inc"
2169
+ # line 2170 "vm.inc"
2140
2170
  # undef NAME_OF_CURRENT_INSN
2141
2171
 
2142
2172
  /* ### Instruction trailers. ### */
@@ -2149,7 +2179,7 @@ INSN_ENTRY(definesmethod)
2149
2179
  END_INSN(definesmethod);
2150
2180
  }
2151
2181
 
2152
- /* insn send(ci, cc, blockiseq)(...)(val) */
2182
+ /* insn send(cd, blockiseq)(...)(val) */
2153
2183
  INSN_ENTRY(send)
2154
2184
  {
2155
2185
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2157,10 +2187,9 @@ INSN_ENTRY(send)
2157
2187
  DEBUG_ENTER_INSN("send");
2158
2188
 
2159
2189
  /* ### Declare and assign variables. ### */
2160
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2161
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2162
- ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
2163
- # define INSN_ATTR(x) attr_ ## x ## _send(ci, cc, blockiseq)
2190
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2191
+ ISEQ blockiseq = (ISEQ)GET_OPERAND(2);
2192
+ # define INSN_ATTR(x) attr_ ## x ## _send(cd, blockiseq)
2164
2193
  bool leaf = INSN_ATTR(leaf);
2165
2194
  VALUE val;
2166
2195
 
@@ -2169,23 +2198,22 @@ INSN_ENTRY(send)
2169
2198
  POPN(INSN_ATTR(popn));
2170
2199
  SETUP_CANARY();
2171
2200
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2172
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2173
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2174
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, blockiseq);
2201
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2202
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, blockiseq);
2175
2203
 
2176
2204
  /* ### Here we do the instruction body. ### */
2177
2205
  # define NAME_OF_CURRENT_INSN send
2178
- # line 790 "insns.def"
2206
+ # line 780 "insns.def"
2179
2207
  {
2180
- VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), ci, blockiseq, false);
2181
- val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);
2208
+ VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), &cd->ci, blockiseq, false);
2209
+ val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);
2182
2210
 
2183
2211
  if (val == Qundef) {
2184
2212
  RESTORE_REGS();
2185
2213
  NEXT_INSN();
2186
2214
  }
2187
2215
  }
2188
- # line 2189 "vm.inc"
2216
+ # line 2217 "vm.inc"
2189
2217
  # undef NAME_OF_CURRENT_INSN
2190
2218
 
2191
2219
  /* ### Instruction trailers. ### */
@@ -2199,7 +2227,7 @@ INSN_ENTRY(send)
2199
2227
  END_INSN(send);
2200
2228
  }
2201
2229
 
2202
- /* insn opt_send_without_block(ci, cc)(...)(val) */
2230
+ /* insn opt_send_without_block(cd)(...)(val) */
2203
2231
  INSN_ENTRY(opt_send_without_block)
2204
2232
  {
2205
2233
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2207,9 +2235,8 @@ INSN_ENTRY(opt_send_without_block)
2207
2235
  DEBUG_ENTER_INSN("opt_send_without_block");
2208
2236
 
2209
2237
  /* ### Declare and assign variables. ### */
2210
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2211
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2212
- # define INSN_ATTR(x) attr_ ## x ## _opt_send_without_block(ci, cc)
2238
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2239
+ # define INSN_ATTR(x) attr_ ## x ## _opt_send_without_block(cd)
2213
2240
  bool leaf = INSN_ATTR(leaf);
2214
2241
  VALUE val;
2215
2242
 
@@ -2218,22 +2245,21 @@ INSN_ENTRY(opt_send_without_block)
2218
2245
  POPN(INSN_ATTR(popn));
2219
2246
  SETUP_CANARY();
2220
2247
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2221
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2222
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2248
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2223
2249
 
2224
2250
  /* ### Here we do the instruction body. ### */
2225
2251
  # define NAME_OF_CURRENT_INSN opt_send_without_block
2226
- # line 808 "insns.def"
2252
+ # line 799 "insns.def"
2227
2253
  {
2228
2254
  VALUE bh = VM_BLOCK_HANDLER_NONE;
2229
- val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_method_wrap);
2255
+ val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap);
2230
2256
 
2231
2257
  if (val == Qundef) {
2232
2258
  RESTORE_REGS();
2233
2259
  NEXT_INSN();
2234
2260
  }
2235
2261
  }
2236
- # line 2237 "vm.inc"
2262
+ # line 2263 "vm.inc"
2237
2263
  # undef NAME_OF_CURRENT_INSN
2238
2264
 
2239
2265
  /* ### Instruction trailers. ### */
@@ -2247,7 +2273,7 @@ INSN_ENTRY(opt_send_without_block)
2247
2273
  END_INSN(opt_send_without_block);
2248
2274
  }
2249
2275
 
2250
- /* insn opt_str_freeze(str, ci, cc)()(val) */
2276
+ /* insn opt_str_freeze(str, cd)()(val) */
2251
2277
  INSN_ENTRY(opt_str_freeze)
2252
2278
  {
2253
2279
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2256,9 +2282,8 @@ INSN_ENTRY(opt_str_freeze)
2256
2282
 
2257
2283
  /* ### Declare and assign variables. ### */
2258
2284
  VALUE str = (VALUE)GET_OPERAND(1);
2259
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
2260
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
2261
- # define INSN_ATTR(x) attr_ ## x ## _opt_str_freeze(str, ci, cc)
2285
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
2286
+ # define INSN_ATTR(x) attr_ ## x ## _opt_str_freeze(str, cd)
2262
2287
  bool leaf = INSN_ATTR(leaf);
2263
2288
  VALUE val;
2264
2289
 
@@ -2267,12 +2292,11 @@ INSN_ENTRY(opt_str_freeze)
2267
2292
  SETUP_CANARY();
2268
2293
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2269
2294
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str);
2270
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
2271
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
2295
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
2272
2296
 
2273
2297
  /* ### Here we do the instruction body. ### */
2274
2298
  # define NAME_OF_CURRENT_INSN opt_str_freeze
2275
- # line 823 "insns.def"
2299
+ # line 814 "insns.def"
2276
2300
  {
2277
2301
  val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze);
2278
2302
 
@@ -2281,7 +2305,7 @@ INSN_ENTRY(opt_str_freeze)
2281
2305
  CALL_SIMPLE_METHOD();
2282
2306
  }
2283
2307
  }
2284
- # line 2285 "vm.inc"
2308
+ # line 2309 "vm.inc"
2285
2309
  # undef NAME_OF_CURRENT_INSN
2286
2310
 
2287
2311
  /* ### Instruction trailers. ### */
@@ -2289,6 +2313,8 @@ INSN_ENTRY(opt_str_freeze)
2289
2313
  CHECK_CANARY();
2290
2314
  INC_SP(INSN_ATTR(sp_inc));
2291
2315
  TOPN(0) = val;
2316
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2317
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2292
2318
  if (leaf) ADD_PC(INSN_ATTR(width));
2293
2319
  # undef INSN_ATTR
2294
2320
 
@@ -2296,7 +2322,7 @@ INSN_ENTRY(opt_str_freeze)
2296
2322
  END_INSN(opt_str_freeze);
2297
2323
  }
2298
2324
 
2299
- /* insn opt_nil_p(ci, cc)(recv)(val) */
2325
+ /* insn opt_nil_p(cd)(recv)(val) */
2300
2326
  INSN_ENTRY(opt_nil_p)
2301
2327
  {
2302
2328
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2304,9 +2330,8 @@ INSN_ENTRY(opt_nil_p)
2304
2330
  DEBUG_ENTER_INSN("opt_nil_p");
2305
2331
 
2306
2332
  /* ### Declare and assign variables. ### */
2307
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2308
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2309
- # define INSN_ATTR(x) attr_ ## x ## _opt_nil_p(ci, cc)
2333
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2334
+ # define INSN_ATTR(x) attr_ ## x ## _opt_nil_p(cd)
2310
2335
  bool leaf = INSN_ATTR(leaf);
2311
2336
  VALUE recv = TOPN(0);
2312
2337
  VALUE val;
@@ -2315,20 +2340,19 @@ INSN_ENTRY(opt_nil_p)
2315
2340
  if (! leaf) ADD_PC(INSN_ATTR(width));
2316
2341
  SETUP_CANARY();
2317
2342
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2318
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2319
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2343
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2320
2344
 
2321
2345
  /* ### Here we do the instruction body. ### */
2322
2346
  # define NAME_OF_CURRENT_INSN opt_nil_p
2323
- # line 838 "insns.def"
2347
+ # line 829 "insns.def"
2324
2348
  {
2325
- val = vm_opt_nil_p(ci, cc, recv);
2349
+ val = vm_opt_nil_p(cd, recv);
2326
2350
 
2327
2351
  if (val == Qundef) {
2328
2352
  CALL_SIMPLE_METHOD();
2329
2353
  }
2330
2354
  }
2331
- # line 2332 "vm.inc"
2355
+ # line 2356 "vm.inc"
2332
2356
  # undef NAME_OF_CURRENT_INSN
2333
2357
 
2334
2358
  /* ### Instruction trailers. ### */
@@ -2336,6 +2360,8 @@ INSN_ENTRY(opt_nil_p)
2336
2360
  CHECK_CANARY();
2337
2361
  INC_SP(INSN_ATTR(sp_inc));
2338
2362
  TOPN(0) = val;
2363
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2364
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2339
2365
  if (leaf) ADD_PC(INSN_ATTR(width));
2340
2366
  # undef INSN_ATTR
2341
2367
 
@@ -2343,7 +2369,7 @@ INSN_ENTRY(opt_nil_p)
2343
2369
  END_INSN(opt_nil_p);
2344
2370
  }
2345
2371
 
2346
- /* insn opt_str_uminus(str, ci, cc)()(val) */
2372
+ /* insn opt_str_uminus(str, cd)()(val) */
2347
2373
  INSN_ENTRY(opt_str_uminus)
2348
2374
  {
2349
2375
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2352,9 +2378,8 @@ INSN_ENTRY(opt_str_uminus)
2352
2378
 
2353
2379
  /* ### Declare and assign variables. ### */
2354
2380
  VALUE str = (VALUE)GET_OPERAND(1);
2355
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
2356
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
2357
- # define INSN_ATTR(x) attr_ ## x ## _opt_str_uminus(str, ci, cc)
2381
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
2382
+ # define INSN_ATTR(x) attr_ ## x ## _opt_str_uminus(str, cd)
2358
2383
  bool leaf = INSN_ATTR(leaf);
2359
2384
  VALUE val;
2360
2385
 
@@ -2363,12 +2388,11 @@ INSN_ENTRY(opt_str_uminus)
2363
2388
  SETUP_CANARY();
2364
2389
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2365
2390
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str);
2366
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
2367
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
2391
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
2368
2392
 
2369
2393
  /* ### Here we do the instruction body. ### */
2370
2394
  # define NAME_OF_CURRENT_INSN opt_str_uminus
2371
- # line 851 "insns.def"
2395
+ # line 842 "insns.def"
2372
2396
  {
2373
2397
  val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus);
2374
2398
 
@@ -2377,7 +2401,7 @@ INSN_ENTRY(opt_str_uminus)
2377
2401
  CALL_SIMPLE_METHOD();
2378
2402
  }
2379
2403
  }
2380
- # line 2381 "vm.inc"
2404
+ # line 2405 "vm.inc"
2381
2405
  # undef NAME_OF_CURRENT_INSN
2382
2406
 
2383
2407
  /* ### Instruction trailers. ### */
@@ -2385,6 +2409,8 @@ INSN_ENTRY(opt_str_uminus)
2385
2409
  CHECK_CANARY();
2386
2410
  INC_SP(INSN_ATTR(sp_inc));
2387
2411
  TOPN(0) = val;
2412
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2413
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2388
2414
  if (leaf) ADD_PC(INSN_ATTR(width));
2389
2415
  # undef INSN_ATTR
2390
2416
 
@@ -2413,11 +2439,11 @@ INSN_ENTRY(opt_newarray_max)
2413
2439
 
2414
2440
  /* ### Here we do the instruction body. ### */
2415
2441
  # define NAME_OF_CURRENT_INSN opt_newarray_max
2416
- # line 871 "insns.def"
2442
+ # line 862 "insns.def"
2417
2443
  {
2418
2444
  val = vm_opt_newarray_max(num, STACK_ADDR_FROM_TOP(num));
2419
2445
  }
2420
- # line 2421 "vm.inc"
2446
+ # line 2447 "vm.inc"
2421
2447
  # undef NAME_OF_CURRENT_INSN
2422
2448
 
2423
2449
  /* ### Instruction trailers. ### */
@@ -2425,6 +2451,8 @@ INSN_ENTRY(opt_newarray_max)
2425
2451
  CHECK_CANARY();
2426
2452
  INC_SP(INSN_ATTR(sp_inc));
2427
2453
  TOPN(0) = val;
2454
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2455
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2428
2456
  if (leaf) ADD_PC(INSN_ATTR(width));
2429
2457
  # undef INSN_ATTR
2430
2458
 
@@ -2453,11 +2481,11 @@ INSN_ENTRY(opt_newarray_min)
2453
2481
 
2454
2482
  /* ### Here we do the instruction body. ### */
2455
2483
  # define NAME_OF_CURRENT_INSN opt_newarray_min
2456
- # line 883 "insns.def"
2484
+ # line 874 "insns.def"
2457
2485
  {
2458
2486
  val = vm_opt_newarray_min(num, STACK_ADDR_FROM_TOP(num));
2459
2487
  }
2460
- # line 2461 "vm.inc"
2488
+ # line 2489 "vm.inc"
2461
2489
  # undef NAME_OF_CURRENT_INSN
2462
2490
 
2463
2491
  /* ### Instruction trailers. ### */
@@ -2465,6 +2493,8 @@ INSN_ENTRY(opt_newarray_min)
2465
2493
  CHECK_CANARY();
2466
2494
  INC_SP(INSN_ATTR(sp_inc));
2467
2495
  TOPN(0) = val;
2496
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2497
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2468
2498
  if (leaf) ADD_PC(INSN_ATTR(width));
2469
2499
  # undef INSN_ATTR
2470
2500
 
@@ -2472,7 +2502,7 @@ INSN_ENTRY(opt_newarray_min)
2472
2502
  END_INSN(opt_newarray_min);
2473
2503
  }
2474
2504
 
2475
- /* insn invokesuper(ci, cc, blockiseq)(...)(val) */
2505
+ /* insn invokesuper(cd, blockiseq)(...)(val) */
2476
2506
  INSN_ENTRY(invokesuper)
2477
2507
  {
2478
2508
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2480,10 +2510,9 @@ INSN_ENTRY(invokesuper)
2480
2510
  DEBUG_ENTER_INSN("invokesuper");
2481
2511
 
2482
2512
  /* ### Declare and assign variables. ### */
2483
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2484
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2485
- ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
2486
- # define INSN_ATTR(x) attr_ ## x ## _invokesuper(ci, cc, blockiseq)
2513
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2514
+ ISEQ blockiseq = (ISEQ)GET_OPERAND(2);
2515
+ # define INSN_ATTR(x) attr_ ## x ## _invokesuper(cd, blockiseq)
2487
2516
  bool leaf = INSN_ATTR(leaf);
2488
2517
  VALUE val;
2489
2518
 
@@ -2492,23 +2521,22 @@ INSN_ENTRY(invokesuper)
2492
2521
  POPN(INSN_ATTR(popn));
2493
2522
  SETUP_CANARY();
2494
2523
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2495
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2496
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
2497
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, blockiseq);
2524
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2525
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, blockiseq);
2498
2526
 
2499
2527
  /* ### Here we do the instruction body. ### */
2500
2528
  # define NAME_OF_CURRENT_INSN invokesuper
2501
- # line 894 "insns.def"
2529
+ # line 886 "insns.def"
2502
2530
  {
2503
- VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), ci, blockiseq, true);
2504
- val = vm_sendish(ec, GET_CFP(), ci, cc, bh, vm_search_super_method);
2531
+ VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), &cd->ci, blockiseq, true);
2532
+ val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_super_method);
2505
2533
 
2506
2534
  if (val == Qundef) {
2507
2535
  RESTORE_REGS();
2508
2536
  NEXT_INSN();
2509
2537
  }
2510
2538
  }
2511
- # line 2512 "vm.inc"
2539
+ # line 2540 "vm.inc"
2512
2540
  # undef NAME_OF_CURRENT_INSN
2513
2541
 
2514
2542
  /* ### Instruction trailers. ### */
@@ -2522,7 +2550,7 @@ INSN_ENTRY(invokesuper)
2522
2550
  END_INSN(invokesuper);
2523
2551
  }
2524
2552
 
2525
- /* insn invokeblock(ci)(...)(val) */
2553
+ /* insn invokeblock(cd)(...)(val) */
2526
2554
  INSN_ENTRY(invokeblock)
2527
2555
  {
2528
2556
  /* ### Declare that we have just entered into an instruction. ### */
@@ -2530,8 +2558,8 @@ INSN_ENTRY(invokeblock)
2530
2558
  DEBUG_ENTER_INSN("invokeblock");
2531
2559
 
2532
2560
  /* ### Declare and assign variables. ### */
2533
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2534
- # define INSN_ATTR(x) attr_ ## x ## _invokeblock(ci)
2561
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
2562
+ # define INSN_ATTR(x) attr_ ## x ## _invokeblock(cd)
2535
2563
  bool leaf = INSN_ATTR(leaf);
2536
2564
  VALUE val;
2537
2565
 
@@ -2540,25 +2568,25 @@ INSN_ENTRY(invokeblock)
2540
2568
  POPN(INSN_ATTR(popn));
2541
2569
  SETUP_CANARY();
2542
2570
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
2543
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
2571
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
2544
2572
 
2545
2573
  /* ### Here we do the instruction body. ### */
2546
2574
  # define NAME_OF_CURRENT_INSN invokeblock
2547
- # line 912 "insns.def"
2575
+ # line 905 "insns.def"
2548
2576
  {
2549
- static struct rb_call_cache cc = {
2550
- 0, 0, NULL, NULL, vm_invokeblock_i,
2551
- };
2577
+ if (UNLIKELY(cd->cc.call != vm_invokeblock_i)) {
2578
+ cd->cc.call = vm_invokeblock_i; // check before setting to avoid CoW
2579
+ }
2552
2580
 
2553
2581
  VALUE bh = VM_BLOCK_HANDLER_NONE;
2554
- val = vm_sendish(ec, GET_CFP(), ci, &cc, bh, vm_search_invokeblock);
2582
+ val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_invokeblock);
2555
2583
 
2556
2584
  if (val == Qundef) {
2557
2585
  RESTORE_REGS();
2558
2586
  NEXT_INSN();
2559
2587
  }
2560
2588
  }
2561
- # line 2562 "vm.inc"
2589
+ # line 2590 "vm.inc"
2562
2590
  # undef NAME_OF_CURRENT_INSN
2563
2591
 
2564
2592
  /* ### Instruction trailers. ### */
@@ -2592,7 +2620,7 @@ INSN_ENTRY(leave)
2592
2620
 
2593
2621
  /* ### Here we do the instruction body. ### */
2594
2622
  # define NAME_OF_CURRENT_INSN leave
2595
- # line 937 "insns.def"
2623
+ # line 930 "insns.def"
2596
2624
  {
2597
2625
  if (OPT_CHECKED_RUN) {
2598
2626
  const VALUE *const bp = vm_base_ptr(GET_CFP());
@@ -2601,8 +2629,6 @@ INSN_ENTRY(leave)
2601
2629
  }
2602
2630
  }
2603
2631
 
2604
- RUBY_VM_CHECK_INTS(ec);
2605
-
2606
2632
  if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
2607
2633
  # if OPT_CALL_THREADED_CODE
2608
2634
  rb_ec_thread_ptr(ec)->retval = val;
@@ -2615,7 +2641,7 @@ INSN_ENTRY(leave)
2615
2641
  RESTORE_REGS();
2616
2642
  }
2617
2643
  }
2618
- # line 2619 "vm.inc"
2644
+ # line 2645 "vm.inc"
2619
2645
  # undef NAME_OF_CURRENT_INSN
2620
2646
 
2621
2647
  /* ### Instruction trailers. ### */
@@ -2651,14 +2677,13 @@ INSN_ENTRY(throw)
2651
2677
 
2652
2678
  /* ### Here we do the instruction body. ### */
2653
2679
  # define NAME_OF_CURRENT_INSN throw
2654
- # line 972 "insns.def"
2680
+ # line 963 "insns.def"
2655
2681
  {
2656
- RUBY_VM_CHECK_INTS(ec);
2657
2682
  val = vm_throw(ec, GET_CFP(), throw_state, throwobj);
2658
2683
  THROW_EXCEPTION(val);
2659
2684
  /* unreachable */
2660
2685
  }
2661
- # line 2662 "vm.inc"
2686
+ # line 2687 "vm.inc"
2662
2687
  # undef NAME_OF_CURRENT_INSN
2663
2688
 
2664
2689
  /* ### Instruction trailers. ### */
@@ -2666,6 +2691,8 @@ INSN_ENTRY(throw)
2666
2691
  CHECK_CANARY();
2667
2692
  INC_SP(INSN_ATTR(sp_inc));
2668
2693
  TOPN(0) = val;
2694
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2695
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2669
2696
  if (leaf) ADD_PC(INSN_ATTR(width));
2670
2697
  # undef INSN_ATTR
2671
2698
 
@@ -2693,12 +2720,12 @@ INSN_ENTRY(jump)
2693
2720
 
2694
2721
  /* ### Here we do the instruction body. ### */
2695
2722
  # define NAME_OF_CURRENT_INSN jump
2696
- # line 991 "insns.def"
2723
+ # line 981 "insns.def"
2697
2724
  {
2698
2725
  RUBY_VM_CHECK_INTS(ec);
2699
2726
  JUMP(dst);
2700
2727
  }
2701
- # line 2702 "vm.inc"
2728
+ # line 2729 "vm.inc"
2702
2729
  # undef NAME_OF_CURRENT_INSN
2703
2730
 
2704
2731
  /* ### Instruction trailers. ### */
@@ -2733,14 +2760,14 @@ INSN_ENTRY(branchif)
2733
2760
 
2734
2761
  /* ### Here we do the instruction body. ### */
2735
2762
  # define NAME_OF_CURRENT_INSN branchif
2736
- # line 1004 "insns.def"
2763
+ # line 994 "insns.def"
2737
2764
  {
2738
2765
  if (RTEST(val)) {
2739
2766
  RUBY_VM_CHECK_INTS(ec);
2740
2767
  JUMP(dst);
2741
2768
  }
2742
2769
  }
2743
- # line 2744 "vm.inc"
2770
+ # line 2771 "vm.inc"
2744
2771
  # undef NAME_OF_CURRENT_INSN
2745
2772
 
2746
2773
  /* ### Instruction trailers. ### */
@@ -2775,14 +2802,14 @@ INSN_ENTRY(branchunless)
2775
2802
 
2776
2803
  /* ### Here we do the instruction body. ### */
2777
2804
  # define NAME_OF_CURRENT_INSN branchunless
2778
- # line 1019 "insns.def"
2805
+ # line 1009 "insns.def"
2779
2806
  {
2780
2807
  if (!RTEST(val)) {
2781
2808
  RUBY_VM_CHECK_INTS(ec);
2782
2809
  JUMP(dst);
2783
2810
  }
2784
2811
  }
2785
- # line 2786 "vm.inc"
2812
+ # line 2813 "vm.inc"
2786
2813
  # undef NAME_OF_CURRENT_INSN
2787
2814
 
2788
2815
  /* ### Instruction trailers. ### */
@@ -2817,14 +2844,14 @@ INSN_ENTRY(branchnil)
2817
2844
 
2818
2845
  /* ### Here we do the instruction body. ### */
2819
2846
  # define NAME_OF_CURRENT_INSN branchnil
2820
- # line 1034 "insns.def"
2847
+ # line 1024 "insns.def"
2821
2848
  {
2822
2849
  if (NIL_P(val)) {
2823
2850
  RUBY_VM_CHECK_INTS(ec);
2824
2851
  JUMP(dst);
2825
2852
  }
2826
2853
  }
2827
- # line 2828 "vm.inc"
2854
+ # line 2855 "vm.inc"
2828
2855
  # undef NAME_OF_CURRENT_INSN
2829
2856
 
2830
2857
  /* ### Instruction trailers. ### */
@@ -2861,17 +2888,17 @@ INSN_ENTRY(opt_getinlinecache)
2861
2888
 
2862
2889
  /* ### Here we do the instruction body. ### */
2863
2890
  # define NAME_OF_CURRENT_INSN opt_getinlinecache
2864
- # line 1051 "insns.def"
2891
+ # line 1041 "insns.def"
2865
2892
  {
2866
2893
  if (vm_ic_hit_p(ic, GET_EP())) {
2867
- val = ic->ic_value.value;
2894
+ val = ic->value;
2868
2895
  JUMP(dst);
2869
2896
  }
2870
2897
  else {
2871
2898
  val = Qnil;
2872
2899
  }
2873
2900
  }
2874
- # line 2875 "vm.inc"
2901
+ # line 2902 "vm.inc"
2875
2902
  # undef NAME_OF_CURRENT_INSN
2876
2903
 
2877
2904
  /* ### Instruction trailers. ### */
@@ -2879,6 +2906,8 @@ INSN_ENTRY(opt_getinlinecache)
2879
2906
  CHECK_CANARY();
2880
2907
  INC_SP(INSN_ATTR(sp_inc));
2881
2908
  TOPN(0) = val;
2909
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2910
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2882
2911
  if (leaf) ADD_PC(INSN_ATTR(width));
2883
2912
  # undef INSN_ATTR
2884
2913
 
@@ -2907,11 +2936,11 @@ INSN_ENTRY(opt_setinlinecache)
2907
2936
 
2908
2937
  /* ### Here we do the instruction body. ### */
2909
2938
  # define NAME_OF_CURRENT_INSN opt_setinlinecache
2910
- # line 1067 "insns.def"
2939
+ # line 1057 "insns.def"
2911
2940
  {
2912
2941
  vm_ic_update(ic, val, GET_EP());
2913
2942
  }
2914
- # line 2915 "vm.inc"
2943
+ # line 2944 "vm.inc"
2915
2944
  # undef NAME_OF_CURRENT_INSN
2916
2945
 
2917
2946
  /* ### Instruction trailers. ### */
@@ -2919,6 +2948,8 @@ INSN_ENTRY(opt_setinlinecache)
2919
2948
  CHECK_CANARY();
2920
2949
  INC_SP(INSN_ATTR(sp_inc));
2921
2950
  TOPN(0) = val;
2951
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
2952
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
2922
2953
  if (leaf) ADD_PC(INSN_ATTR(width));
2923
2954
  # undef INSN_ATTR
2924
2955
 
@@ -2950,11 +2981,11 @@ INSN_ENTRY(once)
2950
2981
 
2951
2982
  /* ### Here we do the instruction body. ### */
2952
2983
  # define NAME_OF_CURRENT_INSN once
2953
- # line 1077 "insns.def"
2984
+ # line 1067 "insns.def"
2954
2985
  {
2955
2986
  val = vm_once_dispatch(ec, iseq, ise);
2956
2987
  }
2957
- # line 2958 "vm.inc"
2988
+ # line 2989 "vm.inc"
2958
2989
  # undef NAME_OF_CURRENT_INSN
2959
2990
 
2960
2991
  /* ### Instruction trailers. ### */
@@ -2991,7 +3022,7 @@ INSN_ENTRY(opt_case_dispatch)
2991
3022
 
2992
3023
  /* ### Here we do the instruction body. ### */
2993
3024
  # define NAME_OF_CURRENT_INSN opt_case_dispatch
2994
- # line 1088 "insns.def"
3025
+ # line 1078 "insns.def"
2995
3026
  {
2996
3027
  OFFSET dst = vm_case_dispatch(hash, else_offset, key);
2997
3028
 
@@ -2999,7 +3030,7 @@ INSN_ENTRY(opt_case_dispatch)
2999
3030
  JUMP(dst);
3000
3031
  }
3001
3032
  }
3002
- # line 3003 "vm.inc"
3033
+ # line 3034 "vm.inc"
3003
3034
  # undef NAME_OF_CURRENT_INSN
3004
3035
 
3005
3036
  /* ### Instruction trailers. ### */
@@ -3013,7 +3044,7 @@ INSN_ENTRY(opt_case_dispatch)
3013
3044
  END_INSN(opt_case_dispatch);
3014
3045
  }
3015
3046
 
3016
- /* insn opt_plus(ci, cc)(recv, obj)(val) */
3047
+ /* insn opt_plus(cd)(recv, obj)(val) */
3017
3048
  INSN_ENTRY(opt_plus)
3018
3049
  {
3019
3050
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3021,9 +3052,8 @@ INSN_ENTRY(opt_plus)
3021
3052
  DEBUG_ENTER_INSN("opt_plus");
3022
3053
 
3023
3054
  /* ### Declare and assign variables. ### */
3024
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3025
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3026
- # define INSN_ATTR(x) attr_ ## x ## _opt_plus(ci, cc)
3055
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3056
+ # define INSN_ATTR(x) attr_ ## x ## _opt_plus(cd)
3027
3057
  bool leaf = INSN_ATTR(leaf);
3028
3058
  VALUE recv = TOPN(1);
3029
3059
  VALUE obj = TOPN(0);
@@ -3033,12 +3063,11 @@ INSN_ENTRY(opt_plus)
3033
3063
  if (! leaf) ADD_PC(INSN_ATTR(width));
3034
3064
  SETUP_CANARY();
3035
3065
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3036
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3037
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3066
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3038
3067
 
3039
3068
  /* ### Here we do the instruction body. ### */
3040
3069
  # define NAME_OF_CURRENT_INSN opt_plus
3041
- # line 1104 "insns.def"
3070
+ # line 1094 "insns.def"
3042
3071
  {
3043
3072
  val = vm_opt_plus(recv, obj);
3044
3073
 
@@ -3046,7 +3075,7 @@ INSN_ENTRY(opt_plus)
3046
3075
  CALL_SIMPLE_METHOD();
3047
3076
  }
3048
3077
  }
3049
- # line 3050 "vm.inc"
3078
+ # line 3079 "vm.inc"
3050
3079
  # undef NAME_OF_CURRENT_INSN
3051
3080
 
3052
3081
  /* ### Instruction trailers. ### */
@@ -3054,6 +3083,8 @@ INSN_ENTRY(opt_plus)
3054
3083
  CHECK_CANARY();
3055
3084
  INC_SP(INSN_ATTR(sp_inc));
3056
3085
  TOPN(0) = val;
3086
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3087
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3057
3088
  if (leaf) ADD_PC(INSN_ATTR(width));
3058
3089
  # undef INSN_ATTR
3059
3090
 
@@ -3061,7 +3092,7 @@ INSN_ENTRY(opt_plus)
3061
3092
  END_INSN(opt_plus);
3062
3093
  }
3063
3094
 
3064
- /* insn opt_minus(ci, cc)(recv, obj)(val) */
3095
+ /* insn opt_minus(cd)(recv, obj)(val) */
3065
3096
  INSN_ENTRY(opt_minus)
3066
3097
  {
3067
3098
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3069,9 +3100,8 @@ INSN_ENTRY(opt_minus)
3069
3100
  DEBUG_ENTER_INSN("opt_minus");
3070
3101
 
3071
3102
  /* ### Declare and assign variables. ### */
3072
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3073
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3074
- # define INSN_ATTR(x) attr_ ## x ## _opt_minus(ci, cc)
3103
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3104
+ # define INSN_ATTR(x) attr_ ## x ## _opt_minus(cd)
3075
3105
  bool leaf = INSN_ATTR(leaf);
3076
3106
  VALUE recv = TOPN(1);
3077
3107
  VALUE obj = TOPN(0);
@@ -3081,12 +3111,11 @@ INSN_ENTRY(opt_minus)
3081
3111
  if (! leaf) ADD_PC(INSN_ATTR(width));
3082
3112
  SETUP_CANARY();
3083
3113
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3084
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3085
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3114
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3086
3115
 
3087
3116
  /* ### Here we do the instruction body. ### */
3088
3117
  # define NAME_OF_CURRENT_INSN opt_minus
3089
- # line 1118 "insns.def"
3118
+ # line 1108 "insns.def"
3090
3119
  {
3091
3120
  val = vm_opt_minus(recv, obj);
3092
3121
 
@@ -3094,7 +3123,7 @@ INSN_ENTRY(opt_minus)
3094
3123
  CALL_SIMPLE_METHOD();
3095
3124
  }
3096
3125
  }
3097
- # line 3098 "vm.inc"
3126
+ # line 3127 "vm.inc"
3098
3127
  # undef NAME_OF_CURRENT_INSN
3099
3128
 
3100
3129
  /* ### Instruction trailers. ### */
@@ -3102,6 +3131,8 @@ INSN_ENTRY(opt_minus)
3102
3131
  CHECK_CANARY();
3103
3132
  INC_SP(INSN_ATTR(sp_inc));
3104
3133
  TOPN(0) = val;
3134
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3135
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3105
3136
  if (leaf) ADD_PC(INSN_ATTR(width));
3106
3137
  # undef INSN_ATTR
3107
3138
 
@@ -3109,7 +3140,7 @@ INSN_ENTRY(opt_minus)
3109
3140
  END_INSN(opt_minus);
3110
3141
  }
3111
3142
 
3112
- /* insn opt_mult(ci, cc)(recv, obj)(val) */
3143
+ /* insn opt_mult(cd)(recv, obj)(val) */
3113
3144
  INSN_ENTRY(opt_mult)
3114
3145
  {
3115
3146
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3117,9 +3148,8 @@ INSN_ENTRY(opt_mult)
3117
3148
  DEBUG_ENTER_INSN("opt_mult");
3118
3149
 
3119
3150
  /* ### Declare and assign variables. ### */
3120
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3121
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3122
- # define INSN_ATTR(x) attr_ ## x ## _opt_mult(ci, cc)
3151
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3152
+ # define INSN_ATTR(x) attr_ ## x ## _opt_mult(cd)
3123
3153
  bool leaf = INSN_ATTR(leaf);
3124
3154
  VALUE recv = TOPN(1);
3125
3155
  VALUE obj = TOPN(0);
@@ -3129,12 +3159,11 @@ INSN_ENTRY(opt_mult)
3129
3159
  if (! leaf) ADD_PC(INSN_ATTR(width));
3130
3160
  SETUP_CANARY();
3131
3161
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3132
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3133
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3162
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3134
3163
 
3135
3164
  /* ### Here we do the instruction body. ### */
3136
3165
  # define NAME_OF_CURRENT_INSN opt_mult
3137
- # line 1132 "insns.def"
3166
+ # line 1122 "insns.def"
3138
3167
  {
3139
3168
  val = vm_opt_mult(recv, obj);
3140
3169
 
@@ -3142,7 +3171,7 @@ INSN_ENTRY(opt_mult)
3142
3171
  CALL_SIMPLE_METHOD();
3143
3172
  }
3144
3173
  }
3145
- # line 3146 "vm.inc"
3174
+ # line 3175 "vm.inc"
3146
3175
  # undef NAME_OF_CURRENT_INSN
3147
3176
 
3148
3177
  /* ### Instruction trailers. ### */
@@ -3150,6 +3179,8 @@ INSN_ENTRY(opt_mult)
3150
3179
  CHECK_CANARY();
3151
3180
  INC_SP(INSN_ATTR(sp_inc));
3152
3181
  TOPN(0) = val;
3182
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3183
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3153
3184
  if (leaf) ADD_PC(INSN_ATTR(width));
3154
3185
  # undef INSN_ATTR
3155
3186
 
@@ -3157,7 +3188,7 @@ INSN_ENTRY(opt_mult)
3157
3188
  END_INSN(opt_mult);
3158
3189
  }
3159
3190
 
3160
- /* insn opt_div(ci, cc)(recv, obj)(val) */
3191
+ /* insn opt_div(cd)(recv, obj)(val) */
3161
3192
  INSN_ENTRY(opt_div)
3162
3193
  {
3163
3194
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3165,9 +3196,8 @@ INSN_ENTRY(opt_div)
3165
3196
  DEBUG_ENTER_INSN("opt_div");
3166
3197
 
3167
3198
  /* ### Declare and assign variables. ### */
3168
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3169
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3170
- # define INSN_ATTR(x) attr_ ## x ## _opt_div(ci, cc)
3199
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3200
+ # define INSN_ATTR(x) attr_ ## x ## _opt_div(cd)
3171
3201
  bool leaf = INSN_ATTR(leaf);
3172
3202
  VALUE recv = TOPN(1);
3173
3203
  VALUE obj = TOPN(0);
@@ -3177,12 +3207,11 @@ INSN_ENTRY(opt_div)
3177
3207
  if (! leaf) ADD_PC(INSN_ATTR(width));
3178
3208
  SETUP_CANARY();
3179
3209
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3180
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3181
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3210
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3182
3211
 
3183
3212
  /* ### Here we do the instruction body. ### */
3184
3213
  # define NAME_OF_CURRENT_INSN opt_div
3185
- # line 1149 "insns.def"
3214
+ # line 1139 "insns.def"
3186
3215
  {
3187
3216
  val = vm_opt_div(recv, obj);
3188
3217
 
@@ -3190,7 +3219,7 @@ INSN_ENTRY(opt_div)
3190
3219
  CALL_SIMPLE_METHOD();
3191
3220
  }
3192
3221
  }
3193
- # line 3194 "vm.inc"
3222
+ # line 3223 "vm.inc"
3194
3223
  # undef NAME_OF_CURRENT_INSN
3195
3224
 
3196
3225
  /* ### Instruction trailers. ### */
@@ -3198,6 +3227,8 @@ INSN_ENTRY(opt_div)
3198
3227
  CHECK_CANARY();
3199
3228
  INC_SP(INSN_ATTR(sp_inc));
3200
3229
  TOPN(0) = val;
3230
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3231
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3201
3232
  if (leaf) ADD_PC(INSN_ATTR(width));
3202
3233
  # undef INSN_ATTR
3203
3234
 
@@ -3205,7 +3236,7 @@ INSN_ENTRY(opt_div)
3205
3236
  END_INSN(opt_div);
3206
3237
  }
3207
3238
 
3208
- /* insn opt_mod(ci, cc)(recv, obj)(val) */
3239
+ /* insn opt_mod(cd)(recv, obj)(val) */
3209
3240
  INSN_ENTRY(opt_mod)
3210
3241
  {
3211
3242
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3213,9 +3244,8 @@ INSN_ENTRY(opt_mod)
3213
3244
  DEBUG_ENTER_INSN("opt_mod");
3214
3245
 
3215
3246
  /* ### Declare and assign variables. ### */
3216
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3217
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3218
- # define INSN_ATTR(x) attr_ ## x ## _opt_mod(ci, cc)
3247
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3248
+ # define INSN_ATTR(x) attr_ ## x ## _opt_mod(cd)
3219
3249
  bool leaf = INSN_ATTR(leaf);
3220
3250
  VALUE recv = TOPN(1);
3221
3251
  VALUE obj = TOPN(0);
@@ -3225,12 +3255,11 @@ INSN_ENTRY(opt_mod)
3225
3255
  if (! leaf) ADD_PC(INSN_ATTR(width));
3226
3256
  SETUP_CANARY();
3227
3257
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3228
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3229
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3258
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3230
3259
 
3231
3260
  /* ### Here we do the instruction body. ### */
3232
3261
  # define NAME_OF_CURRENT_INSN opt_mod
3233
- # line 1165 "insns.def"
3262
+ # line 1155 "insns.def"
3234
3263
  {
3235
3264
  val = vm_opt_mod(recv, obj);
3236
3265
 
@@ -3238,7 +3267,7 @@ INSN_ENTRY(opt_mod)
3238
3267
  CALL_SIMPLE_METHOD();
3239
3268
  }
3240
3269
  }
3241
- # line 3242 "vm.inc"
3270
+ # line 3271 "vm.inc"
3242
3271
  # undef NAME_OF_CURRENT_INSN
3243
3272
 
3244
3273
  /* ### Instruction trailers. ### */
@@ -3246,6 +3275,8 @@ INSN_ENTRY(opt_mod)
3246
3275
  CHECK_CANARY();
3247
3276
  INC_SP(INSN_ATTR(sp_inc));
3248
3277
  TOPN(0) = val;
3278
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3279
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3249
3280
  if (leaf) ADD_PC(INSN_ATTR(width));
3250
3281
  # undef INSN_ATTR
3251
3282
 
@@ -3253,7 +3284,7 @@ INSN_ENTRY(opt_mod)
3253
3284
  END_INSN(opt_mod);
3254
3285
  }
3255
3286
 
3256
- /* insn opt_eq(ci, cc)(recv, obj)(val) */
3287
+ /* insn opt_eq(cd)(recv, obj)(val) */
3257
3288
  INSN_ENTRY(opt_eq)
3258
3289
  {
3259
3290
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3261,9 +3292,8 @@ INSN_ENTRY(opt_eq)
3261
3292
  DEBUG_ENTER_INSN("opt_eq");
3262
3293
 
3263
3294
  /* ### Declare and assign variables. ### */
3264
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3265
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3266
- # define INSN_ATTR(x) attr_ ## x ## _opt_eq(ci, cc)
3295
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3296
+ # define INSN_ATTR(x) attr_ ## x ## _opt_eq(cd)
3267
3297
  bool leaf = INSN_ATTR(leaf);
3268
3298
  VALUE recv = TOPN(1);
3269
3299
  VALUE obj = TOPN(0);
@@ -3273,20 +3303,19 @@ INSN_ENTRY(opt_eq)
3273
3303
  if (! leaf) ADD_PC(INSN_ATTR(width));
3274
3304
  SETUP_CANARY();
3275
3305
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3276
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3277
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3306
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3278
3307
 
3279
3308
  /* ### Here we do the instruction body. ### */
3280
3309
  # define NAME_OF_CURRENT_INSN opt_eq
3281
- # line 1179 "insns.def"
3310
+ # line 1169 "insns.def"
3282
3311
  {
3283
- val = opt_eq_func(recv, obj, ci, cc);
3312
+ val = opt_eq_func(recv, obj, cd);
3284
3313
 
3285
3314
  if (val == Qundef) {
3286
3315
  CALL_SIMPLE_METHOD();
3287
3316
  }
3288
3317
  }
3289
- # line 3290 "vm.inc"
3318
+ # line 3319 "vm.inc"
3290
3319
  # undef NAME_OF_CURRENT_INSN
3291
3320
 
3292
3321
  /* ### Instruction trailers. ### */
@@ -3294,6 +3323,8 @@ INSN_ENTRY(opt_eq)
3294
3323
  CHECK_CANARY();
3295
3324
  INC_SP(INSN_ATTR(sp_inc));
3296
3325
  TOPN(0) = val;
3326
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3327
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3297
3328
  if (leaf) ADD_PC(INSN_ATTR(width));
3298
3329
  # undef INSN_ATTR
3299
3330
 
@@ -3301,7 +3332,7 @@ INSN_ENTRY(opt_eq)
3301
3332
  END_INSN(opt_eq);
3302
3333
  }
3303
3334
 
3304
- /* insn opt_neq(ci_eq, cc_eq, ci, cc)(recv, obj)(val) */
3335
+ /* insn opt_neq(cd_eq, cd)(recv, obj)(val) */
3305
3336
  INSN_ENTRY(opt_neq)
3306
3337
  {
3307
3338
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3309,11 +3340,9 @@ INSN_ENTRY(opt_neq)
3309
3340
  DEBUG_ENTER_INSN("opt_neq");
3310
3341
 
3311
3342
  /* ### Declare and assign variables. ### */
3312
- CALL_INFO ci_eq = (CALL_INFO)GET_OPERAND(1);
3313
- CALL_CACHE cc_eq = (CALL_CACHE)GET_OPERAND(2);
3314
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(3);
3315
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(4);
3316
- # define INSN_ATTR(x) attr_ ## x ## _opt_neq(ci_eq, cc_eq, ci, cc)
3343
+ CALL_DATA cd_eq = (CALL_DATA)GET_OPERAND(1);
3344
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
3345
+ # define INSN_ATTR(x) attr_ ## x ## _opt_neq(cd_eq, cd)
3317
3346
  bool leaf = INSN_ATTR(leaf);
3318
3347
  VALUE recv = TOPN(1);
3319
3348
  VALUE obj = TOPN(0);
@@ -3323,22 +3352,20 @@ INSN_ENTRY(opt_neq)
3323
3352
  if (! leaf) ADD_PC(INSN_ATTR(width));
3324
3353
  SETUP_CANARY();
3325
3354
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3326
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci_eq);
3327
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc_eq);
3328
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, ci);
3329
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 3, cc);
3355
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd_eq);
3356
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
3330
3357
 
3331
3358
  /* ### Here we do the instruction body. ### */
3332
3359
  # define NAME_OF_CURRENT_INSN opt_neq
3333
- # line 1193 "insns.def"
3360
+ # line 1183 "insns.def"
3334
3361
  {
3335
- val = vm_opt_neq(ci, cc, ci_eq, cc_eq, recv, obj);
3362
+ val = vm_opt_neq(cd, cd_eq, recv, obj);
3336
3363
 
3337
3364
  if (val == Qundef) {
3338
3365
  CALL_SIMPLE_METHOD();
3339
3366
  }
3340
3367
  }
3341
- # line 3342 "vm.inc"
3368
+ # line 3369 "vm.inc"
3342
3369
  # undef NAME_OF_CURRENT_INSN
3343
3370
 
3344
3371
  /* ### Instruction trailers. ### */
@@ -3346,6 +3373,8 @@ INSN_ENTRY(opt_neq)
3346
3373
  CHECK_CANARY();
3347
3374
  INC_SP(INSN_ATTR(sp_inc));
3348
3375
  TOPN(0) = val;
3376
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3377
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3349
3378
  if (leaf) ADD_PC(INSN_ATTR(width));
3350
3379
  # undef INSN_ATTR
3351
3380
 
@@ -3353,7 +3382,7 @@ INSN_ENTRY(opt_neq)
3353
3382
  END_INSN(opt_neq);
3354
3383
  }
3355
3384
 
3356
- /* insn opt_lt(ci, cc)(recv, obj)(val) */
3385
+ /* insn opt_lt(cd)(recv, obj)(val) */
3357
3386
  INSN_ENTRY(opt_lt)
3358
3387
  {
3359
3388
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3361,9 +3390,8 @@ INSN_ENTRY(opt_lt)
3361
3390
  DEBUG_ENTER_INSN("opt_lt");
3362
3391
 
3363
3392
  /* ### Declare and assign variables. ### */
3364
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3365
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3366
- # define INSN_ATTR(x) attr_ ## x ## _opt_lt(ci, cc)
3393
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3394
+ # define INSN_ATTR(x) attr_ ## x ## _opt_lt(cd)
3367
3395
  bool leaf = INSN_ATTR(leaf);
3368
3396
  VALUE recv = TOPN(1);
3369
3397
  VALUE obj = TOPN(0);
@@ -3373,12 +3401,11 @@ INSN_ENTRY(opt_lt)
3373
3401
  if (! leaf) ADD_PC(INSN_ATTR(width));
3374
3402
  SETUP_CANARY();
3375
3403
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3376
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3377
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3404
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3378
3405
 
3379
3406
  /* ### Here we do the instruction body. ### */
3380
3407
  # define NAME_OF_CURRENT_INSN opt_lt
3381
- # line 1207 "insns.def"
3408
+ # line 1197 "insns.def"
3382
3409
  {
3383
3410
  val = vm_opt_lt(recv, obj);
3384
3411
 
@@ -3386,7 +3413,7 @@ INSN_ENTRY(opt_lt)
3386
3413
  CALL_SIMPLE_METHOD();
3387
3414
  }
3388
3415
  }
3389
- # line 3390 "vm.inc"
3416
+ # line 3417 "vm.inc"
3390
3417
  # undef NAME_OF_CURRENT_INSN
3391
3418
 
3392
3419
  /* ### Instruction trailers. ### */
@@ -3394,6 +3421,8 @@ INSN_ENTRY(opt_lt)
3394
3421
  CHECK_CANARY();
3395
3422
  INC_SP(INSN_ATTR(sp_inc));
3396
3423
  TOPN(0) = val;
3424
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3425
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3397
3426
  if (leaf) ADD_PC(INSN_ATTR(width));
3398
3427
  # undef INSN_ATTR
3399
3428
 
@@ -3401,7 +3430,7 @@ INSN_ENTRY(opt_lt)
3401
3430
  END_INSN(opt_lt);
3402
3431
  }
3403
3432
 
3404
- /* insn opt_le(ci, cc)(recv, obj)(val) */
3433
+ /* insn opt_le(cd)(recv, obj)(val) */
3405
3434
  INSN_ENTRY(opt_le)
3406
3435
  {
3407
3436
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3409,9 +3438,8 @@ INSN_ENTRY(opt_le)
3409
3438
  DEBUG_ENTER_INSN("opt_le");
3410
3439
 
3411
3440
  /* ### Declare and assign variables. ### */
3412
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3413
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3414
- # define INSN_ATTR(x) attr_ ## x ## _opt_le(ci, cc)
3441
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3442
+ # define INSN_ATTR(x) attr_ ## x ## _opt_le(cd)
3415
3443
  bool leaf = INSN_ATTR(leaf);
3416
3444
  VALUE recv = TOPN(1);
3417
3445
  VALUE obj = TOPN(0);
@@ -3421,12 +3449,11 @@ INSN_ENTRY(opt_le)
3421
3449
  if (! leaf) ADD_PC(INSN_ATTR(width));
3422
3450
  SETUP_CANARY();
3423
3451
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3424
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3425
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3452
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3426
3453
 
3427
3454
  /* ### Here we do the instruction body. ### */
3428
3455
  # define NAME_OF_CURRENT_INSN opt_le
3429
- # line 1221 "insns.def"
3456
+ # line 1211 "insns.def"
3430
3457
  {
3431
3458
  val = vm_opt_le(recv, obj);
3432
3459
 
@@ -3434,7 +3461,7 @@ INSN_ENTRY(opt_le)
3434
3461
  CALL_SIMPLE_METHOD();
3435
3462
  }
3436
3463
  }
3437
- # line 3438 "vm.inc"
3464
+ # line 3465 "vm.inc"
3438
3465
  # undef NAME_OF_CURRENT_INSN
3439
3466
 
3440
3467
  /* ### Instruction trailers. ### */
@@ -3442,6 +3469,8 @@ INSN_ENTRY(opt_le)
3442
3469
  CHECK_CANARY();
3443
3470
  INC_SP(INSN_ATTR(sp_inc));
3444
3471
  TOPN(0) = val;
3472
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3473
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3445
3474
  if (leaf) ADD_PC(INSN_ATTR(width));
3446
3475
  # undef INSN_ATTR
3447
3476
 
@@ -3449,7 +3478,7 @@ INSN_ENTRY(opt_le)
3449
3478
  END_INSN(opt_le);
3450
3479
  }
3451
3480
 
3452
- /* insn opt_gt(ci, cc)(recv, obj)(val) */
3481
+ /* insn opt_gt(cd)(recv, obj)(val) */
3453
3482
  INSN_ENTRY(opt_gt)
3454
3483
  {
3455
3484
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3457,9 +3486,8 @@ INSN_ENTRY(opt_gt)
3457
3486
  DEBUG_ENTER_INSN("opt_gt");
3458
3487
 
3459
3488
  /* ### Declare and assign variables. ### */
3460
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3461
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3462
- # define INSN_ATTR(x) attr_ ## x ## _opt_gt(ci, cc)
3489
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3490
+ # define INSN_ATTR(x) attr_ ## x ## _opt_gt(cd)
3463
3491
  bool leaf = INSN_ATTR(leaf);
3464
3492
  VALUE recv = TOPN(1);
3465
3493
  VALUE obj = TOPN(0);
@@ -3469,12 +3497,11 @@ INSN_ENTRY(opt_gt)
3469
3497
  if (! leaf) ADD_PC(INSN_ATTR(width));
3470
3498
  SETUP_CANARY();
3471
3499
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3472
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3473
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3500
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3474
3501
 
3475
3502
  /* ### Here we do the instruction body. ### */
3476
3503
  # define NAME_OF_CURRENT_INSN opt_gt
3477
- # line 1235 "insns.def"
3504
+ # line 1225 "insns.def"
3478
3505
  {
3479
3506
  val = vm_opt_gt(recv, obj);
3480
3507
 
@@ -3482,7 +3509,7 @@ INSN_ENTRY(opt_gt)
3482
3509
  CALL_SIMPLE_METHOD();
3483
3510
  }
3484
3511
  }
3485
- # line 3486 "vm.inc"
3512
+ # line 3513 "vm.inc"
3486
3513
  # undef NAME_OF_CURRENT_INSN
3487
3514
 
3488
3515
  /* ### Instruction trailers. ### */
@@ -3490,6 +3517,8 @@ INSN_ENTRY(opt_gt)
3490
3517
  CHECK_CANARY();
3491
3518
  INC_SP(INSN_ATTR(sp_inc));
3492
3519
  TOPN(0) = val;
3520
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3521
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3493
3522
  if (leaf) ADD_PC(INSN_ATTR(width));
3494
3523
  # undef INSN_ATTR
3495
3524
 
@@ -3497,7 +3526,7 @@ INSN_ENTRY(opt_gt)
3497
3526
  END_INSN(opt_gt);
3498
3527
  }
3499
3528
 
3500
- /* insn opt_ge(ci, cc)(recv, obj)(val) */
3529
+ /* insn opt_ge(cd)(recv, obj)(val) */
3501
3530
  INSN_ENTRY(opt_ge)
3502
3531
  {
3503
3532
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3505,9 +3534,8 @@ INSN_ENTRY(opt_ge)
3505
3534
  DEBUG_ENTER_INSN("opt_ge");
3506
3535
 
3507
3536
  /* ### Declare and assign variables. ### */
3508
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3509
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3510
- # define INSN_ATTR(x) attr_ ## x ## _opt_ge(ci, cc)
3537
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3538
+ # define INSN_ATTR(x) attr_ ## x ## _opt_ge(cd)
3511
3539
  bool leaf = INSN_ATTR(leaf);
3512
3540
  VALUE recv = TOPN(1);
3513
3541
  VALUE obj = TOPN(0);
@@ -3517,12 +3545,11 @@ INSN_ENTRY(opt_ge)
3517
3545
  if (! leaf) ADD_PC(INSN_ATTR(width));
3518
3546
  SETUP_CANARY();
3519
3547
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3520
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3521
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3548
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3522
3549
 
3523
3550
  /* ### Here we do the instruction body. ### */
3524
3551
  # define NAME_OF_CURRENT_INSN opt_ge
3525
- # line 1249 "insns.def"
3552
+ # line 1239 "insns.def"
3526
3553
  {
3527
3554
  val = vm_opt_ge(recv, obj);
3528
3555
 
@@ -3530,7 +3557,7 @@ INSN_ENTRY(opt_ge)
3530
3557
  CALL_SIMPLE_METHOD();
3531
3558
  }
3532
3559
  }
3533
- # line 3534 "vm.inc"
3560
+ # line 3561 "vm.inc"
3534
3561
  # undef NAME_OF_CURRENT_INSN
3535
3562
 
3536
3563
  /* ### Instruction trailers. ### */
@@ -3538,6 +3565,8 @@ INSN_ENTRY(opt_ge)
3538
3565
  CHECK_CANARY();
3539
3566
  INC_SP(INSN_ATTR(sp_inc));
3540
3567
  TOPN(0) = val;
3568
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3569
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3541
3570
  if (leaf) ADD_PC(INSN_ATTR(width));
3542
3571
  # undef INSN_ATTR
3543
3572
 
@@ -3545,7 +3574,7 @@ INSN_ENTRY(opt_ge)
3545
3574
  END_INSN(opt_ge);
3546
3575
  }
3547
3576
 
3548
- /* insn opt_ltlt(ci, cc)(recv, obj)(val) */
3577
+ /* insn opt_ltlt(cd)(recv, obj)(val) */
3549
3578
  INSN_ENTRY(opt_ltlt)
3550
3579
  {
3551
3580
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3553,9 +3582,8 @@ INSN_ENTRY(opt_ltlt)
3553
3582
  DEBUG_ENTER_INSN("opt_ltlt");
3554
3583
 
3555
3584
  /* ### Declare and assign variables. ### */
3556
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3557
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3558
- # define INSN_ATTR(x) attr_ ## x ## _opt_ltlt(ci, cc)
3585
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3586
+ # define INSN_ATTR(x) attr_ ## x ## _opt_ltlt(cd)
3559
3587
  bool leaf = INSN_ATTR(leaf);
3560
3588
  VALUE recv = TOPN(1);
3561
3589
  VALUE obj = TOPN(0);
@@ -3565,12 +3593,11 @@ INSN_ENTRY(opt_ltlt)
3565
3593
  if (! leaf) ADD_PC(INSN_ATTR(width));
3566
3594
  SETUP_CANARY();
3567
3595
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3568
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3569
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3596
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3570
3597
 
3571
3598
  /* ### Here we do the instruction body. ### */
3572
3599
  # define NAME_OF_CURRENT_INSN opt_ltlt
3573
- # line 1267 "insns.def"
3600
+ # line 1257 "insns.def"
3574
3601
  {
3575
3602
  val = vm_opt_ltlt(recv, obj);
3576
3603
 
@@ -3578,7 +3605,7 @@ INSN_ENTRY(opt_ltlt)
3578
3605
  CALL_SIMPLE_METHOD();
3579
3606
  }
3580
3607
  }
3581
- # line 3582 "vm.inc"
3608
+ # line 3609 "vm.inc"
3582
3609
  # undef NAME_OF_CURRENT_INSN
3583
3610
 
3584
3611
  /* ### Instruction trailers. ### */
@@ -3586,6 +3613,8 @@ INSN_ENTRY(opt_ltlt)
3586
3613
  CHECK_CANARY();
3587
3614
  INC_SP(INSN_ATTR(sp_inc));
3588
3615
  TOPN(0) = val;
3616
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3617
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3589
3618
  if (leaf) ADD_PC(INSN_ATTR(width));
3590
3619
  # undef INSN_ATTR
3591
3620
 
@@ -3593,7 +3622,7 @@ INSN_ENTRY(opt_ltlt)
3593
3622
  END_INSN(opt_ltlt);
3594
3623
  }
3595
3624
 
3596
- /* insn opt_and(ci, cc)(recv, obj)(val) */
3625
+ /* insn opt_and(cd)(recv, obj)(val) */
3597
3626
  INSN_ENTRY(opt_and)
3598
3627
  {
3599
3628
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3601,9 +3630,8 @@ INSN_ENTRY(opt_and)
3601
3630
  DEBUG_ENTER_INSN("opt_and");
3602
3631
 
3603
3632
  /* ### Declare and assign variables. ### */
3604
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3605
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3606
- # define INSN_ATTR(x) attr_ ## x ## _opt_and(ci, cc)
3633
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3634
+ # define INSN_ATTR(x) attr_ ## x ## _opt_and(cd)
3607
3635
  bool leaf = INSN_ATTR(leaf);
3608
3636
  VALUE recv = TOPN(1);
3609
3637
  VALUE obj = TOPN(0);
@@ -3613,12 +3641,11 @@ INSN_ENTRY(opt_and)
3613
3641
  if (! leaf) ADD_PC(INSN_ATTR(width));
3614
3642
  SETUP_CANARY();
3615
3643
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3616
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3617
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3644
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3618
3645
 
3619
3646
  /* ### Here we do the instruction body. ### */
3620
3647
  # define NAME_OF_CURRENT_INSN opt_and
3621
- # line 1281 "insns.def"
3648
+ # line 1271 "insns.def"
3622
3649
  {
3623
3650
  val = vm_opt_and(recv, obj);
3624
3651
 
@@ -3626,7 +3653,7 @@ INSN_ENTRY(opt_and)
3626
3653
  CALL_SIMPLE_METHOD();
3627
3654
  }
3628
3655
  }
3629
- # line 3630 "vm.inc"
3656
+ # line 3657 "vm.inc"
3630
3657
  # undef NAME_OF_CURRENT_INSN
3631
3658
 
3632
3659
  /* ### Instruction trailers. ### */
@@ -3634,6 +3661,8 @@ INSN_ENTRY(opt_and)
3634
3661
  CHECK_CANARY();
3635
3662
  INC_SP(INSN_ATTR(sp_inc));
3636
3663
  TOPN(0) = val;
3664
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3665
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3637
3666
  if (leaf) ADD_PC(INSN_ATTR(width));
3638
3667
  # undef INSN_ATTR
3639
3668
 
@@ -3641,7 +3670,7 @@ INSN_ENTRY(opt_and)
3641
3670
  END_INSN(opt_and);
3642
3671
  }
3643
3672
 
3644
- /* insn opt_or(ci, cc)(recv, obj)(val) */
3673
+ /* insn opt_or(cd)(recv, obj)(val) */
3645
3674
  INSN_ENTRY(opt_or)
3646
3675
  {
3647
3676
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3649,9 +3678,8 @@ INSN_ENTRY(opt_or)
3649
3678
  DEBUG_ENTER_INSN("opt_or");
3650
3679
 
3651
3680
  /* ### Declare and assign variables. ### */
3652
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3653
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3654
- # define INSN_ATTR(x) attr_ ## x ## _opt_or(ci, cc)
3681
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3682
+ # define INSN_ATTR(x) attr_ ## x ## _opt_or(cd)
3655
3683
  bool leaf = INSN_ATTR(leaf);
3656
3684
  VALUE recv = TOPN(1);
3657
3685
  VALUE obj = TOPN(0);
@@ -3661,12 +3689,11 @@ INSN_ENTRY(opt_or)
3661
3689
  if (! leaf) ADD_PC(INSN_ATTR(width));
3662
3690
  SETUP_CANARY();
3663
3691
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3664
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3665
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3692
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3666
3693
 
3667
3694
  /* ### Here we do the instruction body. ### */
3668
3695
  # define NAME_OF_CURRENT_INSN opt_or
3669
- # line 1295 "insns.def"
3696
+ # line 1285 "insns.def"
3670
3697
  {
3671
3698
  val = vm_opt_or(recv, obj);
3672
3699
 
@@ -3674,7 +3701,7 @@ INSN_ENTRY(opt_or)
3674
3701
  CALL_SIMPLE_METHOD();
3675
3702
  }
3676
3703
  }
3677
- # line 3678 "vm.inc"
3704
+ # line 3705 "vm.inc"
3678
3705
  # undef NAME_OF_CURRENT_INSN
3679
3706
 
3680
3707
  /* ### Instruction trailers. ### */
@@ -3682,6 +3709,8 @@ INSN_ENTRY(opt_or)
3682
3709
  CHECK_CANARY();
3683
3710
  INC_SP(INSN_ATTR(sp_inc));
3684
3711
  TOPN(0) = val;
3712
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3713
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3685
3714
  if (leaf) ADD_PC(INSN_ATTR(width));
3686
3715
  # undef INSN_ATTR
3687
3716
 
@@ -3689,7 +3718,7 @@ INSN_ENTRY(opt_or)
3689
3718
  END_INSN(opt_or);
3690
3719
  }
3691
3720
 
3692
- /* insn opt_aref(ci, cc)(recv, obj)(val) */
3721
+ /* insn opt_aref(cd)(recv, obj)(val) */
3693
3722
  INSN_ENTRY(opt_aref)
3694
3723
  {
3695
3724
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3697,9 +3726,8 @@ INSN_ENTRY(opt_aref)
3697
3726
  DEBUG_ENTER_INSN("opt_aref");
3698
3727
 
3699
3728
  /* ### Declare and assign variables. ### */
3700
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3701
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3702
- # define INSN_ATTR(x) attr_ ## x ## _opt_aref(ci, cc)
3729
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3730
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aref(cd)
3703
3731
  bool leaf = INSN_ATTR(leaf);
3704
3732
  VALUE recv = TOPN(1);
3705
3733
  VALUE obj = TOPN(0);
@@ -3709,12 +3737,11 @@ INSN_ENTRY(opt_aref)
3709
3737
  if (! leaf) ADD_PC(INSN_ATTR(width));
3710
3738
  SETUP_CANARY();
3711
3739
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3712
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3713
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3740
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3714
3741
 
3715
3742
  /* ### Here we do the instruction body. ### */
3716
3743
  # define NAME_OF_CURRENT_INSN opt_aref
3717
- # line 1314 "insns.def"
3744
+ # line 1304 "insns.def"
3718
3745
  {
3719
3746
  val = vm_opt_aref(recv, obj);
3720
3747
 
@@ -3722,7 +3749,7 @@ INSN_ENTRY(opt_aref)
3722
3749
  CALL_SIMPLE_METHOD();
3723
3750
  }
3724
3751
  }
3725
- # line 3726 "vm.inc"
3752
+ # line 3753 "vm.inc"
3726
3753
  # undef NAME_OF_CURRENT_INSN
3727
3754
 
3728
3755
  /* ### Instruction trailers. ### */
@@ -3730,6 +3757,8 @@ INSN_ENTRY(opt_aref)
3730
3757
  CHECK_CANARY();
3731
3758
  INC_SP(INSN_ATTR(sp_inc));
3732
3759
  TOPN(0) = val;
3760
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3761
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3733
3762
  if (leaf) ADD_PC(INSN_ATTR(width));
3734
3763
  # undef INSN_ATTR
3735
3764
 
@@ -3737,7 +3766,7 @@ INSN_ENTRY(opt_aref)
3737
3766
  END_INSN(opt_aref);
3738
3767
  }
3739
3768
 
3740
- /* insn opt_aset(ci, cc)(recv, obj, set)(val) */
3769
+ /* insn opt_aset(cd)(recv, obj, set)(val) */
3741
3770
  INSN_ENTRY(opt_aset)
3742
3771
  {
3743
3772
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3745,9 +3774,8 @@ INSN_ENTRY(opt_aset)
3745
3774
  DEBUG_ENTER_INSN("opt_aset");
3746
3775
 
3747
3776
  /* ### Declare and assign variables. ### */
3748
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3749
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3750
- # define INSN_ATTR(x) attr_ ## x ## _opt_aset(ci, cc)
3777
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3778
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aset(cd)
3751
3779
  bool leaf = INSN_ATTR(leaf);
3752
3780
  VALUE recv = TOPN(2);
3753
3781
  VALUE obj = TOPN(1);
@@ -3758,12 +3786,11 @@ INSN_ENTRY(opt_aset)
3758
3786
  if (! leaf) ADD_PC(INSN_ATTR(width));
3759
3787
  SETUP_CANARY();
3760
3788
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3761
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3762
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3789
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3763
3790
 
3764
3791
  /* ### Here we do the instruction body. ### */
3765
3792
  # define NAME_OF_CURRENT_INSN opt_aset
3766
- # line 1331 "insns.def"
3793
+ # line 1321 "insns.def"
3767
3794
  {
3768
3795
  val = vm_opt_aset(recv, obj, set);
3769
3796
 
@@ -3771,7 +3798,7 @@ INSN_ENTRY(opt_aset)
3771
3798
  CALL_SIMPLE_METHOD();
3772
3799
  }
3773
3800
  }
3774
- # line 3775 "vm.inc"
3801
+ # line 3802 "vm.inc"
3775
3802
  # undef NAME_OF_CURRENT_INSN
3776
3803
 
3777
3804
  /* ### Instruction trailers. ### */
@@ -3779,6 +3806,8 @@ INSN_ENTRY(opt_aset)
3779
3806
  CHECK_CANARY();
3780
3807
  INC_SP(INSN_ATTR(sp_inc));
3781
3808
  TOPN(0) = val;
3809
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3810
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3782
3811
  if (leaf) ADD_PC(INSN_ATTR(width));
3783
3812
  # undef INSN_ATTR
3784
3813
 
@@ -3786,7 +3815,7 @@ INSN_ENTRY(opt_aset)
3786
3815
  END_INSN(opt_aset);
3787
3816
  }
3788
3817
 
3789
- /* insn opt_aset_with(key, ci, cc)(recv, val)(val) */
3818
+ /* insn opt_aset_with(key, cd)(recv, val)(val) */
3790
3819
  INSN_ENTRY(opt_aset_with)
3791
3820
  {
3792
3821
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3795,9 +3824,8 @@ INSN_ENTRY(opt_aset_with)
3795
3824
 
3796
3825
  /* ### Declare and assign variables. ### */
3797
3826
  VALUE key = (VALUE)GET_OPERAND(1);
3798
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
3799
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
3800
- # define INSN_ATTR(x) attr_ ## x ## _opt_aset_with(key, ci, cc)
3827
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
3828
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aset_with(key, cd)
3801
3829
  bool leaf = INSN_ATTR(leaf);
3802
3830
  VALUE recv = TOPN(1);
3803
3831
  VALUE val = TOPN(0);
@@ -3807,12 +3835,11 @@ INSN_ENTRY(opt_aset_with)
3807
3835
  SETUP_CANARY();
3808
3836
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3809
3837
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key);
3810
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
3811
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
3838
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
3812
3839
 
3813
3840
  /* ### Here we do the instruction body. ### */
3814
3841
  # define NAME_OF_CURRENT_INSN opt_aset_with
3815
- # line 1347 "insns.def"
3842
+ # line 1337 "insns.def"
3816
3843
  {
3817
3844
  VALUE tmp = vm_opt_aset_with(recv, key, val);
3818
3845
 
@@ -3827,7 +3854,7 @@ INSN_ENTRY(opt_aset_with)
3827
3854
  CALL_SIMPLE_METHOD();
3828
3855
  }
3829
3856
  }
3830
- # line 3831 "vm.inc"
3857
+ # line 3858 "vm.inc"
3831
3858
  # undef NAME_OF_CURRENT_INSN
3832
3859
 
3833
3860
  /* ### Instruction trailers. ### */
@@ -3835,6 +3862,8 @@ INSN_ENTRY(opt_aset_with)
3835
3862
  CHECK_CANARY();
3836
3863
  INC_SP(INSN_ATTR(sp_inc));
3837
3864
  TOPN(0) = val;
3865
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3866
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3838
3867
  if (leaf) ADD_PC(INSN_ATTR(width));
3839
3868
  # undef INSN_ATTR
3840
3869
 
@@ -3842,7 +3871,7 @@ INSN_ENTRY(opt_aset_with)
3842
3871
  END_INSN(opt_aset_with);
3843
3872
  }
3844
3873
 
3845
- /* insn opt_aref_with(key, ci, cc)(recv)(val) */
3874
+ /* insn opt_aref_with(key, cd)(recv)(val) */
3846
3875
  INSN_ENTRY(opt_aref_with)
3847
3876
  {
3848
3877
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3851,9 +3880,8 @@ INSN_ENTRY(opt_aref_with)
3851
3880
 
3852
3881
  /* ### Declare and assign variables. ### */
3853
3882
  VALUE key = (VALUE)GET_OPERAND(1);
3854
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(2);
3855
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(3);
3856
- # define INSN_ATTR(x) attr_ ## x ## _opt_aref_with(key, ci, cc)
3883
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(2);
3884
+ # define INSN_ATTR(x) attr_ ## x ## _opt_aref_with(key, cd)
3857
3885
  bool leaf = INSN_ATTR(leaf);
3858
3886
  VALUE recv = TOPN(0);
3859
3887
  VALUE val;
@@ -3863,12 +3891,11 @@ INSN_ENTRY(opt_aref_with)
3863
3891
  SETUP_CANARY();
3864
3892
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3865
3893
  COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key);
3866
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ci);
3867
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 2, cc);
3894
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd);
3868
3895
 
3869
3896
  /* ### Here we do the instruction body. ### */
3870
3897
  # define NAME_OF_CURRENT_INSN opt_aref_with
3871
- # line 1370 "insns.def"
3898
+ # line 1360 "insns.def"
3872
3899
  {
3873
3900
  val = vm_opt_aref_with(recv, key);
3874
3901
 
@@ -3879,7 +3906,7 @@ INSN_ENTRY(opt_aref_with)
3879
3906
  CALL_SIMPLE_METHOD();
3880
3907
  }
3881
3908
  }
3882
- # line 3883 "vm.inc"
3909
+ # line 3910 "vm.inc"
3883
3910
  # undef NAME_OF_CURRENT_INSN
3884
3911
 
3885
3912
  /* ### Instruction trailers. ### */
@@ -3887,6 +3914,8 @@ INSN_ENTRY(opt_aref_with)
3887
3914
  CHECK_CANARY();
3888
3915
  INC_SP(INSN_ATTR(sp_inc));
3889
3916
  TOPN(0) = val;
3917
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3918
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3890
3919
  if (leaf) ADD_PC(INSN_ATTR(width));
3891
3920
  # undef INSN_ATTR
3892
3921
 
@@ -3894,7 +3923,7 @@ INSN_ENTRY(opt_aref_with)
3894
3923
  END_INSN(opt_aref_with);
3895
3924
  }
3896
3925
 
3897
- /* insn opt_length(ci, cc)(recv)(val) */
3926
+ /* insn opt_length(cd)(recv)(val) */
3898
3927
  INSN_ENTRY(opt_length)
3899
3928
  {
3900
3929
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3902,9 +3931,8 @@ INSN_ENTRY(opt_length)
3902
3931
  DEBUG_ENTER_INSN("opt_length");
3903
3932
 
3904
3933
  /* ### Declare and assign variables. ### */
3905
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3906
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3907
- # define INSN_ATTR(x) attr_ ## x ## _opt_length(ci, cc)
3934
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3935
+ # define INSN_ATTR(x) attr_ ## x ## _opt_length(cd)
3908
3936
  bool leaf = INSN_ATTR(leaf);
3909
3937
  VALUE recv = TOPN(0);
3910
3938
  VALUE val;
@@ -3913,12 +3941,11 @@ INSN_ENTRY(opt_length)
3913
3941
  if (! leaf) ADD_PC(INSN_ATTR(width));
3914
3942
  SETUP_CANARY();
3915
3943
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3916
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3917
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3944
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3918
3945
 
3919
3946
  /* ### Here we do the instruction body. ### */
3920
3947
  # define NAME_OF_CURRENT_INSN opt_length
3921
- # line 1387 "insns.def"
3948
+ # line 1377 "insns.def"
3922
3949
  {
3923
3950
  val = vm_opt_length(recv, BOP_LENGTH);
3924
3951
 
@@ -3926,7 +3953,7 @@ INSN_ENTRY(opt_length)
3926
3953
  CALL_SIMPLE_METHOD();
3927
3954
  }
3928
3955
  }
3929
- # line 3930 "vm.inc"
3956
+ # line 3957 "vm.inc"
3930
3957
  # undef NAME_OF_CURRENT_INSN
3931
3958
 
3932
3959
  /* ### Instruction trailers. ### */
@@ -3934,6 +3961,8 @@ INSN_ENTRY(opt_length)
3934
3961
  CHECK_CANARY();
3935
3962
  INC_SP(INSN_ATTR(sp_inc));
3936
3963
  TOPN(0) = val;
3964
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
3965
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3937
3966
  if (leaf) ADD_PC(INSN_ATTR(width));
3938
3967
  # undef INSN_ATTR
3939
3968
 
@@ -3941,7 +3970,7 @@ INSN_ENTRY(opt_length)
3941
3970
  END_INSN(opt_length);
3942
3971
  }
3943
3972
 
3944
- /* insn opt_size(ci, cc)(recv)(val) */
3973
+ /* insn opt_size(cd)(recv)(val) */
3945
3974
  INSN_ENTRY(opt_size)
3946
3975
  {
3947
3976
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3949,9 +3978,8 @@ INSN_ENTRY(opt_size)
3949
3978
  DEBUG_ENTER_INSN("opt_size");
3950
3979
 
3951
3980
  /* ### Declare and assign variables. ### */
3952
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3953
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3954
- # define INSN_ATTR(x) attr_ ## x ## _opt_size(ci, cc)
3981
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
3982
+ # define INSN_ATTR(x) attr_ ## x ## _opt_size(cd)
3955
3983
  bool leaf = INSN_ATTR(leaf);
3956
3984
  VALUE recv = TOPN(0);
3957
3985
  VALUE val;
@@ -3960,12 +3988,11 @@ INSN_ENTRY(opt_size)
3960
3988
  if (! leaf) ADD_PC(INSN_ATTR(width));
3961
3989
  SETUP_CANARY();
3962
3990
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
3963
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
3964
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
3991
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
3965
3992
 
3966
3993
  /* ### Here we do the instruction body. ### */
3967
3994
  # define NAME_OF_CURRENT_INSN opt_size
3968
- # line 1401 "insns.def"
3995
+ # line 1391 "insns.def"
3969
3996
  {
3970
3997
  val = vm_opt_length(recv, BOP_SIZE);
3971
3998
 
@@ -3973,7 +4000,7 @@ INSN_ENTRY(opt_size)
3973
4000
  CALL_SIMPLE_METHOD();
3974
4001
  }
3975
4002
  }
3976
- # line 3977 "vm.inc"
4003
+ # line 4004 "vm.inc"
3977
4004
  # undef NAME_OF_CURRENT_INSN
3978
4005
 
3979
4006
  /* ### Instruction trailers. ### */
@@ -3981,6 +4008,8 @@ INSN_ENTRY(opt_size)
3981
4008
  CHECK_CANARY();
3982
4009
  INC_SP(INSN_ATTR(sp_inc));
3983
4010
  TOPN(0) = val;
4011
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4012
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
3984
4013
  if (leaf) ADD_PC(INSN_ATTR(width));
3985
4014
  # undef INSN_ATTR
3986
4015
 
@@ -3988,7 +4017,7 @@ INSN_ENTRY(opt_size)
3988
4017
  END_INSN(opt_size);
3989
4018
  }
3990
4019
 
3991
- /* insn opt_empty_p(ci, cc)(recv)(val) */
4020
+ /* insn opt_empty_p(cd)(recv)(val) */
3992
4021
  INSN_ENTRY(opt_empty_p)
3993
4022
  {
3994
4023
  /* ### Declare that we have just entered into an instruction. ### */
@@ -3996,9 +4025,8 @@ INSN_ENTRY(opt_empty_p)
3996
4025
  DEBUG_ENTER_INSN("opt_empty_p");
3997
4026
 
3998
4027
  /* ### Declare and assign variables. ### */
3999
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4000
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4001
- # define INSN_ATTR(x) attr_ ## x ## _opt_empty_p(ci, cc)
4028
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
4029
+ # define INSN_ATTR(x) attr_ ## x ## _opt_empty_p(cd)
4002
4030
  bool leaf = INSN_ATTR(leaf);
4003
4031
  VALUE recv = TOPN(0);
4004
4032
  VALUE val;
@@ -4007,12 +4035,11 @@ INSN_ENTRY(opt_empty_p)
4007
4035
  if (! leaf) ADD_PC(INSN_ATTR(width));
4008
4036
  SETUP_CANARY();
4009
4037
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4010
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4011
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4038
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4012
4039
 
4013
4040
  /* ### Here we do the instruction body. ### */
4014
4041
  # define NAME_OF_CURRENT_INSN opt_empty_p
4015
- # line 1415 "insns.def"
4042
+ # line 1405 "insns.def"
4016
4043
  {
4017
4044
  val = vm_opt_empty_p(recv);
4018
4045
 
@@ -4020,7 +4047,7 @@ INSN_ENTRY(opt_empty_p)
4020
4047
  CALL_SIMPLE_METHOD();
4021
4048
  }
4022
4049
  }
4023
- # line 4024 "vm.inc"
4050
+ # line 4051 "vm.inc"
4024
4051
  # undef NAME_OF_CURRENT_INSN
4025
4052
 
4026
4053
  /* ### Instruction trailers. ### */
@@ -4028,6 +4055,8 @@ INSN_ENTRY(opt_empty_p)
4028
4055
  CHECK_CANARY();
4029
4056
  INC_SP(INSN_ATTR(sp_inc));
4030
4057
  TOPN(0) = val;
4058
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4059
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4031
4060
  if (leaf) ADD_PC(INSN_ATTR(width));
4032
4061
  # undef INSN_ATTR
4033
4062
 
@@ -4035,7 +4064,7 @@ INSN_ENTRY(opt_empty_p)
4035
4064
  END_INSN(opt_empty_p);
4036
4065
  }
4037
4066
 
4038
- /* insn opt_succ(ci, cc)(recv)(val) */
4067
+ /* insn opt_succ(cd)(recv)(val) */
4039
4068
  INSN_ENTRY(opt_succ)
4040
4069
  {
4041
4070
  /* ### Declare that we have just entered into an instruction. ### */
@@ -4043,9 +4072,8 @@ INSN_ENTRY(opt_succ)
4043
4072
  DEBUG_ENTER_INSN("opt_succ");
4044
4073
 
4045
4074
  /* ### Declare and assign variables. ### */
4046
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4047
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4048
- # define INSN_ATTR(x) attr_ ## x ## _opt_succ(ci, cc)
4075
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
4076
+ # define INSN_ATTR(x) attr_ ## x ## _opt_succ(cd)
4049
4077
  bool leaf = INSN_ATTR(leaf);
4050
4078
  VALUE recv = TOPN(0);
4051
4079
  VALUE val;
@@ -4054,12 +4082,11 @@ INSN_ENTRY(opt_succ)
4054
4082
  if (! leaf) ADD_PC(INSN_ATTR(width));
4055
4083
  SETUP_CANARY();
4056
4084
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4057
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4058
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4085
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4059
4086
 
4060
4087
  /* ### Here we do the instruction body. ### */
4061
4088
  # define NAME_OF_CURRENT_INSN opt_succ
4062
- # line 1429 "insns.def"
4089
+ # line 1419 "insns.def"
4063
4090
  {
4064
4091
  val = vm_opt_succ(recv);
4065
4092
 
@@ -4067,7 +4094,7 @@ INSN_ENTRY(opt_succ)
4067
4094
  CALL_SIMPLE_METHOD();
4068
4095
  }
4069
4096
  }
4070
- # line 4071 "vm.inc"
4097
+ # line 4098 "vm.inc"
4071
4098
  # undef NAME_OF_CURRENT_INSN
4072
4099
 
4073
4100
  /* ### Instruction trailers. ### */
@@ -4075,6 +4102,8 @@ INSN_ENTRY(opt_succ)
4075
4102
  CHECK_CANARY();
4076
4103
  INC_SP(INSN_ATTR(sp_inc));
4077
4104
  TOPN(0) = val;
4105
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4106
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4078
4107
  if (leaf) ADD_PC(INSN_ATTR(width));
4079
4108
  # undef INSN_ATTR
4080
4109
 
@@ -4082,7 +4111,7 @@ INSN_ENTRY(opt_succ)
4082
4111
  END_INSN(opt_succ);
4083
4112
  }
4084
4113
 
4085
- /* insn opt_not(ci, cc)(recv)(val) */
4114
+ /* insn opt_not(cd)(recv)(val) */
4086
4115
  INSN_ENTRY(opt_not)
4087
4116
  {
4088
4117
  /* ### Declare that we have just entered into an instruction. ### */
@@ -4090,9 +4119,8 @@ INSN_ENTRY(opt_not)
4090
4119
  DEBUG_ENTER_INSN("opt_not");
4091
4120
 
4092
4121
  /* ### Declare and assign variables. ### */
4093
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4094
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4095
- # define INSN_ATTR(x) attr_ ## x ## _opt_not(ci, cc)
4122
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
4123
+ # define INSN_ATTR(x) attr_ ## x ## _opt_not(cd)
4096
4124
  bool leaf = INSN_ATTR(leaf);
4097
4125
  VALUE recv = TOPN(0);
4098
4126
  VALUE val;
@@ -4101,20 +4129,19 @@ INSN_ENTRY(opt_not)
4101
4129
  if (! leaf) ADD_PC(INSN_ATTR(width));
4102
4130
  SETUP_CANARY();
4103
4131
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4104
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4105
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4132
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4106
4133
 
4107
4134
  /* ### Here we do the instruction body. ### */
4108
4135
  # define NAME_OF_CURRENT_INSN opt_not
4109
- # line 1443 "insns.def"
4136
+ # line 1433 "insns.def"
4110
4137
  {
4111
- val = vm_opt_not(ci, cc, recv);
4138
+ val = vm_opt_not(cd, recv);
4112
4139
 
4113
4140
  if (val == Qundef) {
4114
4141
  CALL_SIMPLE_METHOD();
4115
4142
  }
4116
4143
  }
4117
- # line 4118 "vm.inc"
4144
+ # line 4145 "vm.inc"
4118
4145
  # undef NAME_OF_CURRENT_INSN
4119
4146
 
4120
4147
  /* ### Instruction trailers. ### */
@@ -4122,6 +4149,8 @@ INSN_ENTRY(opt_not)
4122
4149
  CHECK_CANARY();
4123
4150
  INC_SP(INSN_ATTR(sp_inc));
4124
4151
  TOPN(0) = val;
4152
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4153
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4125
4154
  if (leaf) ADD_PC(INSN_ATTR(width));
4126
4155
  # undef INSN_ATTR
4127
4156
 
@@ -4129,7 +4158,7 @@ INSN_ENTRY(opt_not)
4129
4158
  END_INSN(opt_not);
4130
4159
  }
4131
4160
 
4132
- /* insn opt_regexpmatch2(ci, cc)(obj2, obj1)(val) */
4161
+ /* insn opt_regexpmatch2(cd)(obj2, obj1)(val) */
4133
4162
  INSN_ENTRY(opt_regexpmatch2)
4134
4163
  {
4135
4164
  /* ### Declare that we have just entered into an instruction. ### */
@@ -4137,9 +4166,8 @@ INSN_ENTRY(opt_regexpmatch2)
4137
4166
  DEBUG_ENTER_INSN("opt_regexpmatch2");
4138
4167
 
4139
4168
  /* ### Declare and assign variables. ### */
4140
- CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
4141
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
4142
- # define INSN_ATTR(x) attr_ ## x ## _opt_regexpmatch2(ci, cc)
4169
+ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1);
4170
+ # define INSN_ATTR(x) attr_ ## x ## _opt_regexpmatch2(cd)
4143
4171
  bool leaf = INSN_ATTR(leaf);
4144
4172
  VALUE obj2 = TOPN(1);
4145
4173
  VALUE obj1 = TOPN(0);
@@ -4149,12 +4177,11 @@ INSN_ENTRY(opt_regexpmatch2)
4149
4177
  if (! leaf) ADD_PC(INSN_ATTR(width));
4150
4178
  SETUP_CANARY();
4151
4179
  COLLECT_USAGE_INSN(INSN_ATTR(bin));
4152
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ci);
4153
- COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cc);
4180
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd);
4154
4181
 
4155
4182
  /* ### Here we do the instruction body. ### */
4156
4183
  # define NAME_OF_CURRENT_INSN opt_regexpmatch2
4157
- # line 1458 "insns.def"
4184
+ # line 1448 "insns.def"
4158
4185
  {
4159
4186
  val = vm_opt_regexpmatch2(obj2, obj1);
4160
4187
 
@@ -4162,7 +4189,7 @@ INSN_ENTRY(opt_regexpmatch2)
4162
4189
  CALL_SIMPLE_METHOD();
4163
4190
  }
4164
4191
  }
4165
- # line 4166 "vm.inc"
4192
+ # line 4193 "vm.inc"
4166
4193
  # undef NAME_OF_CURRENT_INSN
4167
4194
 
4168
4195
  /* ### Instruction trailers. ### */
@@ -4170,6 +4197,8 @@ INSN_ENTRY(opt_regexpmatch2)
4170
4197
  CHECK_CANARY();
4171
4198
  INC_SP(INSN_ATTR(sp_inc));
4172
4199
  TOPN(0) = val;
4200
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4201
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4173
4202
  if (leaf) ADD_PC(INSN_ATTR(width));
4174
4203
  # undef INSN_ATTR
4175
4204
 
@@ -4198,7 +4227,7 @@ INSN_ENTRY(opt_call_c_function)
4198
4227
 
4199
4228
  /* ### Here we do the instruction body. ### */
4200
4229
  # define NAME_OF_CURRENT_INSN opt_call_c_function
4201
- # line 1474 "insns.def"
4230
+ # line 1464 "insns.def"
4202
4231
  {
4203
4232
  reg_cfp = (funcptr)(ec, reg_cfp);
4204
4233
 
@@ -4211,7 +4240,7 @@ INSN_ENTRY(opt_call_c_function)
4211
4240
  RESTORE_REGS();
4212
4241
  NEXT_INSN();
4213
4242
  }
4214
- # line 4215 "vm.inc"
4243
+ # line 4244 "vm.inc"
4215
4244
  # undef NAME_OF_CURRENT_INSN
4216
4245
 
4217
4246
  /* ### Instruction trailers. ### */
@@ -4224,6 +4253,150 @@ INSN_ENTRY(opt_call_c_function)
4224
4253
  END_INSN(opt_call_c_function);
4225
4254
  }
4226
4255
 
4256
+ /* insn invokebuiltin(bf)(...)(ret) */
4257
+ INSN_ENTRY(invokebuiltin)
4258
+ {
4259
+ /* ### Declare that we have just entered into an instruction. ### */
4260
+ START_OF_ORIGINAL_INSN(invokebuiltin);
4261
+ DEBUG_ENTER_INSN("invokebuiltin");
4262
+
4263
+ /* ### Declare and assign variables. ### */
4264
+ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1);
4265
+ # define INSN_ATTR(x) attr_ ## x ## _invokebuiltin(bf)
4266
+ bool leaf = INSN_ATTR(leaf);
4267
+ VALUE ret;
4268
+
4269
+ /* ### Instruction preambles. ### */
4270
+ if (! leaf) ADD_PC(INSN_ATTR(width));
4271
+ SETUP_CANARY();
4272
+ COLLECT_USAGE_INSN(INSN_ATTR(bin));
4273
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf);
4274
+
4275
+ /* ### Here we do the instruction body. ### */
4276
+ # define NAME_OF_CURRENT_INSN invokebuiltin
4277
+ # line 1485 "insns.def"
4278
+ {
4279
+ ret = vm_invoke_builtin(ec, reg_cfp, bf, STACK_ADDR_FROM_TOP(bf->argc));
4280
+ }
4281
+ # line 4282 "vm.inc"
4282
+ # undef NAME_OF_CURRENT_INSN
4283
+
4284
+ /* ### Instruction trailers. ### */
4285
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4286
+ CHECK_CANARY();
4287
+ INC_SP(INSN_ATTR(sp_inc));
4288
+ TOPN(0) = ret;
4289
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4290
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4291
+ if (leaf) ADD_PC(INSN_ATTR(width));
4292
+ # undef INSN_ATTR
4293
+
4294
+ /* ### Leave the instruction. ### */
4295
+ END_INSN(invokebuiltin);
4296
+ }
4297
+
4298
+ /* insn opt_invokebuiltin_delegate(bf, index)()(ret) */
4299
+ INSN_ENTRY(opt_invokebuiltin_delegate)
4300
+ {
4301
+ /* ### Declare that we have just entered into an instruction. ### */
4302
+ START_OF_ORIGINAL_INSN(opt_invokebuiltin_delegate);
4303
+ DEBUG_ENTER_INSN("opt_invokebuiltin_delegate");
4304
+
4305
+ /* ### Declare and assign variables. ### */
4306
+ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1);
4307
+ rb_num_t index = (rb_num_t)GET_OPERAND(2);
4308
+ # define INSN_ATTR(x) attr_ ## x ## _opt_invokebuiltin_delegate(bf, index)
4309
+ bool leaf = INSN_ATTR(leaf);
4310
+ VALUE ret;
4311
+
4312
+ /* ### Instruction preambles. ### */
4313
+ if (! leaf) ADD_PC(INSN_ATTR(width));
4314
+ SETUP_CANARY();
4315
+ COLLECT_USAGE_INSN(INSN_ATTR(bin));
4316
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf);
4317
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, index);
4318
+
4319
+ /* ### Here we do the instruction body. ### */
4320
+ # define NAME_OF_CURRENT_INSN opt_invokebuiltin_delegate
4321
+ # line 1496 "insns.def"
4322
+ {
4323
+ ret = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);
4324
+ }
4325
+ # line 4326 "vm.inc"
4326
+ # undef NAME_OF_CURRENT_INSN
4327
+
4328
+ /* ### Instruction trailers. ### */
4329
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4330
+ CHECK_CANARY();
4331
+ INC_SP(INSN_ATTR(sp_inc));
4332
+ TOPN(0) = ret;
4333
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4334
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4335
+ if (leaf) ADD_PC(INSN_ATTR(width));
4336
+ # undef INSN_ATTR
4337
+
4338
+ /* ### Leave the instruction. ### */
4339
+ END_INSN(opt_invokebuiltin_delegate);
4340
+ }
4341
+
4342
+ /* insn opt_invokebuiltin_delegate_leave(bf, index)()(val) */
4343
+ INSN_ENTRY(opt_invokebuiltin_delegate_leave)
4344
+ {
4345
+ /* ### Declare that we have just entered into an instruction. ### */
4346
+ START_OF_ORIGINAL_INSN(opt_invokebuiltin_delegate_leave);
4347
+ DEBUG_ENTER_INSN("opt_invokebuiltin_delegate_leave");
4348
+
4349
+ /* ### Declare and assign variables. ### */
4350
+ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1);
4351
+ rb_num_t index = (rb_num_t)GET_OPERAND(2);
4352
+ # define INSN_ATTR(x) attr_ ## x ## _opt_invokebuiltin_delegate_leave(bf, index)
4353
+ bool leaf = INSN_ATTR(leaf);
4354
+ VALUE val;
4355
+
4356
+ /* ### Instruction preambles. ### */
4357
+ if (! leaf) ADD_PC(INSN_ATTR(width));
4358
+ SETUP_CANARY();
4359
+ COLLECT_USAGE_INSN(INSN_ATTR(bin));
4360
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf);
4361
+ COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, index);
4362
+
4363
+ /* ### Here we do the instruction body. ### */
4364
+ # define NAME_OF_CURRENT_INSN opt_invokebuiltin_delegate_leave
4365
+ # line 1507 "insns.def"
4366
+ {
4367
+ val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index);
4368
+
4369
+ /* leave fastpath */
4370
+ /* TracePoint/return should fallback this insn to opt_invokebuiltin_delegate */
4371
+ if (vm_pop_frame(ec, GET_CFP(), GET_EP())) {
4372
+ # if OPT_CALL_THREADED_CODE
4373
+ rb_ec_thread_ptr(ec)->retval = val;
4374
+ return 0;
4375
+ # else
4376
+ return val;
4377
+ # endif
4378
+ }
4379
+ else {
4380
+ RESTORE_REGS();
4381
+ }
4382
+ }
4383
+ # line 4384 "vm.inc"
4384
+ # undef NAME_OF_CURRENT_INSN
4385
+
4386
+ /* ### Instruction trailers. ### */
4387
+ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4388
+ CHECK_CANARY();
4389
+ INC_SP(INSN_ATTR(sp_inc));
4390
+ TOPN(0) = val;
4391
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4392
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4393
+ if (leaf) ADD_PC(INSN_ATTR(width));
4394
+ # undef INSN_ATTR
4395
+
4396
+ /* ### Leave the instruction. ### */
4397
+ END_INSN(opt_invokebuiltin_delegate_leave);
4398
+ }
4399
+
4227
4400
  /* insn getlocal_WC_0(idx)()(val) */
4228
4401
  INSN_ENTRY(getlocal_WC_0)
4229
4402
  {
@@ -4234,7 +4407,7 @@ INSN_ENTRY(getlocal_WC_0)
4234
4407
  /* ### Declare and assign variables. ### */
4235
4408
  #line 10 "defs/opt_operand.def"
4236
4409
  const rb_num_t level = 0;
4237
- #line 4238 "vm.inc"
4410
+ #line 4411 "vm.inc"
4238
4411
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4239
4412
  # define INSN_ATTR(x) attr_ ## x ## _getlocal_WC_0(idx)
4240
4413
  bool leaf = INSN_ATTR(leaf);
@@ -4254,7 +4427,7 @@ INSN_ENTRY(getlocal_WC_0)
4254
4427
  RB_DEBUG_COUNTER_INC(lvar_get);
4255
4428
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
4256
4429
  }
4257
- # line 4258 "vm.inc"
4430
+ # line 4431 "vm.inc"
4258
4431
  # undef NAME_OF_CURRENT_INSN
4259
4432
 
4260
4433
  /* ### Instruction trailers. ### */
@@ -4262,6 +4435,8 @@ INSN_ENTRY(getlocal_WC_0)
4262
4435
  CHECK_CANARY();
4263
4436
  INC_SP(INSN_ATTR(sp_inc));
4264
4437
  TOPN(0) = val;
4438
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4439
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4265
4440
  if (leaf) ADD_PC(INSN_ATTR(width));
4266
4441
  # undef INSN_ATTR
4267
4442
 
@@ -4279,7 +4454,7 @@ INSN_ENTRY(getlocal_WC_1)
4279
4454
  /* ### Declare and assign variables. ### */
4280
4455
  #line 11 "defs/opt_operand.def"
4281
4456
  const rb_num_t level = 1;
4282
- #line 4283 "vm.inc"
4457
+ #line 4458 "vm.inc"
4283
4458
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4284
4459
  # define INSN_ATTR(x) attr_ ## x ## _getlocal_WC_1(idx)
4285
4460
  bool leaf = INSN_ATTR(leaf);
@@ -4299,7 +4474,7 @@ INSN_ENTRY(getlocal_WC_1)
4299
4474
  RB_DEBUG_COUNTER_INC(lvar_get);
4300
4475
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0);
4301
4476
  }
4302
- # line 4303 "vm.inc"
4477
+ # line 4478 "vm.inc"
4303
4478
  # undef NAME_OF_CURRENT_INSN
4304
4479
 
4305
4480
  /* ### Instruction trailers. ### */
@@ -4307,6 +4482,8 @@ INSN_ENTRY(getlocal_WC_1)
4307
4482
  CHECK_CANARY();
4308
4483
  INC_SP(INSN_ATTR(sp_inc));
4309
4484
  TOPN(0) = val;
4485
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4486
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4310
4487
  if (leaf) ADD_PC(INSN_ATTR(width));
4311
4488
  # undef INSN_ATTR
4312
4489
 
@@ -4324,7 +4501,7 @@ INSN_ENTRY(setlocal_WC_0)
4324
4501
  /* ### Declare and assign variables. ### */
4325
4502
  #line 12 "defs/opt_operand.def"
4326
4503
  const rb_num_t level = 0;
4327
- #line 4328 "vm.inc"
4504
+ #line 4505 "vm.inc"
4328
4505
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4329
4506
  # define INSN_ATTR(x) attr_ ## x ## _setlocal_WC_0(idx)
4330
4507
  bool leaf = INSN_ATTR(leaf);
@@ -4344,7 +4521,7 @@ INSN_ENTRY(setlocal_WC_0)
4344
4521
  RB_DEBUG_COUNTER_INC(lvar_set);
4345
4522
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);
4346
4523
  }
4347
- # line 4348 "vm.inc"
4524
+ # line 4525 "vm.inc"
4348
4525
  # undef NAME_OF_CURRENT_INSN
4349
4526
 
4350
4527
  /* ### Instruction trailers. ### */
@@ -4368,7 +4545,7 @@ INSN_ENTRY(setlocal_WC_1)
4368
4545
  /* ### Declare and assign variables. ### */
4369
4546
  #line 13 "defs/opt_operand.def"
4370
4547
  const rb_num_t level = 1;
4371
- #line 4372 "vm.inc"
4548
+ #line 4549 "vm.inc"
4372
4549
  lindex_t idx = (lindex_t)GET_OPERAND(1);
4373
4550
  # define INSN_ATTR(x) attr_ ## x ## _setlocal_WC_1(idx)
4374
4551
  bool leaf = INSN_ATTR(leaf);
@@ -4388,7 +4565,7 @@ INSN_ENTRY(setlocal_WC_1)
4388
4565
  RB_DEBUG_COUNTER_INC(lvar_set);
4389
4566
  (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0);
4390
4567
  }
4391
- # line 4392 "vm.inc"
4568
+ # line 4569 "vm.inc"
4392
4569
  # undef NAME_OF_CURRENT_INSN
4393
4570
 
4394
4571
  /* ### Instruction trailers. ### */
@@ -4412,7 +4589,7 @@ INSN_ENTRY(putobject_INT2FIX_0_)
4412
4589
  /* ### Declare and assign variables. ### */
4413
4590
  #line 15 "defs/opt_operand.def"
4414
4591
  const VALUE val = INT2FIX(0);
4415
- #line 4416 "vm.inc"
4592
+ #line 4593 "vm.inc"
4416
4593
  # define INSN_ATTR(x) attr_ ## x ## _putobject_INT2FIX_0_()
4417
4594
  bool leaf = INSN_ATTR(leaf);
4418
4595
 
@@ -4424,6 +4601,8 @@ INSN_ENTRY(putobject_INT2FIX_0_)
4424
4601
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4425
4602
  INC_SP(INSN_ATTR(sp_inc));
4426
4603
  TOPN(0) = val;
4604
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4605
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4427
4606
  if (leaf) ADD_PC(INSN_ATTR(width));
4428
4607
  # undef INSN_ATTR
4429
4608
 
@@ -4441,7 +4620,7 @@ INSN_ENTRY(putobject_INT2FIX_1_)
4441
4620
  /* ### Declare and assign variables. ### */
4442
4621
  #line 16 "defs/opt_operand.def"
4443
4622
  const VALUE val = INT2FIX(1);
4444
- #line 4445 "vm.inc"
4623
+ #line 4624 "vm.inc"
4445
4624
  # define INSN_ATTR(x) attr_ ## x ## _putobject_INT2FIX_1_()
4446
4625
  bool leaf = INSN_ATTR(leaf);
4447
4626
 
@@ -4453,6 +4632,8 @@ INSN_ENTRY(putobject_INT2FIX_1_)
4453
4632
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn));
4454
4633
  INC_SP(INSN_ATTR(sp_inc));
4455
4634
  TOPN(0) = val;
4635
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE));
4636
+ VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED));
4456
4637
  if (leaf) ADD_PC(INSN_ATTR(width));
4457
4638
  # undef INSN_ATTR
4458
4639
 
@@ -4836,14 +5017,6 @@ INSN_ENTRY(trace_checktype)
4836
5017
  END_INSN(trace_checktype);
4837
5018
  }
4838
5019
 
4839
- /* insn trace_methodref(...)(...)(...) */
4840
- INSN_ENTRY(trace_methodref)
4841
- {
4842
- vm_trace(ec, GET_CFP(), GET_PC());
4843
- DISPATCH_ORIGINAL_INSN(methodref);
4844
- END_INSN(trace_methodref);
4845
- }
4846
-
4847
5020
  /* insn trace_defineclass(...)(...)(...) */
4848
5021
  INSN_ENTRY(trace_defineclass)
4849
5022
  {
@@ -5220,6 +5393,30 @@ INSN_ENTRY(trace_opt_call_c_function)
5220
5393
  END_INSN(trace_opt_call_c_function);
5221
5394
  }
5222
5395
 
5396
+ /* insn trace_invokebuiltin(...)(...)(...) */
5397
+ INSN_ENTRY(trace_invokebuiltin)
5398
+ {
5399
+ vm_trace(ec, GET_CFP(), GET_PC());
5400
+ DISPATCH_ORIGINAL_INSN(invokebuiltin);
5401
+ END_INSN(trace_invokebuiltin);
5402
+ }
5403
+
5404
+ /* insn trace_opt_invokebuiltin_delegate(...)(...)(...) */
5405
+ INSN_ENTRY(trace_opt_invokebuiltin_delegate)
5406
+ {
5407
+ vm_trace(ec, GET_CFP(), GET_PC());
5408
+ DISPATCH_ORIGINAL_INSN(opt_invokebuiltin_delegate);
5409
+ END_INSN(trace_opt_invokebuiltin_delegate);
5410
+ }
5411
+
5412
+ /* insn trace_opt_invokebuiltin_delegate_leave(...)(...)(...) */
5413
+ INSN_ENTRY(trace_opt_invokebuiltin_delegate_leave)
5414
+ {
5415
+ vm_trace(ec, GET_CFP(), GET_PC());
5416
+ DISPATCH_ORIGINAL_INSN(opt_invokebuiltin_delegate_leave);
5417
+ END_INSN(trace_opt_invokebuiltin_delegate_leave);
5418
+ }
5419
+
5223
5420
  /* insn trace_getlocal_WC_0(...)(...)(...) */
5224
5421
  INSN_ENTRY(trace_getlocal_WC_0)
5225
5422
  {