debase-ruby_core_source 0.9.9 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/addr2line.h +0 -0
  4. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/build_assert/build_assert.h +0 -0
  5. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/check_type/check_type.h +0 -0
  6. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/container_of/container_of.h +0 -0
  7. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/ccan/list/list.h +28 -166
  8. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/ccan/str/str.h +0 -0
  9. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/constant.h +3 -10
  10. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/dln.h +0 -0
  11. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/eval_intern.h +49 -89
  12. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/gc.h +1 -8
  13. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/id.h +5 -15
  14. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/insns.inc +107 -0
  15. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/insns_info.inc +45 -89
  16. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/internal.h +164 -666
  17. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/iseq.h +158 -0
  18. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/known_errors.inc +0 -0
  19. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/method.h +144 -0
  20. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/node.h +42 -18
  21. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/node_name.inc +6 -2
  22. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/opt_sc.inc +0 -40
  23. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/optinsn.inc +0 -0
  24. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/optunifs.inc +0 -5
  25. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/parse.h +8 -28
  26. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/probes_helper.h +67 -0
  27. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/regenc.h +16 -16
  28. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/regint.h +10 -33
  29. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/regparse.h +1 -5
  30. data/lib/debase/ruby_core_source/ruby-2.2.8-p477/revision.h +1 -0
  31. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/ruby_atomic.h +5 -68
  32. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/siphash.h +0 -0
  33. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/symbol.h +13 -33
  34. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/thread_pthread.h +2 -2
  35. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/thread_win32.h +0 -0
  36. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/timev.h +0 -0
  37. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/transcode_data.h +7 -23
  38. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/version.h +10 -31
  39. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/vm.inc +497 -542
  40. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/vm_core.h +305 -784
  41. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/vm_debug.h +0 -0
  42. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.2.8-p477}/vm_exec.h +0 -0
  43. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.2.8-p477}/vm_insnhelper.h +56 -50
  44. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/vm_opts.h +7 -8
  45. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.2.8-p477}/vmtc.inc +0 -5
  46. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/addr2line.h +0 -0
  47. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/build_assert/build_assert.h +0 -0
  48. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/check_type/check_type.h +0 -0
  49. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/container_of/container_of.h +0 -0
  50. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/ccan/list/list.h +0 -0
  51. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/ccan/str/str.h +0 -0
  52. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/constant.h +1 -1
  53. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/dln.h +0 -0
  54. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/encindex.h +0 -0
  55. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/eval_intern.h +3 -4
  56. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/gc.h +0 -0
  57. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/id.h +0 -9
  58. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/id_table.h +0 -0
  59. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/insns.inc +46 -48
  60. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/insns_info.inc +0 -20
  61. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/internal.h +58 -290
  62. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/iseq.h +15 -18
  63. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/known_errors.inc +0 -0
  64. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/method.h +2 -2
  65. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/node.h +2 -2
  66. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/node_name.inc +0 -0
  67. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/opt_sc.inc +0 -16
  68. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/optinsn.inc +0 -0
  69. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/optunifs.inc +0 -2
  70. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/parse.h +8 -27
  71. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/probes_helper.h +0 -0
  72. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/regenc.h +14 -14
  73. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/regint.h +0 -8
  74. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/regparse.h +0 -0
  75. data/lib/debase/ruby_core_source/ruby-2.3.5-p376/revision.h +1 -0
  76. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/ruby_atomic.h +0 -0
  77. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/siphash.h +0 -0
  78. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/symbol.h +3 -3
  79. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/thread_pthread.h +0 -0
  80. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/thread_win32.h +0 -0
  81. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/timev.h +0 -0
  82. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/transcode_data.h +0 -0
  83. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.3.5-p376}/version.h +9 -27
  84. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm.inc +255 -264
  85. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_call_iseq_optimized.inc +5 -5
  86. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_core.h +37 -28
  87. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/vm_debug.h +0 -0
  88. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/vm_exec.h +0 -0
  89. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_insnhelper.h +32 -16
  90. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.3.5-p376}/vm_opts.h +0 -0
  91. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.3.5-p376}/vmtc.inc +0 -2
  92. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/addr2line.h +0 -0
  93. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/build_assert/build_assert.h +0 -0
  94. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/check_type/check_type.h +0 -0
  95. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/container_of/container_of.h +0 -0
  96. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/ccan/list/list.h +0 -0
  97. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/ccan/str/str.h +0 -0
  98. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/constant.h +0 -0
  99. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/dln.h +0 -0
  100. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/encindex.h +0 -0
  101. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/eval_intern.h +0 -0
  102. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/gc.h +0 -0
  103. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/id.h +0 -0
  104. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/id_table.h +0 -0
  105. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/insns.inc +0 -0
  106. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/insns_info.inc +0 -0
  107. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/internal.h +116 -51
  108. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/iseq.h +0 -0
  109. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/known_errors.inc +0 -0
  110. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/method.h +0 -0
  111. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/node.h +2 -2
  112. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/node_name.inc +0 -0
  113. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/opt_sc.inc +0 -0
  114. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/optinsn.inc +0 -0
  115. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/optunifs.inc +0 -0
  116. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/parse.h +8 -27
  117. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/probes_helper.h +0 -0
  118. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/regenc.h +79 -67
  119. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/regint.h +187 -244
  120. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/regparse.h +30 -27
  121. data/lib/debase/ruby_core_source/ruby-2.4.2-p198/revision.h +1 -0
  122. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/ruby_assert.h +0 -0
  123. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/ruby_atomic.h +0 -0
  124. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/siphash.h +0 -0
  125. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/symbol.h +0 -0
  126. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/thread_pthread.h +0 -0
  127. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/thread_win32.h +0 -0
  128. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/timev.h +0 -0
  129. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/transcode_data.h +0 -0
  130. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/version.h +6 -6
  131. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm.inc +37 -34
  132. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/vm_call_iseq_optimized.inc +0 -0
  133. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_core.h +9 -7
  134. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_debug.h +0 -0
  135. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_exec.h +0 -0
  136. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview3 → ruby-2.4.2-p198}/vm_insnhelper.h +30 -14
  137. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview2 → ruby-2.4.2-p198}/vm_opts.h +0 -0
  138. data/lib/debase/ruby_core_source/{ruby-2.4.0-preview1 → ruby-2.4.2-p198}/vmtc.inc +0 -0
  139. data/lib/debase/ruby_core_source/version.rb +1 -1
  140. metadata +138 -143
  141. data/lib/debase/ruby_core_source/ruby-2.4.0-preview1/method.h +0 -213
  142. data/lib/debase/ruby_core_source/ruby-2.4.0-preview1/revision.h +0 -1
  143. data/lib/debase/ruby_core_source/ruby-2.4.0-preview2/revision.h +0 -1
  144. data/lib/debase/ruby_core_source/ruby-2.4.0-preview2/ruby_assert.h +0 -54
  145. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/encindex.h +0 -67
  146. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/id_table.h +0 -31
  147. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/insns.inc +0 -112
  148. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/iseq.h +0 -252
  149. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/probes_helper.h +0 -43
  150. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/revision.h +0 -1
  151. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/ruby_assert.h +0 -54
  152. data/lib/debase/ruby_core_source/ruby-2.4.0-preview3/vm_call_iseq_optimized.inc +0 -212
@@ -2,7 +2,7 @@
2
2
 
3
3
  vm_core.h -
4
4
 
5
- $Author: ko1 $
5
+ $Author: usa $
6
6
  created at: 04/01/01 19:41:38 JST
7
7
 
8
8
  Copyright (C) 2004-2007 Koichi Sasada
@@ -12,49 +12,6 @@
12
12
  #ifndef RUBY_VM_CORE_H
13
13
  #define RUBY_VM_CORE_H
14
14
 
15
- /*
16
- * Enable check mode.
17
- * 1: enable local assertions.
18
- */
19
- #ifndef VM_CHECK_MODE
20
- #define VM_CHECK_MODE 0
21
- #endif
22
-
23
- /**
24
- * VM Debug Level
25
- *
26
- * debug level:
27
- * 0: no debug output
28
- * 1: show instruction name
29
- * 2: show stack frame when control stack frame is changed
30
- * 3: show stack status
31
- * 4: show register
32
- * 5:
33
- * 10: gc check
34
- */
35
-
36
- #ifndef VMDEBUG
37
- #define VMDEBUG 0
38
- #endif
39
-
40
- #if 0
41
- #undef VMDEBUG
42
- #define VMDEBUG 3
43
- #endif
44
-
45
- #include "ruby_assert.h"
46
-
47
- #if VM_CHECK_MODE > 0
48
- #define VM_ASSERT(expr) ( \
49
- RUBY_ASSERT_WHEN(VM_CHECK_MODE > 0, expr))
50
-
51
- #define VM_UNREACHABLE(func) rb_bug(#func ": unreachable")
52
-
53
- #else
54
- #define VM_ASSERT(expr) ((void)0)
55
- #define VM_UNREACHABLE(func) ((void)0)
56
- #endif
57
-
58
15
  #define RUBY_VM_THREAD_MODEL 2
59
16
 
60
17
  #include "ruby/ruby.h"
@@ -79,8 +36,10 @@
79
36
  #ifdef _WIN32
80
37
  /*
81
38
  * TODO: object space independent st_table.
82
- * socklist and conlist will be freed exit_handler(), after object
83
- * space destruction.
39
+ * socklist needs st_table in rb_w32_sysinit(), before object space
40
+ * initialization.
41
+ * It is too early now to change st_hash_type, since it breaks binary
42
+ * compatibility.
84
43
  */
85
44
  #define ENABLE_VM_OBJSPACE 0
86
45
  #else
@@ -149,43 +108,15 @@
149
108
 
150
109
  typedef unsigned long rb_num_t;
151
110
 
152
- enum ruby_tag_type {
153
- RUBY_TAG_RETURN = 0x1,
154
- RUBY_TAG_BREAK = 0x2,
155
- RUBY_TAG_NEXT = 0x3,
156
- RUBY_TAG_RETRY = 0x4,
157
- RUBY_TAG_REDO = 0x5,
158
- RUBY_TAG_RAISE = 0x6,
159
- RUBY_TAG_THROW = 0x7,
160
- RUBY_TAG_FATAL = 0x8,
161
- RUBY_TAG_MASK = 0xf
162
- };
163
- #define TAG_RETURN RUBY_TAG_RETURN
164
- #define TAG_BREAK RUBY_TAG_BREAK
165
- #define TAG_NEXT RUBY_TAG_NEXT
166
- #define TAG_RETRY RUBY_TAG_RETRY
167
- #define TAG_REDO RUBY_TAG_REDO
168
- #define TAG_RAISE RUBY_TAG_RAISE
169
- #define TAG_THROW RUBY_TAG_THROW
170
- #define TAG_FATAL RUBY_TAG_FATAL
171
- #define TAG_MASK RUBY_TAG_MASK
172
-
173
- enum ruby_vm_throw_flags {
174
- VM_THROW_NO_ESCAPE_FLAG = 0x8000,
175
- VM_THROW_LEVEL_SHIFT = 16,
176
- VM_THROW_STATE_MASK = 0xff
177
- };
111
+ /* iseq data type */
178
112
 
179
- /* forward declarations */
180
- struct rb_thread_struct;
181
- struct rb_control_frame_struct;
113
+ struct iseq_compile_data_ensure_node_stack;
182
114
 
183
- /* iseq data type */
184
115
  typedef struct rb_compile_option_struct rb_compile_option_t;
185
116
 
117
+
186
118
  struct iseq_inline_cache_entry {
187
119
  rb_serial_t ic_serial;
188
- const rb_cref_t *ic_cref;
189
120
  union {
190
121
  size_t index;
191
122
  VALUE value;
@@ -200,76 +131,74 @@ union iseq_inline_storage_entry {
200
131
  struct iseq_inline_cache_entry cache;
201
132
  };
202
133
 
203
- enum method_missing_reason {
204
- MISSING_NOENTRY = 0x00,
205
- MISSING_PRIVATE = 0x01,
206
- MISSING_PROTECTED = 0x02,
207
- MISSING_FCALL = 0x04,
208
- MISSING_VCALL = 0x08,
209
- MISSING_SUPER = 0x10,
210
- MISSING_MISSING = 0x20,
211
- MISSING_NONE = 0x40
212
- };
213
-
214
- struct rb_call_info {
215
- /* fixed at compile time */
216
- ID mid;
217
- unsigned int flag;
218
- int orig_argc;
219
- };
134
+ /* to avoid warning */
135
+ struct rb_thread_struct;
136
+ struct rb_control_frame_struct;
220
137
 
221
- struct rb_call_info_kw_arg {
138
+ typedef struct rb_call_info_kw_arg_struct {
222
139
  int keyword_len;
223
140
  VALUE keywords[1];
224
- };
141
+ } rb_call_info_kw_arg_t;
225
142
 
226
- struct rb_call_info_with_kwarg {
227
- struct rb_call_info ci;
228
- struct rb_call_info_kw_arg *kw_arg;
229
- };
230
-
231
- struct rb_calling_info {
232
- VALUE block_handler;
233
- VALUE recv;
234
- int argc;
235
- };
143
+ /* rb_call_info_t contains calling information including inline cache */
144
+ typedef struct rb_call_info_struct {
145
+ /* fixed at compile time */
146
+ ID mid;
236
147
 
237
- struct rb_call_cache;
238
- typedef VALUE (*vm_call_handler)(struct rb_thread_struct *th, struct rb_control_frame_struct *cfp, struct rb_calling_info *calling, const struct rb_call_info *ci, struct rb_call_cache *cc);
148
+ unsigned int flag;
149
+ int orig_argc;
150
+ rb_iseq_t *blockiseq;
151
+ rb_call_info_kw_arg_t *kw_arg;
239
152
 
240
- struct rb_call_cache {
241
153
  /* inline cache: keys */
242
154
  rb_serial_t method_state;
243
155
  rb_serial_t class_serial;
156
+ VALUE klass;
244
157
 
245
158
  /* inline cache: values */
246
- const rb_callable_method_entry_t *me;
247
-
248
- vm_call_handler call;
159
+ const rb_method_entry_t *me;
160
+ VALUE defined_class;
249
161
 
162
+ /* temporary values for method calling */
163
+ struct rb_block_struct *blockptr;
164
+ VALUE recv;
165
+ int argc;
250
166
  union {
251
- unsigned int index; /* used by ivar */
252
- enum method_missing_reason method_missing_reason; /* used by method_missing */
167
+ int opt_pc; /* used by iseq */
168
+ int index; /* used by ivar */
169
+ int missing_reason; /* used by method_missing */
253
170
  int inc_sp; /* used by cfunc */
254
171
  } aux;
255
- };
172
+
173
+ VALUE (*call)(struct rb_thread_struct *th, struct rb_control_frame_struct *cfp, struct rb_call_info_struct *ci);
174
+ } rb_call_info_t;
256
175
 
257
176
  #if 1
258
- #define CoreDataFromValue(obj, type) (type*)DATA_PTR(obj)
177
+ #define GetCoreDataFromValue(obj, type, ptr) do { \
178
+ (ptr) = (type*)DATA_PTR(obj); \
179
+ } while (0)
259
180
  #else
260
- #define CoreDataFromValue(obj, type) (type*)rb_data_object_get(obj)
181
+ #define GetCoreDataFromValue(obj, type, ptr) Data_Get_Struct((obj), type, (ptr))
261
182
  #endif
262
- #define GetCoreDataFromValue(obj, type, ptr) ((ptr) = CoreDataFromValue((obj), type))
183
+
184
+ #define GetISeqPtr(obj, ptr) \
185
+ GetCoreDataFromValue((obj), rb_iseq_t, (ptr))
263
186
 
264
187
  typedef struct rb_iseq_location_struct {
265
- VALUE path;
266
- VALUE absolute_path;
267
- VALUE base_label;
268
- VALUE label;
188
+ const VALUE path;
189
+ const VALUE absolute_path;
190
+ const VALUE base_label;
191
+ const VALUE label;
269
192
  VALUE first_lineno; /* TODO: may be unsigned short */
270
193
  } rb_iseq_location_t;
271
194
 
272
- struct rb_iseq_constant_body {
195
+ struct rb_iseq_struct;
196
+
197
+ struct rb_iseq_struct {
198
+ /***************/
199
+ /* static data */
200
+ /***************/
201
+
273
202
  enum iseq_type {
274
203
  ISEQ_TYPE_TOP,
275
204
  ISEQ_TYPE_METHOD,
@@ -281,9 +210,34 @@ struct rb_iseq_constant_body {
281
210
  ISEQ_TYPE_MAIN,
282
211
  ISEQ_TYPE_DEFINED_GUARD
283
212
  } type; /* instruction sequence type */
213
+ #if defined(WORDS_BIGENDIAN) && (SIZEOF_VALUE > SIZEOF_INT)
214
+ char dummy[SIZEOF_VALUE - SIZEOF_INT]; /* [Bug #10037][ruby-core:63721] */
215
+ #endif
216
+ int stack_max; /* for stack overflow check */
217
+
218
+ rb_iseq_location_t location;
284
219
 
220
+ VALUE *iseq_encoded; /* encoded iseq (insn addr and operands) */
285
221
  unsigned int iseq_size;
286
- const VALUE *iseq_encoded; /* encoded iseq (insn addr and operands) */
222
+ unsigned int line_info_size;
223
+
224
+ const VALUE mark_ary; /* Array: includes operands which should be GC marked */
225
+ const VALUE coverage; /* coverage array */
226
+
227
+ /* insn info, must be freed */
228
+ struct iseq_line_info_entry *line_info_table;
229
+
230
+ ID *local_table; /* must free */
231
+ int local_table_size;
232
+
233
+ /* sizeof(vars) + 1 */
234
+ int local_size;
235
+
236
+ union iseq_inline_storage_entry *is_entries;
237
+ int is_size;
238
+
239
+ int callinfo_size;
240
+ rb_call_info_t *callinfo_entries;
287
241
 
288
242
  /**
289
243
  * parameter information
@@ -321,7 +275,7 @@ struct rb_iseq_constant_body {
321
275
  unsigned int ambiguous_param0 : 1; /* {|a|} */
322
276
  } flags;
323
277
 
324
- unsigned int size;
278
+ int size;
325
279
 
326
280
  int lead_num;
327
281
  int opt_num;
@@ -330,7 +284,7 @@ struct rb_iseq_constant_body {
330
284
  int post_num;
331
285
  int block_start;
332
286
 
333
- const VALUE *opt_table; /* (opt_num + 1) entries. */
287
+ VALUE *opt_table; /* (opt_num + 1) entries. */
334
288
  /* opt_num and opt_table:
335
289
  *
336
290
  * def foo o1=e1, o2=e2, ..., oN=eN
@@ -345,83 +299,53 @@ struct rb_iseq_constant_body {
345
299
  * opt_table = [A1, A2, ..., AN, AL]
346
300
  */
347
301
 
348
- const struct rb_iseq_param_keyword {
302
+ struct rb_iseq_param_keyword {
349
303
  int num;
350
304
  int required_num;
351
305
  int bits_start;
352
306
  int rest_start;
353
- const ID *table;
354
- const VALUE *default_values;
307
+ ID *table;
308
+ VALUE *default_values;
355
309
  } *keyword;
356
310
  } param;
357
311
 
358
- rb_iseq_location_t location;
359
-
360
- /* insn info, must be freed */
361
- const struct iseq_line_info_entry *line_info_table;
362
-
363
- const ID *local_table; /* must free */
364
-
365
312
  /* catch table */
366
- const struct iseq_catch_table *catch_table;
313
+ struct iseq_catch_table *catch_table;
367
314
 
368
315
  /* for child iseq */
369
- const struct rb_iseq_struct *parent_iseq;
370
- struct rb_iseq_struct *local_iseq; /* local_iseq->flip_cnt can be modified */
316
+ struct rb_iseq_struct *parent_iseq;
317
+ struct rb_iseq_struct *local_iseq;
371
318
 
372
- union iseq_inline_storage_entry *is_entries;
373
- struct rb_call_info *ci_entries; /* struct rb_call_info ci_entries[ci_size];
374
- * struct rb_call_info_with_kwarg cikw_entries[ci_kw_size];
375
- * So that:
376
- * struct rb_call_info_with_kwarg *cikw_entries = &body->ci_entries[ci_size];
377
- */
378
- struct rb_call_cache *cc_entries; /* size is ci_size = ci_kw_size */
379
-
380
- VALUE mark_ary; /* Array: includes operands which should be GC marked */
381
-
382
- unsigned int local_table_size;
383
- unsigned int is_size;
384
- unsigned int ci_size;
385
- unsigned int ci_kw_size;
386
- unsigned int line_info_size;
387
- unsigned int stack_max; /* for stack overflow check */
388
- };
389
-
390
- /* T_IMEMO/iseq */
391
- /* typedef rb_iseq_t is in method.h */
392
- struct rb_iseq_struct {
393
- VALUE flags;
394
- VALUE reserved1;
395
- struct rb_iseq_constant_body *body;
319
+ /****************/
320
+ /* dynamic data */
321
+ /****************/
396
322
 
397
- union { /* 4, 5 words */
398
- struct iseq_compile_data *compile_data; /* used at compile time */
323
+ VALUE self;
324
+ const VALUE orig; /* non-NULL if its data have origin */
325
+
326
+ /* block inlining */
327
+ /*
328
+ * NODE *node;
329
+ * void *special_block_builder;
330
+ * void *cached_special_block_builder;
331
+ * VALUE cached_special_block;
332
+ */
399
333
 
400
- struct {
401
- VALUE obj;
402
- int index;
403
- } loader;
404
- } aux;
405
- };
334
+ /* klass/module nest information stack (cref) */
335
+ NODE * const cref_stack;
336
+ const VALUE klass;
406
337
 
407
- #ifndef USE_LAZY_LOAD
408
- #define USE_LAZY_LOAD 0
409
- #endif
338
+ /* misc */
339
+ ID defined_method_id; /* for define_method */
340
+ rb_num_t flip_cnt;
410
341
 
411
- #if USE_LAZY_LOAD
412
- const rb_iseq_t *rb_iseq_complete(const rb_iseq_t *iseq);
413
- #endif
342
+ /* used at compile time */
343
+ struct iseq_compile_data *compile_data;
414
344
 
415
- static inline const rb_iseq_t *
416
- rb_iseq_check(const rb_iseq_t *iseq)
417
- {
418
- #if USE_LAZY_LOAD
419
- if (iseq->body == NULL) {
420
- rb_iseq_complete((rb_iseq_t *)iseq);
421
- }
422
- #endif
423
- return iseq;
424
- }
345
+ /* original iseq, before encoding
346
+ * used for debug/dump (TODO: union with compile_data) */
347
+ VALUE *iseq;
348
+ };
425
349
 
426
350
  enum ruby_special_exceptions {
427
351
  ruby_error_reenter,
@@ -454,8 +378,6 @@ enum ruby_basic_operators {
454
378
  BOP_NEQ,
455
379
  BOP_MATCH,
456
380
  BOP_FREEZE,
457
- BOP_MAX,
458
- BOP_MIN,
459
381
 
460
382
  BOP_LAST_
461
383
  };
@@ -465,15 +387,15 @@ enum ruby_basic_operators {
465
387
 
466
388
  struct rb_vm_struct;
467
389
  typedef void rb_vm_at_exit_func(struct rb_vm_struct*);
468
-
469
390
  typedef struct rb_at_exit_list {
470
391
  rb_vm_at_exit_func *func;
471
392
  struct rb_at_exit_list *next;
472
393
  } rb_at_exit_list;
473
394
 
395
+ #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
474
396
  struct rb_objspace;
475
- struct rb_objspace *rb_objspace_alloc(void);
476
397
  void rb_objspace_free(struct rb_objspace *);
398
+ #endif
477
399
 
478
400
  typedef struct rb_hook_list_struct {
479
401
  struct rb_event_hook_struct *hooks;
@@ -494,14 +416,14 @@ typedef struct rb_vm_struct {
494
416
  size_t living_thread_num;
495
417
  VALUE thgroup_default;
496
418
 
497
- unsigned int running: 1;
498
- unsigned int thread_abort_on_exception: 1;
499
- unsigned int thread_report_on_exception: 1;
500
- unsigned int trace_running: 1;
419
+ int running;
420
+ int thread_abort_on_exception;
421
+ int trace_running;
501
422
  volatile int sleeper;
502
423
 
503
424
  /* object management */
504
425
  VALUE mark_object_ary;
426
+
505
427
  const VALUE special_exceptions[ruby_special_error_count];
506
428
 
507
429
  /* load */
@@ -536,9 +458,13 @@ typedef struct rb_vm_struct {
536
458
  VALUE verbose, debug, orig_progname, progname;
537
459
  VALUE coverages;
538
460
 
461
+ struct unlinked_method_entry_list_entry *unlinked_method_entry_list;
462
+
539
463
  VALUE defined_module_hash;
540
464
 
465
+ #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
541
466
  struct rb_objspace *objspace;
467
+ #endif
542
468
 
543
469
  rb_at_exit_list *at_exit;
544
470
 
@@ -571,18 +497,15 @@ typedef struct rb_vm_struct {
571
497
  #define RUBY_VM_FIBER_MACHINE_STACK_SIZE_MIN ( 16 * 1024 * sizeof(VALUE)) /* 64 KB or 128 KB */
572
498
 
573
499
  /* optimize insn */
574
- #define INTEGER_REDEFINED_OP_FLAG (1 << 0)
500
+ #define FIXNUM_REDEFINED_OP_FLAG (1 << 0)
575
501
  #define FLOAT_REDEFINED_OP_FLAG (1 << 1)
576
502
  #define STRING_REDEFINED_OP_FLAG (1 << 2)
577
503
  #define ARRAY_REDEFINED_OP_FLAG (1 << 3)
578
504
  #define HASH_REDEFINED_OP_FLAG (1 << 4)
579
- /* #define BIGNUM_REDEFINED_OP_FLAG (1 << 5) */
505
+ #define BIGNUM_REDEFINED_OP_FLAG (1 << 5)
580
506
  #define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
581
507
  #define TIME_REDEFINED_OP_FLAG (1 << 7)
582
508
  #define REGEXP_REDEFINED_OP_FLAG (1 << 8)
583
- #define NIL_REDEFINED_OP_FLAG (1 << 9)
584
- #define TRUE_REDEFINED_OP_FLAG (1 << 10)
585
- #define FALSE_REDEFINED_OP_FLAG (1 << 11)
586
509
 
587
510
  #define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((GET_VM()->redefined_flag[(op)]&(klass)) == 0))
588
511
 
@@ -591,55 +514,34 @@ typedef struct rb_vm_struct {
591
514
  #endif
592
515
 
593
516
  #ifndef VM_DEBUG_VERIFY_METHOD_CACHE
594
- #define VM_DEBUG_VERIFY_METHOD_CACHE (VM_DEBUG_MODE != 0)
517
+ #define VM_DEBUG_VERIFY_METHOD_CACHE 0
595
518
  #endif
596
519
 
597
- struct rb_captured_block {
598
- VALUE self;
599
- const VALUE *ep;
600
- union {
601
- const rb_iseq_t *iseq;
602
- const struct vm_ifunc *ifunc;
603
- VALUE val;
604
- } code;
605
- };
606
-
607
- enum rb_block_handler_type {
608
- block_handler_type_iseq,
609
- block_handler_type_ifunc,
610
- block_handler_type_symbol,
611
- block_handler_type_proc
612
- };
613
-
614
- enum rb_block_type {
615
- block_type_iseq,
616
- block_type_ifunc,
617
- block_type_symbol,
618
- block_type_proc
619
- };
620
-
621
- struct rb_block {
622
- union {
623
- struct rb_captured_block captured;
624
- VALUE symbol;
625
- VALUE proc;
626
- } as;
627
- enum rb_block_type type;
628
- };
629
-
630
520
  typedef struct rb_control_frame_struct {
631
- const VALUE *pc; /* cfp[0] */
521
+ VALUE *pc; /* cfp[0] */
632
522
  VALUE *sp; /* cfp[1] */
633
- const rb_iseq_t *iseq; /* cfp[2] */
634
- VALUE self; /* cfp[3] / block[0] */
635
- const VALUE *ep; /* cfp[4] / block[1] */
636
- const void *block_code; /* cfp[5] / block[2] */ /* iseq or ifunc */
523
+ rb_iseq_t *iseq; /* cfp[2] */
524
+ VALUE flag; /* cfp[3] */
525
+ VALUE self; /* cfp[4] / block[0] */
526
+ VALUE klass; /* cfp[5] / block[1] */
527
+ VALUE *ep; /* cfp[6] / block[2] */
528
+ rb_iseq_t *block_iseq; /* cfp[7] / block[3] */
529
+ VALUE proc; /* cfp[8] / block[4] */
530
+ const rb_method_entry_t *me;/* cfp[9] */
637
531
 
638
532
  #if VM_DEBUG_BP_CHECK
639
- VALUE *bp_check; /* cfp[6] */
533
+ VALUE *bp_check; /* cfp[10] */
640
534
  #endif
641
535
  } rb_control_frame_t;
642
536
 
537
+ typedef struct rb_block_struct {
538
+ VALUE self; /* share with method frame if it's only block */
539
+ VALUE klass; /* share with method frame if it's only block */
540
+ VALUE *ep; /* share with method frame if it's only block */
541
+ rb_iseq_t *iseq;
542
+ VALUE proc;
543
+ } rb_block_t;
544
+
643
545
  extern const rb_data_type_t ruby_threadptr_data_type;
644
546
 
645
547
  #define GetThreadPtr(obj, ptr) \
@@ -676,11 +578,13 @@ struct rb_unblock_callback {
676
578
 
677
579
  struct rb_mutex_struct;
678
580
 
581
+ struct rb_thread_struct;
679
582
  typedef struct rb_thread_list_struct{
680
583
  struct rb_thread_list_struct *next;
681
584
  struct rb_thread_struct *th;
682
585
  } rb_thread_list_t;
683
586
 
587
+
684
588
  typedef struct rb_ensure_entry {
685
589
  VALUE marker;
686
590
  VALUE (*e_proc)(ANYARGS);
@@ -715,20 +619,22 @@ typedef struct rb_thread_struct {
715
619
  int waiting_fd;
716
620
 
717
621
  /* for rb_iterate */
718
- VALUE passed_block_handler;
622
+ const rb_block_t *passed_block;
719
623
 
720
624
  /* for bmethod */
721
- const rb_callable_method_entry_t *passed_bmethod_me;
625
+ const rb_method_entry_t *passed_bmethod_me;
722
626
 
723
627
  /* for cfunc */
724
- struct rb_calling_info *calling;
628
+ rb_call_info_t *passed_ci;
725
629
 
726
630
  /* for load(true) */
727
631
  VALUE top_self;
728
632
  VALUE top_wrapper;
729
633
 
730
634
  /* eval env */
731
- const VALUE *root_lep;
635
+ rb_block_t *base_block;
636
+
637
+ VALUE *root_lep;
732
638
  VALUE root_svar;
733
639
 
734
640
  /* thread control */
@@ -770,6 +676,20 @@ typedef struct rb_thread_struct {
770
676
  struct rb_vm_tag *tag;
771
677
  struct rb_vm_protect_tag *protect_tag;
772
678
 
679
+ /*! Thread-local state of evaluation context.
680
+ *
681
+ * If negative, this thread is evaluating the main program.
682
+ * If positive, this thread is evaluating a program under Kernel::eval
683
+ * family.
684
+ */
685
+ int parse_in_eval;
686
+
687
+ /*! Thread-local state of compiling context.
688
+ *
689
+ * If non-zero, the parser does not automatically print error messages to
690
+ * stderr. */
691
+ int mild_compile_error;
692
+
773
693
  /* storage */
774
694
  st_table *local_storage;
775
695
  VALUE local_storage_recursive_hash;
@@ -810,14 +730,12 @@ typedef struct rb_thread_struct {
810
730
  rb_ensure_list_t *ensure_list;
811
731
 
812
732
  /* misc */
813
- enum method_missing_reason method_missing_reason: 8;
814
- unsigned int abort_on_exception: 1;
815
- unsigned int report_on_exception: 1;
733
+ int method_missing_reason;
734
+ int abort_on_exception;
816
735
  #ifdef USE_SIGALTSTACK
817
736
  void *altstack;
818
737
  #endif
819
738
  unsigned long running_time_us;
820
- VALUE name;
821
739
  } rb_thread_t;
822
740
 
823
741
  typedef enum {
@@ -839,25 +757,24 @@ typedef enum {
839
757
  RUBY_SYMBOL_EXPORT_BEGIN
840
758
 
841
759
  /* node -> iseq */
842
- rb_iseq_t *rb_iseq_new(NODE*, VALUE, VALUE, VALUE, const rb_iseq_t *parent, enum iseq_type);
843
- rb_iseq_t *rb_iseq_new_top(NODE *node, VALUE name, VALUE path, VALUE absolute_path, const rb_iseq_t *parent);
844
- rb_iseq_t *rb_iseq_new_main(NODE *node, VALUE path, VALUE absolute_path, const rb_iseq_t *parent);
845
- rb_iseq_t *rb_iseq_new_with_bopt(NODE*, VALUE, VALUE, VALUE, VALUE, VALUE, enum iseq_type, VALUE);
846
- rb_iseq_t *rb_iseq_new_with_opt(NODE*, VALUE, VALUE, VALUE, VALUE, const rb_iseq_t *parent, enum iseq_type, const rb_compile_option_t*);
760
+ VALUE rb_iseq_new(NODE*, VALUE, VALUE, VALUE, VALUE, enum iseq_type);
761
+ VALUE rb_iseq_new_top(NODE *node, VALUE name, VALUE path, VALUE absolute_path, VALUE parent);
762
+ VALUE rb_iseq_new_main(NODE *node, VALUE path, VALUE absolute_path);
763
+ VALUE rb_iseq_new_with_bopt(NODE*, VALUE, VALUE, VALUE, VALUE, VALUE, enum iseq_type, VALUE);
764
+ VALUE rb_iseq_new_with_opt(NODE*, VALUE, VALUE, VALUE, VALUE, VALUE, enum iseq_type, const rb_compile_option_t*);
847
765
 
848
766
  /* src -> iseq */
849
- rb_iseq_t *rb_iseq_compile(VALUE src, VALUE file, VALUE line);
850
- rb_iseq_t *rb_iseq_compile_on_base(VALUE src, VALUE file, VALUE line, const struct rb_block *base_block);
851
- rb_iseq_t *rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE absolute_path, VALUE line, const struct rb_block *base_block, VALUE opt);
767
+ VALUE rb_iseq_compile(VALUE src, VALUE file, VALUE line);
768
+ VALUE rb_iseq_compile_on_base(VALUE src, VALUE file, VALUE line, rb_block_t *base_block);
769
+ VALUE rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE absolute_path, VALUE line, rb_block_t *base_block, VALUE opt);
852
770
 
853
- VALUE rb_iseq_disasm(const rb_iseq_t *iseq);
771
+ VALUE rb_iseq_disasm(VALUE self);
854
772
  int rb_iseq_disasm_insn(VALUE str, const VALUE *iseqval, size_t pos, const rb_iseq_t *iseq, VALUE child);
855
773
  const char *ruby_node_name(int node);
856
774
 
857
- VALUE rb_iseq_coverage(const rb_iseq_t *iseq);
858
-
859
775
  RUBY_EXTERN VALUE rb_cISeq;
860
776
  RUBY_EXTERN VALUE rb_cRubyVM;
777
+ RUBY_EXTERN VALUE rb_cEnv;
861
778
  RUBY_EXTERN VALUE rb_mRubyVMFrozenCore;
862
779
  RUBY_SYMBOL_EXPORT_END
863
780
 
@@ -865,18 +782,24 @@ RUBY_SYMBOL_EXPORT_END
865
782
  GetCoreDataFromValue((obj), rb_proc_t, (ptr))
866
783
 
867
784
  typedef struct {
868
- const struct rb_block block;
869
- int8_t safe_level; /* 0..1 */
785
+ rb_block_t block;
786
+
787
+ VALUE envval; /* for GC mark */
788
+ VALUE blockprocval;
789
+ int8_t safe_level; /* 0..3 */
870
790
  int8_t is_from_method; /* bool */
871
791
  int8_t is_lambda; /* bool */
872
792
  } rb_proc_t;
873
793
 
794
+ #define GetEnvPtr(obj, ptr) \
795
+ GetCoreDataFromValue((obj), rb_env_t, (ptr))
796
+
874
797
  typedef struct {
875
- VALUE flags; /* imemo header */
876
- const rb_iseq_t *iseq;
877
- const VALUE *ep;
878
- const VALUE *env;
879
- unsigned int env_size;
798
+ int env_size;
799
+ int local_size;
800
+ VALUE prev_envval; /* for GC mark */
801
+ rb_block_t block;
802
+ VALUE env[1]; /* flexible array */
880
803
  } rb_env_t;
881
804
 
882
805
  extern const rb_data_type_t ruby_binding_data_type;
@@ -885,8 +808,9 @@ extern const rb_data_type_t ruby_binding_data_type;
885
808
  GetCoreDataFromValue((obj), rb_binding_t, (ptr))
886
809
 
887
810
  typedef struct {
888
- struct rb_block block;
811
+ VALUE env;
889
812
  VALUE path;
813
+ VALUE blockprocval; /* for GC mark */
890
814
  unsigned short first_lineno;
891
815
  } rb_binding_t;
892
816
 
@@ -901,16 +825,14 @@ enum vm_check_match_type {
901
825
  #define VM_CHECKMATCH_TYPE_MASK 0x03
902
826
  #define VM_CHECKMATCH_ARRAY 0x04
903
827
 
904
- #define VM_CALL_ARGS_SPLAT (0x01 << 0) /* m(*args) */
905
- #define VM_CALL_ARGS_BLOCKARG (0x01 << 1) /* m(&block) */
906
- #define VM_CALL_FCALL (0x01 << 2) /* m(...) */
907
- #define VM_CALL_VCALL (0x01 << 3) /* m */
908
- #define VM_CALL_ARGS_SIMPLE (0x01 << 4) /* (ci->flag & (SPLAT|BLOCKARG)) && blockiseq == NULL && ci->kw_arg == NULL */
909
- #define VM_CALL_BLOCKISEQ (0x01 << 5) /* has blockiseq */
910
- #define VM_CALL_KWARG (0x01 << 6) /* has kwarg */
911
- #define VM_CALL_TAILCALL (0x01 << 7) /* located at tail position */
912
- #define VM_CALL_SUPER (0x01 << 8) /* super */
913
- #define VM_CALL_OPT_SEND (0x01 << 9) /* internal flag */
828
+ #define VM_CALL_ARGS_SPLAT (0x01 << 1) /* m(*args) */
829
+ #define VM_CALL_ARGS_BLOCKARG (0x01 << 2) /* m(&block) */
830
+ #define VM_CALL_FCALL (0x01 << 3) /* m(...) */
831
+ #define VM_CALL_VCALL (0x01 << 4) /* m */
832
+ #define VM_CALL_TAILCALL (0x01 << 5) /* located at tail position */
833
+ #define VM_CALL_SUPER (0x01 << 6) /* super */
834
+ #define VM_CALL_OPT_SEND (0x01 << 7) /* internal flag */
835
+ #define VM_CALL_ARGS_SIMPLE (0x01 << 8) /* (ci->flag & (SPLAT|BLOCKARG)) && ci->blockiseq == NULL && ci->kw_arg == NULL */
914
836
 
915
837
  enum vm_special_object_type {
916
838
  VM_SPECIAL_OBJECT_VMCORE = 1,
@@ -918,18 +840,34 @@ enum vm_special_object_type {
918
840
  VM_SPECIAL_OBJECT_CONST_BASE
919
841
  };
920
842
 
921
- enum vm_svar_index {
922
- VM_SVAR_LASTLINE = 0, /* $_ */
923
- VM_SVAR_BACKREF = 1, /* $~ */
843
+ #define VM_FRAME_MAGIC_METHOD 0x11
844
+ #define VM_FRAME_MAGIC_BLOCK 0x21
845
+ #define VM_FRAME_MAGIC_CLASS 0x31
846
+ #define VM_FRAME_MAGIC_TOP 0x41
847
+ #define VM_FRAME_MAGIC_CFUNC 0x61
848
+ #define VM_FRAME_MAGIC_PROC 0x71
849
+ #define VM_FRAME_MAGIC_IFUNC 0x81
850
+ #define VM_FRAME_MAGIC_EVAL 0x91
851
+ #define VM_FRAME_MAGIC_LAMBDA 0xa1
852
+ #define VM_FRAME_MAGIC_RESCUE 0xb1
853
+ #define VM_FRAME_MAGIC_MASK_BITS 8
854
+ #define VM_FRAME_MAGIC_MASK (~(~(VALUE)0<<VM_FRAME_MAGIC_MASK_BITS))
855
+
856
+ #define VM_FRAME_TYPE(cfp) ((cfp)->flag & VM_FRAME_MAGIC_MASK)
857
+
858
+ /* other frame flag */
859
+ #define VM_FRAME_FLAG_PASSED 0x0100
860
+ #define VM_FRAME_FLAG_FINISH 0x0200
861
+ #define VM_FRAME_FLAG_BMETHOD 0x0400
862
+ #define VM_FRAME_TYPE_FINISH_P(cfp) (((cfp)->flag & VM_FRAME_FLAG_FINISH) != 0)
863
+ #define VM_FRAME_TYPE_BMETHOD_P(cfp) (((cfp)->flag & VM_FRAME_FLAG_BMETHOD) != 0)
924
864
 
925
- VM_SVAR_EXTRA_START = 2,
926
- VM_SVAR_FLIPFLOP_START = 2 /* flipflop */
927
- };
865
+ #define RUBYVM_CFUNC_FRAME_P(cfp) \
866
+ (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)
928
867
 
929
868
  /* inline cache */
930
869
  typedef struct iseq_inline_cache_entry *IC;
931
- typedef struct rb_call_info *CALL_INFO;
932
- typedef struct rb_call_cache *CALL_CACHE;
870
+ typedef rb_call_info_t *CALL_INFO;
933
871
 
934
872
  void rb_vm_change_state(void);
935
873
 
@@ -942,231 +880,31 @@ typedef VALUE CDHASH;
942
880
  typedef rb_control_frame_t *
943
881
  (FUNC_FASTCALL(*rb_insn_func_t))(rb_thread_t *, rb_control_frame_t *);
944
882
 
945
- #define VM_TAGGED_PTR_SET(p, tag) ((VALUE)(p) | (tag))
946
- #define VM_TAGGED_PTR_REF(v, mask) ((void *)((v) & ~mask))
947
-
948
- #define GC_GUARDED_PTR(p) VM_TAGGED_PTR_SET((p), 0x01)
949
- #define GC_GUARDED_PTR_REF(p) VM_TAGGED_PTR_REF((p), 0x03)
883
+ #define GC_GUARDED_PTR(p) ((VALUE)((VALUE)(p) | 0x01))
884
+ #define GC_GUARDED_PTR_REF(p) ((void *)(((VALUE)(p)) & ~0x03))
950
885
  #define GC_GUARDED_PTR_P(p) (((VALUE)(p)) & 0x01)
951
886
 
952
- enum {
953
- /* Frame/Environment flag bits:
954
- * MMMM MMMM MMMM MMMM ____ ____ FFFF EEEX (LSB)
955
- *
956
- * X : tag for GC marking (It seems as Fixnum)
957
- * EEE : 3 bits Env flags
958
- * FFFF: 4 bits Frame flags
959
- * MMMM: 16 bits frame magic (to check frame corruption)
960
- */
961
-
962
- /* frame types */
963
- VM_FRAME_MAGIC_METHOD = 0x11110001,
964
- VM_FRAME_MAGIC_BLOCK = 0x22220001,
965
- VM_FRAME_MAGIC_CLASS = 0x33330001,
966
- VM_FRAME_MAGIC_TOP = 0x44440001,
967
- VM_FRAME_MAGIC_CFUNC = 0x55550001,
968
- VM_FRAME_MAGIC_PROC = 0x66660001,
969
- VM_FRAME_MAGIC_IFUNC = 0x77770001,
970
- VM_FRAME_MAGIC_EVAL = 0x88880001,
971
- VM_FRAME_MAGIC_LAMBDA = 0x99990001,
972
- VM_FRAME_MAGIC_RESCUE = 0xaaaa0001,
973
- VM_FRAME_MAGIC_DUMMY = 0xbbbb0001,
974
-
975
- VM_FRAME_MAGIC_MASK = 0xffff0001,
976
-
977
- /* frame flag */
978
- VM_FRAME_FLAG_PASSED = 0x0010,
979
- VM_FRAME_FLAG_FINISH = 0x0020,
980
- VM_FRAME_FLAG_BMETHOD = 0x0040,
981
- VM_FRAME_FLAG_CFRAME = 0x0080,
982
-
983
- /* env flag */
984
- VM_ENV_FLAG_LOCAL = 0x0002,
985
- VM_ENV_FLAG_ESCAPED = 0x0004,
986
- VM_ENV_FLAG_WB_REQUIRED = 0x0008
987
- };
988
-
989
- #define VM_ENV_DATA_SIZE ( 3)
990
-
991
- #define VM_ENV_DATA_INDEX_ME_CREF (-2) /* ep[-2] */
992
- #define VM_ENV_DATA_INDEX_SPECVAL (-1) /* ep[-1] */
993
- #define VM_ENV_DATA_INDEX_FLAGS ( 0) /* ep[ 0] */
994
- #define VM_ENV_DATA_INDEX_ENV ( 1) /* ep[ 1] */
995
- #define VM_ENV_DATA_INDEX_ENV_PROC ( 2) /* ep[ 2] */
996
-
997
- #define VM_ENV_INDEX_LAST_LVAR (-VM_ENV_DATA_SIZE)
998
-
999
- static inline void VM_FORCE_WRITE_SPECIAL_CONST(const VALUE *ptr, VALUE special_const_value);
1000
-
1001
- static inline void
1002
- VM_ENV_FLAGS_SET(const VALUE *ep, VALUE flag)
1003
- {
1004
- VALUE flags = ep[VM_ENV_DATA_INDEX_FLAGS];
1005
- VM_ASSERT(FIXNUM_P(flags));
1006
- VM_FORCE_WRITE_SPECIAL_CONST(&ep[VM_ENV_DATA_INDEX_FLAGS], flags | flag);
1007
- }
1008
-
1009
- static inline void
1010
- VM_ENV_FLAGS_UNSET(const VALUE *ep, VALUE flag)
1011
- {
1012
- VALUE flags = ep[VM_ENV_DATA_INDEX_FLAGS];
1013
- VM_ASSERT(FIXNUM_P(flags));
1014
- VM_FORCE_WRITE_SPECIAL_CONST(&ep[VM_ENV_DATA_INDEX_FLAGS], flags & ~flag);
1015
- }
1016
-
1017
- static inline unsigned long
1018
- VM_ENV_FLAGS(const VALUE *ep, long flag)
1019
- {
1020
- VALUE flags = ep[VM_ENV_DATA_INDEX_FLAGS];
1021
- VM_ASSERT(FIXNUM_P(flags));
1022
- return flags & flag;
1023
- }
1024
-
1025
- static inline unsigned long
1026
- VM_FRAME_TYPE(const rb_control_frame_t *cfp)
1027
- {
1028
- return VM_ENV_FLAGS(cfp->ep, VM_FRAME_MAGIC_MASK);
1029
- }
1030
-
1031
- static inline int
1032
- VM_FRAME_FINISHED_P(const rb_control_frame_t *cfp)
1033
- {
1034
- return VM_ENV_FLAGS(cfp->ep, VM_FRAME_FLAG_FINISH ) != 0;
1035
- }
1036
-
1037
- static inline int
1038
- VM_FRAME_BMETHOD_P(const rb_control_frame_t *cfp)
1039
- {
1040
- return VM_ENV_FLAGS(cfp->ep, VM_FRAME_FLAG_BMETHOD) != 0;
1041
- }
1042
-
1043
- static inline int
1044
- rb_obj_is_iseq(VALUE iseq)
1045
- {
1046
- return RB_TYPE_P(iseq, T_IMEMO) && imemo_type(iseq) == imemo_iseq;
1047
- }
1048
-
1049
- #if VM_CHECK_MODE > 0
1050
- #define RUBY_VM_NORMAL_ISEQ_P(iseq) rb_obj_is_iseq((VALUE)iseq)
1051
- #endif
1052
-
1053
- static inline int
1054
- VM_FRAME_CFRAME_P(const rb_control_frame_t *cfp)
1055
- {
1056
- int cframe_p = VM_ENV_FLAGS(cfp->ep, VM_FRAME_FLAG_CFRAME) != 0;
1057
- VM_ASSERT(RUBY_VM_NORMAL_ISEQ_P(cfp->iseq) != cframe_p);
1058
- return cframe_p;
1059
- }
1060
-
1061
- static inline int
1062
- VM_FRAME_RUBYFRAME_P(const rb_control_frame_t *cfp)
1063
- {
1064
- return !VM_FRAME_CFRAME_P(cfp);
1065
- }
1066
-
1067
- #define RUBYVM_CFUNC_FRAME_P(cfp) \
1068
- (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)
1069
-
1070
- #define VM_GUARDED_PREV_EP(ep) GC_GUARDED_PTR(ep)
1071
- #define VM_BLOCK_HANDLER_NONE 0
1072
-
1073
- static inline int
1074
- VM_ENV_LOCAL_P(const VALUE *ep)
1075
- {
1076
- return VM_ENV_FLAGS(ep, VM_ENV_FLAG_LOCAL) ? 1 : 0;
1077
- }
1078
-
1079
- static inline const VALUE *
1080
- VM_ENV_PREV_EP(const VALUE *ep)
1081
- {
1082
- VM_ASSERT(VM_ENV_LOCAL_P(ep) == 0);
1083
- return GC_GUARDED_PTR_REF(ep[VM_ENV_DATA_INDEX_SPECVAL]);
1084
- }
1085
-
1086
- static inline VALUE
1087
- VM_ENV_BLOCK_HANDLER(const VALUE *ep)
1088
- {
1089
- VM_ASSERT(VM_ENV_LOCAL_P(ep));
1090
- return ep[VM_ENV_DATA_INDEX_SPECVAL];
1091
- }
1092
-
1093
- #if VM_CHECK_MODE > 0
1094
- int rb_vm_ep_in_heap_p(const VALUE *ep);
1095
- #endif
1096
-
1097
- static inline int
1098
- VM_ENV_ESCAPED_P(const VALUE *ep)
1099
- {
1100
- VM_ASSERT(rb_vm_ep_in_heap_p(ep) == !!VM_ENV_FLAGS(ep, VM_ENV_FLAG_ESCAPED));
1101
- return VM_ENV_FLAGS(ep, VM_ENV_FLAG_ESCAPED) ? 1 : 0;
1102
- }
1103
-
1104
- #if VM_CHECK_MODE > 0
1105
- static inline int
1106
- vm_assert_env(VALUE obj)
1107
- {
1108
- VM_ASSERT(RB_TYPE_P(obj, T_IMEMO));
1109
- VM_ASSERT(imemo_type(obj) == imemo_env);
1110
- return 1;
1111
- }
1112
- #endif
1113
-
1114
- static inline VALUE
1115
- VM_ENV_ENVVAL(const VALUE *ep)
1116
- {
1117
- VALUE envval = ep[VM_ENV_DATA_INDEX_ENV];
1118
- VM_ASSERT(VM_ENV_ESCAPED_P(ep));
1119
- VM_ASSERT(vm_assert_env(envval));
1120
- return envval;
1121
- }
1122
-
1123
- static inline const rb_env_t *
1124
- VM_ENV_ENVVAL_PTR(const VALUE *ep)
1125
- {
1126
- return (const rb_env_t *)VM_ENV_ENVVAL(ep);
1127
- }
1128
-
1129
- static inline VALUE
1130
- VM_ENV_PROCVAL(const VALUE *ep)
1131
- {
1132
- VM_ASSERT(VM_ENV_ESCAPED_P(ep));
1133
- VM_ASSERT(VM_ENV_LOCAL_P(ep));
1134
- VM_ASSERT(VM_ENV_BLOCK_HANDLER(ep) != VM_BLOCK_HANDLER_NONE);
1135
-
1136
- return ep[VM_ENV_DATA_INDEX_ENV_PROC];
1137
- }
1138
-
1139
- static inline const rb_env_t *
1140
- vm_env_new(VALUE *env_ep, VALUE *env_body, unsigned int env_size, const rb_iseq_t *iseq)
1141
- {
1142
- rb_env_t *env = (rb_env_t *)rb_imemo_new(imemo_env, (VALUE)env_ep, (VALUE)env_body, 0, (VALUE)iseq);
1143
- env->env_size = env_size;
1144
- env_ep[VM_ENV_DATA_INDEX_ENV] = (VALUE)env;
1145
- return env;
1146
- }
1147
-
1148
- static inline void
1149
- VM_FORCE_WRITE(const VALUE *ptr, VALUE v)
1150
- {
1151
- *((VALUE *)ptr) = v;
1152
- }
887
+ /*
888
+ * block frame:
889
+ * ep[ 0]: prev frame
890
+ * ep[-1]: CREF (for *_eval)
891
+ *
892
+ * method frame:
893
+ * ep[ 0]: block pointer (ptr | VM_ENVVAL_BLOCK_PTR_FLAG)
894
+ */
1153
895
 
1154
- static inline void
1155
- VM_FORCE_WRITE_SPECIAL_CONST(const VALUE *ptr, VALUE special_const_value)
1156
- {
1157
- VM_ASSERT(RB_SPECIAL_CONST_P(special_const_value));
1158
- VM_FORCE_WRITE(ptr, special_const_value);
1159
- }
896
+ #define VM_ENVVAL_BLOCK_PTR_FLAG 0x02
897
+ #define VM_ENVVAL_BLOCK_PTR(v) (GC_GUARDED_PTR(v) | VM_ENVVAL_BLOCK_PTR_FLAG)
898
+ #define VM_ENVVAL_BLOCK_PTR_P(v) ((v) & VM_ENVVAL_BLOCK_PTR_FLAG)
899
+ #define VM_ENVVAL_PREV_EP_PTR(v) ((VALUE)GC_GUARDED_PTR(v))
900
+ #define VM_ENVVAL_PREV_EP_PTR_P(v) (!(VM_ENVVAL_BLOCK_PTR_P(v)))
1160
901
 
1161
- static inline void
1162
- VM_STACK_ENV_WRITE(const VALUE *ep, int index, VALUE v)
1163
- {
1164
- VM_ASSERT(VM_ENV_FLAGS(ep, VM_ENV_FLAG_WB_REQUIRED) == 0);
1165
- VM_FORCE_WRITE(&ep[index], v);
1166
- }
902
+ #define VM_EP_PREV_EP(ep) ((VALUE *)GC_GUARDED_PTR_REF((ep)[0]))
903
+ #define VM_EP_BLOCK_PTR(ep) ((rb_block_t *)GC_GUARDED_PTR_REF((ep)[0]))
904
+ #define VM_EP_LEP_P(ep) VM_ENVVAL_BLOCK_PTR_P((ep)[0])
1167
905
 
1168
- const VALUE *rb_vm_ep_local_ep(const VALUE *ep);
1169
- VALUE rb_vm_frame_block_handler(const rb_control_frame_t *cfp);
906
+ VALUE *rb_vm_ep_local_ep(VALUE *ep);
907
+ rb_block_t *rb_vm_control_frame_block_ptr(rb_control_frame_t *cfp);
1170
908
 
1171
909
  #define RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp) ((cfp)+1)
1172
910
  #define RUBY_VM_NEXT_CONTROL_FRAME(cfp) ((cfp)-1)
@@ -1177,232 +915,18 @@ VALUE rb_vm_frame_block_handler(const rb_control_frame_t *cfp);
1177
915
  #define RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp) \
1178
916
  (!RUBY_VM_VALID_CONTROL_FRAME_P((cfp), RUBY_VM_END_CONTROL_FRAME(th)))
1179
917
 
1180
- static inline int
1181
- VM_BH_ISEQ_BLOCK_P(VALUE block_handler)
1182
- {
1183
- if ((block_handler & 0x03) == 0x01) {
1184
- #if VM_CHECK_MODE > 0
1185
- struct rb_captured_block *captured = VM_TAGGED_PTR_REF(block_handler, 0x03);
1186
- VM_ASSERT(RB_TYPE_P(captured->code.val, T_IMEMO));
1187
- VM_ASSERT(imemo_type(captured->code.val) == imemo_iseq);
1188
- #endif
1189
- return 1;
1190
- }
1191
- else {
1192
- return 0;
1193
- }
1194
- }
1195
-
1196
- static inline VALUE
1197
- VM_BH_FROM_ISEQ_BLOCK(const struct rb_captured_block *captured)
1198
- {
1199
- VALUE block_handler = VM_TAGGED_PTR_SET(captured, 0x01);
1200
- VM_ASSERT(VM_BH_ISEQ_BLOCK_P(block_handler));
1201
- return block_handler;
1202
- }
1203
-
1204
- static inline const struct rb_captured_block *
1205
- VM_BH_TO_ISEQ_BLOCK(VALUE block_handler)
1206
- {
1207
- struct rb_captured_block *captured = VM_TAGGED_PTR_REF(block_handler, 0x03);
1208
- VM_ASSERT(VM_BH_ISEQ_BLOCK_P(block_handler));
1209
- return captured;
1210
- }
1211
-
1212
- static inline int
1213
- VM_BH_IFUNC_P(VALUE block_handler)
1214
- {
1215
- if ((block_handler & 0x03) == 0x03) {
1216
- #if VM_CHECK_MODE > 0
1217
- struct rb_captured_block *captured = (void *)(block_handler & ~0x03);
1218
- VM_ASSERT(RB_TYPE_P(captured->code.val, T_IMEMO));
1219
- VM_ASSERT(imemo_type(captured->code.val) == imemo_ifunc);
1220
- #endif
1221
- return 1;
1222
- }
1223
- else {
1224
- return 0;
1225
- }
1226
- }
1227
-
1228
- static inline VALUE
1229
- VM_BH_FROM_IFUNC_BLOCK(const struct rb_captured_block *captured)
1230
- {
1231
- VALUE block_handler = VM_TAGGED_PTR_SET(captured, 0x03);
1232
- VM_ASSERT(VM_BH_IFUNC_P(block_handler));
1233
- return block_handler;
1234
- }
1235
-
1236
- static inline const struct rb_captured_block *
1237
- VM_BH_TO_IFUNC_BLOCK(VALUE block_handler)
1238
- {
1239
- struct rb_captured_block *captured = VM_TAGGED_PTR_REF(block_handler, 0x03);
1240
- VM_ASSERT(VM_BH_IFUNC_P(block_handler));
1241
- return captured;
1242
- }
1243
-
1244
- static inline const struct rb_captured_block *
1245
- VM_BH_TO_CAPT_BLOCK(VALUE block_handler)
1246
- {
1247
- struct rb_captured_block *captured = VM_TAGGED_PTR_REF(block_handler, 0x03);
1248
- VM_ASSERT(VM_BH_IFUNC_P(block_handler) || VM_BH_ISEQ_BLOCK_P(block_handler));
1249
- return captured;
1250
- }
1251
-
1252
- static inline enum rb_block_handler_type
1253
- vm_block_handler_type(VALUE block_handler)
1254
- {
1255
- if (VM_BH_ISEQ_BLOCK_P(block_handler)) {
1256
- return block_handler_type_iseq;
1257
- }
1258
- else if (VM_BH_IFUNC_P(block_handler)) {
1259
- return block_handler_type_ifunc;
1260
- }
1261
- else if (SYMBOL_P(block_handler)) {
1262
- return block_handler_type_symbol;
1263
- }
1264
- else {
1265
- VM_ASSERT(rb_obj_is_proc(block_handler));
1266
- return block_handler_type_proc;
1267
- }
1268
- }
1269
-
1270
- static inline int
1271
- vm_block_handler_verify(VALUE block_handler)
1272
- {
1273
- VM_ASSERT(block_handler == VM_BLOCK_HANDLER_NONE ||
1274
- vm_block_handler_type(block_handler) >= 0);
1275
- return 1;
1276
- }
1277
-
1278
- static inline enum rb_block_type
1279
- vm_block_type(const struct rb_block *block)
1280
- {
1281
- #if VM_CHECK_MODE > 0
1282
- switch (block->type) {
1283
- case block_type_iseq:
1284
- VM_ASSERT(RB_TYPE_P(block->as.captured.code.val, T_IMEMO));
1285
- VM_ASSERT(imemo_type(block->as.captured.code.val) == imemo_iseq);
1286
- break;
1287
- case block_type_ifunc:
1288
- VM_ASSERT(RB_TYPE_P(block->as.captured.code.val, T_IMEMO));
1289
- VM_ASSERT(imemo_type(block->as.captured.code.val) == imemo_ifunc);
1290
- break;
1291
- case block_type_symbol:
1292
- VM_ASSERT(SYMBOL_P(block->as.symbol));
1293
- break;
1294
- case block_type_proc:
1295
- VM_ASSERT(rb_obj_is_proc(block->as.proc));
1296
- break;
1297
- }
1298
- #endif
1299
- return block->type;
1300
- }
1301
-
1302
- static inline void
1303
- vm_block_type_set(const struct rb_block *block, enum rb_block_type type)
1304
- {
1305
- struct rb_block *mb = (struct rb_block *)block;
1306
- mb->type = type;
1307
- }
1308
-
1309
- static inline const struct rb_block *
1310
- vm_proc_block(VALUE procval)
1311
- {
1312
- rb_proc_t *proc = RTYPEDDATA_DATA(procval);
1313
- VM_ASSERT(rb_obj_is_proc(procval));
1314
- return &proc->block;
1315
- }
1316
-
1317
- static inline const rb_iseq_t *vm_block_iseq(const struct rb_block *block);
1318
- static inline const VALUE *vm_block_ep(const struct rb_block *block);
1319
-
1320
- static inline const rb_iseq_t *
1321
- vm_proc_iseq(VALUE procval)
1322
- {
1323
- VM_ASSERT(rb_obj_is_proc(procval));
1324
- return vm_block_iseq(vm_proc_block(procval));
1325
- }
1326
-
1327
- static inline const VALUE *
1328
- vm_proc_ep(VALUE procval)
1329
- {
1330
- return vm_block_ep(vm_proc_block(procval));
1331
- }
1332
-
1333
- static inline const rb_iseq_t *
1334
- vm_block_iseq(const struct rb_block *block)
1335
- {
1336
- switch (vm_block_type(block)) {
1337
- case block_type_iseq: return block->as.captured.code.iseq;
1338
- case block_type_proc: return vm_proc_iseq(block->as.proc);
1339
- case block_type_ifunc:
1340
- case block_type_symbol: return NULL;
1341
- }
1342
- VM_UNREACHABLE(vm_block_iseq);
1343
- return NULL;
1344
- }
1345
-
1346
- static inline const VALUE *
1347
- vm_block_ep(const struct rb_block *block)
1348
- {
1349
- switch (vm_block_type(block)) {
1350
- case block_type_iseq:
1351
- case block_type_ifunc: return block->as.captured.ep;
1352
- case block_type_proc: return vm_proc_ep(block->as.proc);
1353
- case block_type_symbol: return NULL;
1354
- }
1355
- VM_UNREACHABLE(vm_block_ep);
1356
- return NULL;
1357
- }
1358
-
1359
- static inline VALUE
1360
- vm_block_self(const struct rb_block *block)
1361
- {
1362
- switch (vm_block_type(block)) {
1363
- case block_type_iseq:
1364
- case block_type_ifunc:
1365
- return block->as.captured.self;
1366
- case block_type_proc:
1367
- return vm_block_self(vm_proc_block(block->as.proc));
1368
- case block_type_symbol:
1369
- return Qundef;
1370
- }
1371
- VM_UNREACHABLE(vm_block_self);
1372
- return Qundef;
1373
- }
1374
-
1375
- static inline VALUE
1376
- VM_BH_TO_SYMBOL(VALUE block_handler)
1377
- {
1378
- VM_ASSERT(SYMBOL_P(block_handler));
1379
- return block_handler;
1380
- }
1381
-
1382
- static inline VALUE
1383
- VM_BH_FROM_SYMBOL(VALUE symbol)
1384
- {
1385
- VM_ASSERT(SYMBOL_P(symbol));
1386
- return symbol;
1387
- }
1388
-
1389
- static inline VALUE
1390
- VM_BH_TO_PROC(VALUE block_handler)
1391
- {
1392
- VM_ASSERT(rb_obj_is_proc(block_handler));
1393
- return block_handler;
1394
- }
918
+ #define RUBY_VM_IFUNC_P(ptr) RB_TYPE_P((VALUE)(ptr), T_NODE)
919
+ #define RUBY_VM_NORMAL_ISEQ_P(ptr) \
920
+ ((ptr) && !RUBY_VM_IFUNC_P(ptr))
1395
921
 
1396
- static inline VALUE
1397
- VM_BH_FROM_PROC(VALUE procval)
1398
- {
1399
- VM_ASSERT(rb_obj_is_proc(procval));
1400
- return procval;
1401
- }
922
+ #define RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp) ((rb_block_t *)(&(cfp)->self))
923
+ #define RUBY_VM_GET_CFP_FROM_BLOCK_PTR(b) \
924
+ ((rb_control_frame_t *)((VALUE *)(b) - 4))
925
+ /* magic number `4' is depend on rb_control_frame_t layout. */
1402
926
 
1403
927
  /* VM related object allocate functions */
1404
928
  VALUE rb_thread_alloc(VALUE klass);
1405
- VALUE rb_proc_alloc(VALUE klass);
929
+ VALUE rb_proc_wrap(VALUE klass, rb_proc_t *); /* may use with rb_proc_alloc */
1406
930
  VALUE rb_binding_alloc(VALUE klass);
1407
931
 
1408
932
  /* for debug */
@@ -1417,26 +941,29 @@ NORETURN(void rb_bug_context(const void *, const char *fmt, ...));
1417
941
 
1418
942
  /* functions about thread/vm execution */
1419
943
  RUBY_SYMBOL_EXPORT_BEGIN
1420
- VALUE rb_iseq_eval(const rb_iseq_t *iseq);
1421
- VALUE rb_iseq_eval_main(const rb_iseq_t *iseq);
944
+ VALUE rb_iseq_eval(VALUE iseqval);
945
+ VALUE rb_iseq_eval_main(VALUE iseqval);
1422
946
  RUBY_SYMBOL_EXPORT_END
1423
947
  int rb_thread_method_id_and_class(rb_thread_t *th, ID *idp, VALUE *klassp);
1424
948
 
1425
- VALUE rb_vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, int argc, const VALUE *argv, VALUE block_handler);
1426
- VALUE rb_vm_make_proc_lambda(rb_thread_t *th, const struct rb_captured_block *captured, VALUE klass, int8_t is_lambda);
1427
- VALUE rb_vm_make_proc(rb_thread_t *th, const struct rb_captured_block *captured, VALUE klass);
949
+ VALUE rb_vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc,
950
+ int argc, const VALUE *argv, const rb_block_t *blockptr);
951
+ VALUE rb_vm_make_proc_lambda(rb_thread_t *th, const rb_block_t *block, VALUE klass, int8_t is_lambda);
952
+ VALUE rb_vm_make_proc(rb_thread_t *th, const rb_block_t *block, VALUE klass);
1428
953
  VALUE rb_vm_make_binding(rb_thread_t *th, const rb_control_frame_t *src_cfp);
1429
- VALUE rb_vm_env_local_variables(const rb_env_t *env);
1430
- const rb_env_t *rb_vm_env_prev_env(const rb_env_t *env);
1431
- const VALUE *rb_binding_add_dynavars(rb_binding_t *bind, int dyncount, const ID *dynvars);
954
+ VALUE rb_vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp);
955
+ VALUE rb_vm_env_local_variables(VALUE envval);
956
+ VALUE *rb_binding_add_dynavars(rb_binding_t *bind, int dyncount, const ID *dynvars);
1432
957
  void rb_vm_inc_const_missing_count(void);
1433
958
  void rb_vm_gvl_destroy(rb_vm_t *vm);
1434
959
  VALUE rb_vm_call(rb_thread_t *th, VALUE recv, VALUE id, int argc,
1435
- const VALUE *argv, const rb_callable_method_entry_t *me);
1436
- void rb_vm_pop_frame(rb_thread_t *th);
960
+ const VALUE *argv, const rb_method_entry_t *me,
961
+ VALUE defined_class);
962
+ void rb_unlink_method_entry(rb_method_entry_t *me);
963
+ void rb_gc_mark_unlinked_live_method_entries(void *pvm);
1437
964
 
1438
965
  void rb_thread_start_timer_thread(void);
1439
- void rb_thread_stop_timer_thread(void);
966
+ void rb_thread_stop_timer_thread(int);
1440
967
  void rb_thread_reset_timer_thread(void);
1441
968
  void rb_thread_wakeup_timer_thread(void);
1442
969
 
@@ -1461,11 +988,12 @@ rb_vm_living_threads_remove(rb_vm_t *vm, rb_thread_t *th)
1461
988
  vm->living_thread_num--;
1462
989
  }
1463
990
 
991
+ int ruby_thread_has_gvl_p(void);
1464
992
  typedef int rb_backtrace_iter_func(void *, VALUE, int, VALUE);
1465
993
  rb_control_frame_t *rb_vm_get_ruby_level_next_cfp(const rb_thread_t *th, const rb_control_frame_t *cfp);
1466
994
  rb_control_frame_t *rb_vm_get_binding_creatable_next_cfp(const rb_thread_t *th, const rb_control_frame_t *cfp);
1467
995
  int rb_vm_get_sourceline(const rb_control_frame_t *);
1468
- VALUE rb_name_err_mesg_new(VALUE mesg, VALUE recv, VALUE method);
996
+ VALUE rb_name_err_mesg_new(VALUE obj, VALUE mesg, VALUE recv, VALUE method);
1469
997
  void rb_vm_stack_to_heap(rb_thread_t *th);
1470
998
  void ruby_thread_init_stack(rb_thread_t *th);
1471
999
  int rb_vm_control_frame_id_and_class(const rb_control_frame_t *cfp, ID *idp, VALUE *klassp);
@@ -1477,9 +1005,7 @@ void rb_gc_mark_machine_stack(rb_thread_t *th);
1477
1005
 
1478
1006
  int rb_autoloading_value(VALUE mod, ID id, VALUE* value);
1479
1007
 
1480
- void rb_vm_rewrite_cref(rb_cref_t *node, VALUE old_klass, VALUE new_klass, rb_cref_t **new_cref_ptr);
1481
-
1482
- const rb_callable_method_entry_t *rb_vm_frame_method_entry(const rb_control_frame_t *cfp);
1008
+ void rb_vm_rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr);
1483
1009
 
1484
1010
  #define sysstack_error GET_VM()->special_exceptions[ruby_error_sysstack]
1485
1011
 
@@ -1508,20 +1034,18 @@ extern rb_event_flag_t ruby_vm_event_flags;
1508
1034
  #define OPT_CALL_CFUNC_WITHOUT_FRAME 0
1509
1035
  #endif
1510
1036
 
1511
- #define GET_THREAD() vm_thread_with_frame(ruby_current_thread)
1512
- #if OPT_CALL_CFUNC_WITHOUT_FRAME
1513
1037
  static inline rb_thread_t *
1514
- vm_thread_with_frame(rb_thread_t *th)
1038
+ GET_THREAD(void)
1515
1039
  {
1040
+ rb_thread_t *th = ruby_current_thread;
1041
+ #if OPT_CALL_CFUNC_WITHOUT_FRAME
1516
1042
  if (UNLIKELY(th->passed_ci != 0)) {
1517
- void rb_vm_call_cfunc_push_frame(rb_thread_t *th);
1518
- rb_vm_call_cfunc_push_frame(th);
1043
+ void vm_call_cfunc_push_frame(rb_thread_t *th);
1044
+ vm_call_cfunc_push_frame(th);
1519
1045
  }
1046
+ #endif
1520
1047
  return th;
1521
1048
  }
1522
- #else
1523
- #define vm_thread_with_frame(th) (th)
1524
- #endif
1525
1049
 
1526
1050
  #define rb_thread_set_current_raw(th) (void)(ruby_current_thread = (th))
1527
1051
  #define rb_thread_set_current(th) do { \
@@ -1550,7 +1074,6 @@ enum {
1550
1074
  #define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & ~(th)->interrupt_mask & (PENDING_INTERRUPT_MASK|TRAP_INTERRUPT_MASK))
1551
1075
  #define RUBY_VM_INTERRUPTED_ANY(th) ((th)->interrupt_flag & ~(th)->interrupt_mask)
1552
1076
 
1553
- VALUE rb_exc_set_backtrace(VALUE exc, VALUE bt);
1554
1077
  int rb_signal_buff_size(void);
1555
1078
  void rb_signal_exec(rb_thread_t *th, int sig);
1556
1079
  void rb_threadptr_check_signal(rb_thread_t *mth);
@@ -1562,16 +1085,23 @@ void rb_threadptr_unlock_all_locking_mutexes(rb_thread_t *th);
1562
1085
  void rb_threadptr_pending_interrupt_clear(rb_thread_t *th);
1563
1086
  void rb_threadptr_pending_interrupt_enque(rb_thread_t *th, VALUE v);
1564
1087
  int rb_threadptr_pending_interrupt_active_p(rb_thread_t *th);
1565
- void rb_threadptr_error_print(rb_thread_t *th, VALUE errinfo);
1566
1088
 
1567
- #define RUBY_VM_CHECK_INTS(th) ruby_vm_check_ints(th)
1568
- static inline void
1569
- ruby_vm_check_ints(rb_thread_t *th)
1570
- {
1571
- if (UNLIKELY(RUBY_VM_INTERRUPTED_ANY(th))) {
1572
- rb_threadptr_execute_interrupts(th, 0);
1573
- }
1574
- }
1089
+ #define RUBY_VM_CHECK_INTS_BLOCKING(th) do { \
1090
+ if (UNLIKELY(!rb_threadptr_pending_interrupt_empty_p(th))) { \
1091
+ th->pending_interrupt_queue_checked = 0; \
1092
+ RUBY_VM_SET_INTERRUPT(th); \
1093
+ rb_threadptr_execute_interrupts(th, 1); \
1094
+ } \
1095
+ else if (UNLIKELY(RUBY_VM_INTERRUPTED_ANY(th))) { \
1096
+ rb_threadptr_execute_interrupts(th, 1); \
1097
+ } \
1098
+ } while (0)
1099
+
1100
+ #define RUBY_VM_CHECK_INTS(th) do { \
1101
+ if (UNLIKELY(RUBY_VM_INTERRUPTED_ANY(th))) { \
1102
+ rb_threadptr_execute_interrupts(th, 0); \
1103
+ } \
1104
+ } while (0)
1575
1105
 
1576
1106
  /* tracer */
1577
1107
  struct rb_trace_arg_struct {
@@ -1594,33 +1124,24 @@ void rb_threadptr_exec_event_hooks(struct rb_trace_arg_struct *trace_arg);
1594
1124
  void rb_threadptr_exec_event_hooks_and_pop_frame(struct rb_trace_arg_struct *trace_arg);
1595
1125
 
1596
1126
  #define EXEC_EVENT_HOOK_ORIG(th_, flag_, self_, id_, klass_, data_, pop_p_) do { \
1597
- const rb_event_flag_t flag_arg_ = (flag_); \
1598
- if (UNLIKELY(ruby_vm_event_flags & (flag_arg_))) { \
1599
- /* defer evaluating the other arguments */ \
1600
- ruby_exec_event_hook_orig(th_, flag_arg_, self_, id_, klass_, data_, pop_p_); \
1127
+ if (UNLIKELY(ruby_vm_event_flags & (flag_))) { \
1128
+ if (((th)->event_hooks.events | (th)->vm->event_hooks.events) & (flag_)) { \
1129
+ struct rb_trace_arg_struct trace_arg; \
1130
+ trace_arg.event = (flag_); \
1131
+ trace_arg.th = (th_); \
1132
+ trace_arg.cfp = (trace_arg.th)->cfp; \
1133
+ trace_arg.self = (self_); \
1134
+ trace_arg.id = (id_); \
1135
+ trace_arg.klass = (klass_); \
1136
+ trace_arg.data = (data_); \
1137
+ trace_arg.path = Qundef; \
1138
+ trace_arg.klass_solved = 0; \
1139
+ if (pop_p_) rb_threadptr_exec_event_hooks_and_pop_frame(&trace_arg); \
1140
+ else rb_threadptr_exec_event_hooks(&trace_arg); \
1141
+ } \
1601
1142
  } \
1602
1143
  } while (0)
1603
1144
 
1604
- static inline void
1605
- ruby_exec_event_hook_orig(rb_thread_t *const th, const rb_event_flag_t flag,
1606
- VALUE self, ID id, VALUE klass, VALUE data, int pop_p)
1607
- {
1608
- if ((th->event_hooks.events | th->vm->event_hooks.events) & flag) {
1609
- struct rb_trace_arg_struct trace_arg;
1610
- trace_arg.event = flag;
1611
- trace_arg.th = th;
1612
- trace_arg.cfp = th->cfp;
1613
- trace_arg.self = self;
1614
- trace_arg.id = id;
1615
- trace_arg.klass = klass;
1616
- trace_arg.data = data;
1617
- trace_arg.path = Qundef;
1618
- trace_arg.klass_solved = 0;
1619
- if (pop_p) rb_threadptr_exec_event_hooks_and_pop_frame(&trace_arg);
1620
- else rb_threadptr_exec_event_hooks(&trace_arg);
1621
- }
1622
- }
1623
-
1624
1145
  #define EXEC_EVENT_HOOK(th_, flag_, self_, id_, klass_, data_) \
1625
1146
  EXEC_EVENT_HOOK_ORIG(th_, flag_, self_, id_, klass_, data_, 0)
1626
1147