debase-ruby_core_source 0.9.9 → 0.9.10

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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/addr2line.h +0 -0
  4. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/build_assert/build_assert.h +0 -0
  5. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/check_type/check_type.h +0 -0
  6. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/container_of/container_of.h +0 -0
  7. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/ccan/list/list.h +28 -166
  8. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/str/str.h +0 -0
  9. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/constant.h +3 -10
  10. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/dln.h +0 -0
  11. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/eval_intern.h +49 -89
  12. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/gc.h +1 -8
  13. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/id.h +5 -15
  14. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/insns.inc +107 -0
  15. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/insns_info.inc +45 -89
  16. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/internal.h +164 -666
  17. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/iseq.h +158 -0
  18. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/known_errors.inc +0 -0
  19. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/method.h +144 -0
  20. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/node.h +42 -18
  21. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/node_name.inc +6 -2
  22. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/opt_sc.inc +0 -40
  23. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/optinsn.inc +0 -0
  24. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/optunifs.inc +0 -5
  25. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/parse.h +8 -28
  26. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/probes_helper.h +67 -0
  27. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/regenc.h +16 -16
  28. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/regint.h +10 -33
  29. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/regparse.h +1 -5
  30. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/revision.h +1 -0
  31. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/ruby_atomic.h +5 -68
  32. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/siphash.h +0 -0
  33. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/symbol.h +13 -33
  34. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/thread_pthread.h +2 -2
  35. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/thread_win32.h +0 -0
  36. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/timev.h +0 -0
  37. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/transcode_data.h +7 -23
  38. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/version.h +10 -31
  39. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/vm.inc +497 -542
  40. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/vm_core.h +305 -784
  41. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/vm_debug.h +0 -0
  42. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/vm_exec.h +0 -0
  43. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/vm_insnhelper.h +56 -50
  44. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/vm_opts.h +7 -8
  45. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/vmtc.inc +0 -5
  46. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/addr2line.h +0 -0
  47. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/build_assert/build_assert.h +0 -0
  48. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/check_type/check_type.h +0 -0
  49. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/container_of/container_of.h +0 -0
  50. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/ccan/list/list.h +0 -0
  51. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/str/str.h +0 -0
  52. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/constant.h +1 -1
  53. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/dln.h +0 -0
  54. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/encindex.h +0 -0
  55. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/eval_intern.h +3 -4
  56. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/gc.h +0 -0
  57. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/id.h +0 -9
  58. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/id_table.h +0 -0
  59. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/insns.inc +46 -48
  60. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/insns_info.inc +0 -20
  61. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/internal.h +58 -290
  62. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/iseq.h +15 -18
  63. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/known_errors.inc +0 -0
  64. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/method.h +2 -2
  65. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/node.h +2 -2
  66. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/node_name.inc +0 -0
  67. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/opt_sc.inc +0 -16
  68. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/optinsn.inc +0 -0
  69. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/optunifs.inc +0 -2
  70. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/parse.h +8 -27
  71. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/probes_helper.h +0 -0
  72. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/regenc.h +14 -14
  73. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/regint.h +0 -8
  74. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/regparse.h +0 -0
  75. data/lib/debase/ruby_core_source/ruby-2.3.5-p376/revision.h +1 -0
  76. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/ruby_atomic.h +0 -0
  77. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/siphash.h +0 -0
  78. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/symbol.h +3 -3
  79. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/thread_pthread.h +0 -0
  80. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/thread_win32.h +0 -0
  81. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/timev.h +0 -0
  82. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/transcode_data.h +0 -0
  83. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/version.h +9 -27
  84. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm.inc +255 -264
  85. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_call_iseq_optimized.inc +5 -5
  86. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_core.h +37 -28
  87. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/vm_debug.h +0 -0
  88. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/vm_exec.h +0 -0
  89. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_insnhelper.h +32 -16
  90. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_opts.h +0 -0
  91. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/vmtc.inc +0 -2
  92. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/addr2line.h +0 -0
  93. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/build_assert/build_assert.h +0 -0
  94. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/check_type/check_type.h +0 -0
  95. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/container_of/container_of.h +0 -0
  96. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/ccan/list/list.h +0 -0
  97. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/str/str.h +0 -0
  98. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/constant.h +0 -0
  99. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/dln.h +0 -0
  100. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/encindex.h +0 -0
  101. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/eval_intern.h +0 -0
  102. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/gc.h +0 -0
  103. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/id.h +0 -0
  104. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/id_table.h +0 -0
  105. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/insns.inc +0 -0
  106. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/insns_info.inc +0 -0
  107. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/internal.h +116 -51
  108. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/iseq.h +0 -0
  109. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/known_errors.inc +0 -0
  110. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/method.h +0 -0
  111. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/node.h +2 -2
  112. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/node_name.inc +0 -0
  113. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/opt_sc.inc +0 -0
  114. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/optinsn.inc +0 -0
  115. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/optunifs.inc +0 -0
  116. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/parse.h +8 -27
  117. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/probes_helper.h +0 -0
  118. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/regenc.h +79 -67
  119. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/regint.h +187 -244
  120. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/regparse.h +30 -27
  121. data/lib/debase/ruby_core_source/ruby-2.4.2-p198/revision.h +1 -0
  122. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/ruby_assert.h +0 -0
  123. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/ruby_atomic.h +0 -0
  124. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/siphash.h +0 -0
  125. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/symbol.h +0 -0
  126. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/thread_pthread.h +0 -0
  127. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/thread_win32.h +0 -0
  128. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/timev.h +0 -0
  129. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/transcode_data.h +0 -0
  130. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/version.h +6 -6
  131. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm.inc +37 -34
  132. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/vm_call_iseq_optimized.inc +0 -0
  133. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_core.h +9 -7
  134. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_debug.h +0 -0
  135. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_exec.h +0 -0
  136. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_insnhelper.h +30 -14
  137. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/vm_opts.h +0 -0
  138. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/vmtc.inc +0 -0
  139. data/lib/debase/ruby_core_source/version.rb +1 -1
  140. metadata +138 -143
  141. data/lib/debase/ruby_core_source/ruby-2.4.0-preview1/method.h +0 -213
  142. data/lib/debase/ruby_core_source/ruby-2.4.0-preview1/revision.h +0 -1
  143. data/lib/debase/ruby_core_source/ruby-2.4.0-preview2/revision.h +0 -1
  144. data/lib/debase/ruby_core_source/ruby-2.4.0-preview2/ruby_assert.h +0 -54
  145. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/encindex.h +0 -67
  146. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/id_table.h +0 -31
  147. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/insns.inc +0 -112
  148. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/iseq.h +0 -252
  149. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/probes_helper.h +0 -43
  150. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/revision.h +0 -1
  151. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/ruby_assert.h +0 -54
  152. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/vm_call_iseq_optimized.inc +0 -212
@@ -17,10 +17,10 @@
17
17
  #define DYNAMIC_ID_P(id) (!(id&ID_STATIC_SYM)&&id>tLAST_OP_ID)
18
18
  #define STATIC_ID2SYM(id) (((VALUE)(id)<<RUBY_SPECIAL_SHIFT)|SYMBOL_FLAG)
19
19
 
20
- #ifdef HAVE_BUILTIN___BUILTIN_CONSTANT_P
20
+ #ifdef __GNUC__
21
21
  #define rb_id2sym(id) \
22
- RB_GNUC_EXTENSION_BLOCK(__builtin_constant_p(id) && !DYNAMIC_ID_P(id) ? \
23
- STATIC_ID2SYM(id) : rb_id2sym(id))
22
+ __extension__(__builtin_constant_p(id) && !DYNAMIC_ID_P(id) ? \
23
+ STATIC_ID2SYM(id) : rb_id2sym(id))
24
24
  #endif
25
25
 
26
26
  struct RSymbol {
@@ -32,38 +32,23 @@ struct RSymbol {
32
32
 
33
33
  #define RSYMBOL(obj) (R_CAST(RSymbol)(obj))
34
34
 
35
- #define is_notop_id(id) ((id)>tLAST_OP_ID)
36
- #define is_local_id(id) (id_type(id)==ID_LOCAL)
37
- #define is_global_id(id) (id_type(id)==ID_GLOBAL)
38
- #define is_instance_id(id) (id_type(id)==ID_INSTANCE)
39
- #define is_attrset_id(id) ((id)==idASET||id_type(id)==ID_ATTRSET)
40
- #define is_const_id(id) (id_type(id)==ID_CONST)
41
- #define is_class_id(id) (id_type(id)==ID_CLASS)
42
- #define is_junk_id(id) (id_type(id)==ID_JUNK)
43
-
44
35
  static inline int
45
36
  id_type(ID id)
46
37
  {
47
- if (is_notop_id(id)) {
48
- return (int)(id&ID_SCOPE_MASK);
49
- }
50
- else {
38
+ if (id<=tLAST_OP_ID) {
51
39
  return -1;
52
40
  }
41
+ return (int)(id&ID_SCOPE_MASK);
53
42
  }
54
43
 
55
- typedef uint32_t rb_id_serial_t;
56
-
57
- static inline rb_id_serial_t
58
- rb_id_to_serial(ID id)
59
- {
60
- if (is_notop_id(id)) {
61
- return (rb_id_serial_t)(id >> ID_SCOPE_SHIFT);
62
- }
63
- else {
64
- return (rb_id_serial_t)id;
65
- }
66
- }
44
+ #define is_notop_id(id) ((id)>tLAST_OP_ID)
45
+ #define is_local_id(id) (id_type(id)==ID_LOCAL)
46
+ #define is_global_id(id) (id_type(id)==ID_GLOBAL)
47
+ #define is_instance_id(id) (id_type(id)==ID_INSTANCE)
48
+ #define is_attrset_id(id) (id_type(id)==ID_ATTRSET)
49
+ #define is_const_id(id) (id_type(id)==ID_CONST)
50
+ #define is_class_id(id) (id_type(id)==ID_CLASS)
51
+ #define is_junk_id(id) (id_type(id)==ID_JUNK)
67
52
 
68
53
  static inline int
69
54
  sym_type(VALUE sym)
@@ -100,9 +85,4 @@ is_global_name_punct(const int c)
100
85
 
101
86
  ID rb_intern_cstr_without_pindown(const char *, long, rb_encoding *);
102
87
 
103
- RUBY_SYMBOL_EXPORT_BEGIN
104
-
105
- size_t rb_sym_immortal_count(void);
106
-
107
- RUBY_SYMBOL_EXPORT_END
108
88
  #endif
@@ -2,7 +2,7 @@
2
2
 
3
3
  thread_pthread.h -
4
4
 
5
- $Author: kosaki $
5
+ $Author: normal $
6
6
 
7
7
  Copyright (C) 2004-2007 Koichi Sasada
8
8
 
@@ -26,7 +26,7 @@ typedef struct rb_thread_cond_struct {
26
26
  } rb_nativethread_cond_t;
27
27
 
28
28
  typedef struct native_thread_data_struct {
29
- struct list_node ubf_list;
29
+ void *signal_thread_list;
30
30
  rb_nativethread_cond_t sleep_cond;
31
31
  } native_thread_data_t;
32
32
 
@@ -46,26 +46,10 @@ RUBY_SYMBOL_EXPORT_BEGIN
46
46
  #define makeSTR1LEN(len) ((len)-4)
47
47
 
48
48
  #define o1(b1) (PType((((unsigned char)(b1))<<8)|ONEbt))
49
- #define o2(b1,b2) (PType((((unsigned char)(b1))<<8)|\
50
- (((unsigned char)(b2))<<16)|\
51
- TWObt))
52
- #define o3(b1,b2,b3) (PType(((((unsigned char)(b1))<<8)|\
53
- (((unsigned char)(b2))<<16)|\
54
- (((unsigned int)(unsigned char)(b3))<<24)|\
55
- THREEbt)&\
56
- 0xffffffffU))
57
- #define o4(b0,b1,b2,b3) (PType(((((unsigned char)(b1))<<8)|\
58
- (((unsigned char)(b2))<<16)|\
59
- (((unsigned int)(unsigned char)(b3))<<24)|\
60
- ((((unsigned char)(b0))&0x07)<<5)|\
61
- FOURbt)&\
62
- 0xffffffffU))
63
- #define g4(b0,b1,b2,b3) (PType(((((unsigned char)(b0))<<8)|\
64
- (((unsigned char)(b2))<<16)|\
65
- ((((unsigned char)(b1))&0x0f)<<24)|\
66
- ((((unsigned int)(unsigned char)(b3))&0x0f)<<28)|\
67
- GB4bt)&\
68
- 0xffffffffU))
49
+ #define o2(b1,b2) (PType((((unsigned char)(b1))<<8)|(((unsigned char)(b2))<<16)|TWObt))
50
+ #define o3(b1,b2,b3) (PType(((((unsigned char)(b1))<<8)|(((unsigned char)(b2))<<16)|(((unsigned int)(unsigned char)(b3))<<24)|THREEbt)&0xffffffffU))
51
+ #define o4(b0,b1,b2,b3) (PType(((((unsigned char)(b1))<<8)|(((unsigned char)(b2))<<16)|(((unsigned char)(b3))<<24)|((((unsigned char)(b0))&0x07)<<5)|FOURbt)&0xffffffffU))
52
+ #define g4(b0,b1,b2,b3) (PType(((((unsigned char)(b0))<<8)|(((unsigned char)(b2))<<16)|((((unsigned char)(b1))&0x0f)<<24)|((((unsigned int)(unsigned char)(b3))&0x0f)<<28)|GB4bt)&0xffffffffU))
69
53
  #define funsio(diff) (PType((((unsigned int)(diff))<<8)|FUNsio))
70
54
 
71
55
  #define getBT1(a) ((unsigned char)((a)>> 8))
@@ -86,9 +70,9 @@ RUBY_SYMBOL_EXPORT_BEGIN
86
70
  #define THREETRAIL /* legal but undefined if three more trailing UTF-8 */
87
71
 
88
72
  typedef enum {
89
- asciicompat_converter, /* ASCII-compatible -> ASCII-compatible */
90
- asciicompat_decoder, /* ASCII-incompatible -> ASCII-compatible */
91
- asciicompat_encoder /* ASCII-compatible -> ASCII-incompatible */
73
+ asciicompat_converter, /* ASCII-compatible -> ASCII-compatible */
74
+ asciicompat_decoder, /* ASCII-incompatible -> ASCII-compatible */
75
+ asciicompat_encoder /* ASCII-compatible -> ASCII-incompatible */
92
76
  /* ASCII-incompatible -> ASCII-incompatible is intentionally omitted. */
93
77
  } rb_transcoder_asciicompat_type_t;
94
78
 
@@ -1,31 +1,13 @@
1
- #define RUBY_VERSION "2.4.0"
2
- #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
3
- #define RUBY_PATCHLEVEL -1
1
+ #define RUBY_VERSION "2.2.8"
2
+ #define RUBY_RELEASE_DATE "2017-09-14"
3
+ #define RUBY_PATCHLEVEL 477
4
4
 
5
- #define RUBY_RELEASE_YEAR 2016
6
- #define RUBY_RELEASE_MONTH 6
7
- #define RUBY_RELEASE_DAY 20
5
+ #define RUBY_RELEASE_YEAR 2017
6
+ #define RUBY_RELEASE_MONTH 9
7
+ #define RUBY_RELEASE_DAY 14
8
8
 
9
9
  #include "ruby/version.h"
10
10
 
11
- #ifndef TOKEN_PASTE
12
- #define TOKEN_PASTE(x,y) x##y
13
- #endif
14
- #define ONLY_ONE_DIGIT(x) TOKEN_PASTE(10,x) < 1000
15
- #define WITH_ZERO_PADDING(x) TOKEN_PASTE(0,x)
16
- #define RUBY_BIRTH_YEAR_STR STRINGIZE(RUBY_BIRTH_YEAR)
17
- #define RUBY_RELEASE_YEAR_STR STRINGIZE(RUBY_RELEASE_YEAR)
18
- #if ONLY_ONE_DIGIT(RUBY_RELEASE_MONTH)
19
- #define RUBY_RELEASE_MONTH_STR STRINGIZE(WITH_ZERO_PADDING(RUBY_RELEASE_MONTH))
20
- #else
21
- #define RUBY_RELEASE_MONTH_STR STRINGIZE(RUBY_RELEASE_MONTH)
22
- #endif
23
- #if ONLY_ONE_DIGIT(RUBY_RELEASE_DAY)
24
- #define RUBY_RELEASE_DAY_STR STRINGIZE(WITH_ZERO_PADDING(RUBY_RELEASE_DAY))
25
- #else
26
- #define RUBY_RELEASE_DAY_STR STRINGIZE(RUBY_RELEASE_DAY)
27
- #endif
28
-
29
11
  #if !defined RUBY_LIB_VERSION && defined RUBY_LIB_VERSION_STYLE
30
12
  # if RUBY_LIB_VERSION_STYLE == 3
31
13
  # define RUBY_LIB_VERSION STRINGIZE(RUBY_API_VERSION_MAJOR)"."STRINGIZE(RUBY_API_VERSION_MINOR)"."STRINGIZE(RUBY_API_VERSION_TEENY)
@@ -35,7 +17,7 @@
35
17
  #endif
36
18
 
37
19
  #if RUBY_PATCHLEVEL == -1
38
- #define RUBY_PATCHLEVEL_STR "preview1"
20
+ #define RUBY_PATCHLEVEL_STR "dev"
39
21
  #else
40
22
  #define RUBY_PATCHLEVEL_STR "p"STRINGIZE(RUBY_PATCHLEVEL)
41
23
  #endif
@@ -48,10 +30,7 @@
48
30
  #endif
49
31
 
50
32
  #if RUBY_REVISION
51
- # if RUBY_PATCHLEVEL == -1
52
- # ifndef RUBY_BRANCH_NAME
53
- # define RUBY_BRANCH_NAME "trunk"
54
- # endif
33
+ # ifdef RUBY_BRANCH_NAME
55
34
  # define RUBY_REVISION_STR " "RUBY_BRANCH_NAME" "STRINGIZE(RUBY_REVISION)
56
35
  # else
57
36
  # define RUBY_REVISION_STR " revision "STRINGIZE(RUBY_REVISION)
@@ -68,6 +47,6 @@
68
47
  "["RUBY_PLATFORM"]"
69
48
  # define RUBY_COPYRIGHT \
70
49
  "ruby - Copyright (C) " \
71
- RUBY_BIRTH_YEAR_STR"-" \
72
- RUBY_RELEASE_YEAR_STR" " \
50
+ STRINGIZE(RUBY_BIRTH_YEAR)"-" \
51
+ STRINGIZE(RUBY_RELEASE_YEAR)" " \
73
52
  RUBY_AUTHOR
@@ -53,7 +53,7 @@ INSN_ENTRY(getlocal){
53
53
  {
54
54
  #line 60 "insns.def"
55
55
  int i, lev = (int)level;
56
- const VALUE *ep = GET_EP();
56
+ VALUE *ep = GET_EP();
57
57
 
58
58
  /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
59
59
  for (i = 0; i < lev; i++) {
@@ -88,13 +88,13 @@ INSN_ENTRY(setlocal){
88
88
  {
89
89
  #line 83 "insns.def"
90
90
  int i, lev = (int)level;
91
- const VALUE *ep = GET_EP();
91
+ VALUE *ep = GET_EP();
92
92
 
93
93
  /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
94
94
  for (i = 0; i < lev; i++) {
95
95
  ep = GET_PREV_EP(ep);
96
96
  }
97
- vm_env_write(ep, -(int)idx, val);
97
+ *(ep - idx) = val;
98
98
 
99
99
  #line 100 "vm.inc"
100
100
  #undef CURRENT_INSN_setlocal
@@ -224,9 +224,10 @@ INSN_ENTRY(getclassvariable){
224
224
  COLLECT_USAGE_OPERAND(BIN(getclassvariable), 0, id);
225
225
  {
226
226
  #line 162 "insns.def"
227
- val = rb_cvar_get(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id);
227
+ NODE *cref = rb_vm_get_cref(GET_ISEQ(), GET_EP());
228
+ val = rb_cvar_get(vm_get_cvar_base(cref, GET_CFP()), id);
228
229
 
229
- #line 230 "vm.inc"
230
+ #line 231 "vm.inc"
230
231
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
231
232
  PUSH(val);
232
233
  #undef CURRENT_INSN_getclassvariable
@@ -249,11 +250,11 @@ INSN_ENTRY(setclassvariable){
249
250
  COLLECT_USAGE_INSN(BIN(setclassvariable));
250
251
  COLLECT_USAGE_OPERAND(BIN(setclassvariable), 0, id);
251
252
  {
252
- #line 176 "insns.def"
253
- vm_ensure_not_refinement_module(GET_SELF());
254
- rb_cvar_set(vm_get_cvar_base(rb_vm_get_cref(GET_EP()), GET_CFP()), id, val);
253
+ #line 177 "insns.def"
254
+ NODE *cref = rb_vm_get_cref(GET_ISEQ(), GET_EP());
255
+ rb_cvar_set(vm_get_cvar_base(cref, GET_CFP()), id, val);
255
256
 
256
- #line 257 "vm.inc"
257
+ #line 258 "vm.inc"
257
258
  #undef CURRENT_INSN_setclassvariable
258
259
  #undef INSN_IS_SC
259
260
  #undef INSN_LABEL
@@ -275,10 +276,10 @@ INSN_ENTRY(getconstant){
275
276
  COLLECT_USAGE_INSN(BIN(getconstant));
276
277
  COLLECT_USAGE_OPERAND(BIN(getconstant), 0, id);
277
278
  {
278
- #line 198 "insns.def"
279
- val = vm_get_ev_const(th, klass, id, 0);
279
+ #line 199 "insns.def"
280
+ val = vm_get_ev_const(th, GET_ISEQ(), klass, id, 0);
280
281
 
281
- #line 282 "vm.inc"
282
+ #line 283 "vm.inc"
282
283
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
283
284
  PUSH(val);
284
285
  #undef CURRENT_INSN_getconstant
@@ -302,9 +303,8 @@ INSN_ENTRY(setconstant){
302
303
  COLLECT_USAGE_INSN(BIN(setconstant));
303
304
  COLLECT_USAGE_OPERAND(BIN(setconstant), 0, id);
304
305
  {
305
- #line 220 "insns.def"
306
+ #line 221 "insns.def"
306
307
  vm_check_if_namespace(cbase);
307
- vm_ensure_not_refinement_module(GET_SELF());
308
308
  rb_const_set(cbase, id, val);
309
309
 
310
310
  #line 311 "vm.inc"
@@ -461,10 +461,10 @@ INSN_ENTRY(putspecialobject){
461
461
  val = rb_mRubyVMFrozenCore;
462
462
  break;
463
463
  case VM_SPECIAL_OBJECT_CBASE:
464
- val = vm_get_cbase(GET_EP());
464
+ val = vm_get_cbase(GET_ISEQ(), GET_EP());
465
465
  break;
466
466
  case VM_SPECIAL_OBJECT_CONST_BASE:
467
- val = vm_get_const_base(GET_EP());
467
+ val = vm_get_const_base(GET_ISEQ(), GET_EP());
468
468
  break;
469
469
  default:
470
470
  rb_bug("putspecialobject insn: unknown value_type");
@@ -494,7 +494,7 @@ INSN_ENTRY(putiseq){
494
494
  COLLECT_USAGE_OPERAND(BIN(putiseq), 0, iseq);
495
495
  {
496
496
  #line 342 "insns.def"
497
- ret = (VALUE)iseq;
497
+ ret = iseq->self;
498
498
 
499
499
  #line 500 "vm.inc"
500
500
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
@@ -546,10 +546,16 @@ INSN_ENTRY(concatstrings){
546
546
  COLLECT_USAGE_OPERAND(BIN(concatstrings), 0, num);
547
547
  {
548
548
  #line 370 "insns.def"
549
- val = rb_str_concat_literals(num, &TOPN(num-1));
549
+ rb_num_t i = num - 1;
550
+
551
+ val = rb_str_resurrect(TOPN(i));
552
+ while (i-- > 0) {
553
+ const VALUE v = TOPN(i);
554
+ rb_str_append(val, v);
555
+ }
550
556
  POPN(num);
551
557
 
552
- #line 553 "vm.inc"
558
+ #line 559 "vm.inc"
553
559
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
554
560
  PUSH(val);
555
561
  #undef CURRENT_INSN_concatstrings
@@ -571,10 +577,10 @@ INSN_ENTRY(tostring){
571
577
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
572
578
  COLLECT_USAGE_INSN(BIN(tostring));
573
579
  {
574
- #line 385 "insns.def"
580
+ #line 391 "insns.def"
575
581
  val = rb_obj_as_string(val);
576
582
 
577
- #line 578 "vm.inc"
583
+ #line 584 "vm.inc"
578
584
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
579
585
  PUSH(val);
580
586
  #undef CURRENT_INSN_tostring
@@ -582,35 +588,6 @@ INSN_ENTRY(tostring){
582
588
  #undef INSN_LABEL
583
589
  #undef LABEL_IS_SC
584
590
  END_INSN(tostring);}}}
585
- INSN_ENTRY(freezestring){
586
- {
587
- VALUE debug_info = (VALUE)GET_OPERAND(1);
588
- VALUE str = TOPN(0);
589
- DEBUG_ENTER_INSN("freezestring");
590
- ADD_PC(1+1);
591
- PREFETCH(GET_PC());
592
- POPN(1);
593
- #define CURRENT_INSN_freezestring 1
594
- #define INSN_IS_SC() 0
595
- #define INSN_LABEL(lab) LABEL_freezestring_##lab
596
- #define LABEL_IS_SC(lab) LABEL_##lab##_##t
597
- COLLECT_USAGE_INSN(BIN(freezestring));
598
- COLLECT_USAGE_OPERAND(BIN(freezestring), 0, debug_info);
599
- {
600
- #line 399 "insns.def"
601
- if (!NIL_P(debug_info)) {
602
- rb_ivar_set(str, id_debug_created_info, debug_info);
603
- }
604
- rb_str_freeze(str);
605
-
606
- #line 607 "vm.inc"
607
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
608
- PUSH(str);
609
- #undef CURRENT_INSN_freezestring
610
- #undef INSN_IS_SC
611
- #undef INSN_LABEL
612
- #undef LABEL_IS_SC
613
- END_INSN(freezestring);}}}
614
591
  INSN_ENTRY(toregexp){
615
592
  {
616
593
  VALUE val;
@@ -628,18 +605,18 @@ INSN_ENTRY(toregexp){
628
605
  COLLECT_USAGE_OPERAND(BIN(toregexp), 0, opt);
629
606
  COLLECT_USAGE_OPERAND(BIN(toregexp), 1, cnt);
630
607
  {
631
- #line 418 "insns.def"
608
+ #line 406 "insns.def"
632
609
  VALUE rb_reg_new_ary(VALUE ary, int options);
633
610
  rb_num_t i;
634
611
  const VALUE ary = rb_ary_tmp_new(cnt);
635
612
  for (i = 0; i < cnt; i++) {
636
- rb_ary_store(ary, cnt-i-1, TOPN(i));
613
+ rb_ary_store(ary, cnt-i-1, TOPN(i));
637
614
  }
638
615
  POPN(cnt);
639
616
  val = rb_reg_new_ary(ary, (int)opt);
640
617
  rb_ary_clear(ary);
641
618
 
642
- #line 643 "vm.inc"
619
+ #line 620 "vm.inc"
643
620
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
644
621
  PUSH(val);
645
622
  #undef CURRENT_INSN_toregexp
@@ -662,11 +639,11 @@ INSN_ENTRY(newarray){
662
639
  COLLECT_USAGE_INSN(BIN(newarray));
663
640
  COLLECT_USAGE_OPERAND(BIN(newarray), 0, num);
664
641
  {
665
- #line 440 "insns.def"
642
+ #line 428 "insns.def"
666
643
  val = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num));
667
644
  POPN(num);
668
645
 
669
- #line 670 "vm.inc"
646
+ #line 647 "vm.inc"
670
647
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
671
648
  PUSH(val);
672
649
  #undef CURRENT_INSN_newarray
@@ -689,10 +666,10 @@ INSN_ENTRY(duparray){
689
666
  COLLECT_USAGE_INSN(BIN(duparray));
690
667
  COLLECT_USAGE_OPERAND(BIN(duparray), 0, ary);
691
668
  {
692
- #line 455 "insns.def"
669
+ #line 443 "insns.def"
693
670
  val = rb_ary_resurrect(ary);
694
671
 
695
- #line 696 "vm.inc"
672
+ #line 673 "vm.inc"
696
673
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
697
674
  PUSH(val);
698
675
  #undef CURRENT_INSN_duparray
@@ -717,10 +694,10 @@ INSN_ENTRY(expandarray){
717
694
  COLLECT_USAGE_OPERAND(BIN(expandarray), 0, num);
718
695
  COLLECT_USAGE_OPERAND(BIN(expandarray), 1, flag);
719
696
  {
720
- #line 483 "insns.def"
697
+ #line 464 "insns.def"
721
698
  vm_expandarray(GET_CFP(), ary, num, (int)flag);
722
699
 
723
- #line 724 "vm.inc"
700
+ #line 701 "vm.inc"
724
701
  #undef CURRENT_INSN_expandarray
725
702
  #undef INSN_IS_SC
726
703
  #undef INSN_LABEL
@@ -742,7 +719,7 @@ INSN_ENTRY(concatarray){
742
719
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
743
720
  COLLECT_USAGE_INSN(BIN(concatarray));
744
721
  {
745
- #line 497 "insns.def"
722
+ #line 478 "insns.def"
746
723
  const VALUE ary2 = ary2st;
747
724
  VALUE tmp1 = rb_check_convert_type(ary1, T_ARRAY, "Array", "to_a");
748
725
  VALUE tmp2 = rb_check_convert_type(ary2, T_ARRAY, "Array", "to_a");
@@ -760,7 +737,7 @@ INSN_ENTRY(concatarray){
760
737
  }
761
738
  ary = rb_ary_concat(tmp1, tmp2);
762
739
 
763
- #line 764 "vm.inc"
740
+ #line 741 "vm.inc"
764
741
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
765
742
  PUSH(ary);
766
743
  #undef CURRENT_INSN_concatarray
@@ -784,7 +761,7 @@ INSN_ENTRY(splatarray){
784
761
  COLLECT_USAGE_INSN(BIN(splatarray));
785
762
  COLLECT_USAGE_OPERAND(BIN(splatarray), 0, flag);
786
763
  {
787
- #line 526 "insns.def"
764
+ #line 507 "insns.def"
788
765
  VALUE tmp = rb_check_convert_type(ary, T_ARRAY, "Array", "to_a");
789
766
  if (NIL_P(tmp)) {
790
767
  tmp = rb_ary_new3(1, ary);
@@ -794,7 +771,7 @@ INSN_ENTRY(splatarray){
794
771
  }
795
772
  obj = tmp;
796
773
 
797
- #line 798 "vm.inc"
774
+ #line 775 "vm.inc"
798
775
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
799
776
  PUSH(obj);
800
777
  #undef CURRENT_INSN_splatarray
@@ -817,10 +794,12 @@ INSN_ENTRY(newhash){
817
794
  COLLECT_USAGE_INSN(BIN(newhash));
818
795
  COLLECT_USAGE_OPERAND(BIN(newhash), 0, num);
819
796
  {
820
- #line 548 "insns.def"
797
+ #line 529 "insns.def"
821
798
  rb_num_t i;
822
799
 
823
- RUBY_DTRACE_CREATE_HOOK(HASH, num);
800
+ if(RUBY_DTRACE_HASH_CREATE_ENABLED()) {
801
+ RUBY_DTRACE_HASH_CREATE(num, rb_sourcefile(), rb_sourceline());
802
+ }
824
803
 
825
804
  val = rb_hash_new();
826
805
 
@@ -831,7 +810,7 @@ INSN_ENTRY(newhash){
831
810
  }
832
811
  POPN(num);
833
812
 
834
- #line 835 "vm.inc"
813
+ #line 814 "vm.inc"
835
814
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
836
815
  PUSH(val);
837
816
  #undef CURRENT_INSN_newhash
@@ -856,10 +835,10 @@ INSN_ENTRY(newrange){
856
835
  COLLECT_USAGE_INSN(BIN(newrange));
857
836
  COLLECT_USAGE_OPERAND(BIN(newrange), 0, flag);
858
837
  {
859
- #line 573 "insns.def"
838
+ #line 556 "insns.def"
860
839
  val = rb_range_new(low, high, (int)flag);
861
840
 
862
- #line 863 "vm.inc"
841
+ #line 842 "vm.inc"
863
842
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
864
843
  PUSH(val);
865
844
  #undef CURRENT_INSN_newrange
@@ -881,11 +860,11 @@ INSN_ENTRY(pop){
881
860
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
882
861
  COLLECT_USAGE_INSN(BIN(pop));
883
862
  {
884
- #line 591 "insns.def"
863
+ #line 574 "insns.def"
885
864
  (void)val;
886
865
  /* none */
887
866
 
888
- #line 889 "vm.inc"
867
+ #line 868 "vm.inc"
889
868
  #undef CURRENT_INSN_pop
890
869
  #undef INSN_IS_SC
891
870
  #undef INSN_LABEL
@@ -907,10 +886,10 @@ INSN_ENTRY(dup){
907
886
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
908
887
  COLLECT_USAGE_INSN(BIN(dup));
909
888
  {
910
- #line 606 "insns.def"
889
+ #line 589 "insns.def"
911
890
  val1 = val2 = val;
912
891
 
913
- #line 914 "vm.inc"
892
+ #line 893 "vm.inc"
914
893
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 2);
915
894
  PUSH(val1);
916
895
  PUSH(val2);
@@ -933,7 +912,7 @@ INSN_ENTRY(dupn){
933
912
  COLLECT_USAGE_INSN(BIN(dupn));
934
913
  COLLECT_USAGE_OPERAND(BIN(dupn), 0, n);
935
914
  {
936
- #line 620 "insns.def"
915
+ #line 603 "insns.def"
937
916
  rb_num_t i;
938
917
  VALUE *sp = STACK_ADDR_FROM_TOP(n);
939
918
  for (i = 0; i < n; i++) {
@@ -941,7 +920,7 @@ INSN_ENTRY(dupn){
941
920
  }
942
921
  INC_SP(n);
943
922
 
944
- #line 945 "vm.inc"
923
+ #line 924 "vm.inc"
945
924
  #undef CURRENT_INSN_dupn
946
925
  #undef INSN_IS_SC
947
926
  #undef INSN_LABEL
@@ -962,10 +941,10 @@ INSN_ENTRY(swap){
962
941
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
963
942
  COLLECT_USAGE_INSN(BIN(swap));
964
943
  {
965
- #line 640 "insns.def"
944
+ #line 623 "insns.def"
966
945
  /* none */
967
946
 
968
- #line 969 "vm.inc"
947
+ #line 948 "vm.inc"
969
948
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 2);
970
949
  PUSH(obj);
971
950
  PUSH(val);
@@ -974,37 +953,6 @@ INSN_ENTRY(swap){
974
953
  #undef INSN_LABEL
975
954
  #undef LABEL_IS_SC
976
955
  END_INSN(swap);}}}
977
- INSN_ENTRY(reverse){
978
- {
979
- rb_num_t n = (rb_num_t)GET_OPERAND(1);
980
-
981
- DEBUG_ENTER_INSN("reverse");
982
- ADD_PC(1+1);
983
- PREFETCH(GET_PC());
984
- #define CURRENT_INSN_reverse 1
985
- #define INSN_IS_SC() 0
986
- #define INSN_LABEL(lab) LABEL_reverse_##lab
987
- #define LABEL_IS_SC(lab) LABEL_##lab##_##t
988
- COLLECT_USAGE_INSN(BIN(reverse));
989
- COLLECT_USAGE_OPERAND(BIN(reverse), 0, n);
990
- {
991
- #line 654 "insns.def"
992
- rb_num_t i;
993
- VALUE *sp = STACK_ADDR_FROM_TOP(n);
994
-
995
- for (i=0; i<n/2; i++) {
996
- VALUE v0 = sp[i];
997
- VALUE v1 = TOPN(i);
998
- sp[i] = v1;
999
- TOPN(i) = v0;
1000
- }
1001
-
1002
- #line 1003 "vm.inc"
1003
- #undef CURRENT_INSN_reverse
1004
- #undef INSN_IS_SC
1005
- #undef INSN_LABEL
1006
- #undef LABEL_IS_SC
1007
- END_INSN(reverse);}}}
1008
956
  INSN_ENTRY(reput){
1009
957
  {
1010
958
 
@@ -1019,10 +967,10 @@ INSN_ENTRY(reput){
1019
967
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1020
968
  COLLECT_USAGE_INSN(BIN(reput));
1021
969
  {
1022
- #line 676 "insns.def"
970
+ #line 637 "insns.def"
1023
971
  /* none */
1024
972
 
1025
- #line 1026 "vm.inc"
973
+ #line 974 "vm.inc"
1026
974
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1027
975
  PUSH(val);
1028
976
  #undef CURRENT_INSN_reput
@@ -1045,10 +993,10 @@ INSN_ENTRY(topn){
1045
993
  COLLECT_USAGE_INSN(BIN(topn));
1046
994
  COLLECT_USAGE_OPERAND(BIN(topn), 0, n);
1047
995
  {
1048
- #line 690 "insns.def"
996
+ #line 651 "insns.def"
1049
997
  val = TOPN(n);
1050
998
 
1051
- #line 1052 "vm.inc"
999
+ #line 1000 "vm.inc"
1052
1000
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1053
1001
  PUSH(val);
1054
1002
  #undef CURRENT_INSN_topn
@@ -1071,10 +1019,10 @@ INSN_ENTRY(setn){
1071
1019
  COLLECT_USAGE_INSN(BIN(setn));
1072
1020
  COLLECT_USAGE_OPERAND(BIN(setn), 0, n);
1073
1021
  {
1074
- #line 704 "insns.def"
1022
+ #line 665 "insns.def"
1075
1023
  TOPN(n-1) = val;
1076
1024
 
1077
- #line 1078 "vm.inc"
1025
+ #line 1026 "vm.inc"
1078
1026
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1079
1027
  PUSH(val);
1080
1028
  #undef CURRENT_INSN_setn
@@ -1096,10 +1044,10 @@ INSN_ENTRY(adjuststack){
1096
1044
  COLLECT_USAGE_INSN(BIN(adjuststack));
1097
1045
  COLLECT_USAGE_OPERAND(BIN(adjuststack), 0, n);
1098
1046
  {
1099
- #line 718 "insns.def"
1047
+ #line 679 "insns.def"
1100
1048
  DEC_SP(n);
1101
1049
 
1102
- #line 1103 "vm.inc"
1050
+ #line 1051 "vm.inc"
1103
1051
  #undef CURRENT_INSN_adjuststack
1104
1052
  #undef INSN_IS_SC
1105
1053
  #undef INSN_LABEL
@@ -1125,10 +1073,105 @@ INSN_ENTRY(defined){
1125
1073
  COLLECT_USAGE_OPERAND(BIN(defined), 1, obj);
1126
1074
  COLLECT_USAGE_OPERAND(BIN(defined), 2, needstr);
1127
1075
  {
1128
- #line 737 "insns.def"
1129
- val = vm_defined(th, GET_CFP(), op_type, obj, needstr, v);
1076
+ #line 698 "insns.def"
1077
+ VALUE klass;
1078
+ enum defined_type expr_type = 0;
1079
+ enum defined_type type = (enum defined_type)op_type;
1080
+
1081
+ val = Qnil;
1082
+
1083
+ switch (type) {
1084
+ case DEFINED_IVAR:
1085
+ if (rb_ivar_defined(GET_SELF(), SYM2ID(obj))) {
1086
+ expr_type = DEFINED_IVAR;
1087
+ }
1088
+ break;
1089
+ case DEFINED_IVAR2:
1090
+ klass = vm_get_cbase(GET_ISEQ(), GET_EP());
1091
+ break;
1092
+ case DEFINED_GVAR:
1093
+ if (rb_gvar_defined(rb_global_entry(SYM2ID(obj)))) {
1094
+ expr_type = DEFINED_GVAR;
1095
+ }
1096
+ break;
1097
+ case DEFINED_CVAR: {
1098
+ NODE *cref = rb_vm_get_cref(GET_ISEQ(), GET_EP());
1099
+ klass = vm_get_cvar_base(cref, GET_CFP());
1100
+ if (rb_cvar_defined(klass, SYM2ID(obj))) {
1101
+ expr_type = DEFINED_CVAR;
1102
+ }
1103
+ break;
1104
+ }
1105
+ case DEFINED_CONST:
1106
+ klass = v;
1107
+ if (vm_get_ev_const(th, GET_ISEQ(), klass, SYM2ID(obj), 1)) {
1108
+ expr_type = DEFINED_CONST;
1109
+ }
1110
+ break;
1111
+ case DEFINED_FUNC:
1112
+ klass = CLASS_OF(v);
1113
+ if (rb_method_boundp(klass, SYM2ID(obj), 0)) {
1114
+ expr_type = DEFINED_METHOD;
1115
+ }
1116
+ break;
1117
+ case DEFINED_METHOD:{
1118
+ VALUE klass = CLASS_OF(v);
1119
+ const rb_method_entry_t *me = rb_method_entry(klass, SYM2ID(obj), 0);
1120
+
1121
+ if (me) {
1122
+ if (!(me->flag & NOEX_PRIVATE) &&
1123
+ !((me->flag & NOEX_PROTECTED) && !rb_obj_is_kind_of(GET_SELF(), rb_class_real(klass)))) {
1124
+ expr_type = DEFINED_METHOD;
1125
+ }
1126
+ }
1127
+ else {
1128
+ VALUE args[2];
1129
+ VALUE r;
1130
1130
 
1131
- #line 1132 "vm.inc"
1131
+ args[0] = obj; args[1] = Qfalse;
1132
+ r = rb_check_funcall(v, idRespond_to_missing, 2, args);
1133
+ if (r != Qundef && RTEST(r))
1134
+ expr_type = DEFINED_METHOD;
1135
+ }
1136
+ break;
1137
+ }
1138
+ case DEFINED_YIELD:
1139
+ if (GET_BLOCK_PTR()) {
1140
+ expr_type = DEFINED_YIELD;
1141
+ }
1142
+ break;
1143
+ case DEFINED_ZSUPER:{
1144
+ rb_call_info_t cit;
1145
+ if (vm_search_superclass(GET_CFP(), GET_ISEQ(), Qnil, &cit) == 0) {
1146
+ VALUE klass = cit.klass;
1147
+ ID id = cit.mid;
1148
+ if (rb_method_boundp(klass, id, 0)) {
1149
+ expr_type = DEFINED_ZSUPER;
1150
+ }
1151
+ }
1152
+ break;
1153
+ }
1154
+ case DEFINED_REF:{
1155
+ val = vm_getspecial(th, GET_LEP(), Qfalse, FIX2INT(obj));
1156
+ if (val != Qnil) {
1157
+ expr_type = DEFINED_GVAR;
1158
+ }
1159
+ break;
1160
+ }
1161
+ default:
1162
+ rb_bug("unimplemented defined? type (VM)");
1163
+ break;
1164
+ }
1165
+ if (expr_type != 0) {
1166
+ if (needstr != Qfalse) {
1167
+ val = rb_iseq_defined_string(expr_type);
1168
+ }
1169
+ else {
1170
+ val = Qtrue;
1171
+ }
1172
+ }
1173
+
1174
+ #line 1175 "vm.inc"
1132
1175
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1133
1176
  PUSH(val);
1134
1177
  #undef CURRENT_INSN_defined
@@ -1153,7 +1196,7 @@ INSN_ENTRY(checkmatch){
1153
1196
  COLLECT_USAGE_INSN(BIN(checkmatch));
1154
1197
  COLLECT_USAGE_OPERAND(BIN(checkmatch), 0, flag);
1155
1198
  {
1156
- #line 756 "insns.def"
1199
+ #line 812 "insns.def"
1157
1200
  enum vm_check_match_type checkmatch_type =
1158
1201
  (enum vm_check_match_type)(flag & VM_CHECKMATCH_TYPE_MASK);
1159
1202
  result = Qfalse;
@@ -1173,7 +1216,7 @@ INSN_ENTRY(checkmatch){
1173
1216
  }
1174
1217
  }
1175
1218
 
1176
- #line 1177 "vm.inc"
1219
+ #line 1220 "vm.inc"
1177
1220
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1178
1221
  PUSH(result);
1179
1222
  #undef CURRENT_INSN_checkmatch
@@ -1198,7 +1241,7 @@ INSN_ENTRY(checkkeyword){
1198
1241
  COLLECT_USAGE_OPERAND(BIN(checkkeyword), 0, kw_bits_index);
1199
1242
  COLLECT_USAGE_OPERAND(BIN(checkkeyword), 1, keyword_index);
1200
1243
  {
1201
- #line 787 "insns.def"
1244
+ #line 843 "insns.def"
1202
1245
  const VALUE *ep = GET_EP();
1203
1246
  const VALUE kw_bits = *(ep - kw_bits_index);
1204
1247
 
@@ -1207,11 +1250,11 @@ INSN_ENTRY(checkkeyword){
1207
1250
  ret = (bits & (0x01 << keyword_index)) ? Qfalse : Qtrue;
1208
1251
  }
1209
1252
  else {
1210
- VM_ASSERT(RB_TYPE_P(kw_bits, T_HASH));
1253
+ assert(RB_TYPE_P(kw_bits, T_HASH));
1211
1254
  ret = rb_hash_has_key(kw_bits, INT2FIX(keyword_index)) ? Qfalse : Qtrue;
1212
1255
  }
1213
1256
 
1214
- #line 1215 "vm.inc"
1257
+ #line 1258 "vm.inc"
1215
1258
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1216
1259
  PUSH(ret);
1217
1260
  #undef CURRENT_INSN_checkkeyword
@@ -1233,34 +1276,34 @@ INSN_ENTRY(trace){
1233
1276
  COLLECT_USAGE_INSN(BIN(trace));
1234
1277
  COLLECT_USAGE_OPERAND(BIN(trace), 0, nf);
1235
1278
  {
1236
- #line 811 "insns.def"
1279
+ #line 867 "insns.def"
1237
1280
  rb_event_flag_t flag = (rb_event_flag_t)nf;
1238
1281
 
1239
1282
  if (RUBY_DTRACE_METHOD_ENTRY_ENABLED() ||
1240
- RUBY_DTRACE_METHOD_RETURN_ENABLED() ||
1241
- RUBY_DTRACE_CMETHOD_ENTRY_ENABLED() ||
1242
- RUBY_DTRACE_CMETHOD_RETURN_ENABLED()) {
1243
-
1244
- switch (flag) {
1245
- case RUBY_EVENT_CALL:
1246
- RUBY_DTRACE_METHOD_ENTRY_HOOK(th, 0, 0);
1247
- break;
1248
- case RUBY_EVENT_C_CALL:
1249
- RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, 0, 0);
1250
- break;
1251
- case RUBY_EVENT_RETURN:
1252
- RUBY_DTRACE_METHOD_RETURN_HOOK(th, 0, 0);
1253
- break;
1254
- case RUBY_EVENT_C_RETURN:
1255
- RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, 0, 0);
1256
- break;
1257
- }
1283
+ RUBY_DTRACE_METHOD_RETURN_ENABLED() ||
1284
+ RUBY_DTRACE_CMETHOD_ENTRY_ENABLED() ||
1285
+ RUBY_DTRACE_CMETHOD_RETURN_ENABLED()) {
1286
+
1287
+ switch(flag) {
1288
+ case RUBY_EVENT_CALL:
1289
+ RUBY_DTRACE_METHOD_ENTRY_HOOK(th, 0, 0);
1290
+ break;
1291
+ case RUBY_EVENT_C_CALL:
1292
+ RUBY_DTRACE_CMETHOD_ENTRY_HOOK(th, 0, 0);
1293
+ break;
1294
+ case RUBY_EVENT_RETURN:
1295
+ RUBY_DTRACE_METHOD_RETURN_HOOK(th, 0, 0);
1296
+ break;
1297
+ case RUBY_EVENT_C_RETURN:
1298
+ RUBY_DTRACE_CMETHOD_RETURN_HOOK(th, 0, 0);
1299
+ break;
1300
+ }
1258
1301
  }
1259
1302
 
1260
1303
  EXEC_EVENT_HOOK(th, flag, GET_SELF(), 0, 0 /* id and klass are resolved at callee */,
1261
1304
  (flag & (RUBY_EVENT_RETURN | RUBY_EVENT_B_RETURN)) ? TOPN(0) : Qundef);
1262
1305
 
1263
- #line 1264 "vm.inc"
1306
+ #line 1307 "vm.inc"
1264
1307
  #undef CURRENT_INSN_trace
1265
1308
  #undef INSN_IS_SC
1266
1309
  #undef INSN_LABEL
@@ -1287,8 +1330,10 @@ INSN_ENTRY(defineclass){
1287
1330
  COLLECT_USAGE_OPERAND(BIN(defineclass), 1, class_iseq);
1288
1331
  COLLECT_USAGE_OPERAND(BIN(defineclass), 2, flags);
1289
1332
  {
1290
- #line 857 "insns.def"
1333
+ #line 913 "insns.def"
1291
1334
  VALUE klass;
1335
+ VALUE class_iseq_val = class_iseq->self;
1336
+ rb_iseq_t *orig_class_iseq = NULL;
1292
1337
  rb_vm_defineclass_type_t type = VM_DEFINECLASS_TYPE(flags);
1293
1338
 
1294
1339
  switch (type) {
@@ -1297,8 +1342,8 @@ INSN_ENTRY(defineclass){
1297
1342
 
1298
1343
  if (VM_DEFINECLASS_HAS_SUPERCLASS_P(flags) &&
1299
1344
  !RB_TYPE_P(super, T_CLASS)) {
1300
- rb_raise(rb_eTypeError, "superclass must be a Class (%"PRIsVALUE" given)",
1301
- rb_obj_class(super));
1345
+ rb_raise(rb_eTypeError, "superclass must be a Class (%s given)",
1346
+ rb_obj_classname(super));
1302
1347
  }
1303
1348
 
1304
1349
  vm_check_if_namespace(cbase);
@@ -1310,7 +1355,7 @@ INSN_ENTRY(defineclass){
1310
1355
  klass = VM_DEFINECLASS_SCOPED_P(flags) ?
1311
1356
  rb_public_const_get_at(klass, id) : rb_const_get_at(klass, id);
1312
1357
  if (!RB_TYPE_P(klass, T_CLASS)) {
1313
- rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a class", rb_id2str(id));
1358
+ rb_raise(rb_eTypeError, "%s is not a class", rb_id2name(id));
1314
1359
  }
1315
1360
 
1316
1361
  if (VM_DEFINECLASS_HAS_SUPERCLASS_P(flags)) {
@@ -1318,8 +1363,8 @@ INSN_ENTRY(defineclass){
1318
1363
  tmp = rb_class_real(RCLASS_SUPER(klass));
1319
1364
 
1320
1365
  if (tmp != super) {
1321
- rb_raise(rb_eTypeError, "superclass mismatch for class %"PRIsVALUE"",
1322
- rb_id2str(id));
1366
+ rb_raise(rb_eTypeError, "superclass mismatch for class %s",
1367
+ rb_id2name(id));
1323
1368
  }
1324
1369
  }
1325
1370
  }
@@ -1337,7 +1382,18 @@ INSN_ENTRY(defineclass){
1337
1382
  case VM_DEFINECLASS_TYPE_SINGLETON_CLASS:
1338
1383
  /* val is dummy. classdef returns class scope value */
1339
1384
  /* super is dummy */
1340
- klass = rb_singleton_class(cbase);
1385
+ {
1386
+ klass = rb_singleton_class(cbase);
1387
+
1388
+ /* Copy iseq to duplicate cref_stack place.
1389
+ * This is ad-hoc solution for [Bug #10871].
1390
+ * and this does not solve more complicated source code with singleton class.
1391
+ * If you need to solve everything, use Ruby 2.3 and later.
1392
+ */
1393
+ orig_class_iseq = class_iseq;
1394
+ class_iseq_val = rb_iseq_clone(class_iseq->self, cbase);
1395
+ GetISeqPtr(class_iseq_val, class_iseq);
1396
+ }
1341
1397
  break;
1342
1398
  case VM_DEFINECLASS_TYPE_MODULE:
1343
1399
  /* val is dummy. classdef returns class scope value */
@@ -1351,7 +1407,7 @@ INSN_ENTRY(defineclass){
1351
1407
  rb_public_const_get_at(klass, id) : rb_const_get_at(klass, id);
1352
1408
  /* already exist */
1353
1409
  if (!RB_TYPE_P(klass, T_MODULE)) {
1354
- rb_raise(rb_eTypeError, "%"PRIsVALUE" is not a module", rb_id2str(id));
1410
+ rb_raise(rb_eTypeError, "%s is not a module", rb_id2name(id));
1355
1411
  }
1356
1412
  }
1357
1413
  else {
@@ -1365,19 +1421,23 @@ INSN_ENTRY(defineclass){
1365
1421
  rb_bug("unknown defineclass type: %d", (int)type);
1366
1422
  }
1367
1423
 
1368
- rb_iseq_check(class_iseq);
1424
+ COPY_CREF(class_iseq->cref_stack, vm_cref_push(th, klass, NOEX_PUBLIC, NULL));
1425
+ if (orig_class_iseq) {
1426
+ COPY_CREF(orig_class_iseq->cref_stack, vm_cref_push(th, klass, NOEX_PUBLIC, NULL));
1427
+ }
1369
1428
 
1370
1429
  /* enter scope */
1371
- vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS | VM_ENV_FLAG_LOCAL, klass,
1372
- GET_BLOCK_HANDLER(),
1373
- (VALUE)vm_cref_push(th, klass, NULL, FALSE),
1374
- class_iseq->body->iseq_encoded, GET_SP(),
1375
- class_iseq->body->local_table_size,
1376
- class_iseq->body->stack_max);
1430
+ vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS,
1431
+ klass, 0, VM_ENVVAL_BLOCK_PTR(GET_BLOCK_PTR()),
1432
+ class_iseq->iseq_encoded, GET_SP(),
1433
+ class_iseq->local_size, 0, class_iseq->stack_max);
1434
+
1435
+ RB_GC_GUARD(class_iseq_val);
1436
+
1377
1437
  RESTORE_REGS();
1378
1438
  NEXT_INSN();
1379
1439
 
1380
- #line 1381 "vm.inc"
1440
+ #line 1441 "vm.inc"
1381
1441
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1382
1442
  PUSH(val);
1383
1443
  #undef CURRENT_INSN_defineclass
@@ -1388,12 +1448,10 @@ INSN_ENTRY(defineclass){
1388
1448
  INSN_ENTRY(send){
1389
1449
  {
1390
1450
  VALUE val;
1391
- ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
1392
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
1393
1451
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1394
1452
 
1395
1453
  DEBUG_ENTER_INSN("send");
1396
- ADD_PC(1+3);
1454
+ ADD_PC(1+1);
1397
1455
  PREFETCH(GET_PC());
1398
1456
  #define CURRENT_INSN_send 1
1399
1457
  #define INSN_IS_SC() 0
@@ -1401,17 +1459,14 @@ INSN_ENTRY(send){
1401
1459
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1402
1460
  COLLECT_USAGE_INSN(BIN(send));
1403
1461
  COLLECT_USAGE_OPERAND(BIN(send), 0, ci);
1404
- COLLECT_USAGE_OPERAND(BIN(send), 1, cc);
1405
- COLLECT_USAGE_OPERAND(BIN(send), 2, blockiseq);
1406
1462
  {
1407
- #line 963 "insns.def"
1408
- struct rb_calling_info calling;
1409
-
1410
- vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, FALSE);
1411
- vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));
1412
- CALL_METHOD(&calling, ci, cc);
1463
+ #line 1036 "insns.def"
1464
+ ci->argc = ci->orig_argc;
1465
+ vm_caller_setup_arg_block(th, reg_cfp, ci, FALSE);
1466
+ vm_search_method(ci, ci->recv = TOPN(ci->argc));
1467
+ CALL_METHOD(ci);
1413
1468
 
1414
- #line 1415 "vm.inc"
1469
+ #line 1470 "vm.inc"
1415
1470
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1416
1471
  PUSH(val);
1417
1472
  #undef CURRENT_INSN_send
@@ -1434,7 +1489,7 @@ INSN_ENTRY(opt_str_freeze){
1434
1489
  COLLECT_USAGE_INSN(BIN(opt_str_freeze));
1435
1490
  COLLECT_USAGE_OPERAND(BIN(opt_str_freeze), 0, str);
1436
1491
  {
1437
- #line 976 "insns.def"
1492
+ #line 1048 "insns.def"
1438
1493
  if (BASIC_OP_UNREDEFINED_P(BOP_FREEZE, STRING_REDEFINED_OP_FLAG)) {
1439
1494
  val = str;
1440
1495
  }
@@ -1442,7 +1497,7 @@ INSN_ENTRY(opt_str_freeze){
1442
1497
  val = rb_funcall(rb_str_resurrect(str), idFreeze, 0);
1443
1498
  }
1444
1499
 
1445
- #line 1446 "vm.inc"
1500
+ #line 1501 "vm.inc"
1446
1501
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1447
1502
  PUSH(val);
1448
1503
  #undef CURRENT_INSN_opt_str_freeze
@@ -1450,116 +1505,13 @@ INSN_ENTRY(opt_str_freeze){
1450
1505
  #undef INSN_LABEL
1451
1506
  #undef LABEL_IS_SC
1452
1507
  END_INSN(opt_str_freeze);}}}
1453
- INSN_ENTRY(opt_newarray_max){
1454
- {
1455
- VALUE val;
1456
- rb_num_t num = (rb_num_t)GET_OPERAND(1);
1457
-
1458
- DEBUG_ENTER_INSN("opt_newarray_max");
1459
- ADD_PC(1+1);
1460
- PREFETCH(GET_PC());
1461
- #define CURRENT_INSN_opt_newarray_max 1
1462
- #define INSN_IS_SC() 0
1463
- #define INSN_LABEL(lab) LABEL_opt_newarray_max_##lab
1464
- #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1465
- COLLECT_USAGE_INSN(BIN(opt_newarray_max));
1466
- COLLECT_USAGE_OPERAND(BIN(opt_newarray_max), 0, num);
1467
- {
1468
- #line 990 "insns.def"
1469
- #define id_cmp idCmp
1470
- if (BASIC_OP_UNREDEFINED_P(BOP_MAX, ARRAY_REDEFINED_OP_FLAG)) {
1471
- if (num == 0) {
1472
- val = Qnil;
1473
- }
1474
- else {
1475
- struct cmp_opt_data cmp_opt = { 0, 0 };
1476
- VALUE result = Qundef;
1477
- rb_num_t i = num - 1;
1478
- result = TOPN(i);
1479
- while (i-- > 0) {
1480
- const VALUE v = TOPN(i);
1481
- if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) > 0) {
1482
- result = v;
1483
- }
1484
- }
1485
- val = result == Qundef ? Qnil : result;
1486
- }
1487
- POPN(num);
1488
- }
1489
- else {
1490
- VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num));
1491
- val = rb_funcall(ary, idMax, 0);
1492
- POPN(num);
1493
- }
1494
- #undef id_cmp
1495
-
1496
- #line 1497 "vm.inc"
1497
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1498
- PUSH(val);
1499
- #undef CURRENT_INSN_opt_newarray_max
1500
- #undef INSN_IS_SC
1501
- #undef INSN_LABEL
1502
- #undef LABEL_IS_SC
1503
- END_INSN(opt_newarray_max);}}}
1504
- INSN_ENTRY(opt_newarray_min){
1505
- {
1506
- VALUE val;
1507
- rb_num_t num = (rb_num_t)GET_OPERAND(1);
1508
-
1509
- DEBUG_ENTER_INSN("opt_newarray_min");
1510
- ADD_PC(1+1);
1511
- PREFETCH(GET_PC());
1512
- #define CURRENT_INSN_opt_newarray_min 1
1513
- #define INSN_IS_SC() 0
1514
- #define INSN_LABEL(lab) LABEL_opt_newarray_min_##lab
1515
- #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1516
- COLLECT_USAGE_INSN(BIN(opt_newarray_min));
1517
- COLLECT_USAGE_OPERAND(BIN(opt_newarray_min), 0, num);
1518
- {
1519
- #line 1024 "insns.def"
1520
- #define id_cmp idCmp
1521
- if (BASIC_OP_UNREDEFINED_P(BOP_MIN, ARRAY_REDEFINED_OP_FLAG)) {
1522
- if (num == 0) {
1523
- val = Qnil;
1524
- }
1525
- else {
1526
- struct cmp_opt_data cmp_opt = { 0, 0 };
1527
- VALUE result = Qundef;
1528
- rb_num_t i = num - 1;
1529
- result = TOPN(i);
1530
- while (i-- > 0) {
1531
- const VALUE v = TOPN(i);
1532
- if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) < 0) {
1533
- result = v;
1534
- }
1535
- }
1536
- val = result == Qundef ? Qnil : result;
1537
- }
1538
- POPN(num);
1539
- }
1540
- else {
1541
- VALUE ary = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num));
1542
- val = rb_funcall(ary, idMin, 0);
1543
- POPN(num);
1544
- }
1545
- #undef id_cmp
1546
-
1547
- #line 1548 "vm.inc"
1548
- CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1549
- PUSH(val);
1550
- #undef CURRENT_INSN_opt_newarray_min
1551
- #undef INSN_IS_SC
1552
- #undef INSN_LABEL
1553
- #undef LABEL_IS_SC
1554
- END_INSN(opt_newarray_min);}}}
1555
1508
  INSN_ENTRY(opt_send_without_block){
1556
1509
  {
1557
1510
  VALUE val;
1558
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
1559
1511
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1560
1512
 
1561
1513
  DEBUG_ENTER_INSN("opt_send_without_block");
1562
- ADD_PC(1+2);
1514
+ ADD_PC(1+1);
1563
1515
  PREFETCH(GET_PC());
1564
1516
  #define CURRENT_INSN_opt_send_without_block 1
1565
1517
  #define INSN_IS_SC() 0
@@ -1567,15 +1519,13 @@ INSN_ENTRY(opt_send_without_block){
1567
1519
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1568
1520
  COLLECT_USAGE_INSN(BIN(opt_send_without_block));
1569
1521
  COLLECT_USAGE_OPERAND(BIN(opt_send_without_block), 0, ci);
1570
- COLLECT_USAGE_OPERAND(BIN(opt_send_without_block), 1, cc);
1571
1522
  {
1572
- #line 1063 "insns.def"
1573
- struct rb_calling_info calling;
1574
- calling.block_handler = VM_BLOCK_HANDLER_NONE;
1575
- vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc));
1576
- CALL_METHOD(&calling, ci, cc);
1523
+ #line 1067 "insns.def"
1524
+ ci->argc = ci->orig_argc;
1525
+ vm_search_method(ci, ci->recv = TOPN(ci->argc));
1526
+ CALL_METHOD(ci);
1577
1527
 
1578
- #line 1579 "vm.inc"
1528
+ #line 1529 "vm.inc"
1579
1529
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1580
1530
  PUSH(val);
1581
1531
  #undef CURRENT_INSN_opt_send_without_block
@@ -1586,12 +1536,10 @@ INSN_ENTRY(opt_send_without_block){
1586
1536
  INSN_ENTRY(invokesuper){
1587
1537
  {
1588
1538
  VALUE val;
1589
- ISEQ blockiseq = (ISEQ)GET_OPERAND(3);
1590
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
1591
1539
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
1592
1540
 
1593
1541
  DEBUG_ENTER_INSN("invokesuper");
1594
- ADD_PC(1+3);
1542
+ ADD_PC(1+1);
1595
1543
  PREFETCH(GET_PC());
1596
1544
  #define CURRENT_INSN_invokesuper 1
1597
1545
  #define INSN_IS_SC() 0
@@ -1599,19 +1547,15 @@ INSN_ENTRY(invokesuper){
1599
1547
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1600
1548
  COLLECT_USAGE_INSN(BIN(invokesuper));
1601
1549
  COLLECT_USAGE_OPERAND(BIN(invokesuper), 0, ci);
1602
- COLLECT_USAGE_OPERAND(BIN(invokesuper), 1, cc);
1603
- COLLECT_USAGE_OPERAND(BIN(invokesuper), 2, blockiseq);
1604
1550
  {
1605
- #line 1080 "insns.def"
1606
- struct rb_calling_info calling;
1607
- calling.argc = ci->orig_argc;
1608
-
1609
- vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, TRUE);
1610
- calling.recv = GET_SELF();
1611
- vm_search_super_method(th, GET_CFP(), &calling, ci, cc);
1612
- CALL_METHOD(&calling, ci, cc);
1551
+ #line 1083 "insns.def"
1552
+ ci->argc = ci->orig_argc;
1553
+ vm_caller_setup_arg_block(th, reg_cfp, ci, TRUE);
1554
+ ci->recv = GET_SELF();
1555
+ vm_search_super_method(th, GET_CFP(), ci);
1556
+ CALL_METHOD(ci);
1613
1557
 
1614
- #line 1615 "vm.inc"
1558
+ #line 1559 "vm.inc"
1615
1559
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1616
1560
  PUSH(val);
1617
1561
  #undef CURRENT_INSN_invokesuper
@@ -1634,19 +1578,17 @@ INSN_ENTRY(invokeblock){
1634
1578
  COLLECT_USAGE_INSN(BIN(invokeblock));
1635
1579
  COLLECT_USAGE_OPERAND(BIN(invokeblock), 0, ci);
1636
1580
  {
1637
- #line 1100 "insns.def"
1638
- struct rb_calling_info calling;
1639
- calling.argc = ci->orig_argc;
1640
- calling.block_handler = VM_BLOCK_HANDLER_NONE;
1641
- calling.recv = GET_SELF();
1642
-
1643
- val = vm_invoke_block(th, GET_CFP(), &calling, ci);
1581
+ #line 1101 "insns.def"
1582
+ ci->argc = ci->orig_argc;
1583
+ ci->blockptr = 0;
1584
+ ci->recv = GET_SELF();
1585
+ val = vm_invoke_block(th, GET_CFP(), ci);
1644
1586
  if (val == Qundef) {
1645
1587
  RESTORE_REGS();
1646
1588
  NEXT_INSN();
1647
1589
  }
1648
1590
 
1649
- #line 1650 "vm.inc"
1591
+ #line 1592 "vm.inc"
1650
1592
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1651
1593
  PUSH(val);
1652
1594
  #undef CURRENT_INSN_invokeblock
@@ -1668,18 +1610,19 @@ INSN_ENTRY(leave){
1668
1610
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1669
1611
  COLLECT_USAGE_INSN(BIN(leave));
1670
1612
  {
1671
- #line 1123 "insns.def"
1613
+ #line 1122 "insns.def"
1672
1614
  if (OPT_CHECKED_RUN) {
1673
- const VALUE *const bp = vm_base_ptr(reg_cfp);
1674
- if (reg_cfp->sp != bp) {
1615
+ if (reg_cfp->sp != vm_base_ptr(reg_cfp)) {
1675
1616
  rb_bug("Stack consistency error (sp: %"PRIdPTRDIFF", bp: %"PRIdPTRDIFF")",
1676
- VM_SP_CNT(th, reg_cfp->sp), VM_SP_CNT(th, bp));
1617
+ VM_SP_CNT(th, reg_cfp->sp), VM_SP_CNT(th, vm_base_ptr(reg_cfp)));
1677
1618
  }
1678
1619
  }
1679
1620
 
1680
1621
  RUBY_VM_CHECK_INTS(th);
1681
1622
 
1682
- if (vm_pop_frame(th, GET_CFP(), GET_EP())) {
1623
+ if (UNLIKELY(VM_FRAME_TYPE_FINISH_P(GET_CFP()))) {
1624
+ vm_pop_frame(th);
1625
+
1683
1626
  #if OPT_CALL_THREADED_CODE
1684
1627
  th->retval = val;
1685
1628
  return 0;
@@ -1688,10 +1631,11 @@ INSN_ENTRY(leave){
1688
1631
  #endif
1689
1632
  }
1690
1633
  else {
1634
+ vm_pop_frame(th);
1691
1635
  RESTORE_REGS();
1692
1636
  }
1693
1637
 
1694
- #line 1695 "vm.inc"
1638
+ #line 1639 "vm.inc"
1695
1639
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1696
1640
  PUSH(val);
1697
1641
  #undef CURRENT_INSN_leave
@@ -1715,13 +1659,13 @@ INSN_ENTRY(throw){
1715
1659
  COLLECT_USAGE_INSN(BIN(throw));
1716
1660
  COLLECT_USAGE_OPERAND(BIN(throw), 0, throw_state);
1717
1661
  {
1718
- #line 1161 "insns.def"
1662
+ #line 1162 "insns.def"
1719
1663
  RUBY_VM_CHECK_INTS(th);
1720
1664
  val = vm_throw(th, GET_CFP(), throw_state, throwobj);
1721
1665
  THROW_EXCEPTION(val);
1722
1666
  /* unreachable */
1723
1667
 
1724
- #line 1725 "vm.inc"
1668
+ #line 1669 "vm.inc"
1725
1669
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1726
1670
  PUSH(val);
1727
1671
  #undef CURRENT_INSN_throw
@@ -1743,11 +1687,11 @@ INSN_ENTRY(jump){
1743
1687
  COLLECT_USAGE_INSN(BIN(jump));
1744
1688
  COLLECT_USAGE_OPERAND(BIN(jump), 0, dst);
1745
1689
  {
1746
- #line 1182 "insns.def"
1690
+ #line 1183 "insns.def"
1747
1691
  RUBY_VM_CHECK_INTS(th);
1748
1692
  JUMP(dst);
1749
1693
 
1750
- #line 1751 "vm.inc"
1694
+ #line 1695 "vm.inc"
1751
1695
  #undef CURRENT_INSN_jump
1752
1696
  #undef INSN_IS_SC
1753
1697
  #undef INSN_LABEL
@@ -1768,13 +1712,13 @@ INSN_ENTRY(branchif){
1768
1712
  COLLECT_USAGE_INSN(BIN(branchif));
1769
1713
  COLLECT_USAGE_OPERAND(BIN(branchif), 0, dst);
1770
1714
  {
1771
- #line 1197 "insns.def"
1715
+ #line 1198 "insns.def"
1772
1716
  if (RTEST(val)) {
1773
1717
  RUBY_VM_CHECK_INTS(th);
1774
1718
  JUMP(dst);
1775
1719
  }
1776
1720
 
1777
- #line 1778 "vm.inc"
1721
+ #line 1722 "vm.inc"
1778
1722
  #undef CURRENT_INSN_branchif
1779
1723
  #undef INSN_IS_SC
1780
1724
  #undef INSN_LABEL
@@ -1795,45 +1739,18 @@ INSN_ENTRY(branchunless){
1795
1739
  COLLECT_USAGE_INSN(BIN(branchunless));
1796
1740
  COLLECT_USAGE_OPERAND(BIN(branchunless), 0, dst);
1797
1741
  {
1798
- #line 1214 "insns.def"
1742
+ #line 1215 "insns.def"
1799
1743
  if (!RTEST(val)) {
1800
1744
  RUBY_VM_CHECK_INTS(th);
1801
1745
  JUMP(dst);
1802
1746
  }
1803
1747
 
1804
- #line 1805 "vm.inc"
1748
+ #line 1749 "vm.inc"
1805
1749
  #undef CURRENT_INSN_branchunless
1806
1750
  #undef INSN_IS_SC
1807
1751
  #undef INSN_LABEL
1808
1752
  #undef LABEL_IS_SC
1809
1753
  END_INSN(branchunless);}}}
1810
- INSN_ENTRY(branchnil){
1811
- {
1812
- OFFSET dst = (OFFSET)GET_OPERAND(1);
1813
- VALUE val = TOPN(0);
1814
- DEBUG_ENTER_INSN("branchnil");
1815
- ADD_PC(1+1);
1816
- PREFETCH(GET_PC());
1817
- POPN(1);
1818
- #define CURRENT_INSN_branchnil 1
1819
- #define INSN_IS_SC() 0
1820
- #define INSN_LABEL(lab) LABEL_branchnil_##lab
1821
- #define LABEL_IS_SC(lab) LABEL_##lab##_##t
1822
- COLLECT_USAGE_INSN(BIN(branchnil));
1823
- COLLECT_USAGE_OPERAND(BIN(branchnil), 0, dst);
1824
- {
1825
- #line 1231 "insns.def"
1826
- if (NIL_P(val)) {
1827
- RUBY_VM_CHECK_INTS(th);
1828
- JUMP(dst);
1829
- }
1830
-
1831
- #line 1832 "vm.inc"
1832
- #undef CURRENT_INSN_branchnil
1833
- #undef INSN_IS_SC
1834
- #undef INSN_LABEL
1835
- #undef LABEL_IS_SC
1836
- END_INSN(branchnil);}}}
1837
1754
  INSN_ENTRY(getinlinecache){
1838
1755
  {
1839
1756
  VALUE val;
@@ -1851,9 +1768,8 @@ INSN_ENTRY(getinlinecache){
1851
1768
  COLLECT_USAGE_OPERAND(BIN(getinlinecache), 0, dst);
1852
1769
  COLLECT_USAGE_OPERAND(BIN(getinlinecache), 1, ic);
1853
1770
  {
1854
- #line 1253 "insns.def"
1855
- if (ic->ic_serial == GET_GLOBAL_CONSTANT_STATE() &&
1856
- (ic->ic_cref == NULL || ic->ic_cref == rb_vm_get_cref(GET_EP()))) {
1771
+ #line 1237 "insns.def"
1772
+ if (ic->ic_serial == GET_GLOBAL_CONSTANT_STATE()) {
1857
1773
  val = ic->ic_value.value;
1858
1774
  JUMP(dst);
1859
1775
  }
@@ -1862,7 +1778,7 @@ INSN_ENTRY(getinlinecache){
1862
1778
  val = Qnil;
1863
1779
  }
1864
1780
 
1865
- #line 1866 "vm.inc"
1781
+ #line 1782 "vm.inc"
1866
1782
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1867
1783
  PUSH(val);
1868
1784
  #undef CURRENT_INSN_getinlinecache
@@ -1885,14 +1801,15 @@ INSN_ENTRY(setinlinecache){
1885
1801
  COLLECT_USAGE_INSN(BIN(setinlinecache));
1886
1802
  COLLECT_USAGE_OPERAND(BIN(setinlinecache), 0, ic);
1887
1803
  {
1888
- #line 1275 "insns.def"
1889
- VM_ASSERT(ic->ic_value.value != Qundef);
1804
+ #line 1258 "insns.def"
1805
+ if (ic->ic_value.value == Qundef) {
1806
+ rb_iseq_add_mark_object(GET_ISEQ(), val);
1807
+ }
1890
1808
  ic->ic_value.value = val;
1891
1809
  ic->ic_serial = GET_GLOBAL_CONSTANT_STATE() - ruby_vm_const_missing_count;
1892
- ic->ic_cref = vm_get_const_key_cref(GET_EP());
1893
1810
  ruby_vm_const_missing_count = 0;
1894
1811
 
1895
- #line 1896 "vm.inc"
1812
+ #line 1813 "vm.inc"
1896
1813
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1897
1814
  PUSH(val);
1898
1815
  #undef CURRENT_INSN_setinlinecache
@@ -1917,7 +1834,7 @@ INSN_ENTRY(once){
1917
1834
  COLLECT_USAGE_OPERAND(BIN(once), 0, iseq);
1918
1835
  COLLECT_USAGE_OPERAND(BIN(once), 1, ic);
1919
1836
  {
1920
- #line 1293 "insns.def"
1837
+ #line 1277 "insns.def"
1921
1838
  union iseq_inline_storage_entry *is = (union iseq_inline_storage_entry *)ic;
1922
1839
 
1923
1840
  #define RUNNING_THREAD_ONCE_DONE ((rb_thread_t *)(0x1))
@@ -1943,7 +1860,7 @@ INSN_ENTRY(once){
1943
1860
  goto retry;
1944
1861
  }
1945
1862
 
1946
- #line 1947 "vm.inc"
1863
+ #line 1864 "vm.inc"
1947
1864
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
1948
1865
  PUSH(val);
1949
1866
  #undef CURRENT_INSN_once
@@ -1968,7 +1885,7 @@ INSN_ENTRY(opt_case_dispatch){
1968
1885
  COLLECT_USAGE_OPERAND(BIN(opt_case_dispatch), 0, hash);
1969
1886
  COLLECT_USAGE_OPERAND(BIN(opt_case_dispatch), 1, else_offset);
1970
1887
  {
1971
- #line 1330 "insns.def"
1888
+ #line 1314 "insns.def"
1972
1889
  switch(TYPE(key)) {
1973
1890
  case T_FLOAT: {
1974
1891
  double ival;
@@ -1976,20 +1893,15 @@ INSN_ENTRY(opt_case_dispatch){
1976
1893
  key = FIXABLE(ival) ? LONG2FIX((long)ival) : rb_dbl2big(ival);
1977
1894
  }
1978
1895
  }
1979
- case T_TRUE: /* fall through */
1980
- case T_FALSE:
1981
- case T_NIL:
1982
- case T_SYMBOL:
1896
+ case T_SYMBOL: /* fall through */
1983
1897
  case T_FIXNUM:
1984
1898
  case T_BIGNUM:
1985
1899
  case T_STRING:
1986
1900
  if (BASIC_OP_UNREDEFINED_P(BOP_EQQ,
1987
1901
  SYMBOL_REDEFINED_OP_FLAG |
1988
- INTEGER_REDEFINED_OP_FLAG |
1902
+ FIXNUM_REDEFINED_OP_FLAG |
1989
1903
  FLOAT_REDEFINED_OP_FLAG |
1990
- NIL_REDEFINED_OP_FLAG |
1991
- TRUE_REDEFINED_OP_FLAG |
1992
- FALSE_REDEFINED_OP_FLAG |
1904
+ BIGNUM_REDEFINED_OP_FLAG |
1993
1905
  STRING_REDEFINED_OP_FLAG)) {
1994
1906
  st_data_t val;
1995
1907
  if (st_lookup(RHASH_TBL_RAW(hash), key, &val)) {
@@ -2004,7 +1916,7 @@ INSN_ENTRY(opt_case_dispatch){
2004
1916
  break;
2005
1917
  }
2006
1918
 
2007
- #line 2008 "vm.inc"
1919
+ #line 1920 "vm.inc"
2008
1920
  #undef CURRENT_INSN_opt_case_dispatch
2009
1921
  #undef INSN_IS_SC
2010
1922
  #undef INSN_LABEL
@@ -2013,12 +1925,11 @@ INSN_ENTRY(opt_case_dispatch){
2013
1925
  INSN_ENTRY(opt_plus){
2014
1926
  {
2015
1927
  VALUE val;
2016
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2017
1928
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2018
1929
  VALUE recv = TOPN(1);
2019
1930
  VALUE obj = TOPN(0);
2020
1931
  DEBUG_ENTER_INSN("opt_plus");
2021
- ADD_PC(1+2);
1932
+ ADD_PC(1+1);
2022
1933
  PREFETCH(GET_PC());
2023
1934
  POPN(2);
2024
1935
  #define CURRENT_INSN_opt_plus 1
@@ -2027,20 +1938,29 @@ INSN_ENTRY(opt_plus){
2027
1938
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2028
1939
  COLLECT_USAGE_INSN(BIN(opt_plus));
2029
1940
  COLLECT_USAGE_OPERAND(BIN(opt_plus), 0, ci);
2030
- COLLECT_USAGE_OPERAND(BIN(opt_plus), 1, cc);
2031
1941
  {
2032
- #line 1379 "insns.def"
1942
+ #line 1358 "insns.def"
2033
1943
  if (FIXNUM_2_P(recv, obj) &&
2034
- BASIC_OP_UNREDEFINED_P(BOP_PLUS,INTEGER_REDEFINED_OP_FLAG)) {
1944
+ BASIC_OP_UNREDEFINED_P(BOP_PLUS,FIXNUM_REDEFINED_OP_FLAG)) {
2035
1945
  /* fixnum + fixnum */
2036
1946
  #ifndef LONG_LONG_VALUE
2037
- VALUE msb = (VALUE)1 << ((sizeof(VALUE) * CHAR_BIT) - 1);
2038
- val = recv - 1 + obj;
2039
- if ((~(recv ^ obj) & (recv ^ val)) & msb) {
2040
- val = rb_int2big((SIGNED_VALUE)((val>>1) | (recv & msb)));
1947
+ val = (recv + (obj & (~1)));
1948
+ if ((~(recv ^ obj) & (recv ^ val)) &
1949
+ ((VALUE)0x01 << ((sizeof(VALUE) * CHAR_BIT) - 1))) {
1950
+ val = rb_big_plus(rb_int2big(FIX2LONG(recv)),
1951
+ rb_int2big(FIX2LONG(obj)));
2041
1952
  }
2042
1953
  #else
2043
- val = LONG2NUM(FIX2LONG(recv) + FIX2LONG(obj));
1954
+ long a, b, c;
1955
+ a = FIX2LONG(recv);
1956
+ b = FIX2LONG(obj);
1957
+ c = a + b;
1958
+ if (FIXABLE(c)) {
1959
+ val = LONG2FIX(c);
1960
+ }
1961
+ else {
1962
+ val = rb_big_plus(rb_int2big(a), rb_int2big(b));
1963
+ }
2044
1964
  #endif
2045
1965
  }
2046
1966
  else if (FLONUM_2_P(recv, obj) &&
@@ -2071,7 +1991,7 @@ INSN_ENTRY(opt_plus){
2071
1991
  CALL_SIMPLE_METHOD(recv);
2072
1992
  }
2073
1993
 
2074
- #line 2075 "vm.inc"
1994
+ #line 1995 "vm.inc"
2075
1995
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2076
1996
  PUSH(val);
2077
1997
  #undef CURRENT_INSN_opt_plus
@@ -2082,12 +2002,11 @@ INSN_ENTRY(opt_plus){
2082
2002
  INSN_ENTRY(opt_minus){
2083
2003
  {
2084
2004
  VALUE val;
2085
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2086
2005
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2087
2006
  VALUE recv = TOPN(1);
2088
2007
  VALUE obj = TOPN(0);
2089
2008
  DEBUG_ENTER_INSN("opt_minus");
2090
- ADD_PC(1+2);
2009
+ ADD_PC(1+1);
2091
2010
  PREFETCH(GET_PC());
2092
2011
  POPN(2);
2093
2012
  #define CURRENT_INSN_opt_minus 1
@@ -2096,17 +2015,22 @@ INSN_ENTRY(opt_minus){
2096
2015
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2097
2016
  COLLECT_USAGE_INSN(BIN(opt_minus));
2098
2017
  COLLECT_USAGE_OPERAND(BIN(opt_minus), 0, ci);
2099
- COLLECT_USAGE_OPERAND(BIN(opt_minus), 1, cc);
2100
2018
  {
2101
- #line 1432 "insns.def"
2019
+ #line 1421 "insns.def"
2102
2020
  if (FIXNUM_2_P(recv, obj) &&
2103
- BASIC_OP_UNREDEFINED_P(BOP_MINUS, INTEGER_REDEFINED_OP_FLAG)) {
2021
+ BASIC_OP_UNREDEFINED_P(BOP_MINUS, FIXNUM_REDEFINED_OP_FLAG)) {
2104
2022
  long a, b, c;
2105
2023
 
2106
2024
  a = FIX2LONG(recv);
2107
2025
  b = FIX2LONG(obj);
2108
2026
  c = a - b;
2109
- val = LONG2NUM(c);
2027
+
2028
+ if (FIXABLE(c)) {
2029
+ val = LONG2FIX(c);
2030
+ }
2031
+ else {
2032
+ val = rb_big_minus(rb_int2big(a), rb_int2big(b));
2033
+ }
2110
2034
  }
2111
2035
  else if (FLONUM_2_P(recv, obj) &&
2112
2036
  BASIC_OP_UNREDEFINED_P(BOP_MINUS, FLOAT_REDEFINED_OP_FLAG)) {
@@ -2129,7 +2053,7 @@ INSN_ENTRY(opt_minus){
2129
2053
  CALL_SIMPLE_METHOD(recv);
2130
2054
  }
2131
2055
 
2132
- #line 2133 "vm.inc"
2056
+ #line 2057 "vm.inc"
2133
2057
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2134
2058
  PUSH(val);
2135
2059
  #undef CURRENT_INSN_opt_minus
@@ -2140,12 +2064,11 @@ INSN_ENTRY(opt_minus){
2140
2064
  INSN_ENTRY(opt_mult){
2141
2065
  {
2142
2066
  VALUE val;
2143
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2144
2067
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2145
2068
  VALUE recv = TOPN(1);
2146
2069
  VALUE obj = TOPN(0);
2147
2070
  DEBUG_ENTER_INSN("opt_mult");
2148
- ADD_PC(1+2);
2071
+ ADD_PC(1+1);
2149
2072
  PREFETCH(GET_PC());
2150
2073
  POPN(2);
2151
2074
  #define CURRENT_INSN_opt_mult 1
@@ -2154,12 +2077,25 @@ INSN_ENTRY(opt_mult){
2154
2077
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2155
2078
  COLLECT_USAGE_INSN(BIN(opt_mult));
2156
2079
  COLLECT_USAGE_OPERAND(BIN(opt_mult), 0, ci);
2157
- COLLECT_USAGE_OPERAND(BIN(opt_mult), 1, cc);
2158
2080
  {
2159
- #line 1474 "insns.def"
2081
+ #line 1469 "insns.def"
2160
2082
  if (FIXNUM_2_P(recv, obj) &&
2161
- BASIC_OP_UNREDEFINED_P(BOP_MULT, INTEGER_REDEFINED_OP_FLAG)) {
2162
- val = rb_fix_mul_fix(recv, obj);
2083
+ BASIC_OP_UNREDEFINED_P(BOP_MULT, FIXNUM_REDEFINED_OP_FLAG)) {
2084
+ long a, b;
2085
+
2086
+ a = FIX2LONG(recv);
2087
+ if (a == 0) {
2088
+ val = recv;
2089
+ }
2090
+ else {
2091
+ b = FIX2LONG(obj);
2092
+ if (MUL_OVERFLOW_FIXNUM_P(a, b)) {
2093
+ val = rb_big_mul(rb_int2big(a), rb_int2big(b));
2094
+ }
2095
+ else {
2096
+ val = LONG2FIX(a * b);
2097
+ }
2098
+ }
2163
2099
  }
2164
2100
  else if (FLONUM_2_P(recv, obj) &&
2165
2101
  BASIC_OP_UNREDEFINED_P(BOP_MULT, FLOAT_REDEFINED_OP_FLAG)) {
@@ -2181,7 +2117,7 @@ INSN_ENTRY(opt_mult){
2181
2117
  CALL_SIMPLE_METHOD(recv);
2182
2118
  }
2183
2119
 
2184
- #line 2185 "vm.inc"
2120
+ #line 2121 "vm.inc"
2185
2121
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2186
2122
  PUSH(val);
2187
2123
  #undef CURRENT_INSN_opt_mult
@@ -2192,12 +2128,11 @@ INSN_ENTRY(opt_mult){
2192
2128
  INSN_ENTRY(opt_div){
2193
2129
  {
2194
2130
  VALUE val;
2195
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2196
2131
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2197
2132
  VALUE recv = TOPN(1);
2198
2133
  VALUE obj = TOPN(0);
2199
2134
  DEBUG_ENTER_INSN("opt_div");
2200
- ADD_PC(1+2);
2135
+ ADD_PC(1+1);
2201
2136
  PREFETCH(GET_PC());
2202
2137
  POPN(2);
2203
2138
  #define CURRENT_INSN_opt_div 1
@@ -2206,13 +2141,38 @@ INSN_ENTRY(opt_div){
2206
2141
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2207
2142
  COLLECT_USAGE_INSN(BIN(opt_div));
2208
2143
  COLLECT_USAGE_OPERAND(BIN(opt_div), 0, ci);
2209
- COLLECT_USAGE_OPERAND(BIN(opt_div), 1, cc);
2210
2144
  {
2211
- #line 1510 "insns.def"
2145
+ #line 1519 "insns.def"
2212
2146
  if (FIXNUM_2_P(recv, obj) &&
2213
- BASIC_OP_UNREDEFINED_P(BOP_DIV, INTEGER_REDEFINED_OP_FLAG)) {
2214
- if (FIX2LONG(obj) == 0) goto INSN_LABEL(normal_dispatch);
2215
- val = rb_fix_div_fix(recv, obj);
2147
+ BASIC_OP_UNREDEFINED_P(BOP_DIV, FIXNUM_REDEFINED_OP_FLAG)) {
2148
+ long x, y, div;
2149
+
2150
+ x = FIX2LONG(recv);
2151
+ y = FIX2LONG(obj);
2152
+ {
2153
+ /* copied from numeric.c#fixdivmod */
2154
+ long mod;
2155
+ if (y == 0)
2156
+ goto INSN_LABEL(normal_dispatch);
2157
+ if (y < 0) {
2158
+ if (x < 0)
2159
+ div = -x / -y;
2160
+ else
2161
+ div = -(x / -y);
2162
+ }
2163
+ else {
2164
+ if (x < 0)
2165
+ div = -(-x / y);
2166
+ else
2167
+ div = x / y;
2168
+ }
2169
+ mod = x - div * y;
2170
+ if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
2171
+ mod += y;
2172
+ div -= 1;
2173
+ }
2174
+ }
2175
+ val = LONG2NUM(div);
2216
2176
  }
2217
2177
  else if (FLONUM_2_P(recv, obj) &&
2218
2178
  BASIC_OP_UNREDEFINED_P(BOP_DIV, FLOAT_REDEFINED_OP_FLAG)) {
@@ -2234,7 +2194,7 @@ INSN_ENTRY(opt_div){
2234
2194
  CALL_SIMPLE_METHOD(recv);
2235
2195
  }
2236
2196
 
2237
- #line 2238 "vm.inc"
2197
+ #line 2198 "vm.inc"
2238
2198
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2239
2199
  PUSH(val);
2240
2200
  #undef CURRENT_INSN_opt_div
@@ -2245,12 +2205,11 @@ INSN_ENTRY(opt_div){
2245
2205
  INSN_ENTRY(opt_mod){
2246
2206
  {
2247
2207
  VALUE val;
2248
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2249
2208
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2250
2209
  VALUE recv = TOPN(1);
2251
2210
  VALUE obj = TOPN(0);
2252
2211
  DEBUG_ENTER_INSN("opt_mod");
2253
- ADD_PC(1+2);
2212
+ ADD_PC(1+1);
2254
2213
  PREFETCH(GET_PC());
2255
2214
  POPN(2);
2256
2215
  #define CURRENT_INSN_opt_mod 1
@@ -2259,13 +2218,42 @@ INSN_ENTRY(opt_mod){
2259
2218
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2260
2219
  COLLECT_USAGE_INSN(BIN(opt_mod));
2261
2220
  COLLECT_USAGE_OPERAND(BIN(opt_mod), 0, ci);
2262
- COLLECT_USAGE_OPERAND(BIN(opt_mod), 1, cc);
2263
2221
  {
2264
- #line 1547 "insns.def"
2222
+ #line 1582 "insns.def"
2265
2223
  if (FIXNUM_2_P(recv, obj) &&
2266
- BASIC_OP_UNREDEFINED_P(BOP_MOD, INTEGER_REDEFINED_OP_FLAG )) {
2267
- if (FIX2LONG(obj) == 0) goto INSN_LABEL(normal_dispatch);
2268
- val = rb_fix_mod_fix(recv, obj);
2224
+ BASIC_OP_UNREDEFINED_P(BOP_MOD, FIXNUM_REDEFINED_OP_FLAG )) {
2225
+ long x, y;
2226
+
2227
+ x = FIX2LONG(recv);
2228
+ y = FIX2LONG(obj);
2229
+ if (x > 0 && y > 0) {
2230
+ val = LONG2FIX(x % y);
2231
+ }
2232
+ else {
2233
+ /* copied from numeric.c#fixdivmod */
2234
+ long div, mod;
2235
+
2236
+ if (y == 0)
2237
+ goto INSN_LABEL(normal_dispatch);
2238
+ if (y < 0) {
2239
+ if (x < 0)
2240
+ div = -x / -y;
2241
+ else
2242
+ div = -(x / -y);
2243
+ }
2244
+ else {
2245
+ if (x < 0)
2246
+ div = -(-x / y);
2247
+ else
2248
+ div = x / y;
2249
+ }
2250
+ mod = x - div * y;
2251
+ if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) {
2252
+ mod += y;
2253
+ div -= 1;
2254
+ }
2255
+ val = LONG2FIX(mod);
2256
+ }
2269
2257
  }
2270
2258
  else if (FLONUM_2_P(recv, obj) &&
2271
2259
  BASIC_OP_UNREDEFINED_P(BOP_MOD, FLOAT_REDEFINED_OP_FLAG)) {
@@ -2287,7 +2275,7 @@ INSN_ENTRY(opt_mod){
2287
2275
  CALL_SIMPLE_METHOD(recv);
2288
2276
  }
2289
2277
 
2290
- #line 2291 "vm.inc"
2278
+ #line 2279 "vm.inc"
2291
2279
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2292
2280
  PUSH(val);
2293
2281
  #undef CURRENT_INSN_opt_mod
@@ -2298,12 +2286,11 @@ INSN_ENTRY(opt_mod){
2298
2286
  INSN_ENTRY(opt_eq){
2299
2287
  {
2300
2288
  VALUE val;
2301
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2302
2289
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2303
2290
  VALUE recv = TOPN(1);
2304
2291
  VALUE obj = TOPN(0);
2305
2292
  DEBUG_ENTER_INSN("opt_eq");
2306
- ADD_PC(1+2);
2293
+ ADD_PC(1+1);
2307
2294
  PREFETCH(GET_PC());
2308
2295
  POPN(2);
2309
2296
  #define CURRENT_INSN_opt_eq 1
@@ -2312,10 +2299,9 @@ INSN_ENTRY(opt_eq){
2312
2299
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2313
2300
  COLLECT_USAGE_INSN(BIN(opt_eq));
2314
2301
  COLLECT_USAGE_OPERAND(BIN(opt_eq), 0, ci);
2315
- COLLECT_USAGE_OPERAND(BIN(opt_eq), 1, cc);
2316
2302
  {
2317
- #line 1584 "insns.def"
2318
- val = opt_eq_func(recv, obj, ci, cc);
2303
+ #line 1649 "insns.def"
2304
+ val = opt_eq_func(recv, obj, ci);
2319
2305
 
2320
2306
  if (val == Qundef) {
2321
2307
  /* other */
@@ -2324,7 +2310,7 @@ INSN_ENTRY(opt_eq){
2324
2310
  CALL_SIMPLE_METHOD(recv);
2325
2311
  }
2326
2312
 
2327
- #line 2328 "vm.inc"
2313
+ #line 2314 "vm.inc"
2328
2314
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2329
2315
  PUSH(val);
2330
2316
  #undef CURRENT_INSN_opt_eq
@@ -2335,14 +2321,12 @@ INSN_ENTRY(opt_eq){
2335
2321
  INSN_ENTRY(opt_neq){
2336
2322
  {
2337
2323
  VALUE val;
2338
- CALL_CACHE cc_eq = (CALL_CACHE)GET_OPERAND(4);
2339
- CALL_INFO ci_eq = (CALL_INFO)GET_OPERAND(3);
2340
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2324
+ CALL_INFO ci_eq = (CALL_INFO)GET_OPERAND(2);
2341
2325
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2342
2326
  VALUE recv = TOPN(1);
2343
2327
  VALUE obj = TOPN(0);
2344
2328
  DEBUG_ENTER_INSN("opt_neq");
2345
- ADD_PC(1+4);
2329
+ ADD_PC(1+2);
2346
2330
  PREFETCH(GET_PC());
2347
2331
  POPN(2);
2348
2332
  #define CURRENT_INSN_opt_neq 1
@@ -2351,18 +2335,15 @@ INSN_ENTRY(opt_neq){
2351
2335
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2352
2336
  COLLECT_USAGE_INSN(BIN(opt_neq));
2353
2337
  COLLECT_USAGE_OPERAND(BIN(opt_neq), 0, ci);
2354
- COLLECT_USAGE_OPERAND(BIN(opt_neq), 1, cc);
2355
- COLLECT_USAGE_OPERAND(BIN(opt_neq), 2, ci_eq);
2356
- COLLECT_USAGE_OPERAND(BIN(opt_neq), 3, cc_eq);
2338
+ COLLECT_USAGE_OPERAND(BIN(opt_neq), 1, ci_eq);
2357
2339
  {
2358
- #line 1605 "insns.def"
2340
+ #line 1670 "insns.def"
2359
2341
  extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2);
2360
- vm_search_method(ci, cc, recv);
2361
-
2342
+ vm_search_method(ci, recv);
2362
2343
  val = Qundef;
2363
2344
 
2364
- if (check_cfunc(cc->me, rb_obj_not_equal)) {
2365
- val = opt_eq_func(recv, obj, ci_eq, cc_eq);
2345
+ if (check_cfunc(ci->me, rb_obj_not_equal)) {
2346
+ val = opt_eq_func(recv, obj, ci_eq);
2366
2347
 
2367
2348
  if (val != Qundef) {
2368
2349
  val = RTEST(val) ? Qfalse : Qtrue;
@@ -2376,7 +2357,7 @@ INSN_ENTRY(opt_neq){
2376
2357
  CALL_SIMPLE_METHOD(recv);
2377
2358
  }
2378
2359
 
2379
- #line 2380 "vm.inc"
2360
+ #line 2361 "vm.inc"
2380
2361
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2381
2362
  PUSH(val);
2382
2363
  #undef CURRENT_INSN_opt_neq
@@ -2387,12 +2368,11 @@ INSN_ENTRY(opt_neq){
2387
2368
  INSN_ENTRY(opt_lt){
2388
2369
  {
2389
2370
  VALUE val;
2390
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2391
2371
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2392
2372
  VALUE recv = TOPN(1);
2393
2373
  VALUE obj = TOPN(0);
2394
2374
  DEBUG_ENTER_INSN("opt_lt");
2395
- ADD_PC(1+2);
2375
+ ADD_PC(1+1);
2396
2376
  PREFETCH(GET_PC());
2397
2377
  POPN(2);
2398
2378
  #define CURRENT_INSN_opt_lt 1
@@ -2401,11 +2381,10 @@ INSN_ENTRY(opt_lt){
2401
2381
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2402
2382
  COLLECT_USAGE_INSN(BIN(opt_lt));
2403
2383
  COLLECT_USAGE_OPERAND(BIN(opt_lt), 0, ci);
2404
- COLLECT_USAGE_OPERAND(BIN(opt_lt), 1, cc);
2405
2384
  {
2406
- #line 1637 "insns.def"
2385
+ #line 1701 "insns.def"
2407
2386
  if (FIXNUM_2_P(recv, obj) &&
2408
- BASIC_OP_UNREDEFINED_P(BOP_LT, INTEGER_REDEFINED_OP_FLAG)) {
2387
+ BASIC_OP_UNREDEFINED_P(BOP_LT, FIXNUM_REDEFINED_OP_FLAG)) {
2409
2388
  SIGNED_VALUE a = recv, b = obj;
2410
2389
 
2411
2390
  if (a < b) {
@@ -2436,7 +2415,7 @@ INSN_ENTRY(opt_lt){
2436
2415
  CALL_SIMPLE_METHOD(recv);
2437
2416
  }
2438
2417
 
2439
- #line 2440 "vm.inc"
2418
+ #line 2419 "vm.inc"
2440
2419
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2441
2420
  PUSH(val);
2442
2421
  #undef CURRENT_INSN_opt_lt
@@ -2447,12 +2426,11 @@ INSN_ENTRY(opt_lt){
2447
2426
  INSN_ENTRY(opt_le){
2448
2427
  {
2449
2428
  VALUE val;
2450
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2451
2429
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2452
2430
  VALUE recv = TOPN(1);
2453
2431
  VALUE obj = TOPN(0);
2454
2432
  DEBUG_ENTER_INSN("opt_le");
2455
- ADD_PC(1+2);
2433
+ ADD_PC(1+1);
2456
2434
  PREFETCH(GET_PC());
2457
2435
  POPN(2);
2458
2436
  #define CURRENT_INSN_opt_le 1
@@ -2461,11 +2439,10 @@ INSN_ENTRY(opt_le){
2461
2439
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2462
2440
  COLLECT_USAGE_INSN(BIN(opt_le));
2463
2441
  COLLECT_USAGE_OPERAND(BIN(opt_le), 0, ci);
2464
- COLLECT_USAGE_OPERAND(BIN(opt_le), 1, cc);
2465
2442
  {
2466
- #line 1681 "insns.def"
2443
+ #line 1745 "insns.def"
2467
2444
  if (FIXNUM_2_P(recv, obj) &&
2468
- BASIC_OP_UNREDEFINED_P(BOP_LE, INTEGER_REDEFINED_OP_FLAG)) {
2445
+ BASIC_OP_UNREDEFINED_P(BOP_LE, FIXNUM_REDEFINED_OP_FLAG)) {
2469
2446
  SIGNED_VALUE a = recv, b = obj;
2470
2447
 
2471
2448
  if (a <= b) {
@@ -2487,7 +2464,7 @@ INSN_ENTRY(opt_le){
2487
2464
  CALL_SIMPLE_METHOD(recv);
2488
2465
  }
2489
2466
 
2490
- #line 2491 "vm.inc"
2467
+ #line 2468 "vm.inc"
2491
2468
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2492
2469
  PUSH(val);
2493
2470
  #undef CURRENT_INSN_opt_le
@@ -2498,12 +2475,11 @@ INSN_ENTRY(opt_le){
2498
2475
  INSN_ENTRY(opt_gt){
2499
2476
  {
2500
2477
  VALUE val;
2501
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2502
2478
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2503
2479
  VALUE recv = TOPN(1);
2504
2480
  VALUE obj = TOPN(0);
2505
2481
  DEBUG_ENTER_INSN("opt_gt");
2506
- ADD_PC(1+2);
2482
+ ADD_PC(1+1);
2507
2483
  PREFETCH(GET_PC());
2508
2484
  POPN(2);
2509
2485
  #define CURRENT_INSN_opt_gt 1
@@ -2512,11 +2488,10 @@ INSN_ENTRY(opt_gt){
2512
2488
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2513
2489
  COLLECT_USAGE_INSN(BIN(opt_gt));
2514
2490
  COLLECT_USAGE_OPERAND(BIN(opt_gt), 0, ci);
2515
- COLLECT_USAGE_OPERAND(BIN(opt_gt), 1, cc);
2516
2491
  {
2517
- #line 1716 "insns.def"
2492
+ #line 1780 "insns.def"
2518
2493
  if (FIXNUM_2_P(recv, obj) &&
2519
- BASIC_OP_UNREDEFINED_P(BOP_GT, INTEGER_REDEFINED_OP_FLAG)) {
2494
+ BASIC_OP_UNREDEFINED_P(BOP_GT, FIXNUM_REDEFINED_OP_FLAG)) {
2520
2495
  SIGNED_VALUE a = recv, b = obj;
2521
2496
 
2522
2497
  if (a > b) {
@@ -2547,7 +2522,7 @@ INSN_ENTRY(opt_gt){
2547
2522
  CALL_SIMPLE_METHOD(recv);
2548
2523
  }
2549
2524
 
2550
- #line 2551 "vm.inc"
2525
+ #line 2526 "vm.inc"
2551
2526
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2552
2527
  PUSH(val);
2553
2528
  #undef CURRENT_INSN_opt_gt
@@ -2558,12 +2533,11 @@ INSN_ENTRY(opt_gt){
2558
2533
  INSN_ENTRY(opt_ge){
2559
2534
  {
2560
2535
  VALUE val;
2561
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2562
2536
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2563
2537
  VALUE recv = TOPN(1);
2564
2538
  VALUE obj = TOPN(0);
2565
2539
  DEBUG_ENTER_INSN("opt_ge");
2566
- ADD_PC(1+2);
2540
+ ADD_PC(1+1);
2567
2541
  PREFETCH(GET_PC());
2568
2542
  POPN(2);
2569
2543
  #define CURRENT_INSN_opt_ge 1
@@ -2572,11 +2546,10 @@ INSN_ENTRY(opt_ge){
2572
2546
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2573
2547
  COLLECT_USAGE_INSN(BIN(opt_ge));
2574
2548
  COLLECT_USAGE_OPERAND(BIN(opt_ge), 0, ci);
2575
- COLLECT_USAGE_OPERAND(BIN(opt_ge), 1, cc);
2576
2549
  {
2577
- #line 1760 "insns.def"
2550
+ #line 1824 "insns.def"
2578
2551
  if (FIXNUM_2_P(recv, obj) &&
2579
- BASIC_OP_UNREDEFINED_P(BOP_GE, INTEGER_REDEFINED_OP_FLAG)) {
2552
+ BASIC_OP_UNREDEFINED_P(BOP_GE, FIXNUM_REDEFINED_OP_FLAG)) {
2580
2553
  SIGNED_VALUE a = recv, b = obj;
2581
2554
 
2582
2555
  if (a >= b) {
@@ -2597,7 +2570,7 @@ INSN_ENTRY(opt_ge){
2597
2570
  CALL_SIMPLE_METHOD(recv);
2598
2571
  }
2599
2572
 
2600
- #line 2601 "vm.inc"
2573
+ #line 2574 "vm.inc"
2601
2574
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2602
2575
  PUSH(val);
2603
2576
  #undef CURRENT_INSN_opt_ge
@@ -2608,12 +2581,11 @@ INSN_ENTRY(opt_ge){
2608
2581
  INSN_ENTRY(opt_ltlt){
2609
2582
  {
2610
2583
  VALUE val;
2611
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2612
2584
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2613
2585
  VALUE recv = TOPN(1);
2614
2586
  VALUE obj = TOPN(0);
2615
2587
  DEBUG_ENTER_INSN("opt_ltlt");
2616
- ADD_PC(1+2);
2588
+ ADD_PC(1+1);
2617
2589
  PREFETCH(GET_PC());
2618
2590
  POPN(2);
2619
2591
  #define CURRENT_INSN_opt_ltlt 1
@@ -2622,9 +2594,8 @@ INSN_ENTRY(opt_ltlt){
2622
2594
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2623
2595
  COLLECT_USAGE_INSN(BIN(opt_ltlt));
2624
2596
  COLLECT_USAGE_OPERAND(BIN(opt_ltlt), 0, ci);
2625
- COLLECT_USAGE_OPERAND(BIN(opt_ltlt), 1, cc);
2626
2597
  {
2627
- #line 1794 "insns.def"
2598
+ #line 1858 "insns.def"
2628
2599
  if (!SPECIAL_CONST_P(recv)) {
2629
2600
  if (RBASIC_CLASS(recv) == rb_cString &&
2630
2601
  BASIC_OP_UNREDEFINED_P(BOP_LTLT, STRING_REDEFINED_OP_FLAG)) {
@@ -2645,7 +2616,7 @@ INSN_ENTRY(opt_ltlt){
2645
2616
  CALL_SIMPLE_METHOD(recv);
2646
2617
  }
2647
2618
 
2648
- #line 2649 "vm.inc"
2619
+ #line 2620 "vm.inc"
2649
2620
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2650
2621
  PUSH(val);
2651
2622
  #undef CURRENT_INSN_opt_ltlt
@@ -2656,12 +2627,11 @@ INSN_ENTRY(opt_ltlt){
2656
2627
  INSN_ENTRY(opt_aref){
2657
2628
  {
2658
2629
  VALUE val;
2659
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2660
2630
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2661
2631
  VALUE recv = TOPN(1);
2662
2632
  VALUE obj = TOPN(0);
2663
2633
  DEBUG_ENTER_INSN("opt_aref");
2664
- ADD_PC(1+2);
2634
+ ADD_PC(1+1);
2665
2635
  PREFETCH(GET_PC());
2666
2636
  POPN(2);
2667
2637
  #define CURRENT_INSN_opt_aref 1
@@ -2670,9 +2640,8 @@ INSN_ENTRY(opt_aref){
2670
2640
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2671
2641
  COLLECT_USAGE_INSN(BIN(opt_aref));
2672
2642
  COLLECT_USAGE_OPERAND(BIN(opt_aref), 0, ci);
2673
- COLLECT_USAGE_OPERAND(BIN(opt_aref), 1, cc);
2674
2643
  {
2675
- #line 1826 "insns.def"
2644
+ #line 1890 "insns.def"
2676
2645
  if (!SPECIAL_CONST_P(recv)) {
2677
2646
  if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG) && FIXNUM_P(obj)) {
2678
2647
  val = rb_ary_entry(recv, FIX2LONG(obj));
@@ -2691,7 +2660,7 @@ INSN_ENTRY(opt_aref){
2691
2660
  CALL_SIMPLE_METHOD(recv);
2692
2661
  }
2693
2662
 
2694
- #line 2695 "vm.inc"
2663
+ #line 2664 "vm.inc"
2695
2664
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2696
2665
  PUSH(val);
2697
2666
  #undef CURRENT_INSN_opt_aref
@@ -2702,13 +2671,12 @@ INSN_ENTRY(opt_aref){
2702
2671
  INSN_ENTRY(opt_aset){
2703
2672
  {
2704
2673
  VALUE val;
2705
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2706
2674
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2707
2675
  VALUE recv = TOPN(2);
2708
2676
  VALUE obj = TOPN(1);
2709
2677
  VALUE set = TOPN(0);
2710
2678
  DEBUG_ENTER_INSN("opt_aset");
2711
- ADD_PC(1+2);
2679
+ ADD_PC(1+1);
2712
2680
  PREFETCH(GET_PC());
2713
2681
  POPN(3);
2714
2682
  #define CURRENT_INSN_opt_aset 1
@@ -2717,9 +2685,8 @@ INSN_ENTRY(opt_aset){
2717
2685
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2718
2686
  COLLECT_USAGE_INSN(BIN(opt_aset));
2719
2687
  COLLECT_USAGE_OPERAND(BIN(opt_aset), 0, ci);
2720
- COLLECT_USAGE_OPERAND(BIN(opt_aset), 1, cc);
2721
2688
  {
2722
- #line 1856 "insns.def"
2689
+ #line 1920 "insns.def"
2723
2690
  if (!SPECIAL_CONST_P(recv)) {
2724
2691
  if (RBASIC_CLASS(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_ASET, ARRAY_REDEFINED_OP_FLAG) && FIXNUM_P(obj)) {
2725
2692
  rb_ary_store(recv, FIX2LONG(obj), set);
@@ -2741,7 +2708,7 @@ INSN_ENTRY(opt_aset){
2741
2708
  CALL_SIMPLE_METHOD(recv);
2742
2709
  }
2743
2710
 
2744
- #line 2745 "vm.inc"
2711
+ #line 2712 "vm.inc"
2745
2712
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2746
2713
  PUSH(val);
2747
2714
  #undef CURRENT_INSN_opt_aset
@@ -2751,13 +2718,12 @@ INSN_ENTRY(opt_aset){
2751
2718
  END_INSN(opt_aset);}}}
2752
2719
  INSN_ENTRY(opt_aset_with){
2753
2720
  {
2754
- VALUE key = (VALUE)GET_OPERAND(3);
2755
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2721
+ VALUE key = (VALUE)GET_OPERAND(2);
2756
2722
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2757
2723
  VALUE recv = TOPN(1);
2758
2724
  VALUE val = TOPN(0);
2759
2725
  DEBUG_ENTER_INSN("opt_aset_with");
2760
- ADD_PC(1+3);
2726
+ ADD_PC(1+2);
2761
2727
  PREFETCH(GET_PC());
2762
2728
  POPN(2);
2763
2729
  #define CURRENT_INSN_opt_aset_with 1
@@ -2766,11 +2732,12 @@ INSN_ENTRY(opt_aset_with){
2766
2732
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2767
2733
  COLLECT_USAGE_INSN(BIN(opt_aset_with));
2768
2734
  COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 0, ci);
2769
- COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 1, cc);
2770
- COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 2, key);
2735
+ COLLECT_USAGE_OPERAND(BIN(opt_aset_with), 1, key);
2771
2736
  {
2772
- #line 1889 "insns.def"
2773
- if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG)) {
2737
+ #line 1953 "insns.def"
2738
+ if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash &&
2739
+ BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG) &&
2740
+ rb_hash_compare_by_id_p(recv) == Qfalse) {
2774
2741
  rb_hash_aset(recv, key, val);
2775
2742
  }
2776
2743
  else {
@@ -2780,7 +2747,7 @@ INSN_ENTRY(opt_aset_with){
2780
2747
  CALL_SIMPLE_METHOD(recv);
2781
2748
  }
2782
2749
 
2783
- #line 2784 "vm.inc"
2750
+ #line 2751 "vm.inc"
2784
2751
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2785
2752
  PUSH(val);
2786
2753
  #undef CURRENT_INSN_opt_aset_with
@@ -2791,12 +2758,11 @@ INSN_ENTRY(opt_aset_with){
2791
2758
  INSN_ENTRY(opt_aref_with){
2792
2759
  {
2793
2760
  VALUE val;
2794
- VALUE key = (VALUE)GET_OPERAND(3);
2795
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2761
+ VALUE key = (VALUE)GET_OPERAND(2);
2796
2762
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2797
2763
  VALUE recv = TOPN(0);
2798
2764
  DEBUG_ENTER_INSN("opt_aref_with");
2799
- ADD_PC(1+3);
2765
+ ADD_PC(1+2);
2800
2766
  PREFETCH(GET_PC());
2801
2767
  POPN(1);
2802
2768
  #define CURRENT_INSN_opt_aref_with 1
@@ -2805,11 +2771,12 @@ INSN_ENTRY(opt_aref_with){
2805
2771
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2806
2772
  COLLECT_USAGE_INSN(BIN(opt_aref_with));
2807
2773
  COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 0, ci);
2808
- COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 1, cc);
2809
- COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 2, key);
2774
+ COLLECT_USAGE_OPERAND(BIN(opt_aref_with), 1, key);
2810
2775
  {
2811
- #line 1911 "insns.def"
2812
- if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) {
2776
+ #line 1977 "insns.def"
2777
+ if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash &&
2778
+ BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG) &&
2779
+ rb_hash_compare_by_id_p(recv) == Qfalse) {
2813
2780
  val = rb_hash_aref(recv, key);
2814
2781
  }
2815
2782
  else {
@@ -2818,7 +2785,7 @@ INSN_ENTRY(opt_aref_with){
2818
2785
  CALL_SIMPLE_METHOD(recv);
2819
2786
  }
2820
2787
 
2821
- #line 2822 "vm.inc"
2788
+ #line 2789 "vm.inc"
2822
2789
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2823
2790
  PUSH(val);
2824
2791
  #undef CURRENT_INSN_opt_aref_with
@@ -2829,11 +2796,10 @@ INSN_ENTRY(opt_aref_with){
2829
2796
  INSN_ENTRY(opt_length){
2830
2797
  {
2831
2798
  VALUE val;
2832
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2833
2799
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2834
2800
  VALUE recv = TOPN(0);
2835
2801
  DEBUG_ENTER_INSN("opt_length");
2836
- ADD_PC(1+2);
2802
+ ADD_PC(1+1);
2837
2803
  PREFETCH(GET_PC());
2838
2804
  POPN(1);
2839
2805
  #define CURRENT_INSN_opt_length 1
@@ -2842,9 +2808,8 @@ INSN_ENTRY(opt_length){
2842
2808
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2843
2809
  COLLECT_USAGE_INSN(BIN(opt_length));
2844
2810
  COLLECT_USAGE_OPERAND(BIN(opt_length), 0, ci);
2845
- COLLECT_USAGE_OPERAND(BIN(opt_length), 1, cc);
2846
2811
  {
2847
- #line 1932 "insns.def"
2812
+ #line 2000 "insns.def"
2848
2813
  if (!SPECIAL_CONST_P(recv)) {
2849
2814
  if (RBASIC_CLASS(recv) == rb_cString &&
2850
2815
  BASIC_OP_UNREDEFINED_P(BOP_LENGTH, STRING_REDEFINED_OP_FLAG)) {
@@ -2868,7 +2833,7 @@ INSN_ENTRY(opt_length){
2868
2833
  CALL_SIMPLE_METHOD(recv);
2869
2834
  }
2870
2835
 
2871
- #line 2872 "vm.inc"
2836
+ #line 2837 "vm.inc"
2872
2837
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2873
2838
  PUSH(val);
2874
2839
  #undef CURRENT_INSN_opt_length
@@ -2879,11 +2844,10 @@ INSN_ENTRY(opt_length){
2879
2844
  INSN_ENTRY(opt_size){
2880
2845
  {
2881
2846
  VALUE val;
2882
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2883
2847
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2884
2848
  VALUE recv = TOPN(0);
2885
2849
  DEBUG_ENTER_INSN("opt_size");
2886
- ADD_PC(1+2);
2850
+ ADD_PC(1+1);
2887
2851
  PREFETCH(GET_PC());
2888
2852
  POPN(1);
2889
2853
  #define CURRENT_INSN_opt_size 1
@@ -2892,9 +2856,8 @@ INSN_ENTRY(opt_size){
2892
2856
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2893
2857
  COLLECT_USAGE_INSN(BIN(opt_size));
2894
2858
  COLLECT_USAGE_OPERAND(BIN(opt_size), 0, ci);
2895
- COLLECT_USAGE_OPERAND(BIN(opt_size), 1, cc);
2896
2859
  {
2897
- #line 1967 "insns.def"
2860
+ #line 2035 "insns.def"
2898
2861
  if (!SPECIAL_CONST_P(recv)) {
2899
2862
  if (RBASIC_CLASS(recv) == rb_cString &&
2900
2863
  BASIC_OP_UNREDEFINED_P(BOP_SIZE, STRING_REDEFINED_OP_FLAG)) {
@@ -2918,7 +2881,7 @@ INSN_ENTRY(opt_size){
2918
2881
  CALL_SIMPLE_METHOD(recv);
2919
2882
  }
2920
2883
 
2921
- #line 2922 "vm.inc"
2884
+ #line 2885 "vm.inc"
2922
2885
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2923
2886
  PUSH(val);
2924
2887
  #undef CURRENT_INSN_opt_size
@@ -2929,11 +2892,10 @@ INSN_ENTRY(opt_size){
2929
2892
  INSN_ENTRY(opt_empty_p){
2930
2893
  {
2931
2894
  VALUE val;
2932
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2933
2895
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2934
2896
  VALUE recv = TOPN(0);
2935
2897
  DEBUG_ENTER_INSN("opt_empty_p");
2936
- ADD_PC(1+2);
2898
+ ADD_PC(1+1);
2937
2899
  PREFETCH(GET_PC());
2938
2900
  POPN(1);
2939
2901
  #define CURRENT_INSN_opt_empty_p 1
@@ -2942,9 +2904,8 @@ INSN_ENTRY(opt_empty_p){
2942
2904
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2943
2905
  COLLECT_USAGE_INSN(BIN(opt_empty_p));
2944
2906
  COLLECT_USAGE_OPERAND(BIN(opt_empty_p), 0, ci);
2945
- COLLECT_USAGE_OPERAND(BIN(opt_empty_p), 1, cc);
2946
2907
  {
2947
- #line 2002 "insns.def"
2908
+ #line 2070 "insns.def"
2948
2909
  if (!SPECIAL_CONST_P(recv)) {
2949
2910
  if (RBASIC_CLASS(recv) == rb_cString &&
2950
2911
  BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, STRING_REDEFINED_OP_FLAG)) {
@@ -2971,7 +2932,7 @@ INSN_ENTRY(opt_empty_p){
2971
2932
  CALL_SIMPLE_METHOD(recv);
2972
2933
  }
2973
2934
 
2974
- #line 2975 "vm.inc"
2935
+ #line 2936 "vm.inc"
2975
2936
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
2976
2937
  PUSH(val);
2977
2938
  #undef CURRENT_INSN_opt_empty_p
@@ -2982,11 +2943,10 @@ INSN_ENTRY(opt_empty_p){
2982
2943
  INSN_ENTRY(opt_succ){
2983
2944
  {
2984
2945
  VALUE val;
2985
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
2986
2946
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
2987
2947
  VALUE recv = TOPN(0);
2988
2948
  DEBUG_ENTER_INSN("opt_succ");
2989
- ADD_PC(1+2);
2949
+ ADD_PC(1+1);
2990
2950
  PREFETCH(GET_PC());
2991
2951
  POPN(1);
2992
2952
  #define CURRENT_INSN_opt_succ 1
@@ -2995,18 +2955,17 @@ INSN_ENTRY(opt_succ){
2995
2955
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
2996
2956
  COLLECT_USAGE_INSN(BIN(opt_succ));
2997
2957
  COLLECT_USAGE_OPERAND(BIN(opt_succ), 0, ci);
2998
- COLLECT_USAGE_OPERAND(BIN(opt_succ), 1, cc);
2999
2958
  {
3000
- #line 2040 "insns.def"
2959
+ #line 2108 "insns.def"
3001
2960
  if (SPECIAL_CONST_P(recv)) {
3002
2961
  if (FIXNUM_P(recv) &&
3003
- BASIC_OP_UNREDEFINED_P(BOP_SUCC, INTEGER_REDEFINED_OP_FLAG)) {
2962
+ BASIC_OP_UNREDEFINED_P(BOP_SUCC, FIXNUM_REDEFINED_OP_FLAG)) {
2963
+ const VALUE obj = INT2FIX(1);
3004
2964
  /* fixnum + INT2FIX(1) */
3005
- if (recv != LONG2FIX(FIXNUM_MAX)) {
3006
- val = recv - 1 + INT2FIX(1);
3007
- }
3008
- else {
3009
- val = LONG2NUM(FIXNUM_MAX + 1);
2965
+ val = (recv + (obj & (~1)));
2966
+ if ((~(recv ^ obj) & (recv ^ val)) & ((unsigned long)LONG_MAX + 1)) {
2967
+ val = rb_big_plus(rb_int2big(FIX2LONG(recv)),
2968
+ rb_int2big(FIX2LONG(obj)));
3010
2969
  }
3011
2970
  }
3012
2971
  else {
@@ -3018,8 +2977,7 @@ INSN_ENTRY(opt_succ){
3018
2977
  BASIC_OP_UNREDEFINED_P(BOP_SUCC, STRING_REDEFINED_OP_FLAG)) {
3019
2978
  val = rb_str_succ(recv);
3020
2979
  }
3021
- else
3022
- {
2980
+ else {
3023
2981
  goto INSN_LABEL(normal_dispatch);
3024
2982
  }
3025
2983
  }
@@ -3029,7 +2987,7 @@ INSN_ENTRY(opt_succ){
3029
2987
  CALL_SIMPLE_METHOD(recv);
3030
2988
  }
3031
2989
 
3032
- #line 3033 "vm.inc"
2990
+ #line 2991 "vm.inc"
3033
2991
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3034
2992
  PUSH(val);
3035
2993
  #undef CURRENT_INSN_opt_succ
@@ -3040,11 +2998,10 @@ INSN_ENTRY(opt_succ){
3040
2998
  INSN_ENTRY(opt_not){
3041
2999
  {
3042
3000
  VALUE val;
3043
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3044
3001
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3045
3002
  VALUE recv = TOPN(0);
3046
3003
  DEBUG_ENTER_INSN("opt_not");
3047
- ADD_PC(1+2);
3004
+ ADD_PC(1+1);
3048
3005
  PREFETCH(GET_PC());
3049
3006
  POPN(1);
3050
3007
  #define CURRENT_INSN_opt_not 1
@@ -3053,12 +3010,12 @@ INSN_ENTRY(opt_not){
3053
3010
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3054
3011
  COLLECT_USAGE_INSN(BIN(opt_not));
3055
3012
  COLLECT_USAGE_OPERAND(BIN(opt_not), 0, ci);
3056
- COLLECT_USAGE_OPERAND(BIN(opt_not), 1, cc);
3057
3013
  {
3058
- #line 2083 "insns.def"
3059
- vm_search_method(ci, cc, recv);
3014
+ #line 2150 "insns.def"
3015
+ extern VALUE rb_obj_not(VALUE obj);
3016
+ vm_search_method(ci, recv);
3060
3017
 
3061
- if (check_cfunc(cc->me, rb_obj_not)) {
3018
+ if (check_cfunc(ci->me, rb_obj_not)) {
3062
3019
  val = RTEST(recv) ? Qfalse : Qtrue;
3063
3020
  }
3064
3021
  else {
@@ -3066,7 +3023,7 @@ INSN_ENTRY(opt_not){
3066
3023
  CALL_SIMPLE_METHOD(recv);
3067
3024
  }
3068
3025
 
3069
- #line 3070 "vm.inc"
3026
+ #line 3027 "vm.inc"
3070
3027
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3071
3028
  PUSH(val);
3072
3029
  #undef CURRENT_INSN_opt_not
@@ -3090,7 +3047,7 @@ INSN_ENTRY(opt_regexpmatch1){
3090
3047
  COLLECT_USAGE_INSN(BIN(opt_regexpmatch1));
3091
3048
  COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch1), 0, r);
3092
3049
  {
3093
- #line 2106 "insns.def"
3050
+ #line 2174 "insns.def"
3094
3051
  if (BASIC_OP_UNREDEFINED_P(BOP_MATCH, REGEXP_REDEFINED_OP_FLAG)) {
3095
3052
  val = rb_reg_match(r, obj);
3096
3053
  }
@@ -3098,7 +3055,7 @@ INSN_ENTRY(opt_regexpmatch1){
3098
3055
  val = rb_funcall(r, idEqTilde, 1, obj);
3099
3056
  }
3100
3057
 
3101
- #line 3102 "vm.inc"
3058
+ #line 3059 "vm.inc"
3102
3059
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3103
3060
  PUSH(val);
3104
3061
  #undef CURRENT_INSN_opt_regexpmatch1
@@ -3109,12 +3066,11 @@ INSN_ENTRY(opt_regexpmatch1){
3109
3066
  INSN_ENTRY(opt_regexpmatch2){
3110
3067
  {
3111
3068
  VALUE val;
3112
- CALL_CACHE cc = (CALL_CACHE)GET_OPERAND(2);
3113
3069
  CALL_INFO ci = (CALL_INFO)GET_OPERAND(1);
3114
3070
  VALUE obj2 = TOPN(1);
3115
3071
  VALUE obj1 = TOPN(0);
3116
3072
  DEBUG_ENTER_INSN("opt_regexpmatch2");
3117
- ADD_PC(1+2);
3073
+ ADD_PC(1+1);
3118
3074
  PREFETCH(GET_PC());
3119
3075
  POPN(2);
3120
3076
  #define CURRENT_INSN_opt_regexpmatch2 1
@@ -3123,9 +3079,8 @@ INSN_ENTRY(opt_regexpmatch2){
3123
3079
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3124
3080
  COLLECT_USAGE_INSN(BIN(opt_regexpmatch2));
3125
3081
  COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch2), 0, ci);
3126
- COLLECT_USAGE_OPERAND(BIN(opt_regexpmatch2), 1, cc);
3127
3082
  {
3128
- #line 2125 "insns.def"
3083
+ #line 2193 "insns.def"
3129
3084
  if (CLASS_OF(obj2) == rb_cString &&
3130
3085
  BASIC_OP_UNREDEFINED_P(BOP_MATCH, STRING_REDEFINED_OP_FLAG)) {
3131
3086
  val = rb_reg_match(obj1, obj2);
@@ -3136,7 +3091,7 @@ INSN_ENTRY(opt_regexpmatch2){
3136
3091
  CALL_SIMPLE_METHOD(obj2);
3137
3092
  }
3138
3093
 
3139
- #line 3140 "vm.inc"
3094
+ #line 3095 "vm.inc"
3140
3095
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3141
3096
  PUSH(val);
3142
3097
  #undef CURRENT_INSN_opt_regexpmatch2
@@ -3158,7 +3113,7 @@ INSN_ENTRY(opt_call_c_function){
3158
3113
  COLLECT_USAGE_INSN(BIN(opt_call_c_function));
3159
3114
  COLLECT_USAGE_OPERAND(BIN(opt_call_c_function), 0, funcptr);
3160
3115
  {
3161
- #line 2147 "insns.def"
3116
+ #line 2215 "insns.def"
3162
3117
  reg_cfp = (funcptr)(th, reg_cfp);
3163
3118
 
3164
3119
  if (reg_cfp == 0) {
@@ -3170,7 +3125,7 @@ INSN_ENTRY(opt_call_c_function){
3170
3125
  RESTORE_REGS();
3171
3126
  NEXT_INSN();
3172
3127
 
3173
- #line 3174 "vm.inc"
3128
+ #line 3129 "vm.inc"
3174
3129
  #undef CURRENT_INSN_opt_call_c_function
3175
3130
  #undef INSN_IS_SC
3176
3131
  #undef INSN_LABEL
@@ -3190,10 +3145,10 @@ INSN_ENTRY(bitblt){
3190
3145
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3191
3146
  COLLECT_USAGE_INSN(BIN(bitblt));
3192
3147
  {
3193
- #line 2170 "insns.def"
3148
+ #line 2238 "insns.def"
3194
3149
  ret = rb_str_new2("a bit of bacon, lettuce and tomato");
3195
3150
 
3196
- #line 3197 "vm.inc"
3151
+ #line 3152 "vm.inc"
3197
3152
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3198
3153
  PUSH(ret);
3199
3154
  #undef CURRENT_INSN_bitblt
@@ -3215,10 +3170,10 @@ INSN_ENTRY(answer){
3215
3170
  #define LABEL_IS_SC(lab) LABEL_##lab##_##t
3216
3171
  COLLECT_USAGE_INSN(BIN(answer));
3217
3172
  {
3218
- #line 2184 "insns.def"
3173
+ #line 2252 "insns.def"
3219
3174
  ret = INT2FIX(42);
3220
3175
 
3221
- #line 3222 "vm.inc"
3176
+ #line 3177 "vm.inc"
3222
3177
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3223
3178
  PUSH(ret);
3224
3179
  #undef CURRENT_INSN_answer
@@ -3244,7 +3199,7 @@ INSN_ENTRY(getlocal_OP__WC__0){
3244
3199
  {
3245
3200
  #line 60 "insns.def"
3246
3201
  int i, lev = (int)level;
3247
- const VALUE *ep = GET_EP();
3202
+ VALUE *ep = GET_EP();
3248
3203
 
3249
3204
  /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3250
3205
  for (i = 0; i < lev; i++) {
@@ -3252,7 +3207,7 @@ INSN_ENTRY(getlocal_OP__WC__0){
3252
3207
  }
3253
3208
  val = *(ep - idx);
3254
3209
 
3255
- #line 3256 "vm.inc"
3210
+ #line 3211 "vm.inc"
3256
3211
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3257
3212
  PUSH(val);
3258
3213
  #undef level
@@ -3279,7 +3234,7 @@ INSN_ENTRY(getlocal_OP__WC__1){
3279
3234
  {
3280
3235
  #line 60 "insns.def"
3281
3236
  int i, lev = (int)level;
3282
- const VALUE *ep = GET_EP();
3237
+ VALUE *ep = GET_EP();
3283
3238
 
3284
3239
  /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3285
3240
  for (i = 0; i < lev; i++) {
@@ -3287,7 +3242,7 @@ INSN_ENTRY(getlocal_OP__WC__1){
3287
3242
  }
3288
3243
  val = *(ep - idx);
3289
3244
 
3290
- #line 3291 "vm.inc"
3245
+ #line 3246 "vm.inc"
3291
3246
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3292
3247
  PUSH(val);
3293
3248
  #undef level
@@ -3314,15 +3269,15 @@ INSN_ENTRY(setlocal_OP__WC__0){
3314
3269
  {
3315
3270
  #line 83 "insns.def"
3316
3271
  int i, lev = (int)level;
3317
- const VALUE *ep = GET_EP();
3272
+ VALUE *ep = GET_EP();
3318
3273
 
3319
3274
  /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3320
3275
  for (i = 0; i < lev; i++) {
3321
3276
  ep = GET_PREV_EP(ep);
3322
3277
  }
3323
- vm_env_write(ep, -(int)idx, val);
3278
+ *(ep - idx) = val;
3324
3279
 
3325
- #line 3326 "vm.inc"
3280
+ #line 3281 "vm.inc"
3326
3281
  #undef level
3327
3282
  #undef CURRENT_INSN_setlocal_OP__WC__0
3328
3283
  #undef INSN_IS_SC
@@ -3347,15 +3302,15 @@ INSN_ENTRY(setlocal_OP__WC__1){
3347
3302
  {
3348
3303
  #line 83 "insns.def"
3349
3304
  int i, lev = (int)level;
3350
- const VALUE *ep = GET_EP();
3305
+ VALUE *ep = GET_EP();
3351
3306
 
3352
3307
  /* optimized insns generated for level == (0|1) in defs/opt_operand.def */
3353
3308
  for (i = 0; i < lev; i++) {
3354
3309
  ep = GET_PREV_EP(ep);
3355
3310
  }
3356
- vm_env_write(ep, -(int)idx, val);
3311
+ *(ep - idx) = val;
3357
3312
 
3358
- #line 3359 "vm.inc"
3313
+ #line 3314 "vm.inc"
3359
3314
  #undef level
3360
3315
  #undef CURRENT_INSN_setlocal_OP__WC__1
3361
3316
  #undef INSN_IS_SC
@@ -3379,7 +3334,7 @@ INSN_ENTRY(putobject_OP_INT2FIX_O_0_C_){
3379
3334
  #line 299 "insns.def"
3380
3335
  /* */
3381
3336
 
3382
- #line 3383 "vm.inc"
3337
+ #line 3338 "vm.inc"
3383
3338
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3384
3339
  PUSH(val);
3385
3340
  #undef val
@@ -3405,7 +3360,7 @@ INSN_ENTRY(putobject_OP_INT2FIX_O_1_C_){
3405
3360
  #line 299 "insns.def"
3406
3361
  /* */
3407
3362
 
3408
- #line 3409 "vm.inc"
3363
+ #line 3364 "vm.inc"
3409
3364
  CHECK_VM_STACK_OVERFLOW_FOR_INSN(REG_CFP, 1);
3410
3365
  PUSH(val);
3411
3366
  #undef val