ruby-internal 0.7.3 → 0.8.0

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 (254) hide show
  1. data/bin/ruby-internal-node-dump +1 -1
  2. data/bin/ruby-internal-obfuscate +1 -1
  3. data/ext/cached/ruby-1.8.4/internal/method/{method.h → internal_method.h} +12 -0
  4. data/ext/cached/ruby-1.8.4/internal/module/getcfp.h +13 -0
  5. data/ext/cached/ruby-1.8.4/internal/node/global_entry.h +94 -0
  6. data/ext/cached/ruby-1.8.4/internal/node/node_type_descrip.c +41 -41
  7. data/ext/cached/ruby-1.8.4/internal/node/nodeinfo.c +288 -273
  8. data/ext/cached/ruby-1.8.4/internal/vm/instruction/insns_info.c +3 -0
  9. data/ext/cached/ruby-1.8.4/internal/vm/iseq/iseq_load.inc +21 -2
  10. data/ext/cached/{ruby-1.8.3/internal/method/method.h → ruby-1.8.5/internal/method/internal_method.h} +12 -0
  11. data/ext/cached/ruby-1.8.5/internal/module/getcfp.h +13 -0
  12. data/ext/cached/ruby-1.8.5/internal/node/global_entry.h +94 -0
  13. data/ext/cached/ruby-1.8.5/internal/node/node_type_descrip.c +45 -45
  14. data/ext/cached/ruby-1.8.5/internal/node/nodeinfo.c +310 -295
  15. data/ext/cached/ruby-1.8.5/internal/vm/instruction/insns_info.c +3 -0
  16. data/ext/cached/ruby-1.8.5/internal/vm/iseq/iseq_load.inc +21 -2
  17. data/ext/cached/{ruby-1.8.5/internal/method/method.h → ruby-1.8.6/internal/method/internal_method.h} +12 -0
  18. data/ext/cached/ruby-1.8.6/internal/module/getcfp.h +13 -0
  19. data/ext/cached/ruby-1.8.6/internal/node/global_entry.h +94 -0
  20. data/ext/cached/ruby-1.8.6/internal/node/node_type_descrip.c +48 -48
  21. data/ext/cached/ruby-1.8.6/internal/node/nodeinfo.c +323 -308
  22. data/ext/cached/ruby-1.8.6/internal/vm/instruction/insns_info.c +3 -0
  23. data/ext/cached/ruby-1.8.6/internal/vm/iseq/iseq_load.inc +21 -2
  24. data/ext/cached/{ruby-1.8.6/internal/method/method.h → ruby-1.8.7/internal/method/internal_method.h} +12 -0
  25. data/ext/cached/ruby-1.8.7/internal/module/getcfp.h +13 -0
  26. data/ext/cached/ruby-1.8.7/internal/node/global_entry.h +98 -0
  27. data/ext/cached/ruby-1.8.7/internal/node/node_type_descrip.c +42 -42
  28. data/ext/cached/ruby-1.8.7/internal/node/nodeinfo.c +276 -261
  29. data/ext/cached/ruby-1.8.7/internal/vm/instruction/insns_info.c +3 -0
  30. data/ext/cached/ruby-1.8.7/internal/vm/iseq/iseq_load.inc +21 -2
  31. data/ext/cached/{ruby-1.9.0/internal/method/method.h → ruby-1.9.1/internal/method/internal_method.h} +12 -0
  32. data/ext/cached/ruby-1.9.1/internal/module/classpath.c +12 -14
  33. data/ext/cached/ruby-1.9.1/internal/module/getcfp.h +25 -0
  34. data/ext/cached/ruby-1.9.1/internal/node/global_entry.h +86 -0
  35. data/ext/cached/ruby-1.9.1/internal/node/node_type_descrip.c +46 -48
  36. data/ext/cached/ruby-1.9.1/internal/node/nodeinfo.c +311 -412
  37. data/ext/cached/ruby-1.9.1/internal/vm/instruction/insns_info.c +3 -0
  38. data/ext/cached/ruby-1.9.1/internal/vm/iseq/iseq_load.inc +28 -6
  39. data/ext/cached/ruby-1.9.1/internal/yarv-headers/iseq.h +1 -0
  40. data/ext/cached/ruby-1.9.1/internal/yarv-headers/parse.h +6 -6
  41. data/ext/cached/ruby-1.9.1/internal/yarv-headers/revision.h +1 -1
  42. data/ext/cached/ruby-1.9.1/internal/yarv-headers/version.h +6 -5
  43. data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_core.h +3 -2
  44. data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_insnhelper.h +1 -0
  45. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/binding/block.h +0 -0
  46. data/ext/cached/{ruby-1.9.1/internal/method/method.h → ruby-1.9.2/internal/method/internal_method.h} +16 -5
  47. data/ext/cached/ruby-1.9.2/internal/module/classpath.c +40 -0
  48. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/module/classpath.h +0 -0
  49. data/ext/cached/ruby-1.9.2/internal/module/getcfp.h +25 -0
  50. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/node/block.h +0 -0
  51. data/ext/cached/ruby-1.9.2/internal/node/global_entry.h +93 -0
  52. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/node/node_type_descrip.c +44 -48
  53. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/node/nodeinfo.c +291 -439
  54. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/node/nodeinfo.h +0 -0
  55. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/proc/block.h +0 -0
  56. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/tag/tag.h +0 -0
  57. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/vm/instruction/insns_info.c +141 -64
  58. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/vm/instruction/insns_info.h +88 -80
  59. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/vm/iseq/insns_info.inc +77 -70
  60. data/ext/cached/ruby-1.9.2/internal/vm/iseq/iseq_load.inc +426 -0
  61. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/debug.h +1 -1
  62. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/dln.h +3 -3
  63. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/encdb.h +18 -2
  64. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/eval_intern.h +39 -28
  65. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/gc.h +7 -5
  66. data/ext/cached/ruby-1.9.2/internal/yarv-headers/id.h +170 -0
  67. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/iseq.h +20 -10
  68. data/ext/cached/ruby-1.9.2/internal/yarv-headers/method.h +103 -0
  69. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/node.h +14 -47
  70. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/parse.h +31 -148
  71. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/regenc.h +7 -3
  72. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/regint.h +16 -17
  73. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/regparse.h +4 -1
  74. data/ext/cached/ruby-1.9.2/internal/yarv-headers/revision.h +1 -0
  75. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/thread_pthread.h +4 -1
  76. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/thread_win32.h +1 -1
  77. data/ext/cached/ruby-1.9.2/internal/yarv-headers/timev.h +21 -0
  78. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/transcode_data.h +20 -10
  79. data/ext/cached/ruby-1.9.2/internal/yarv-headers/transdb.h +179 -0
  80. data/ext/cached/ruby-1.9.2/internal/yarv-headers/version.h +55 -0
  81. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/vm_core.h +127 -84
  82. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/vm_exec.h +4 -7
  83. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/vm_insnhelper.h +53 -36
  84. data/ext/cached/{ruby-1.9.0 → ruby-1.9.2}/internal/yarv-headers/vm_opts.h +1 -1
  85. data/ext/cached/ruby-1.9.3/internal/binding/block.h +12 -0
  86. data/ext/cached/ruby-1.9.3/internal/method/internal_method.h +32 -0
  87. data/ext/cached/ruby-1.9.3/internal/module/classpath.c +40 -0
  88. data/ext/cached/{ruby-1.8.0 → ruby-1.9.3}/internal/module/classpath.h +5 -2
  89. data/ext/cached/ruby-1.9.3/internal/module/getcfp.h +25 -0
  90. data/ext/cached/ruby-1.9.3/internal/node/block.h +12 -0
  91. data/ext/cached/ruby-1.9.3/internal/node/global_entry.h +93 -0
  92. data/ext/cached/{ruby-1.8.3 → ruby-1.9.3}/internal/node/node_type_descrip.c +48 -57
  93. data/ext/cached/{ruby-1.6.8 → ruby-1.9.3}/internal/node/nodeinfo.c +589 -740
  94. data/ext/cached/{ruby-1.8.0 → ruby-1.9.3}/internal/node/nodeinfo.h +4 -3
  95. data/ext/cached/ruby-1.9.3/internal/proc/block.h +12 -0
  96. data/ext/cached/ruby-1.9.3/internal/tag/tag.h +6 -0
  97. data/ext/cached/ruby-1.9.3/internal/vm/instruction/insns_info.c +6013 -0
  98. data/ext/cached/ruby-1.9.3/internal/vm/instruction/insns_info.h +899 -0
  99. data/ext/cached/ruby-1.9.3/internal/vm/iseq/insns_info.inc +707 -0
  100. data/ext/cached/ruby-1.9.3/internal/vm/iseq/iseq_load.inc +423 -0
  101. data/ext/cached/ruby-1.9.3/internal/yarv-headers/addr2line.h +21 -0
  102. data/ext/cached/ruby-1.9.3/internal/yarv-headers/atomic.h +56 -0
  103. data/ext/cached/ruby-1.9.3/internal/yarv-headers/constant.h +34 -0
  104. data/ext/cached/ruby-1.9.3/internal/yarv-headers/debug.h +41 -0
  105. data/ext/cached/ruby-1.9.3/internal/yarv-headers/dln.h +50 -0
  106. data/ext/cached/ruby-1.9.3/internal/yarv-headers/encdb.h +167 -0
  107. data/ext/cached/ruby-1.9.3/internal/yarv-headers/eval_intern.h +234 -0
  108. data/ext/cached/ruby-1.9.3/internal/yarv-headers/gc.h +98 -0
  109. data/ext/cached/ruby-1.9.3/internal/yarv-headers/id.h +175 -0
  110. data/ext/cached/ruby-1.9.3/internal/yarv-headers/internal.h +232 -0
  111. data/ext/cached/ruby-1.9.3/internal/yarv-headers/iseq.h +125 -0
  112. data/ext/cached/ruby-1.9.3/internal/yarv-headers/method.h +105 -0
  113. data/ext/cached/ruby-1.9.3/internal/yarv-headers/node.h +503 -0
  114. data/ext/cached/ruby-1.9.3/internal/yarv-headers/parse.h +186 -0
  115. data/ext/cached/ruby-1.9.3/internal/yarv-headers/regenc.h +219 -0
  116. data/ext/cached/ruby-1.9.3/internal/yarv-headers/regint.h +850 -0
  117. data/ext/cached/ruby-1.9.3/internal/yarv-headers/regparse.h +362 -0
  118. data/ext/cached/ruby-1.9.3/internal/yarv-headers/revision.h +1 -0
  119. data/ext/cached/ruby-1.9.3/internal/yarv-headers/thread_pthread.h +51 -0
  120. data/ext/cached/ruby-1.9.3/internal/yarv-headers/thread_win32.h +40 -0
  121. data/ext/cached/ruby-1.9.3/internal/yarv-headers/timev.h +21 -0
  122. data/ext/cached/ruby-1.9.3/internal/yarv-headers/transcode_data.h +117 -0
  123. data/ext/cached/ruby-1.9.3/internal/yarv-headers/transdb.h +189 -0
  124. data/ext/cached/ruby-1.9.3/internal/yarv-headers/version.h +52 -0
  125. data/ext/cached/ruby-1.9.3/internal/yarv-headers/vm_core.h +756 -0
  126. data/ext/cached/ruby-1.9.3/internal/yarv-headers/vm_exec.h +184 -0
  127. data/ext/cached/ruby-1.9.3/internal/yarv-headers/vm_insnhelper.h +220 -0
  128. data/ext/cached/ruby-1.9.3/internal/yarv-headers/vm_opts.h +51 -0
  129. data/ext/internal/binding/block.h +20 -0
  130. data/ext/internal/method/internal_method.h +5 -38
  131. data/ext/internal/method/internal_method.h.rpp +0 -7
  132. data/ext/internal/method/method.c +52 -32
  133. data/ext/internal/module/classpath.c +18 -13
  134. data/ext/internal/module/classpath.h +3 -3
  135. data/ext/internal/module/extconf.rb +3 -2
  136. data/ext/internal/module/getcfp.h +13 -0
  137. data/ext/internal/module/getcfp.h.rpp +44 -0
  138. data/ext/internal/module/module.c +58 -21
  139. data/ext/internal/node/block.h +20 -0
  140. data/ext/internal/node/extconf.rb +2 -0
  141. data/ext/internal/node/global_entry.h +69 -13
  142. data/ext/internal/node/global_entry.h.rpp +11 -2
  143. data/ext/internal/node/node.c +30 -3
  144. data/ext/internal/node/node_type_descrip.c +47 -38
  145. data/ext/internal/node/nodeinfo.c +622 -306
  146. data/ext/internal/node/nodeinfo.h +1 -4
  147. data/ext/internal/proc/block.h +20 -0
  148. data/ext/internal/tag/tag.h +10 -0
  149. data/ext/internal/thread/thread.c +9 -3
  150. data/ext/internal/vm/extconf.rb +1 -0
  151. data/ext/internal/vm/instruction/insns_info.c +3 -5974
  152. data/ext/internal/vm/instruction/insns_info.h +0 -878
  153. data/ext/internal/vm/iseq/extconf.rb +1 -0
  154. data/ext/internal/vm/iseq/iseq.c +38 -4
  155. data/ext/internal/vm/iseq/iseq_load.inc.rpp +23 -5
  156. data/ext/internal/vm/vm.c +28 -0
  157. data/lib/internal/classtree.rb +28 -0
  158. data/lib/internal/debug.rb +10 -2
  159. data/lib/internal/method/as_code.rb +25 -0
  160. data/lib/internal/method/as_expression.rb +2 -3
  161. data/lib/internal/method/origin.rb +29 -0
  162. data/lib/internal/method/signature.rb +5 -300
  163. data/lib/internal/method/signature/argument.rb +102 -0
  164. data/lib/internal/method/signature/iseq.rb +52 -0
  165. data/lib/internal/method/signature/node.rb +160 -0
  166. data/lib/internal/method/signature/signature.rb +23 -0
  167. data/lib/internal/proc/as_code.rb +2 -0
  168. data/lib/internal/proc/as_expression.rb +2 -0
  169. data/lib/internal/vm/bytedecoder.rb +5 -5
  170. data/lib/internal/vm/iseq/as_code.rb +2 -2
  171. data/lib/internal/vm/iseq/as_expression.rb +2 -2
  172. data/test/test_dump_method.rb +1 -1
  173. data/test/test_method.rb +21 -3
  174. data/test/test_node.rb +20 -4
  175. metadata +152 -155
  176. data/ext/cached/ruby-1.6.8/internal/binding/block.h +0 -35
  177. data/ext/cached/ruby-1.6.8/internal/method/method.h +0 -19
  178. data/ext/cached/ruby-1.6.8/internal/module/classpath.c +0 -3
  179. data/ext/cached/ruby-1.6.8/internal/module/classpath.h +0 -8
  180. data/ext/cached/ruby-1.6.8/internal/node/block.h +0 -35
  181. data/ext/cached/ruby-1.6.8/internal/node/global_entry.h +0 -15
  182. data/ext/cached/ruby-1.6.8/internal/node/node_type_descrip.c +0 -149
  183. data/ext/cached/ruby-1.6.8/internal/node/nodeinfo.h +0 -69
  184. data/ext/cached/ruby-1.6.8/internal/proc/block.h +0 -35
  185. data/ext/cached/ruby-1.6.8/internal/tag/tag.h +0 -15
  186. data/ext/cached/ruby-1.6.8/internal/vm/instruction/insns_info.c +0 -39
  187. data/ext/cached/ruby-1.6.8/internal/vm/instruction/insns_info.h +0 -21
  188. data/ext/cached/ruby-1.6.8/internal/vm/iseq/insns_info.inc +0 -12
  189. data/ext/cached/ruby-1.6.8/internal/vm/iseq/iseq_load.inc +0 -9
  190. data/ext/cached/ruby-1.8.0/internal/binding/block.h +0 -37
  191. data/ext/cached/ruby-1.8.0/internal/method/method.h +0 -19
  192. data/ext/cached/ruby-1.8.0/internal/module/classpath.c +0 -27
  193. data/ext/cached/ruby-1.8.0/internal/node/block.h +0 -37
  194. data/ext/cached/ruby-1.8.0/internal/node/global_entry.h +0 -10
  195. data/ext/cached/ruby-1.8.0/internal/node/node_type_descrip.c +0 -155
  196. data/ext/cached/ruby-1.8.0/internal/node/nodeinfo.c +0 -5744
  197. data/ext/cached/ruby-1.8.0/internal/proc/block.h +0 -37
  198. data/ext/cached/ruby-1.8.0/internal/tag/tag.h +0 -15
  199. data/ext/cached/ruby-1.8.0/internal/vm/instruction/insns_info.c +0 -39
  200. data/ext/cached/ruby-1.8.0/internal/vm/instruction/insns_info.h +0 -21
  201. data/ext/cached/ruby-1.8.0/internal/vm/iseq/insns_info.inc +0 -12
  202. data/ext/cached/ruby-1.8.0/internal/vm/iseq/iseq_load.inc +0 -9
  203. data/ext/cached/ruby-1.8.1/internal/binding/block.h +0 -31
  204. data/ext/cached/ruby-1.8.1/internal/method/method.h +0 -19
  205. data/ext/cached/ruby-1.8.1/internal/module/classpath.c +0 -27
  206. data/ext/cached/ruby-1.8.1/internal/module/classpath.h +0 -14
  207. data/ext/cached/ruby-1.8.1/internal/node/block.h +0 -31
  208. data/ext/cached/ruby-1.8.1/internal/node/global_entry.h +0 -10
  209. data/ext/cached/ruby-1.8.1/internal/node/node_type_descrip.c +0 -154
  210. data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.c +0 -5736
  211. data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.h +0 -69
  212. data/ext/cached/ruby-1.8.1/internal/proc/block.h +0 -31
  213. data/ext/cached/ruby-1.8.1/internal/tag/tag.h +0 -16
  214. data/ext/cached/ruby-1.8.1/internal/vm/instruction/insns_info.c +0 -39
  215. data/ext/cached/ruby-1.8.1/internal/vm/instruction/insns_info.h +0 -21
  216. data/ext/cached/ruby-1.8.1/internal/vm/iseq/insns_info.inc +0 -12
  217. data/ext/cached/ruby-1.8.1/internal/vm/iseq/iseq_load.inc +0 -9
  218. data/ext/cached/ruby-1.8.2/internal/binding/block.h +0 -32
  219. data/ext/cached/ruby-1.8.2/internal/method/method.h +0 -19
  220. data/ext/cached/ruby-1.8.2/internal/module/classpath.c +0 -45
  221. data/ext/cached/ruby-1.8.2/internal/module/classpath.h +0 -17
  222. data/ext/cached/ruby-1.8.2/internal/node/block.h +0 -32
  223. data/ext/cached/ruby-1.8.2/internal/node/global_entry.h +0 -10
  224. data/ext/cached/ruby-1.8.2/internal/node/node_type_descrip.c +0 -154
  225. data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.c +0 -5736
  226. data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.h +0 -69
  227. data/ext/cached/ruby-1.8.2/internal/proc/block.h +0 -32
  228. data/ext/cached/ruby-1.8.2/internal/tag/tag.h +0 -16
  229. data/ext/cached/ruby-1.8.2/internal/vm/instruction/insns_info.c +0 -39
  230. data/ext/cached/ruby-1.8.2/internal/vm/instruction/insns_info.h +0 -21
  231. data/ext/cached/ruby-1.8.2/internal/vm/iseq/insns_info.inc +0 -12
  232. data/ext/cached/ruby-1.8.2/internal/vm/iseq/iseq_load.inc +0 -9
  233. data/ext/cached/ruby-1.8.3/internal/binding/block.h +0 -32
  234. data/ext/cached/ruby-1.8.3/internal/module/classpath.c +0 -45
  235. data/ext/cached/ruby-1.8.3/internal/module/classpath.h +0 -17
  236. data/ext/cached/ruby-1.8.3/internal/node/block.h +0 -32
  237. data/ext/cached/ruby-1.8.3/internal/node/global_entry.h +0 -10
  238. data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.c +0 -5736
  239. data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.h +0 -69
  240. data/ext/cached/ruby-1.8.3/internal/proc/block.h +0 -32
  241. data/ext/cached/ruby-1.8.3/internal/tag/tag.h +0 -16
  242. data/ext/cached/ruby-1.8.3/internal/vm/instruction/insns_info.c +0 -39
  243. data/ext/cached/ruby-1.8.3/internal/vm/instruction/insns_info.h +0 -21
  244. data/ext/cached/ruby-1.8.3/internal/vm/iseq/insns_info.inc +0 -12
  245. data/ext/cached/ruby-1.8.3/internal/vm/iseq/iseq_load.inc +0 -9
  246. data/ext/cached/ruby-1.8.7/internal/method/method.h +0 -20
  247. data/ext/cached/ruby-1.9.0/internal/module/classpath.c +0 -42
  248. data/ext/cached/ruby-1.9.0/internal/node/global_entry.h +0 -10
  249. data/ext/cached/ruby-1.9.0/internal/vm/iseq/iseq_load.inc +0 -13
  250. data/ext/cached/ruby-1.9.0/internal/yarv-headers/id.h +0 -83
  251. data/ext/cached/ruby-1.9.0/internal/yarv-headers/revision.h +0 -1
  252. data/ext/cached/ruby-1.9.0/internal/yarv-headers/transdb.h +0 -67
  253. data/ext/cached/ruby-1.9.0/internal/yarv-headers/version.h +0 -57
  254. data/ext/internal/module/cfp.h +0 -13
@@ -7,6 +7,26 @@
7
7
  #include "env.h"
8
8
  #endif
9
9
 
10
+ struct BLOCK {
11
+ NODE *var;
12
+ NODE *body;
13
+ VALUE self;
14
+ struct FRAME frame;
15
+ struct SCOPE *scope;
16
+ VALUE klass;
17
+ NODE *cref;
18
+ int iter;
19
+ int vmode;
20
+ int flags;
21
+ int uniq;
22
+ struct RVarmap *dyna_vars;
23
+ VALUE orig_thread;
24
+ VALUE wrapper;
25
+ VALUE block_obj;
26
+ struct BLOCK *outer;
27
+ struct BLOCK *prev;
28
+ };
29
+
10
30
 
11
31
  #endif
12
32
 
@@ -40,5 +40,7 @@ $CPPFLAGS << " -DRUBY_VERSION_CODE=#{ruby_version_code}"
40
40
 
41
41
  have_header('ruby/node.h') or have_header('node.h')
42
42
 
43
+ have_type('struct RTypedData')
44
+
43
45
  create_ruby_internal_makefile 'internal/node/node'
44
46
 
@@ -3,30 +3,39 @@
3
3
 
4
4
  st_table * rb_global_tbl;
5
5
 
6
- #define global_entry rb_global_entry
7
- #define gvar_getter_t rb_gvar_getter_t
8
- #define gvar_setter_t rb_gvar_setter_t
9
- #define gvar_marker_t rb_gvar_marker_t
10
-
6
+ struct trace_var {
7
+ int removed;
8
+ void (*func)();
9
+ VALUE data;
10
+ struct trace_var *next;
11
+ };
11
12
  struct global_variable {
12
13
  int counter;
13
14
  void *data;
14
- gvar_getter_t *getter;
15
- gvar_setter_t *setter;
16
- gvar_marker_t *marker;
15
+ VALUE (*getter)();
16
+ void (*setter)();
17
+ void (*marker)();
17
18
  int block_trace;
18
19
  struct trace_var *trace;
19
20
  };
20
- #define undef_getter rb_gvar_undef_getter
21
- #define undef_setter rb_gvar_undef_setter
22
- #define undef_marker rb_gvar_undef_marker
21
+ struct global_entry {
22
+ struct global_variable *var;
23
+ ID id;
24
+ };
25
+ static VALUE undef_getter();
26
+ static void undef_setter();
27
+ static void undef_marker();
28
+ static VALUE val_getter();
29
+ static void val_setter();
30
+ static void val_marker();
23
31
  struct global_entry*
24
- rb_global_entry(ID id)
32
+ rb_global_entry(id)
33
+ ID id;
25
34
  {
26
35
  struct global_entry *entry;
27
36
  st_data_t data;
28
37
 
29
- if (!st_lookup(rb_global_tbl, (st_data_t)id, &data)) {
38
+ if (!st_lookup(rb_global_tbl, id, &data)) {
30
39
  struct global_variable *var;
31
40
  entry = ALLOC(struct global_entry);
32
41
  var = ALLOC(struct global_variable);
@@ -47,6 +56,53 @@ rb_global_entry(ID id)
47
56
  }
48
57
  return entry;
49
58
  }
59
+ static VALUE
60
+ undef_getter(id)
61
+ ID id;
62
+ {
63
+ rb_warning("global variable `%s' not initialized", rb_id2name(id));
64
+
65
+ return Qnil;
66
+ }
67
+ static void
68
+ undef_setter(val, id, data, var)
69
+ VALUE val;
70
+ ID id;
71
+ void *data;
72
+ struct global_variable *var;
73
+ {
74
+ var->getter = val_getter;
75
+ var->setter = val_setter;
76
+ var->marker = val_marker;
77
+
78
+ var->data = (void*)val;
79
+ }
80
+ static void
81
+ undef_marker()
82
+ {
83
+ }
84
+ static VALUE
85
+ val_getter(id, val)
86
+ ID id;
87
+ VALUE val;
88
+ {
89
+ return val;
90
+ }
91
+ static void
92
+ val_setter(val, id, data, var)
93
+ VALUE val;
94
+ ID id;
95
+ void *data;
96
+ struct global_variable *var;
97
+ {
98
+ var->data = (void*)val;
99
+ }
100
+ static void
101
+ val_marker(data)
102
+ VALUE data;
103
+ {
104
+ if (data) rb_gc_mark_maybe(data);
105
+ }
50
106
 
51
107
  #endif
52
108
 
@@ -14,8 +14,17 @@ st_table * rb_global_tbl;
14
14
  prev_line = ''
15
15
  while (line = variable_c.gets) != nil do
16
16
  case line
17
- when /^rb_global_entry\(.*\)/,
18
- /^struct global_variable {/
17
+ when /^struct (global_entry|global_variable|trace_var)\s*\{/
18
+ write = true
19
+ stopwrite = false
20
+ when /^static\s+(VALUE|void)\s+(undef_getter|undef_setter|undef_marker)\(\)/,
21
+ /^static\s+(VALUE|void)\s+(val_getter|val_setter|val_marker)\(\)/
22
+ write = true
23
+ stopwrite = true
24
+ when /^(rb_global_entry)\(.*\)/,
25
+ /^(undef_getter|undef_setter|undef_marker)\(.*\)/,
26
+ /^(val_getter|val_setter|val_marker)\(.*\)/,
27
+ /^struct global_variable \{/
19
28
  puts prev_line
20
29
  write = true
21
30
  stopwrite = false
@@ -32,6 +32,22 @@
32
32
  #define RARRAY_PTR(a) RARRAY(a)->ptr
33
33
  #endif
34
34
 
35
+ #ifdef HAVE_TYPE_STRUCT_RTYPEDDATA
36
+
37
+ # undef GetThreadPtr
38
+ # define GetThreadPtr(obj, ptr) \
39
+ TypedData_Get_Struct((obj), rb_thread_t, p_ruby_threadptr_data_type, (ptr))
40
+
41
+ static rb_data_type_t const * p_ruby_threadptr_data_type;
42
+
43
+ static void init_ruby_threadptr_data_type()
44
+ {
45
+ VALUE thread = rb_thread_current();
46
+ p_ruby_threadptr_data_type = RTYPEDDATA_TYPE(thread);
47
+ }
48
+
49
+ #endif
50
+
35
51
  static VALUE rb_cNode = Qnil;
36
52
  static VALUE rb_cNodeType = Qnil;
37
53
  VALUE rb_cNodeSubclass[NODE_LAST];
@@ -524,8 +540,12 @@ VALUE eval_ruby_node(NODE * node, VALUE self, VALUE cref)
524
540
  if(nd_type(node) != NODE_SCOPE)
525
541
  {
526
542
  /* TODO: This is kinda hokey */
527
- ID * local_tbl = ruby_current_thread->cfp->iseq
528
- ? ruby_current_thread->cfp->iseq->local_table
543
+ VALUE thread = rb_thread_current();
544
+ rb_thread_t * th;
545
+ ID * local_tbl;
546
+ GetThreadPtr(thread, th);
547
+ local_tbl = th->cfp->iseq
548
+ ? th->cfp->iseq->local_table
529
549
  : 0;
530
550
  node = NEW_NODE(NODE_SCOPE, local_tbl, node, 0);
531
551
  }
@@ -784,7 +804,10 @@ static VALUE node_compile_string(int argc, VALUE * argv, VALUE self)
784
804
  #ifdef RUBY_VM
785
805
  if(!node)
786
806
  {
787
- rb_exc_raise(GET_THREAD()->errinfo);
807
+ VALUE thread = rb_thread_current();
808
+ rb_thread_t * th;
809
+ GetThreadPtr(thread, th);
810
+ rb_exc_raise(th->errinfo);
788
811
  }
789
812
  #else
790
813
  if(ruby_nerrs > 0)
@@ -1170,5 +1193,9 @@ void Init_node(void)
1170
1193
  ruby_cref_getter,
1171
1194
  ruby_cref_setter);
1172
1195
  #endif
1196
+
1197
+ #ifdef HAVE_TYPE_STRUCT_RTYPEDDATA
1198
+ init_ruby_threadptr_data_type();
1199
+ #endif
1173
1200
  }
1174
1201
 
@@ -2,100 +2,109 @@
2
2
  #include "version.h"
3
3
 
4
4
  Node_Type_Descrip node_type_descrips_unsorted[] = {
5
- { NODE_ALIAS, NEN_1ST, NEN_2ND, NEN_NONE, "ALIAS" },
5
+ { NODE_ALIAS, NEN_2ND, NEN_1ST, NEN_NONE, "ALIAS" },
6
6
  #ifdef HAVE_NODE_ALLOCA
7
- { NODE_ALLOCA, NEN_CFNC, NEN_VALUE, NEN_CNT, "ALLOCA" },
7
+ { NODE_ALLOCA, NEN_CNT, NEN_CFNC, NEN_VALUE, "ALLOCA" },
8
8
  #endif
9
9
  { NODE_AND, NEN_2ND, NEN_1ST, NEN_NONE, "AND" },
10
- { NODE_ARGS, NEN_REST, NEN_OPT, NEN_CNT, "ARGS" },
10
+ { NODE_ARGS, NEN_REST, NEN_CNT, NEN_OPT, "ARGS" },
11
11
  { NODE_ARGSCAT, NEN_HEAD, NEN_BODY, NEN_NONE, "ARGSCAT" },
12
12
  { NODE_ARGSPUSH, NEN_HEAD, NEN_BODY, NEN_NONE, "ARGSPUSH" },
13
- { NODE_ARRAY, NEN_ALEN, NEN_HEAD, NEN_NEXT, "ARRAY" },
14
- { NODE_ATTRASGN, NEN_RECV, NEN_ARGS, NEN_MID, "ATTRASGN" },
15
- { NODE_BACK_REF, NEN_NTH, NEN_CNT, NEN_NONE, "BACK_REF" },
13
+ { NODE_ARRAY, NEN_NEXT, NEN_HEAD, NEN_ALEN, "ARRAY" },
14
+ { NODE_ATTRASGN, NEN_ARGS, NEN_RECV, NEN_MID, "ATTRASGN" },
15
+ { NODE_ATTRSET, NEN_VID, NEN_NONE, NEN_NONE, "ATTRSET" },
16
+ { NODE_BACK_REF, NEN_CNT, NEN_NTH, NEN_NONE, "BACK_REF" },
16
17
  { NODE_BEGIN, NEN_BODY, NEN_NONE, NEN_NONE, "BEGIN" },
17
- { NODE_BLOCK, NEN_HEAD, NEN_NEXT, NEN_NONE, "BLOCK" },
18
+ { NODE_BLOCK, NEN_NEXT, NEN_HEAD, NEN_NONE, "BLOCK" },
18
19
  { NODE_BLOCK_ARG, NEN_CNT, NEN_NONE, NEN_NONE, "BLOCK_ARG" },
19
- { NODE_BLOCK_PASS, NEN_BODY, NEN_ITER, NEN_NONE, "BLOCK_PASS" },
20
+ { NODE_BLOCK_PASS, NEN_ITER, NEN_BODY, NEN_NONE, "BLOCK_PASS" },
20
21
  { NODE_BMETHOD, NEN_CVAL, NEN_NONE, NEN_NONE, "BMETHOD" },
21
22
  { NODE_BREAK, NEN_STTS, NEN_NONE, NEN_NONE, "BREAK" },
22
23
  { NODE_CALL, NEN_ARGS, NEN_MID, NEN_RECV, "CALL" },
23
- { NODE_CASE, NEN_HEAD, NEN_BODY, NEN_NEXT, "CASE" },
24
+ { NODE_CASE, NEN_NEXT, NEN_HEAD, NEN_BODY, "CASE" },
24
25
  { NODE_CDECL, NEN_VALUE, NEN_VID, NEN_NONE, "CDECL" },
26
+ { NODE_CFUNC, NEN_ARGC, NEN_CFNC, NEN_NONE, "CFUNC" },
25
27
  { NODE_CLASS, NEN_SUPER, NEN_CPATH, NEN_BODY, "CLASS" },
26
28
  { NODE_COLON2, NEN_HEAD, NEN_MID, NEN_NONE, "COLON2" },
27
29
  { NODE_COLON3, NEN_MID, NEN_NONE, NEN_NONE, "COLON3" },
28
30
  { NODE_CONST, NEN_VID, NEN_NONE, NEN_NONE, "CONST" },
31
+ { NODE_CREF, NEN_NEXT, NEN_BODY, NEN_CLSS, "CREF" },
29
32
  { NODE_CVAR, NEN_VID, NEN_NONE, NEN_NONE, "CVAR" },
30
33
  { NODE_CVASGN, NEN_VALUE, NEN_VID, NEN_NONE, "CVASGN" },
31
34
  { NODE_CVDECL, NEN_VALUE, NEN_VID, NEN_NONE, "CVDECL" },
32
35
  { NODE_DASGN, NEN_VALUE, NEN_VID, NEN_NONE, "DASGN" },
33
36
  { NODE_DASGN_CURR, NEN_VALUE, NEN_VID, NEN_NONE, "DASGN_CURR" },
34
37
  { NODE_DEFINED, NEN_HEAD, NEN_NONE, NEN_NONE, "DEFINED" },
35
- { NODE_DEFN, NEN_DEFN, NEN_MID, NEN_NOEX, "DEFN" },
36
- { NODE_DEFS, NEN_DEFN, NEN_RECV, NEN_MID, "DEFS" },
37
- { NODE_DOT2, NEN_BEG, NEN_END, NEN_STATE, "DOT2" },
38
- { NODE_DOT3, NEN_BEG, NEN_END, NEN_STATE, "DOT3" },
39
- { NODE_DREGX, NEN_LIT, NEN_NEXT, NEN_CFLAG, "DREGX" },
40
- { NODE_DREGX_ONCE, NEN_LIT, NEN_NEXT, NEN_CFLAG, "DREGX_ONCE" },
41
- { NODE_DSTR, NEN_LIT, NEN_NEXT, NEN_NONE, "DSTR" },
42
- { NODE_DSYM, NEN_LIT, NEN_NEXT, NEN_NONE, "DSYM" },
38
+ { NODE_DEFN, NEN_MID, NEN_NOEX, NEN_DEFN, "DEFN" },
39
+ { NODE_DEFS, NEN_RECV, NEN_MID, NEN_DEFN, "DEFS" },
40
+ { NODE_DMETHOD, NEN_CVAL, NEN_NONE, NEN_NONE, "DMETHOD" },
41
+ { NODE_DOT2, NEN_END, NEN_STATE, NEN_BEG, "DOT2" },
42
+ { NODE_DOT3, NEN_END, NEN_STATE, NEN_BEG, "DOT3" },
43
+ { NODE_DREGX, NEN_NEXT, NEN_LIT, NEN_CFLAG, "DREGX" },
44
+ { NODE_DREGX_ONCE, NEN_NEXT, NEN_LIT, NEN_CFLAG, "DREGX_ONCE" },
45
+ { NODE_DSTR, NEN_NEXT, NEN_LIT, NEN_NONE, "DSTR" },
46
+ { NODE_DSYM, NEN_NEXT, NEN_LIT, NEN_NONE, "DSYM" },
43
47
  { NODE_DVAR, NEN_VID, NEN_NONE, NEN_NONE, "DVAR" },
44
- { NODE_DXSTR, NEN_LIT, NEN_NEXT, NEN_NONE, "DXSTR" },
48
+ { NODE_DXSTR, NEN_NEXT, NEN_LIT, NEN_NONE, "DXSTR" },
45
49
  { NODE_ENSURE, NEN_HEAD, NEN_ENSR, NEN_NONE, "ENSURE" },
46
50
  { NODE_EVSTR, NEN_BODY, NEN_NONE, NEN_NONE, "EVSTR" },
47
51
  { NODE_FALSE, NEN_NONE, NEN_NONE, NEN_NONE, "FALSE" },
52
+ { NODE_FBODY, NEN_ORIG, NEN_HEAD, NEN_MID, "FBODY" },
48
53
  { NODE_FCALL, NEN_ARGS, NEN_MID, NEN_NONE, "FCALL" },
49
- { NODE_FLIP2, NEN_CNT, NEN_BEG, NEN_END, "FLIP2" },
50
- { NODE_FLIP3, NEN_CNT, NEN_BEG, NEN_END, "FLIP3" },
51
- { NODE_FOR, NEN_BODY, NEN_ITER, NEN_VAR, "FOR" },
52
- { NODE_GASGN, NEN_VALUE, NEN_VID, NEN_ENTRY, "GASGN" },
53
- { NODE_GVAR, NEN_VID, NEN_ENTRY, NEN_NONE, "GVAR" },
54
+ { NODE_FLIP2, NEN_CNT, NEN_END, NEN_BEG, "FLIP2" },
55
+ { NODE_FLIP3, NEN_CNT, NEN_END, NEN_BEG, "FLIP3" },
56
+ { NODE_FOR, NEN_ITER, NEN_BODY, NEN_VAR, "FOR" },
57
+ { NODE_GASGN, NEN_ENTRY, NEN_VALUE, NEN_VID, "GASGN" },
58
+ { NODE_GVAR, NEN_ENTRY, NEN_VID, NEN_NONE, "GVAR" },
54
59
  { NODE_HASH, NEN_HEAD, NEN_NONE, NEN_NONE, "HASH" },
55
60
  { NODE_IASGN, NEN_VALUE, NEN_VID, NEN_NONE, "IASGN" },
56
- { NODE_IF, NEN_COND, NEN_BODY, NEN_ELSE, "IF" },
57
- { NODE_IFUNC, NEN_CFNC, NEN_TVAL, NEN_STATE, "IFUNC" },
58
- { NODE_ITER, NEN_BODY, NEN_ITER, NEN_VAR, "ITER" },
61
+ { NODE_IF, NEN_ELSE, NEN_BODY, NEN_COND, "IF" },
62
+ { NODE_IFUNC, NEN_TVAL, NEN_CFNC, NEN_STATE, "IFUNC" },
63
+ { NODE_ITER, NEN_ITER, NEN_BODY, NEN_VAR, "ITER" },
59
64
  { NODE_IVAR, NEN_VID, NEN_NONE, NEN_NONE, "IVAR" },
60
- { NODE_LASGN, NEN_VALUE, NEN_VID, NEN_CNT, "LASGN" },
65
+ { NODE_LASGN, NEN_CNT, NEN_VALUE, NEN_VID, "LASGN" },
61
66
  { NODE_LIT, NEN_LIT, NEN_NONE, NEN_NONE, "LIT" },
62
- { NODE_LVAR, NEN_VID, NEN_CNT, NEN_NONE, "LVAR" },
67
+ { NODE_LVAR, NEN_CNT, NEN_VID, NEN_NONE, "LVAR" },
63
68
  { NODE_MASGN, NEN_ARGS, NEN_HEAD, NEN_VALUE, "MASGN" },
64
69
  { NODE_MATCH, NEN_LIT, NEN_VALUE, NEN_NONE, "MATCH" },
65
70
  { NODE_MATCH2, NEN_RECV, NEN_VALUE, NEN_NONE, "MATCH2" },
66
71
  { NODE_MATCH3, NEN_RECV, NEN_VALUE, NEN_NONE, "MATCH3" },
67
72
  { NODE_MEMO, NEN_NONE, NEN_NONE, NEN_NONE, "MEMO" },
73
+ { NODE_METHOD, NEN_BODY, NEN_NOEX, NEN_NONE, "METHOD" },
68
74
  { NODE_MODULE, NEN_CPATH, NEN_BODY, NEN_NONE, "MODULE" },
75
+ { NODE_NEWLINE, NEN_NEXT, NEN_NONE, NEN_NONE, "NEWLINE" },
69
76
  { NODE_NEXT, NEN_STTS, NEN_NONE, NEN_NONE, "NEXT" },
70
77
  { NODE_NIL, NEN_NONE, NEN_NONE, NEN_NONE, "NIL" },
71
- { NODE_NTH_REF, NEN_NTH, NEN_CNT, NEN_NONE, "NTH_REF" },
78
+ { NODE_NOT, NEN_BODY, NEN_NONE, NEN_NONE, "NOT" },
79
+ { NODE_NTH_REF, NEN_CNT, NEN_NTH, NEN_NONE, "NTH_REF" },
72
80
  { NODE_OPT_N, NEN_BODY, NEN_NONE, NEN_NONE, "OPT_N" },
73
81
  { NODE_OP_ASGN1, NEN_ARGS, NEN_MID, NEN_RECV, "OP_ASGN1" },
74
- { NODE_OP_ASGN2, NEN_RECV, NEN_NEXT, NEN_VALUE, "OP_ASGN2" },
75
- { NODE_OP_ASGN2_ARG, NEN_VID, NEN_AID, NEN_MID, "OP_ASGN2_ARG" },
82
+ { NODE_OP_ASGN2, NEN_NEXT, NEN_RECV, NEN_VALUE, "OP_ASGN2" },
83
+ { NODE_OP_ASGN2_ARG, NEN_AID, NEN_MID, NEN_VID, "OP_ASGN2_ARG" },
76
84
  { NODE_OP_ASGN_AND, NEN_RECV, NEN_VALUE, NEN_NONE, "OP_ASGN_AND" },
77
85
  { NODE_OP_ASGN_OR, NEN_AID, NEN_VALUE, NEN_RECV, "OP_ASGN_OR" },
78
86
  { NODE_OR, NEN_2ND, NEN_1ST, NEN_NONE, "OR" },
79
87
  { NODE_POSTEXE, NEN_NONE, NEN_NONE, NEN_NONE, "POSTEXE" },
80
88
  { NODE_REDO, NEN_NONE, NEN_NONE, NEN_NONE, "REDO" },
81
- { NODE_RESBODY, NEN_HEAD, NEN_BODY, NEN_ARGS, "RESBODY" },
82
- { NODE_RESCUE, NEN_HEAD, NEN_RESQ, NEN_ELSE, "RESCUE" },
89
+ { NODE_RESBODY, NEN_ARGS, NEN_HEAD, NEN_BODY, "RESBODY" },
90
+ { NODE_RESCUE, NEN_RESQ, NEN_HEAD, NEN_ELSE, "RESCUE" },
83
91
  { NODE_RETRY, NEN_NONE, NEN_NONE, NEN_NONE, "RETRY" },
84
92
  { NODE_RETURN, NEN_STTS, NEN_NONE, NEN_NONE, "RETURN" },
85
93
  { NODE_SCLASS, NEN_BODY, NEN_RECV, NEN_NONE, "SCLASS" },
86
- { NODE_SCOPE, NEN_TBL, NEN_RVAL, NEN_NEXT, "SCOPE" },
94
+ { NODE_SCOPE, NEN_NEXT, NEN_TBL, NEN_RVAL, "SCOPE" },
87
95
  { NODE_SELF, NEN_NONE, NEN_NONE, NEN_NONE, "SELF" },
88
96
  { NODE_SPLAT, NEN_HEAD, NEN_NONE, NEN_NONE, "SPLAT" },
89
97
  { NODE_STR, NEN_LIT, NEN_NONE, NEN_NONE, "STR" },
90
98
  { NODE_SUPER, NEN_ARGS, NEN_NONE, NEN_NONE, "SUPER" },
99
+ { NODE_SVALUE, NEN_HEAD, NEN_NONE, NEN_NONE, "SVALUE" },
91
100
  { NODE_TO_ARY, NEN_HEAD, NEN_NONE, NEN_NONE, "TO_ARY" },
92
101
  { NODE_TRUE, NEN_NONE, NEN_NONE, NEN_NONE, "TRUE" },
93
102
  { NODE_UNDEF, NEN_BODY, NEN_NONE, NEN_NONE, "UNDEF" },
94
- { NODE_UNTIL, NEN_BODY, NEN_COND, NEN_STATE, "UNTIL" },
95
- { NODE_VALIAS, NEN_1ST, NEN_2ND, NEN_NONE, "VALIAS" },
103
+ { NODE_UNTIL, NEN_BODY, NEN_STATE, NEN_COND, "UNTIL" },
104
+ { NODE_VALIAS, NEN_2ND, NEN_1ST, NEN_NONE, "VALIAS" },
96
105
  { NODE_VCALL, NEN_MID, NEN_NONE, NEN_NONE, "VCALL" },
97
- { NODE_WHEN, NEN_HEAD, NEN_BODY, NEN_NEXT, "WHEN" },
98
- { NODE_WHILE, NEN_BODY, NEN_COND, NEN_STATE, "WHILE" },
106
+ { NODE_WHEN, NEN_NEXT, NEN_HEAD, NEN_BODY, "WHEN" },
107
+ { NODE_WHILE, NEN_BODY, NEN_STATE, NEN_COND, "WHILE" },
99
108
  { NODE_XSTR, NEN_LIT, NEN_NONE, NEN_NONE, "XSTR" },
100
109
  { NODE_YIELD, NEN_HEAD, NEN_STATE, NEN_NONE, "YIELD" },
101
110
  { NODE_ZARRAY, NEN_NONE, NEN_NONE, NEN_NONE, "ZARRAY" },
@@ -450,8 +450,28 @@ VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash)
450
450
  return ID2SYM(n->nd_entry->id);
451
451
  }
452
452
  case NEN_FRML:
453
+ if(n->nd_frml)
453
454
  {
454
- return LONG2NUM((long)n->nd_frml);
455
+ int node_type;
456
+ if(0 && nd_type(n) == NODE_OP_ASGN2)
457
+ {
458
+ /* All children of NODE_OP_ASGN2 are NODE_OP_ASGN2_ARG */
459
+ node_type = NODE_OP_ASGN2_ARG;
460
+ }
461
+ else
462
+ {
463
+ node_type = nd_type(n->nd_frml);
464
+ }
465
+
466
+ dump_node_or_iseq_to_hash(
467
+ (VALUE)n->nd_frml,
468
+ node_type,
469
+ node_hash);
470
+ return node_id(n->nd_frml);
471
+ }
472
+ else
473
+ {
474
+ return Qnil;
455
475
  }
456
476
  case NEN_HEAD:
457
477
  if(n->nd_head)
@@ -477,6 +497,30 @@ VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash)
477
497
  {
478
498
  return Qnil;
479
499
  }
500
+ case NEN_IBDY:
501
+ if(n->nd_ibdy)
502
+ {
503
+ int node_type;
504
+ if(0 && nd_type(n) == NODE_OP_ASGN2)
505
+ {
506
+ /* All children of NODE_OP_ASGN2 are NODE_OP_ASGN2_ARG */
507
+ node_type = NODE_OP_ASGN2_ARG;
508
+ }
509
+ else
510
+ {
511
+ node_type = nd_type(n->nd_ibdy);
512
+ }
513
+
514
+ dump_node_or_iseq_to_hash(
515
+ (VALUE)n->nd_ibdy,
516
+ node_type,
517
+ node_hash);
518
+ return node_id(n->nd_ibdy);
519
+ }
520
+ else
521
+ {
522
+ return Qnil;
523
+ }
480
524
  case NEN_ITER:
481
525
  if(n->nd_iter)
482
526
  {
@@ -601,19 +645,6 @@ VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash)
601
645
  {
602
646
  return LONG2NUM((long)n->nd_nth);
603
647
  }
604
- case NEN_OID:
605
- if(n->nd_oid == 0)
606
- {
607
- return Qfalse;
608
- }
609
- else if(n->nd_oid == 1)
610
- {
611
- return Qtrue;
612
- }
613
- else
614
- {
615
- return ID2SYM(n->nd_oid);
616
- }
617
648
  case NEN_OPT:
618
649
  if(n->nd_opt)
619
650
  {
@@ -680,23 +711,6 @@ VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash)
680
711
  INT2NUM(TYPE((VALUE)n->nd_orig)),
681
712
  (VALUE)n->nd_orig);
682
713
  }
683
- case NEN_PID:
684
- if(n->nd_pid == 0)
685
- {
686
- return Qfalse;
687
- }
688
- else if(n->nd_pid == 1)
689
- {
690
- return Qtrue;
691
- }
692
- else
693
- {
694
- return ID2SYM(n->nd_pid);
695
- }
696
- case NEN_PLEN:
697
- {
698
- return LONG2NUM((long)n->nd_plen);
699
- }
700
714
  case NEN_RECV:
701
715
  if(n->nd_recv)
702
716
  {
@@ -746,17 +760,28 @@ VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash)
746
760
  return Qnil;
747
761
  }
748
762
  case NEN_REST:
749
- if(n->nd_rest == 0)
763
+ if(n->nd_rest)
750
764
  {
751
- return Qfalse;
752
- }
753
- else if(n->nd_rest == 1)
754
- {
755
- return Qtrue;
765
+ int node_type;
766
+ if(0 && nd_type(n) == NODE_OP_ASGN2)
767
+ {
768
+ /* All children of NODE_OP_ASGN2 are NODE_OP_ASGN2_ARG */
769
+ node_type = NODE_OP_ASGN2_ARG;
770
+ }
771
+ else
772
+ {
773
+ node_type = nd_type(n->nd_rest);
774
+ }
775
+
776
+ dump_node_or_iseq_to_hash(
777
+ (VALUE)n->nd_rest,
778
+ node_type,
779
+ node_hash);
780
+ return node_id(n->nd_rest);
756
781
  }
757
782
  else
758
783
  {
759
- return ID2SYM(n->nd_rest);
784
+ return Qnil;
760
785
  }
761
786
  case NEN_RVAL:
762
787
  if(n->nd_2nd)
@@ -955,10 +980,6 @@ VALUE dump_node_elem(enum Node_Elem_Name nen, NODE * n, VALUE node_hash)
955
980
  {
956
981
  return ID2SYM(n->nd_vid);
957
982
  }
958
- case NEN_VISI:
959
- {
960
- return LONG2NUM((long)n->nd_visi);
961
- }
962
983
  }
963
984
  rb_raise(rb_eArgError, "Invalid Node_Elem_Name %d", nen);
964
985
  }
@@ -1365,7 +1386,27 @@ void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash,
1365
1386
  }
1366
1387
  case NEN_FRML:
1367
1388
  {
1368
- n->nd_frml = NUM2LONG(v);
1389
+ if(v == Qnil)
1390
+ {
1391
+ n->nd_frml = 0;
1392
+ }
1393
+ else
1394
+ {
1395
+ VALUE nid = rb_hash_aref(id_hash, v);
1396
+ if(RTEST(nid))
1397
+ {
1398
+ n->nd_frml = id_to_node(nid);
1399
+ }
1400
+ else
1401
+ {
1402
+ n->u1.node = (NODE *)load_node_or_iseq_from_hash(
1403
+ v, node_hash, id_hash);
1404
+ if(nd_type(n->u1.node) == NODE_OP_ASGN2_ARG)
1405
+ {
1406
+ nd_set_type(n->u1.node, NODE_OP_ASGN2);
1407
+ }
1408
+ }
1409
+ }
1369
1410
  return;
1370
1411
  }
1371
1412
  case NEN_HEAD:
@@ -1393,6 +1434,31 @@ void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash,
1393
1434
  }
1394
1435
  return;
1395
1436
  }
1437
+ case NEN_IBDY:
1438
+ {
1439
+ if(v == Qnil)
1440
+ {
1441
+ n->nd_ibdy = 0;
1442
+ }
1443
+ else
1444
+ {
1445
+ VALUE nid = rb_hash_aref(id_hash, v);
1446
+ if(RTEST(nid))
1447
+ {
1448
+ n->nd_ibdy = id_to_node(nid);
1449
+ }
1450
+ else
1451
+ {
1452
+ n->u2.node = (NODE *)load_node_or_iseq_from_hash(
1453
+ v, node_hash, id_hash);
1454
+ if(nd_type(n->u2.node) == NODE_OP_ASGN2_ARG)
1455
+ {
1456
+ nd_set_type(n->u2.node, NODE_OP_ASGN2);
1457
+ }
1458
+ }
1459
+ }
1460
+ return;
1461
+ }
1396
1462
  case NEN_ITER:
1397
1463
  {
1398
1464
  if(v == Qnil)
@@ -1522,22 +1588,6 @@ void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash,
1522
1588
  n->nd_nth = NUM2LONG(v);
1523
1589
  return;
1524
1590
  }
1525
- case NEN_OID:
1526
- {
1527
- if(v == Qfalse)
1528
- {
1529
- n->nd_oid = 0;
1530
- }
1531
- else if(v == Qfalse)
1532
- {
1533
- n->nd_oid = 1;
1534
- }
1535
- else
1536
- {
1537
- n->nd_oid = SYM2ID(v);
1538
- }
1539
- return;
1540
- }
1541
1591
  case NEN_OPT:
1542
1592
  {
1543
1593
  if(v == Qnil)
@@ -1600,27 +1650,6 @@ void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash,
1600
1650
  }
1601
1651
  return;
1602
1652
  }
1603
- case NEN_PID:
1604
- {
1605
- if(v == Qfalse)
1606
- {
1607
- n->nd_pid = 0;
1608
- }
1609
- else if(v == Qfalse)
1610
- {
1611
- n->nd_pid = 1;
1612
- }
1613
- else
1614
- {
1615
- n->nd_pid = SYM2ID(v);
1616
- }
1617
- return;
1618
- }
1619
- case NEN_PLEN:
1620
- {
1621
- n->nd_plen = NUM2LONG(v);
1622
- return;
1623
- }
1624
1653
  case NEN_RECV:
1625
1654
  {
1626
1655
  if(v == Qnil)
@@ -1673,17 +1702,26 @@ void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash,
1673
1702
  }
1674
1703
  case NEN_REST:
1675
1704
  {
1676
- if(v == Qfalse)
1705
+ if(v == Qnil)
1677
1706
  {
1678
1707
  n->nd_rest = 0;
1679
1708
  }
1680
- else if(v == Qfalse)
1681
- {
1682
- n->nd_rest = 1;
1683
- }
1684
1709
  else
1685
1710
  {
1686
- n->nd_rest = SYM2ID(v);
1711
+ VALUE nid = rb_hash_aref(id_hash, v);
1712
+ if(RTEST(nid))
1713
+ {
1714
+ n->nd_rest = id_to_node(nid);
1715
+ }
1716
+ else
1717
+ {
1718
+ n->u2.node = (NODE *)load_node_or_iseq_from_hash(
1719
+ v, node_hash, id_hash);
1720
+ if(nd_type(n->u2.node) == NODE_OP_ASGN2_ARG)
1721
+ {
1722
+ nd_set_type(n->u2.node, NODE_OP_ASGN2);
1723
+ }
1724
+ }
1687
1725
  }
1688
1726
  return;
1689
1727
  }
@@ -1921,11 +1959,6 @@ void load_node_elem(enum Node_Elem_Name nen, VALUE v, NODE * n, VALUE node_hash,
1921
1959
  }
1922
1960
  return;
1923
1961
  }
1924
- case NEN_VISI:
1925
- {
1926
- n->nd_visi = NUM2LONG(v);
1927
- return;
1928
- }
1929
1962
  }
1930
1963
  rb_raise(rb_eRuntimeError, "Internal error: invalid Node_Elem_Name %d", nen);
1931
1964
  }
@@ -2015,6 +2048,16 @@ static VALUE node_alen(VALUE self)
2015
2048
  Data_Get_Struct(self, NODE, n);
2016
2049
  return LONG2NUM(n->nd_alen);
2017
2050
  }
2051
+ /*
2052
+ * Return the Node's _argc_ member. The return type is an
2053
+ * Integer.
2054
+ */
2055
+ static VALUE node_argc(VALUE self)
2056
+ {
2057
+ NODE * n;
2058
+ Data_Get_Struct(self, NODE, n);
2059
+ return LONG2NUM(n->nd_argc);
2060
+ }
2018
2061
  /*
2019
2062
  * Return the Node's _args_ member. The return type is
2020
2063
  * either a Node or an Object.
@@ -2112,6 +2155,33 @@ static VALUE node_cfnc(VALUE self)
2112
2155
  Data_Get_Struct(self, NODE, n);
2113
2156
  return LONG2NUM((long)(n->nd_cfnc));
2114
2157
  }
2158
+ /*
2159
+ * Return the Node's _clss_ member. The return type is
2160
+ * either a Node or an Object.
2161
+ */
2162
+ static VALUE node_clss(VALUE self)
2163
+ {
2164
+ NODE * n;
2165
+ Data_Get_Struct(self, NODE, n);
2166
+
2167
+ if(TYPE(n->nd_clss) == T_NODE)
2168
+ {
2169
+ if(0 && nd_type(n) == NODE_OP_ASGN2)
2170
+ {
2171
+ return wrap_node_as(
2172
+ (NODE *)n->nd_clss,
2173
+ rb_cNodeSubclass[NODE_OP_ASGN2_ARG]);
2174
+ }
2175
+ else
2176
+ {
2177
+ return wrap_node((NODE *)n->nd_clss);
2178
+ }
2179
+ }
2180
+ else
2181
+ {
2182
+ return (VALUE)n->nd_clss;
2183
+ }
2184
+ }
2115
2185
  /*
2116
2186
  * Return the Node's _cnt_ member. The return type is an
2117
2187
  * Integer.
@@ -2504,6 +2574,33 @@ static VALUE node_opt(VALUE self)
2504
2574
  return (VALUE)n->nd_opt;
2505
2575
  }
2506
2576
  }
2577
+ /*
2578
+ * Return the Node's _orig_ member. The return type is
2579
+ * either a Node or an Object.
2580
+ */
2581
+ static VALUE node_orig(VALUE self)
2582
+ {
2583
+ NODE * n;
2584
+ Data_Get_Struct(self, NODE, n);
2585
+
2586
+ if(TYPE(n->nd_orig) == T_NODE)
2587
+ {
2588
+ if(0 && nd_type(n) == NODE_OP_ASGN2)
2589
+ {
2590
+ return wrap_node_as(
2591
+ (NODE *)n->nd_orig,
2592
+ rb_cNodeSubclass[NODE_OP_ASGN2_ARG]);
2593
+ }
2594
+ else
2595
+ {
2596
+ return wrap_node((NODE *)n->nd_orig);
2597
+ }
2598
+ }
2599
+ else
2600
+ {
2601
+ return (VALUE)n->nd_orig;
2602
+ }
2603
+ }
2507
2604
  /*
2508
2605
  * Return the Node's _recv_ member. The return type is
2509
2606
  * either a Node or an Object.
@@ -2559,24 +2656,30 @@ static VALUE node_resq(VALUE self)
2559
2656
  }
2560
2657
  }
2561
2658
  /*
2562
- * Return the Node's _rest_ member. The return type is a
2563
- * Symbol.
2659
+ * Return the Node's _rest_ member. The return type is
2660
+ * either a Node or an Object.
2564
2661
  */
2565
2662
  static VALUE node_rest(VALUE self)
2566
2663
  {
2567
2664
  NODE * n;
2568
2665
  Data_Get_Struct(self, NODE, n);
2569
- if(n->nd_rest == 0)
2570
- {
2571
- return Qfalse;
2572
- }
2573
- else if(n->nd_rest == 1)
2666
+
2667
+ if(TYPE(n->nd_rest) == T_NODE)
2574
2668
  {
2575
- return Qtrue;
2669
+ if(0 && nd_type(n) == NODE_OP_ASGN2)
2670
+ {
2671
+ return wrap_node_as(
2672
+ (NODE *)n->nd_rest,
2673
+ rb_cNodeSubclass[NODE_OP_ASGN2_ARG]);
2674
+ }
2675
+ else
2676
+ {
2677
+ return wrap_node((NODE *)n->nd_rest);
2678
+ }
2576
2679
  }
2577
2680
  else
2578
2681
  {
2579
- return ID2SYM(n->nd_rest);
2682
+ return (VALUE)n->nd_rest;
2580
2683
  }
2581
2684
  }
2582
2685
  /*
@@ -2822,10 +2925,10 @@ void define_node_subclass_methods()
2822
2925
  rb_iv_set(rb_cALIAS, "__member__", members);
2823
2926
  rb_iv_set(rb_cALIAS, "__type__", INT2NUM(NODE_ALIAS));
2824
2927
  rb_define_singleton_method(rb_cALIAS, "members", node_s_members, 0);
2825
- rb_define_method(rb_cALIAS, "first", node_1st, 0);
2826
- rb_ary_push(members, rb_str_new2("first"));
2827
2928
  rb_define_method(rb_cALIAS, "second", node_2nd, 0);
2828
2929
  rb_ary_push(members, rb_str_new2("second"));
2930
+ rb_define_method(rb_cALIAS, "first", node_1st, 0);
2931
+ rb_ary_push(members, rb_str_new2("first"));
2829
2932
  }
2830
2933
 
2831
2934
  /* Document-class: Node::ALLOCA
@@ -2843,12 +2946,6 @@ void define_node_subclass_methods()
2843
2946
  rb_iv_set(rb_cALLOCA, "__type__", INT2NUM(NODE_ALLOCA));
2844
2947
  rb_define_singleton_method(rb_cALLOCA, "members", node_s_members, 0);
2845
2948
 
2846
- /* Document-method: cfnc
2847
- * a pointer to the allocated memory
2848
- */
2849
- rb_define_method(rb_cALLOCA, "cfnc", node_cfnc, 0);
2850
- rb_ary_push(members, rb_str_new2("cfnc"));
2851
-
2852
2949
  /* Document-method: value
2853
2950
  * a pointer to the previously allocated temporary node
2854
2951
  */
@@ -2860,6 +2957,12 @@ void define_node_subclass_methods()
2860
2957
  */
2861
2958
  rb_define_method(rb_cALLOCA, "cnt", node_cnt, 0);
2862
2959
  rb_ary_push(members, rb_str_new2("cnt"));
2960
+
2961
+ /* Document-method: cfnc
2962
+ * a pointer to the allocated memory
2963
+ */
2964
+ rb_define_method(rb_cALLOCA, "cfnc", node_cfnc, 0);
2965
+ rb_ary_push(members, rb_str_new2("cfnc"));
2863
2966
  }
2864
2967
  #endif
2865
2968
 
@@ -2908,19 +3011,19 @@ void define_node_subclass_methods()
2908
3011
  rb_define_method(rb_cARGS, "rest", node_rest, 0);
2909
3012
  rb_ary_push(members, rb_str_new2("rest"));
2910
3013
 
3014
+ /* Document-method: cnt
3015
+ * the number of required arguments
3016
+ */
3017
+ rb_define_method(rb_cARGS, "cnt", node_cnt, 0);
3018
+ rb_ary_push(members, rb_str_new2("cnt"));
3019
+
2911
3020
  /* Document-method: opt
2912
3021
  * a list of assignment nodes to assign default values to the
2913
3022
  * optional arguments if no argument is specified
2914
3023
  */
2915
3024
  rb_define_method(rb_cARGS, "opt", node_opt, 0);
2916
3025
  rb_ary_push(members, rb_str_new2("opt"));
2917
-
2918
- /* Document-method: cnt
2919
- * the number of required arguments
2920
- */
2921
- rb_define_method(rb_cARGS, "cnt", node_cnt, 0);
2922
- rb_ary_push(members, rb_str_new2("cnt"));
2923
- }
3026
+ }
2924
3027
 
2925
3028
  /* Document-class: Node::ARGSCAT
2926
3029
  * Represents the concatenation of a list of arguments and a splatted
@@ -2985,20 +3088,20 @@ void define_node_subclass_methods()
2985
3088
  rb_iv_set(rb_cARRAY, "__member__", members);
2986
3089
  rb_iv_set(rb_cARRAY, "__type__", INT2NUM(NODE_ARRAY));
2987
3090
  rb_define_singleton_method(rb_cARRAY, "members", node_s_members, 0);
2988
- rb_define_method(rb_cARRAY, "alen", node_alen, 0);
2989
- rb_ary_push(members, rb_str_new2("alen"));
2990
-
2991
- /* Document-method: head
2992
- * the first element of the array
2993
- */
2994
- rb_define_method(rb_cARRAY, "head", node_head, 0);
2995
- rb_ary_push(members, rb_str_new2("head"));
2996
3091
 
2997
3092
  /* Document-method: next
2998
3093
  * the tail of the array
2999
3094
  */
3000
3095
  rb_define_method(rb_cARRAY, "next", node_next, 0);
3001
3096
  rb_ary_push(members, rb_str_new2("next"));
3097
+
3098
+ /* Document-method: head
3099
+ * the first element of the array
3100
+ */
3101
+ rb_define_method(rb_cARRAY, "head", node_head, 0);
3102
+ rb_ary_push(members, rb_str_new2("head"));
3103
+ rb_define_method(rb_cARRAY, "alen", node_alen, 0);
3104
+ rb_ary_push(members, rb_str_new2("alen"));
3002
3105
  }
3003
3106
 
3004
3107
  /* Document-class: Node::ATTRASGN
@@ -3015,6 +3118,12 @@ void define_node_subclass_methods()
3015
3118
  rb_iv_set(rb_cATTRASGN, "__type__", INT2NUM(NODE_ATTRASGN));
3016
3119
  rb_define_singleton_method(rb_cATTRASGN, "members", node_s_members, 0);
3017
3120
 
3121
+ /* Document-method: mid
3122
+ * the id of the attribute, with a trailing '=' sign
3123
+ */
3124
+ rb_define_method(rb_cATTRASGN, "mid", node_mid, 0);
3125
+ rb_ary_push(members, rb_str_new2("mid"));
3126
+
3018
3127
  /* Document-method: recv
3019
3128
  * the receiver of the method
3020
3129
  */
@@ -3026,12 +3135,27 @@ void define_node_subclass_methods()
3026
3135
  */
3027
3136
  rb_define_method(rb_cATTRASGN, "args", node_args, 0);
3028
3137
  rb_ary_push(members, rb_str_new2("args"));
3138
+ }
3029
3139
 
3030
- /* Document-method: mid
3031
- * the id of the attribute, with a trailing '=' sign
3140
+ /* Document-class: Node::ATTRSET
3141
+ * A placeholder for an attribute writer method, which can added to a
3142
+ * class by using attr_writer:
3143
+ * attr_writer :attribute
3144
+ * Its reader counterpart is IVAR.
3145
+ */
3146
+ {
3147
+ VALUE rb_cATTRSET = rb_define_class_under(rb_cNode, "ATTRSET", rb_cNode);
3148
+ members = rb_ary_new();
3149
+ rb_cNodeSubclass[NODE_ATTRSET] = rb_cATTRSET;
3150
+ rb_iv_set(rb_cATTRSET, "__member__", members);
3151
+ rb_iv_set(rb_cATTRSET, "__type__", INT2NUM(NODE_ATTRSET));
3152
+ rb_define_singleton_method(rb_cATTRSET, "members", node_s_members, 0);
3153
+
3154
+ /* Document-method: vid
3155
+ * the name of the attribute, with a leading '@' sign
3032
3156
  */
3033
- rb_define_method(rb_cATTRASGN, "mid", node_mid, 0);
3034
- rb_ary_push(members, rb_str_new2("mid"));
3157
+ rb_define_method(rb_cATTRSET, "vid", node_vid, 0);
3158
+ rb_ary_push(members, rb_str_new2("vid"));
3035
3159
  }
3036
3160
 
3037
3161
  /* Document-class: Node::BACK_REF
@@ -3098,17 +3222,17 @@ void define_node_subclass_methods()
3098
3222
  rb_iv_set(rb_cBLOCK, "__type__", INT2NUM(NODE_BLOCK));
3099
3223
  rb_define_singleton_method(rb_cBLOCK, "members", node_s_members, 0);
3100
3224
 
3101
- /* Document-method: head
3102
- * the first expression in the block of code
3103
- */
3104
- rb_define_method(rb_cBLOCK, "head", node_head, 0);
3105
- rb_ary_push(members, rb_str_new2("head"));
3106
-
3107
3225
  /* Document-method: next
3108
3226
  * the second expression in the block of code
3109
3227
  */
3110
3228
  rb_define_method(rb_cBLOCK, "next", node_next, 0);
3111
3229
  rb_ary_push(members, rb_str_new2("next"));
3230
+
3231
+ /* Document-method: head
3232
+ * the first expression in the block of code
3233
+ */
3234
+ rb_define_method(rb_cBLOCK, "head", node_head, 0);
3235
+ rb_ary_push(members, rb_str_new2("head"));
3112
3236
  }
3113
3237
 
3114
3238
  /* Document-class: Node::BLOCK_ARG
@@ -3216,12 +3340,6 @@ void define_node_subclass_methods()
3216
3340
  rb_iv_set(rb_cCALL, "__type__", INT2NUM(NODE_CALL));
3217
3341
  rb_define_singleton_method(rb_cCALL, "members", node_s_members, 0);
3218
3342
 
3219
- /* Document-method: args
3220
- * the arguments to the method
3221
- */
3222
- rb_define_method(rb_cCALL, "args", node_args, 0);
3223
- rb_ary_push(members, rb_str_new2("args"));
3224
-
3225
3343
  /* Document-method: mid
3226
3344
  * the method id
3227
3345
  */
@@ -3233,6 +3351,12 @@ void define_node_subclass_methods()
3233
3351
  */
3234
3352
  rb_define_method(rb_cCALL, "recv", node_recv, 0);
3235
3353
  rb_ary_push(members, rb_str_new2("recv"));
3354
+
3355
+ /* Document-method: args
3356
+ * the arguments to the method
3357
+ */
3358
+ rb_define_method(rb_cCALL, "args", node_args, 0);
3359
+ rb_ary_push(members, rb_str_new2("args"));
3236
3360
  }
3237
3361
 
3238
3362
  /* Document-class: Node::CASE
@@ -3249,6 +3373,8 @@ void define_node_subclass_methods()
3249
3373
  rb_iv_set(rb_cCASE, "__member__", members);
3250
3374
  rb_iv_set(rb_cCASE, "__type__", INT2NUM(NODE_CASE));
3251
3375
  rb_define_singleton_method(rb_cCASE, "members", node_s_members, 0);
3376
+ rb_define_method(rb_cCASE, "next", node_next, 0);
3377
+ rb_ary_push(members, rb_str_new2("next"));
3252
3378
 
3253
3379
  /* Document-method: head
3254
3380
  * the value to select on
@@ -3262,8 +3388,6 @@ void define_node_subclass_methods()
3262
3388
  */
3263
3389
  rb_define_method(rb_cCASE, "body", node_body, 0);
3264
3390
  rb_ary_push(members, rb_str_new2("body"));
3265
- rb_define_method(rb_cCASE, "next", node_next, 0);
3266
- rb_ary_push(members, rb_str_new2("next"));
3267
3391
  }
3268
3392
 
3269
3393
  /* Document-class: Node::CDECL
@@ -3291,6 +3415,22 @@ void define_node_subclass_methods()
3291
3415
  rb_ary_push(members, rb_str_new2("vid"));
3292
3416
  }
3293
3417
 
3418
+ /* Document-class: Node::CFUNC
3419
+ * A placeholder for a function implemented in C.
3420
+ */
3421
+ {
3422
+ VALUE rb_cCFUNC = rb_define_class_under(rb_cNode, "CFUNC", rb_cNode);
3423
+ members = rb_ary_new();
3424
+ rb_cNodeSubclass[NODE_CFUNC] = rb_cCFUNC;
3425
+ rb_iv_set(rb_cCFUNC, "__member__", members);
3426
+ rb_iv_set(rb_cCFUNC, "__type__", INT2NUM(NODE_CFUNC));
3427
+ rb_define_singleton_method(rb_cCFUNC, "members", node_s_members, 0);
3428
+ rb_define_method(rb_cCFUNC, "cfnc", node_cfnc, 0);
3429
+ rb_ary_push(members, rb_str_new2("cfnc"));
3430
+ rb_define_method(rb_cCFUNC, "argc", node_argc, 0);
3431
+ rb_ary_push(members, rb_str_new2("argc"));
3432
+ }
3433
+
3294
3434
  /* Document-class: Node::CLASS
3295
3435
  * Represents a class definition, e.g.:
3296
3436
  * class cpath
@@ -3351,17 +3491,17 @@ void define_node_subclass_methods()
3351
3491
  rb_iv_set(rb_cCOLON2, "__type__", INT2NUM(NODE_COLON2));
3352
3492
  rb_define_singleton_method(rb_cCOLON2, "members", node_s_members, 0);
3353
3493
 
3354
- /* Document-method: head
3355
- * an expression specifying the class in which to do the lookup
3356
- */
3357
- rb_define_method(rb_cCOLON2, "head", node_head, 0);
3358
- rb_ary_push(members, rb_str_new2("head"));
3359
-
3360
3494
  /* Document-method: mid
3361
3495
  * the name of the method or constant to call/look up
3362
3496
  */
3363
3497
  rb_define_method(rb_cCOLON2, "mid", node_mid, 0);
3364
3498
  rb_ary_push(members, rb_str_new2("mid"));
3499
+
3500
+ /* Document-method: head
3501
+ * an expression specifying the class in which to do the lookup
3502
+ */
3503
+ rb_define_method(rb_cCOLON2, "head", node_head, 0);
3504
+ rb_ary_push(members, rb_str_new2("head"));
3365
3505
  }
3366
3506
 
3367
3507
  /* Document-class: Node::COLON3
@@ -3404,6 +3544,41 @@ void define_node_subclass_methods()
3404
3544
  rb_ary_push(members, rb_str_new2("vid"));
3405
3545
  }
3406
3546
 
3547
+ /* Document-class: Node::CREF
3548
+ * A temporary node used to store the value of ruby_cref or
3549
+ * ruby_top_cref and later restore it. The cref holds a reference to
3550
+ * the cbase, which, among other things, is used for constant and class
3551
+ * variable lookup.
3552
+ *
3553
+ * It should never be evaluated as an expression.
3554
+ */
3555
+ {
3556
+ VALUE rb_cCREF = rb_define_class_under(rb_cNode, "CREF", rb_cNode);
3557
+ members = rb_ary_new();
3558
+ rb_cNodeSubclass[NODE_CREF] = rb_cCREF;
3559
+ rb_iv_set(rb_cCREF, "__member__", members);
3560
+ rb_iv_set(rb_cCREF, "__type__", INT2NUM(NODE_CREF));
3561
+ rb_define_singleton_method(rb_cCREF, "members", node_s_members, 0);
3562
+
3563
+ /* Document-method: next
3564
+ * the previous value of ruby_cref or ruby_top_cref
3565
+ */
3566
+ rb_define_method(rb_cCREF, "next", node_next, 0);
3567
+ rb_ary_push(members, rb_str_new2("next"));
3568
+
3569
+ /* Document-method: body
3570
+ * always 0 (false)
3571
+ */
3572
+ rb_define_method(rb_cCREF, "body", node_body, 0);
3573
+ rb_ary_push(members, rb_str_new2("body"));
3574
+
3575
+ /* Document-method: clss
3576
+ * the new class to use for the cbase.
3577
+ */
3578
+ rb_define_method(rb_cCREF, "clss", node_clss, 0);
3579
+ rb_ary_push(members, rb_str_new2("clss"));
3580
+ }
3581
+
3407
3582
  /* Document-class: Node::CVAR
3408
3583
  * Represents a class variable retrieval. The result of the expression
3409
3584
  * is the value of the class variable.
@@ -3566,12 +3741,6 @@ void define_node_subclass_methods()
3566
3741
  rb_iv_set(rb_cDEFN, "__type__", INT2NUM(NODE_DEFN));
3567
3742
  rb_define_singleton_method(rb_cDEFN, "members", node_s_members, 0);
3568
3743
 
3569
- /* Document-method: defn
3570
- * the body of the method definition
3571
- */
3572
- rb_define_method(rb_cDEFN, "defn", node_defn, 0);
3573
- rb_ary_push(members, rb_str_new2("defn"));
3574
-
3575
3744
  /* Document-method: mid
3576
3745
  * the name of the method* defn the body of the method
3577
3746
  */
@@ -3583,6 +3752,12 @@ void define_node_subclass_methods()
3583
3752
  */
3584
3753
  rb_define_method(rb_cDEFN, "noex", node_noex, 0);
3585
3754
  rb_ary_push(members, rb_str_new2("noex"));
3755
+
3756
+ /* Document-method: defn
3757
+ * the body of the method definition
3758
+ */
3759
+ rb_define_method(rb_cDEFN, "defn", node_defn, 0);
3760
+ rb_ary_push(members, rb_str_new2("defn"));
3586
3761
  }
3587
3762
 
3588
3763
  /* Document-class: Node::DEFS
@@ -3598,6 +3773,12 @@ void define_node_subclass_methods()
3598
3773
  rb_iv_set(rb_cDEFS, "__member__", members);
3599
3774
  rb_iv_set(rb_cDEFS, "__type__", INT2NUM(NODE_DEFS));
3600
3775
  rb_define_singleton_method(rb_cDEFS, "members", node_s_members, 0);
3776
+
3777
+ /* Document-method: mid
3778
+ * the name of the method* defn the body of the method
3779
+ */
3780
+ rb_define_method(rb_cDEFS, "mid", node_mid, 0);
3781
+ rb_ary_push(members, rb_str_new2("mid"));
3601
3782
  rb_define_method(rb_cDEFS, "defn", node_defn, 0);
3602
3783
  rb_ary_push(members, rb_str_new2("defn"));
3603
3784
 
@@ -3606,12 +3787,29 @@ void define_node_subclass_methods()
3606
3787
  */
3607
3788
  rb_define_method(rb_cDEFS, "recv", node_recv, 0);
3608
3789
  rb_ary_push(members, rb_str_new2("recv"));
3790
+ }
3609
3791
 
3610
- /* Document-method: mid
3611
- * the name of the method* defn the body of the method
3792
+ /* Document-class: Node::DMETHOD
3793
+ * A placeholder for a method defined using define_method where the
3794
+ * passed block is created from a Method object, e.g.:
3795
+ * define_method(:name, method(:foo))
3796
+ *
3797
+ * See also BMETHOD.
3798
+ */
3799
+ {
3800
+ VALUE rb_cDMETHOD = rb_define_class_under(rb_cNode, "DMETHOD", rb_cNode);
3801
+ members = rb_ary_new();
3802
+ rb_cNodeSubclass[NODE_DMETHOD] = rb_cDMETHOD;
3803
+ rb_iv_set(rb_cDMETHOD, "__member__", members);
3804
+ rb_iv_set(rb_cDMETHOD, "__type__", INT2NUM(NODE_DMETHOD));
3805
+ rb_define_singleton_method(rb_cDMETHOD, "members", node_s_members, 0);
3806
+
3807
+ /* Document-method: cval
3808
+ * the Method object passed to define_method, which contains the
3809
+ * body of the method
3612
3810
  */
3613
- rb_define_method(rb_cDEFS, "mid", node_mid, 0);
3614
- rb_ary_push(members, rb_str_new2("mid"));
3811
+ rb_define_method(rb_cDMETHOD, "cval", node_cval, 0);
3812
+ rb_ary_push(members, rb_str_new2("cval"));
3615
3813
  }
3616
3814
 
3617
3815
  /* Document-class: Node::DOT2
@@ -3626,20 +3824,20 @@ void define_node_subclass_methods()
3626
3824
  rb_iv_set(rb_cDOT2, "__member__", members);
3627
3825
  rb_iv_set(rb_cDOT2, "__type__", INT2NUM(NODE_DOT2));
3628
3826
  rb_define_singleton_method(rb_cDOT2, "members", node_s_members, 0);
3629
-
3630
- /* Document-method: beg
3631
- * the beginning of the range
3632
- */
3633
- rb_define_method(rb_cDOT2, "beg", node_beg, 0);
3634
- rb_ary_push(members, rb_str_new2("beg"));
3827
+ rb_define_method(rb_cDOT2, "state", node_state, 0);
3828
+ rb_ary_push(members, rb_str_new2("state"));
3635
3829
 
3636
3830
  /* Document-method: end
3637
3831
  * the end of the range
3638
3832
  */
3639
3833
  rb_define_method(rb_cDOT2, "end", node_end, 0);
3640
3834
  rb_ary_push(members, rb_str_new2("end"));
3641
- rb_define_method(rb_cDOT2, "state", node_state, 0);
3642
- rb_ary_push(members, rb_str_new2("state"));
3835
+
3836
+ /* Document-method: beg
3837
+ * the beginning of the range
3838
+ */
3839
+ rb_define_method(rb_cDOT2, "beg", node_beg, 0);
3840
+ rb_ary_push(members, rb_str_new2("beg"));
3643
3841
  }
3644
3842
 
3645
3843
  /* Document-class: Node::DOT3
@@ -3654,20 +3852,20 @@ void define_node_subclass_methods()
3654
3852
  rb_iv_set(rb_cDOT3, "__member__", members);
3655
3853
  rb_iv_set(rb_cDOT3, "__type__", INT2NUM(NODE_DOT3));
3656
3854
  rb_define_singleton_method(rb_cDOT3, "members", node_s_members, 0);
3657
-
3658
- /* Document-method: beg
3659
- * the beginning of the range
3660
- */
3661
- rb_define_method(rb_cDOT3, "beg", node_beg, 0);
3662
- rb_ary_push(members, rb_str_new2("beg"));
3855
+ rb_define_method(rb_cDOT3, "state", node_state, 0);
3856
+ rb_ary_push(members, rb_str_new2("state"));
3663
3857
 
3664
3858
  /* Document-method: end
3665
3859
  * the end of the range
3666
3860
  */
3667
3861
  rb_define_method(rb_cDOT3, "end", node_end, 0);
3668
3862
  rb_ary_push(members, rb_str_new2("end"));
3669
- rb_define_method(rb_cDOT3, "state", node_state, 0);
3670
- rb_ary_push(members, rb_str_new2("state"));
3863
+
3864
+ /* Document-method: beg
3865
+ * the beginning of the range
3866
+ */
3867
+ rb_define_method(rb_cDOT3, "beg", node_beg, 0);
3868
+ rb_ary_push(members, rb_str_new2("beg"));
3671
3869
  }
3672
3870
 
3673
3871
  /* Document-class: Node::DREGX
@@ -3923,6 +4121,38 @@ void define_node_subclass_methods()
3923
4121
  rb_define_singleton_method(rb_cFALSE, "members", node_s_members, 0);
3924
4122
  }
3925
4123
 
4124
+ /* Document-class: Node::FBODY
4125
+ * A placeholder for a method alias, which can be added to a class by
4126
+ * using alias or alias_method:
4127
+ * alias old new
4128
+ */
4129
+ {
4130
+ VALUE rb_cFBODY = rb_define_class_under(rb_cNode, "FBODY", rb_cNode);
4131
+ members = rb_ary_new();
4132
+ rb_cNodeSubclass[NODE_FBODY] = rb_cFBODY;
4133
+ rb_iv_set(rb_cFBODY, "__member__", members);
4134
+ rb_iv_set(rb_cFBODY, "__type__", INT2NUM(NODE_FBODY));
4135
+ rb_define_singleton_method(rb_cFBODY, "members", node_s_members, 0);
4136
+
4137
+ /* Document-method: orig
4138
+ * the origin class
4139
+ */
4140
+ rb_define_method(rb_cFBODY, "orig", node_orig, 0);
4141
+ rb_ary_push(members, rb_str_new2("orig"));
4142
+
4143
+ /* Document-method: mid
4144
+ * the name of the method
4145
+ */
4146
+ rb_define_method(rb_cFBODY, "mid", node_mid, 0);
4147
+ rb_ary_push(members, rb_str_new2("mid"));
4148
+
4149
+ /* Document-method: head
4150
+ * the method body
4151
+ */
4152
+ rb_define_method(rb_cFBODY, "head", node_head, 0);
4153
+ rb_ary_push(members, rb_str_new2("head"));
4154
+ }
4155
+
3926
4156
  /* Document-class: Node::FCALL
3927
4157
  * Represents a method call in the form:
3928
4158
  * mid(args).
@@ -3938,17 +4168,17 @@ void define_node_subclass_methods()
3938
4168
  rb_iv_set(rb_cFCALL, "__type__", INT2NUM(NODE_FCALL));
3939
4169
  rb_define_singleton_method(rb_cFCALL, "members", node_s_members, 0);
3940
4170
 
3941
- /* Document-method: args
3942
- * the arguments to the method
3943
- */
3944
- rb_define_method(rb_cFCALL, "args", node_args, 0);
3945
- rb_ary_push(members, rb_str_new2("args"));
3946
-
3947
4171
  /* Document-method: mid
3948
4172
  * the method id
3949
4173
  */
3950
4174
  rb_define_method(rb_cFCALL, "mid", node_mid, 0);
3951
4175
  rb_ary_push(members, rb_str_new2("mid"));
4176
+
4177
+ /* Document-method: args
4178
+ * the arguments to the method
4179
+ */
4180
+ rb_define_method(rb_cFCALL, "args", node_args, 0);
4181
+ rb_ary_push(members, rb_str_new2("args"));
3952
4182
  }
3953
4183
 
3954
4184
  /* Document-class: Node::FLIP2
@@ -3972,17 +4202,17 @@ void define_node_subclass_methods()
3972
4202
  rb_define_method(rb_cFLIP2, "cnt", node_cnt, 0);
3973
4203
  rb_ary_push(members, rb_str_new2("cnt"));
3974
4204
 
3975
- /* Document-method: beg
3976
- * the beginning of the range
3977
- */
3978
- rb_define_method(rb_cFLIP2, "beg", node_beg, 0);
3979
- rb_ary_push(members, rb_str_new2("beg"));
3980
-
3981
4205
  /* Document-method: end
3982
4206
  * the end of the range
3983
4207
  */
3984
4208
  rb_define_method(rb_cFLIP2, "end", node_end, 0);
3985
4209
  rb_ary_push(members, rb_str_new2("end"));
4210
+
4211
+ /* Document-method: beg
4212
+ * the beginning of the range
4213
+ */
4214
+ rb_define_method(rb_cFLIP2, "beg", node_beg, 0);
4215
+ rb_ary_push(members, rb_str_new2("beg"));
3986
4216
  }
3987
4217
 
3988
4218
  /* Document-class: Node::FLIP3
@@ -4006,17 +4236,17 @@ void define_node_subclass_methods()
4006
4236
  rb_define_method(rb_cFLIP3, "cnt", node_cnt, 0);
4007
4237
  rb_ary_push(members, rb_str_new2("cnt"));
4008
4238
 
4009
- /* Document-method: beg
4010
- * the beginning of the range
4011
- */
4012
- rb_define_method(rb_cFLIP3, "beg", node_beg, 0);
4013
- rb_ary_push(members, rb_str_new2("beg"));
4014
-
4015
4239
  /* Document-method: end
4016
4240
  * the end of the range
4017
4241
  */
4018
4242
  rb_define_method(rb_cFLIP3, "end", node_end, 0);
4019
4243
  rb_ary_push(members, rb_str_new2("end"));
4244
+
4245
+ /* Document-method: beg
4246
+ * the beginning of the range
4247
+ */
4248
+ rb_define_method(rb_cFLIP3, "beg", node_beg, 0);
4249
+ rb_ary_push(members, rb_str_new2("beg"));
4020
4250
  }
4021
4251
 
4022
4252
  /* Document-class: Node::FOR
@@ -4041,6 +4271,14 @@ void define_node_subclass_methods()
4041
4271
  rb_iv_set(rb_cFOR, "__type__", INT2NUM(NODE_FOR));
4042
4272
  rb_define_singleton_method(rb_cFOR, "members", node_s_members, 0);
4043
4273
 
4274
+ /* Document-method: var
4275
+ * an assignment node which assigns the next value in the sequence
4276
+ * to a variable, which may or may not be local. May also be a
4277
+ * multiple assignment.
4278
+ */
4279
+ rb_define_method(rb_cFOR, "var", node_var, 0);
4280
+ rb_ary_push(members, rb_str_new2("var"));
4281
+
4044
4282
  /* Document-method: body
4045
4283
  * the body of the loop
4046
4284
  */
@@ -4052,14 +4290,6 @@ void define_node_subclass_methods()
4052
4290
  */
4053
4291
  rb_define_method(rb_cFOR, "iter", node_iter, 0);
4054
4292
  rb_ary_push(members, rb_str_new2("iter"));
4055
-
4056
- /* Document-method: var
4057
- * an assignment node which assigns the next value in the sequence
4058
- * to a variable, which may or may not be local. May also be a
4059
- * multiple assignment.
4060
- */
4061
- rb_define_method(rb_cFOR, "var", node_var, 0);
4062
- rb_ary_push(members, rb_str_new2("var"));
4063
4293
  }
4064
4294
 
4065
4295
  /* Document-class: Node::GASGN
@@ -4180,12 +4410,6 @@ void define_node_subclass_methods()
4180
4410
  rb_iv_set(rb_cIF, "__type__", INT2NUM(NODE_IF));
4181
4411
  rb_define_singleton_method(rb_cIF, "members", node_s_members, 0);
4182
4412
 
4183
- /* Document-method: cond
4184
- * the condition to evaluate
4185
- */
4186
- rb_define_method(rb_cIF, "cond", node_cond, 0);
4187
- rb_ary_push(members, rb_str_new2("cond"));
4188
-
4189
4413
  /* Document-method: body
4190
4414
  * the expression to evaluate if the expression is true, or false
4191
4415
  * if the expression is empty
@@ -4199,6 +4423,12 @@ void define_node_subclass_methods()
4199
4423
  */
4200
4424
  rb_define_method(rb_cIF, "else", node_else, 0);
4201
4425
  rb_ary_push(members, rb_str_new2("else"));
4426
+
4427
+ /* Document-method: cond
4428
+ * the condition to evaluate
4429
+ */
4430
+ rb_define_method(rb_cIF, "cond", node_cond, 0);
4431
+ rb_ary_push(members, rb_str_new2("cond"));
4202
4432
  }
4203
4433
 
4204
4434
  /* Document-class: Node::IFUNC
@@ -4212,11 +4442,11 @@ void define_node_subclass_methods()
4212
4442
  rb_iv_set(rb_cIFUNC, "__type__", INT2NUM(NODE_IFUNC));
4213
4443
  rb_define_singleton_method(rb_cIFUNC, "members", node_s_members, 0);
4214
4444
 
4215
- /* Document-method: cfnc
4216
- * a pointer to the C function to which to yield
4445
+ /* Document-method: state
4446
+ * always 0
4217
4447
  */
4218
- rb_define_method(rb_cIFUNC, "cfnc", node_cfnc, 0);
4219
- rb_ary_push(members, rb_str_new2("cfnc"));
4448
+ rb_define_method(rb_cIFUNC, "state", node_state, 0);
4449
+ rb_ary_push(members, rb_str_new2("state"));
4220
4450
 
4221
4451
  /* Document-method: tval
4222
4452
  * the user-specified data to be passed as the second argument to
@@ -4225,11 +4455,11 @@ void define_node_subclass_methods()
4225
4455
  rb_define_method(rb_cIFUNC, "tval", node_tval, 0);
4226
4456
  rb_ary_push(members, rb_str_new2("tval"));
4227
4457
 
4228
- /* Document-method: state
4229
- * always 0
4458
+ /* Document-method: cfnc
4459
+ * a pointer to the C function to which to yield
4230
4460
  */
4231
- rb_define_method(rb_cIFUNC, "state", node_state, 0);
4232
- rb_ary_push(members, rb_str_new2("state"));
4461
+ rb_define_method(rb_cIFUNC, "cfnc", node_cfnc, 0);
4462
+ rb_ary_push(members, rb_str_new2("cfnc"));
4233
4463
  }
4234
4464
 
4235
4465
  /* Document-class: Node::ITER
@@ -4253,6 +4483,14 @@ void define_node_subclass_methods()
4253
4483
  rb_iv_set(rb_cITER, "__type__", INT2NUM(NODE_ITER));
4254
4484
  rb_define_singleton_method(rb_cITER, "members", node_s_members, 0);
4255
4485
 
4486
+ /* Document-method: var
4487
+ * an assignment node which assigns the next value in the sequence
4488
+ * to a variable, which may or may not be local. May also be a
4489
+ * multiple assignment.
4490
+ */
4491
+ rb_define_method(rb_cITER, "var", node_var, 0);
4492
+ rb_ary_push(members, rb_str_new2("var"));
4493
+
4256
4494
  /* Document-method: body
4257
4495
  * the body of the loop
4258
4496
  */
@@ -4265,14 +4503,6 @@ void define_node_subclass_methods()
4265
4503
  */
4266
4504
  rb_define_method(rb_cITER, "iter", node_iter, 0);
4267
4505
  rb_ary_push(members, rb_str_new2("iter"));
4268
-
4269
- /* Document-method: var
4270
- * an assignment node which assigns the next value in the sequence
4271
- * to a variable, which may or may not be local. May also be a
4272
- * multiple assignment.
4273
- */
4274
- rb_define_method(rb_cITER, "var", node_var, 0);
4275
- rb_ary_push(members, rb_str_new2("var"));
4276
4506
  }
4277
4507
 
4278
4508
  /* Document-class: Node::IVAR
@@ -4312,14 +4542,14 @@ void define_node_subclass_methods()
4312
4542
  */
4313
4543
  rb_define_method(rb_cLASGN, "value", node_value, 0);
4314
4544
  rb_ary_push(members, rb_str_new2("value"));
4545
+ rb_define_method(rb_cLASGN, "cnt", node_cnt, 0);
4546
+ rb_ary_push(members, rb_str_new2("cnt"));
4315
4547
 
4316
4548
  /* Document-method: vid
4317
4549
  * the name of the local variable
4318
4550
  */
4319
4551
  rb_define_method(rb_cLASGN, "vid", node_vid, 0);
4320
4552
  rb_ary_push(members, rb_str_new2("vid"));
4321
- rb_define_method(rb_cLASGN, "cnt", node_cnt, 0);
4322
- rb_ary_push(members, rb_str_new2("cnt"));
4323
4553
  }
4324
4554
 
4325
4555
  /* Document-class: Node::LIT
@@ -4351,14 +4581,14 @@ void define_node_subclass_methods()
4351
4581
  rb_iv_set(rb_cLVAR, "__member__", members);
4352
4582
  rb_iv_set(rb_cLVAR, "__type__", INT2NUM(NODE_LVAR));
4353
4583
  rb_define_singleton_method(rb_cLVAR, "members", node_s_members, 0);
4584
+ rb_define_method(rb_cLVAR, "cnt", node_cnt, 0);
4585
+ rb_ary_push(members, rb_str_new2("cnt"));
4354
4586
 
4355
4587
  /* Document-method: vid
4356
4588
  * the name of the local variable to retrieve.
4357
4589
  */
4358
4590
  rb_define_method(rb_cLVAR, "vid", node_vid, 0);
4359
4591
  rb_ary_push(members, rb_str_new2("vid"));
4360
- rb_define_method(rb_cLVAR, "cnt", node_cnt, 0);
4361
- rb_ary_push(members, rb_str_new2("cnt"));
4362
4592
  }
4363
4593
 
4364
4594
  /* Document-class: Node::MASGN
@@ -4372,11 +4602,11 @@ void define_node_subclass_methods()
4372
4602
  rb_iv_set(rb_cMASGN, "__type__", INT2NUM(NODE_MASGN));
4373
4603
  rb_define_singleton_method(rb_cMASGN, "members", node_s_members, 0);
4374
4604
 
4375
- /* Document-method: args
4605
+ /* Document-method: value
4376
4606
  * TODO
4377
4607
  */
4378
- rb_define_method(rb_cMASGN, "args", node_args, 0);
4379
- rb_ary_push(members, rb_str_new2("args"));
4608
+ rb_define_method(rb_cMASGN, "value", node_value, 0);
4609
+ rb_ary_push(members, rb_str_new2("value"));
4380
4610
 
4381
4611
  /* Document-method: head
4382
4612
  * TODO
@@ -4384,11 +4614,11 @@ void define_node_subclass_methods()
4384
4614
  rb_define_method(rb_cMASGN, "head", node_head, 0);
4385
4615
  rb_ary_push(members, rb_str_new2("head"));
4386
4616
 
4387
- /* Document-method: value
4617
+ /* Document-method: args
4388
4618
  * TODO
4389
4619
  */
4390
- rb_define_method(rb_cMASGN, "value", node_value, 0);
4391
- rb_ary_push(members, rb_str_new2("value"));
4620
+ rb_define_method(rb_cMASGN, "args", node_args, 0);
4621
+ rb_ary_push(members, rb_str_new2("args"));
4392
4622
  }
4393
4623
 
4394
4624
  /* Document-class: Node::MATCH
@@ -4413,17 +4643,17 @@ void define_node_subclass_methods()
4413
4643
  rb_iv_set(rb_cMATCH, "__type__", INT2NUM(NODE_MATCH));
4414
4644
  rb_define_singleton_method(rb_cMATCH, "members", node_s_members, 0);
4415
4645
 
4416
- /* Document-method: lit
4417
- * the regular expression to use in the condition.
4418
- */
4419
- rb_define_method(rb_cMATCH, "lit", node_lit, 0);
4420
- rb_ary_push(members, rb_str_new2("lit"));
4421
-
4422
4646
  /* Document-method: value
4423
4647
  * the value to compare against
4424
4648
  */
4425
4649
  rb_define_method(rb_cMATCH, "value", node_value, 0);
4426
4650
  rb_ary_push(members, rb_str_new2("value"));
4651
+
4652
+ /* Document-method: lit
4653
+ * the regular expression to use in the condition.
4654
+ */
4655
+ rb_define_method(rb_cMATCH, "lit", node_lit, 0);
4656
+ rb_ary_push(members, rb_str_new2("lit"));
4427
4657
  }
4428
4658
 
4429
4659
  /* Document-class: Node::MATCH2
@@ -4451,13 +4681,6 @@ void define_node_subclass_methods()
4451
4681
  rb_iv_set(rb_cMATCH2, "__type__", INT2NUM(NODE_MATCH2));
4452
4682
  rb_define_singleton_method(rb_cMATCH2, "members", node_s_members, 0);
4453
4683
 
4454
- /* Document-method: recv
4455
- * the regular expression on the left hand side of the match
4456
- * operator
4457
- */
4458
- rb_define_method(rb_cMATCH2, "recv", node_recv, 0);
4459
- rb_ary_push(members, rb_str_new2("recv"));
4460
-
4461
4684
  /* Document-method: value
4462
4685
  * the expression on the right hand side of the match operator, or
4463
4686
  * an expression returning $_ if there is nothing on the right hand
@@ -4465,6 +4688,13 @@ void define_node_subclass_methods()
4465
4688
  */
4466
4689
  rb_define_method(rb_cMATCH2, "value", node_value, 0);
4467
4690
  rb_ary_push(members, rb_str_new2("value"));
4691
+
4692
+ /* Document-method: recv
4693
+ * the regular expression on the left hand side of the match
4694
+ * operator
4695
+ */
4696
+ rb_define_method(rb_cMATCH2, "recv", node_recv, 0);
4697
+ rb_ary_push(members, rb_str_new2("recv"));
4468
4698
  }
4469
4699
 
4470
4700
  /* Document-class: Node::MATCH3
@@ -4482,17 +4712,17 @@ void define_node_subclass_methods()
4482
4712
  rb_iv_set(rb_cMATCH3, "__type__", INT2NUM(NODE_MATCH3));
4483
4713
  rb_define_singleton_method(rb_cMATCH3, "members", node_s_members, 0);
4484
4714
 
4485
- /* Document-method: recv
4486
- * the left hand side of the match
4487
- */
4488
- rb_define_method(rb_cMATCH3, "recv", node_recv, 0);
4489
- rb_ary_push(members, rb_str_new2("recv"));
4490
-
4491
4715
  /* Document-method: value
4492
4716
  * the right hand side of the match
4493
4717
  */
4494
4718
  rb_define_method(rb_cMATCH3, "value", node_value, 0);
4495
4719
  rb_ary_push(members, rb_str_new2("value"));
4720
+
4721
+ /* Document-method: recv
4722
+ * the left hand side of the match
4723
+ */
4724
+ rb_define_method(rb_cMATCH3, "recv", node_recv, 0);
4725
+ rb_ary_push(members, rb_str_new2("recv"));
4496
4726
  }
4497
4727
 
4498
4728
  /* Document-class: Node::MEMO
@@ -4518,6 +4748,30 @@ void define_node_subclass_methods()
4518
4748
  rb_define_singleton_method(rb_cMEMO, "members", node_s_members, 0);
4519
4749
  }
4520
4750
 
4751
+ /* Document-class: Node::METHOD
4752
+ * A placeholder for a method entry in a class's method table.
4753
+ */
4754
+ {
4755
+ VALUE rb_cMETHOD = rb_define_class_under(rb_cNode, "METHOD", rb_cNode);
4756
+ members = rb_ary_new();
4757
+ rb_cNodeSubclass[NODE_METHOD] = rb_cMETHOD;
4758
+ rb_iv_set(rb_cMETHOD, "__member__", members);
4759
+ rb_iv_set(rb_cMETHOD, "__type__", INT2NUM(NODE_METHOD));
4760
+ rb_define_singleton_method(rb_cMETHOD, "members", node_s_members, 0);
4761
+
4762
+ /* Document-method: noex
4763
+ * the method's flags
4764
+ */
4765
+ rb_define_method(rb_cMETHOD, "noex", node_noex, 0);
4766
+ rb_ary_push(members, rb_str_new2("noex"));
4767
+
4768
+ /* Document-method: body
4769
+ * the body of the method
4770
+ */
4771
+ rb_define_method(rb_cMETHOD, "body", node_body, 0);
4772
+ rb_ary_push(members, rb_str_new2("body"));
4773
+ }
4774
+
4521
4775
  /* Document-class: Node::MODULE
4522
4776
  * Represents a module definition, e.g.:
4523
4777
  * module cpath
@@ -4550,6 +4804,25 @@ void define_node_subclass_methods()
4550
4804
  rb_ary_push(members, rb_str_new2("body"));
4551
4805
  }
4552
4806
 
4807
+ /* Document-class: Node::NEWLINE
4808
+ * Represents the termination of a line. This is used for calling
4809
+ * event hooks when a new line of code is reached.
4810
+ */
4811
+ {
4812
+ VALUE rb_cNEWLINE = rb_define_class_under(rb_cNode, "NEWLINE", rb_cNode);
4813
+ members = rb_ary_new();
4814
+ rb_cNodeSubclass[NODE_NEWLINE] = rb_cNEWLINE;
4815
+ rb_iv_set(rb_cNEWLINE, "__member__", members);
4816
+ rb_iv_set(rb_cNEWLINE, "__type__", INT2NUM(NODE_NEWLINE));
4817
+ rb_define_singleton_method(rb_cNEWLINE, "members", node_s_members, 0);
4818
+
4819
+ /* Document-method: next
4820
+ * the expression on the next line
4821
+ */
4822
+ rb_define_method(rb_cNEWLINE, "next", node_next, 0);
4823
+ rb_ary_push(members, rb_str_new2("next"));
4824
+ }
4825
+
4553
4826
  /* Document-class: Node::NEXT
4554
4827
  * Represents the 'next' keyword.
4555
4828
  * Causes control to be transferred to the end of the loop, causing the
@@ -4578,6 +4851,24 @@ void define_node_subclass_methods()
4578
4851
  rb_define_singleton_method(rb_cNIL, "members", node_s_members, 0);
4579
4852
  }
4580
4853
 
4854
+ /* Document-class: Node::NOT
4855
+ * Represents a logical negation.
4856
+ */
4857
+ {
4858
+ VALUE rb_cNOT = rb_define_class_under(rb_cNode, "NOT", rb_cNode);
4859
+ members = rb_ary_new();
4860
+ rb_cNodeSubclass[NODE_NOT] = rb_cNOT;
4861
+ rb_iv_set(rb_cNOT, "__member__", members);
4862
+ rb_iv_set(rb_cNOT, "__type__", INT2NUM(NODE_NOT));
4863
+ rb_define_singleton_method(rb_cNOT, "members", node_s_members, 0);
4864
+
4865
+ /* Document-method: body
4866
+ * the value to negate.
4867
+ */
4868
+ rb_define_method(rb_cNOT, "body", node_body, 0);
4869
+ rb_ary_push(members, rb_str_new2("body"));
4870
+ }
4871
+
4581
4872
  /* Document-class: Node::NTH_REF
4582
4873
  * Represents the nth match data item, e.g. $1, $2, etc.
4583
4874
  */
@@ -4652,12 +4943,6 @@ void define_node_subclass_methods()
4652
4943
  rb_iv_set(rb_cOP_ASGN1, "__type__", INT2NUM(NODE_OP_ASGN1));
4653
4944
  rb_define_singleton_method(rb_cOP_ASGN1, "members", node_s_members, 0);
4654
4945
 
4655
- /* Document-method: args
4656
- * the arguments to the assigment
4657
- */
4658
- rb_define_method(rb_cOP_ASGN1, "args", node_args, 0);
4659
- rb_ary_push(members, rb_str_new2("args"));
4660
-
4661
4946
  /* Document-method: mid
4662
4947
  * 0, 1, or the name a method to call to calculate the value of the
4663
4948
  * rhs
@@ -4670,6 +4955,12 @@ void define_node_subclass_methods()
4670
4955
  */
4671
4956
  rb_define_method(rb_cOP_ASGN1, "recv", node_recv, 0);
4672
4957
  rb_ary_push(members, rb_str_new2("recv"));
4958
+
4959
+ /* Document-method: args
4960
+ * the arguments to the assigment
4961
+ */
4962
+ rb_define_method(rb_cOP_ASGN1, "args", node_args, 0);
4963
+ rb_ary_push(members, rb_str_new2("args"));
4673
4964
  }
4674
4965
 
4675
4966
  /* Document-class: Node::OP_ASGN2
@@ -4692,11 +4983,11 @@ void define_node_subclass_methods()
4692
4983
  rb_iv_set(rb_cOP_ASGN2, "__type__", INT2NUM(NODE_OP_ASGN2));
4693
4984
  rb_define_singleton_method(rb_cOP_ASGN2, "members", node_s_members, 0);
4694
4985
 
4695
- /* Document-method: recv
4696
- * the receiver of the attribute
4986
+ /* Document-method: value
4987
+ * the value to assign to the attribute
4697
4988
  */
4698
- rb_define_method(rb_cOP_ASGN2, "recv", node_recv, 0);
4699
- rb_ary_push(members, rb_str_new2("recv"));
4989
+ rb_define_method(rb_cOP_ASGN2, "value", node_value, 0);
4990
+ rb_ary_push(members, rb_str_new2("value"));
4700
4991
 
4701
4992
  /* Document-method: next
4702
4993
  * another node of type OP_ASGN2 which contains more information
@@ -4705,11 +4996,11 @@ void define_node_subclass_methods()
4705
4996
  rb_define_method(rb_cOP_ASGN2, "next", node_next, 0);
4706
4997
  rb_ary_push(members, rb_str_new2("next"));
4707
4998
 
4708
- /* Document-method: value
4709
- * the value to assign to the attribute
4999
+ /* Document-method: recv
5000
+ * the receiver of the attribute
4710
5001
  */
4711
- rb_define_method(rb_cOP_ASGN2, "value", node_value, 0);
4712
- rb_ary_push(members, rb_str_new2("value"));
5002
+ rb_define_method(rb_cOP_ASGN2, "recv", node_recv, 0);
5003
+ rb_ary_push(members, rb_str_new2("recv"));
4713
5004
  }
4714
5005
 
4715
5006
  /* Document-class: Node::OP_ASGN2_ARG
@@ -4725,12 +5016,6 @@ void define_node_subclass_methods()
4725
5016
  rb_iv_set(rb_cOP_ASGN2_ARG, "__type__", INT2NUM(NODE_OP_ASGN2_ARG));
4726
5017
  rb_define_singleton_method(rb_cOP_ASGN2_ARG, "members", node_s_members, 0);
4727
5018
 
4728
- /* Document-method: vid
4729
- * The method to call on the receiver to retrieve the attribute
4730
- */
4731
- rb_define_method(rb_cOP_ASGN2_ARG, "vid", node_vid, 0);
4732
- rb_ary_push(members, rb_str_new2("vid"));
4733
-
4734
5019
  /* Document-method: aid
4735
5020
  * The method to call on the receiver to set the attribute
4736
5021
  */
@@ -4744,6 +5029,12 @@ void define_node_subclass_methods()
4744
5029
  */
4745
5030
  rb_define_method(rb_cOP_ASGN2_ARG, "mid", node_mid, 0);
4746
5031
  rb_ary_push(members, rb_str_new2("mid"));
5032
+
5033
+ /* Document-method: vid
5034
+ * The method to call on the receiver to retrieve the attribute
5035
+ */
5036
+ rb_define_method(rb_cOP_ASGN2_ARG, "vid", node_vid, 0);
5037
+ rb_ary_push(members, rb_str_new2("vid"));
4747
5038
  }
4748
5039
 
4749
5040
  /* Document-class: Node::OP_ASGN_AND
@@ -4762,18 +5053,18 @@ void define_node_subclass_methods()
4762
5053
  rb_iv_set(rb_cOP_ASGN_AND, "__type__", INT2NUM(NODE_OP_ASGN_AND));
4763
5054
  rb_define_singleton_method(rb_cOP_ASGN_AND, "members", node_s_members, 0);
4764
5055
 
4765
- /* Document-method: recv
4766
- * an expression representing the left hand side of the assignment
4767
- */
4768
- rb_define_method(rb_cOP_ASGN_AND, "recv", node_recv, 0);
4769
- rb_ary_push(members, rb_str_new2("recv"));
4770
-
4771
5056
  /* Document-method: value
4772
5057
  * an expression representing the assignment that should be
4773
5058
  * performed if the left hand side is true
4774
5059
  */
4775
5060
  rb_define_method(rb_cOP_ASGN_AND, "value", node_value, 0);
4776
5061
  rb_ary_push(members, rb_str_new2("value"));
5062
+
5063
+ /* Document-method: recv
5064
+ * an expression representing the left hand side of the assignment
5065
+ */
5066
+ rb_define_method(rb_cOP_ASGN_AND, "recv", node_recv, 0);
5067
+ rb_ary_push(members, rb_str_new2("recv"));
4777
5068
  }
4778
5069
 
4779
5070
  /* Document-class: Node::OP_ASGN_OR
@@ -4946,18 +5237,18 @@ void define_node_subclass_methods()
4946
5237
  rb_iv_set(rb_cRESCUE, "__type__", INT2NUM(NODE_RESCUE));
4947
5238
  rb_define_singleton_method(rb_cRESCUE, "members", node_s_members, 0);
4948
5239
 
4949
- /* Document-method: head
4950
- * the body of the block to evaluate
4951
- */
4952
- rb_define_method(rb_cRESCUE, "head", node_head, 0);
4953
- rb_ary_push(members, rb_str_new2("head"));
4954
-
4955
5240
  /* Document-method: resq
4956
5241
  * the expression to be evaluated if an exception is raised
4957
5242
  */
4958
5243
  rb_define_method(rb_cRESCUE, "resq", node_resq, 0);
4959
5244
  rb_ary_push(members, rb_str_new2("resq"));
4960
5245
 
5246
+ /* Document-method: head
5247
+ * the body of the block to evaluate
5248
+ */
5249
+ rb_define_method(rb_cRESCUE, "head", node_head, 0);
5250
+ rb_ary_push(members, rb_str_new2("head"));
5251
+
4961
5252
  /* Document-method: else
4962
5253
  * the expression to be evaluated if no exception is raised
4963
5254
  */
@@ -5059,18 +5350,18 @@ void define_node_subclass_methods()
5059
5350
  rb_define_method(rb_cSCOPE, "tbl", node_tbl, 0);
5060
5351
  rb_ary_push(members, rb_str_new2("tbl"));
5061
5352
 
5353
+ /* Document-method: next
5354
+ * the body of the lexical scope
5355
+ */
5356
+ rb_define_method(rb_cSCOPE, "next", node_next, 0);
5357
+ rb_ary_push(members, rb_str_new2("next"));
5358
+
5062
5359
  /* Document-method: rval
5063
5360
  * holds information about which class(es) to search for constants
5064
5361
  * in this scope
5065
5362
  */
5066
5363
  rb_define_method(rb_cSCOPE, "rval", node_rval, 0);
5067
5364
  rb_ary_push(members, rb_str_new2("rval"));
5068
-
5069
- /* Document-method: next
5070
- * the body of the lexical scope
5071
- */
5072
- rb_define_method(rb_cSCOPE, "next", node_next, 0);
5073
- rb_ary_push(members, rb_str_new2("next"));
5074
5365
  }
5075
5366
 
5076
5367
  /* Document-class: Node::SELF
@@ -5145,6 +5436,31 @@ void define_node_subclass_methods()
5145
5436
  rb_ary_push(members, rb_str_new2("args"));
5146
5437
  }
5147
5438
 
5439
+ /* Document-class: Node::SVALUE
5440
+ * Represents the collection of multiple values of the right hand side
5441
+ * of an assignment into a single value, for use in single assignment,
5442
+ * e.g.:
5443
+ * lhs = a, b, c
5444
+ * The argument to this node is an Array.
5445
+ * If it is length 0, returns nil.
5446
+ * If it is length 1, returns the first element in the array.
5447
+ * Otherwise, returns the array.
5448
+ */
5449
+ {
5450
+ VALUE rb_cSVALUE = rb_define_class_under(rb_cNode, "SVALUE", rb_cNode);
5451
+ members = rb_ary_new();
5452
+ rb_cNodeSubclass[NODE_SVALUE] = rb_cSVALUE;
5453
+ rb_iv_set(rb_cSVALUE, "__member__", members);
5454
+ rb_iv_set(rb_cSVALUE, "__type__", INT2NUM(NODE_SVALUE));
5455
+ rb_define_singleton_method(rb_cSVALUE, "members", node_s_members, 0);
5456
+
5457
+ /* Document-method: head
5458
+ * an expression which returns an Array.
5459
+ */
5460
+ rb_define_method(rb_cSVALUE, "head", node_head, 0);
5461
+ rb_ary_push(members, rb_str_new2("head"));
5462
+ }
5463
+
5148
5464
  /* Document-class: Node::TO_ARY
5149
5465
  * Represents a conversion from one object type to an array type.
5150
5466
  * Evaluation of this node converts its argument to an array by calling
@@ -5212,6 +5528,8 @@ void define_node_subclass_methods()
5212
5528
  rb_iv_set(rb_cUNTIL, "__member__", members);
5213
5529
  rb_iv_set(rb_cUNTIL, "__type__", INT2NUM(NODE_UNTIL));
5214
5530
  rb_define_singleton_method(rb_cUNTIL, "members", node_s_members, 0);
5531
+ rb_define_method(rb_cUNTIL, "state", node_state, 0);
5532
+ rb_ary_push(members, rb_str_new2("state"));
5215
5533
 
5216
5534
  /* Document-method: body
5217
5535
  * the body of the loop
@@ -5224,8 +5542,6 @@ void define_node_subclass_methods()
5224
5542
  */
5225
5543
  rb_define_method(rb_cUNTIL, "cond", node_cond, 0);
5226
5544
  rb_ary_push(members, rb_str_new2("cond"));
5227
- rb_define_method(rb_cUNTIL, "state", node_state, 0);
5228
- rb_ary_push(members, rb_str_new2("state"));
5229
5545
  }
5230
5546
 
5231
5547
  /* Document-class: Node::VALIAS
@@ -5241,10 +5557,10 @@ void define_node_subclass_methods()
5241
5557
  rb_iv_set(rb_cVALIAS, "__member__", members);
5242
5558
  rb_iv_set(rb_cVALIAS, "__type__", INT2NUM(NODE_VALIAS));
5243
5559
  rb_define_singleton_method(rb_cVALIAS, "members", node_s_members, 0);
5244
- rb_define_method(rb_cVALIAS, "first", node_1st, 0);
5245
- rb_ary_push(members, rb_str_new2("first"));
5246
5560
  rb_define_method(rb_cVALIAS, "second", node_2nd, 0);
5247
5561
  rb_ary_push(members, rb_str_new2("second"));
5562
+ rb_define_method(rb_cVALIAS, "first", node_1st, 0);
5563
+ rb_ary_push(members, rb_str_new2("first"));
5248
5564
  }
5249
5565
 
5250
5566
  /* Document-class: Node::VCALL
@@ -5304,6 +5620,12 @@ void define_node_subclass_methods()
5304
5620
  rb_iv_set(rb_cWHEN, "__type__", INT2NUM(NODE_WHEN));
5305
5621
  rb_define_singleton_method(rb_cWHEN, "members", node_s_members, 0);
5306
5622
 
5623
+ /* Document-method: next
5624
+ * the next expression to be evaluated if the condition is false
5625
+ */
5626
+ rb_define_method(rb_cWHEN, "next", node_next, 0);
5627
+ rb_ary_push(members, rb_str_new2("next"));
5628
+
5307
5629
  /* Document-method: head
5308
5630
  * a value to compare against, or a condition to be tested
5309
5631
  */
@@ -5315,12 +5637,6 @@ void define_node_subclass_methods()
5315
5637
  */
5316
5638
  rb_define_method(rb_cWHEN, "body", node_body, 0);
5317
5639
  rb_ary_push(members, rb_str_new2("body"));
5318
-
5319
- /* Document-method: next
5320
- * the next expression to be evaluated if the condition is false
5321
- */
5322
- rb_define_method(rb_cWHEN, "next", node_next, 0);
5323
- rb_ary_push(members, rb_str_new2("next"));
5324
5640
  }
5325
5641
 
5326
5642
  /* Document-class: Node::WHILE
@@ -5336,6 +5652,8 @@ void define_node_subclass_methods()
5336
5652
  rb_iv_set(rb_cWHILE, "__member__", members);
5337
5653
  rb_iv_set(rb_cWHILE, "__type__", INT2NUM(NODE_WHILE));
5338
5654
  rb_define_singleton_method(rb_cWHILE, "members", node_s_members, 0);
5655
+ rb_define_method(rb_cWHILE, "state", node_state, 0);
5656
+ rb_ary_push(members, rb_str_new2("state"));
5339
5657
 
5340
5658
  /* Document-method: body
5341
5659
  * the body of the loop
@@ -5348,8 +5666,6 @@ void define_node_subclass_methods()
5348
5666
  */
5349
5667
  rb_define_method(rb_cWHILE, "cond", node_cond, 0);
5350
5668
  rb_ary_push(members, rb_str_new2("cond"));
5351
- rb_define_method(rb_cWHILE, "state", node_state, 0);
5352
- rb_ary_push(members, rb_str_new2("state"));
5353
5669
  }
5354
5670
 
5355
5671
  /* Document-class: Node::XSTR
@@ -5386,17 +5702,17 @@ void define_node_subclass_methods()
5386
5702
  rb_iv_set(rb_cYIELD, "__type__", INT2NUM(NODE_YIELD));
5387
5703
  rb_define_singleton_method(rb_cYIELD, "members", node_s_members, 0);
5388
5704
 
5389
- /* Document-method: head
5390
- * the value to yield
5391
- */
5392
- rb_define_method(rb_cYIELD, "head", node_head, 0);
5393
- rb_ary_push(members, rb_str_new2("head"));
5394
-
5395
5705
  /* Document-method: state
5396
5706
  * if nonzero, splats the value before yielding
5397
5707
  */
5398
5708
  rb_define_method(rb_cYIELD, "state", node_state, 0);
5399
5709
  rb_ary_push(members, rb_str_new2("state"));
5710
+
5711
+ /* Document-method: head
5712
+ * the value to yield
5713
+ */
5714
+ rb_define_method(rb_cYIELD, "head", node_head, 0);
5715
+ rb_ary_push(members, rb_str_new2("head"));
5400
5716
  }
5401
5717
 
5402
5718
  /* Document-class: Node::ZARRAY