debase-ruby_core_source 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
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