ruby-internal 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. data/COPYING +59 -0
  2. data/LGPL +515 -0
  3. data/LICENSE +9 -0
  4. data/README +31 -0
  5. data/Rakefile +20 -0
  6. data/TODO +9 -0
  7. data/example/README +5 -0
  8. data/example/simple_client.rb +12 -0
  9. data/example/simple_server.rb +11 -0
  10. data/example/triangle_client.rb +7 -0
  11. data/example/triangle_server.rb +24 -0
  12. data/ext/cached/ruby-1.8.0/internal/binding/block.h +37 -0
  13. data/ext/cached/ruby-1.8.0/internal/method/method.h +19 -0
  14. data/ext/cached/ruby-1.8.0/internal/module/classpath.c +27 -0
  15. data/ext/cached/ruby-1.8.0/internal/module/classpath.h +14 -0
  16. data/ext/cached/ruby-1.8.0/internal/node/block.h +37 -0
  17. data/ext/cached/ruby-1.8.0/internal/node/global_entry.h +10 -0
  18. data/ext/cached/ruby-1.8.0/internal/node/node_type_descrip.c +155 -0
  19. data/ext/cached/ruby-1.8.0/internal/node/nodeinfo.c +5741 -0
  20. data/ext/cached/ruby-1.8.0/internal/node/nodeinfo.h +69 -0
  21. data/ext/cached/ruby-1.8.0/internal/proc/block.h +37 -0
  22. data/ext/cached/ruby-1.8.0/internal/tag/tag.h +15 -0
  23. data/ext/cached/ruby-1.8.0/internal/vm/instruction/insns_info.c +39 -0
  24. data/ext/cached/ruby-1.8.0/internal/vm/instruction/insns_info.h +21 -0
  25. data/ext/cached/ruby-1.8.0/internal/vm/iseq/insns_info.inc +12 -0
  26. data/ext/cached/ruby-1.8.1/internal/binding/block.h +31 -0
  27. data/ext/cached/ruby-1.8.1/internal/method/method.h +19 -0
  28. data/ext/cached/ruby-1.8.1/internal/module/classpath.c +27 -0
  29. data/ext/cached/ruby-1.8.1/internal/module/classpath.h +14 -0
  30. data/ext/cached/ruby-1.8.1/internal/node/block.h +31 -0
  31. data/ext/cached/ruby-1.8.1/internal/node/global_entry.h +10 -0
  32. data/ext/cached/ruby-1.8.1/internal/node/node_type_descrip.c +154 -0
  33. data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.c +5733 -0
  34. data/ext/cached/ruby-1.8.1/internal/node/nodeinfo.h +69 -0
  35. data/ext/cached/ruby-1.8.1/internal/proc/block.h +31 -0
  36. data/ext/cached/ruby-1.8.1/internal/tag/tag.h +16 -0
  37. data/ext/cached/ruby-1.8.1/internal/vm/instruction/insns_info.c +39 -0
  38. data/ext/cached/ruby-1.8.1/internal/vm/instruction/insns_info.h +21 -0
  39. data/ext/cached/ruby-1.8.1/internal/vm/iseq/insns_info.inc +12 -0
  40. data/ext/cached/ruby-1.8.2/internal/binding/block.h +32 -0
  41. data/ext/cached/ruby-1.8.2/internal/method/method.h +19 -0
  42. data/ext/cached/ruby-1.8.2/internal/module/classpath.c +45 -0
  43. data/ext/cached/ruby-1.8.2/internal/module/classpath.h +17 -0
  44. data/ext/cached/ruby-1.8.2/internal/node/block.h +32 -0
  45. data/ext/cached/ruby-1.8.2/internal/node/global_entry.h +10 -0
  46. data/ext/cached/ruby-1.8.2/internal/node/node_type_descrip.c +154 -0
  47. data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.c +5733 -0
  48. data/ext/cached/ruby-1.8.2/internal/node/nodeinfo.h +69 -0
  49. data/ext/cached/ruby-1.8.2/internal/proc/block.h +32 -0
  50. data/ext/cached/ruby-1.8.2/internal/tag/tag.h +16 -0
  51. data/ext/cached/ruby-1.8.2/internal/vm/instruction/insns_info.c +39 -0
  52. data/ext/cached/ruby-1.8.2/internal/vm/instruction/insns_info.h +21 -0
  53. data/ext/cached/ruby-1.8.2/internal/vm/iseq/insns_info.inc +12 -0
  54. data/ext/cached/ruby-1.8.3/internal/binding/block.h +32 -0
  55. data/ext/cached/ruby-1.8.3/internal/method/method.h +20 -0
  56. data/ext/cached/ruby-1.8.3/internal/module/classpath.c +45 -0
  57. data/ext/cached/ruby-1.8.3/internal/module/classpath.h +17 -0
  58. data/ext/cached/ruby-1.8.3/internal/node/block.h +32 -0
  59. data/ext/cached/ruby-1.8.3/internal/node/global_entry.h +10 -0
  60. data/ext/cached/ruby-1.8.3/internal/node/node_type_descrip.c +154 -0
  61. data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.c +5733 -0
  62. data/ext/cached/ruby-1.8.3/internal/node/nodeinfo.h +69 -0
  63. data/ext/cached/ruby-1.8.3/internal/proc/block.h +32 -0
  64. data/ext/cached/ruby-1.8.3/internal/tag/tag.h +16 -0
  65. data/ext/cached/ruby-1.8.3/internal/vm/instruction/insns_info.c +39 -0
  66. data/ext/cached/ruby-1.8.3/internal/vm/instruction/insns_info.h +21 -0
  67. data/ext/cached/ruby-1.8.3/internal/vm/iseq/insns_info.inc +12 -0
  68. data/ext/cached/ruby-1.8.4/internal/binding/block.h +32 -0
  69. data/ext/cached/ruby-1.8.4/internal/method/method.h +20 -0
  70. data/ext/cached/ruby-1.8.4/internal/module/classpath.c +45 -0
  71. data/ext/cached/ruby-1.8.4/internal/module/classpath.h +17 -0
  72. data/ext/cached/ruby-1.8.4/internal/node/block.h +32 -0
  73. data/ext/cached/ruby-1.8.4/internal/node/global_entry.h +10 -0
  74. data/ext/cached/ruby-1.8.4/internal/node/node_type_descrip.c +154 -0
  75. data/ext/cached/ruby-1.8.4/internal/node/nodeinfo.c +5733 -0
  76. data/ext/cached/ruby-1.8.4/internal/node/nodeinfo.h +69 -0
  77. data/ext/cached/ruby-1.8.4/internal/proc/block.h +32 -0
  78. data/ext/cached/ruby-1.8.4/internal/tag/tag.h +16 -0
  79. data/ext/cached/ruby-1.8.4/internal/vm/instruction/insns_info.c +39 -0
  80. data/ext/cached/ruby-1.8.4/internal/vm/instruction/insns_info.h +21 -0
  81. data/ext/cached/ruby-1.8.4/internal/vm/iseq/insns_info.inc +12 -0
  82. data/ext/cached/ruby-1.8.5/internal/binding/block.h +32 -0
  83. data/ext/cached/ruby-1.8.5/internal/method/method.h +20 -0
  84. data/ext/cached/ruby-1.8.5/internal/module/classpath.c +45 -0
  85. data/ext/cached/ruby-1.8.5/internal/module/classpath.h +17 -0
  86. data/ext/cached/ruby-1.8.5/internal/node/block.h +32 -0
  87. data/ext/cached/ruby-1.8.5/internal/node/global_entry.h +10 -0
  88. data/ext/cached/ruby-1.8.5/internal/node/node_type_descrip.c +154 -0
  89. data/ext/cached/ruby-1.8.5/internal/node/nodeinfo.c +5732 -0
  90. data/ext/cached/ruby-1.8.5/internal/node/nodeinfo.h +67 -0
  91. data/ext/cached/ruby-1.8.5/internal/proc/block.h +32 -0
  92. data/ext/cached/ruby-1.8.5/internal/tag/tag.h +16 -0
  93. data/ext/cached/ruby-1.8.5/internal/vm/instruction/insns_info.c +39 -0
  94. data/ext/cached/ruby-1.8.5/internal/vm/instruction/insns_info.h +21 -0
  95. data/ext/cached/ruby-1.8.5/internal/vm/iseq/insns_info.inc +12 -0
  96. data/ext/cached/ruby-1.8.6/internal/binding/block.h +32 -0
  97. data/ext/cached/ruby-1.8.6/internal/method/method.h +20 -0
  98. data/ext/cached/ruby-1.8.6/internal/module/classpath.c +45 -0
  99. data/ext/cached/ruby-1.8.6/internal/module/classpath.h +17 -0
  100. data/ext/cached/ruby-1.8.6/internal/node/block.h +32 -0
  101. data/ext/cached/ruby-1.8.6/internal/node/global_entry.h +10 -0
  102. data/ext/cached/ruby-1.8.6/internal/node/node_type_descrip.c +154 -0
  103. data/ext/cached/ruby-1.8.6/internal/node/nodeinfo.c +5732 -0
  104. data/ext/cached/ruby-1.8.6/internal/node/nodeinfo.h +67 -0
  105. data/ext/cached/ruby-1.8.6/internal/proc/block.h +32 -0
  106. data/ext/cached/ruby-1.8.6/internal/tag/tag.h +16 -0
  107. data/ext/cached/ruby-1.8.6/internal/vm/instruction/insns_info.c +39 -0
  108. data/ext/cached/ruby-1.8.6/internal/vm/instruction/insns_info.h +21 -0
  109. data/ext/cached/ruby-1.8.6/internal/vm/iseq/insns_info.inc +12 -0
  110. data/ext/cached/ruby-1.8.7/internal/binding/block.h +32 -0
  111. data/ext/cached/ruby-1.8.7/internal/method/method.h +20 -0
  112. data/ext/cached/ruby-1.8.7/internal/module/classpath.c +45 -0
  113. data/ext/cached/ruby-1.8.7/internal/module/classpath.h +17 -0
  114. data/ext/cached/ruby-1.8.7/internal/node/block.h +32 -0
  115. data/ext/cached/ruby-1.8.7/internal/node/global_entry.h +10 -0
  116. data/ext/cached/ruby-1.8.7/internal/node/node_type_descrip.c +154 -0
  117. data/ext/cached/ruby-1.8.7/internal/node/nodeinfo.c +5732 -0
  118. data/ext/cached/ruby-1.8.7/internal/node/nodeinfo.h +67 -0
  119. data/ext/cached/ruby-1.8.7/internal/proc/block.h +32 -0
  120. data/ext/cached/ruby-1.8.7/internal/tag/tag.h +16 -0
  121. data/ext/cached/ruby-1.8.7/internal/vm/instruction/insns_info.c +39 -0
  122. data/ext/cached/ruby-1.8.7/internal/vm/instruction/insns_info.h +21 -0
  123. data/ext/cached/ruby-1.8.7/internal/vm/iseq/insns_info.inc +12 -0
  124. data/ext/cached/ruby-1.9.0/internal/binding/block.h +12 -0
  125. data/ext/cached/ruby-1.9.0/internal/method/method.h +20 -0
  126. data/ext/cached/ruby-1.9.0/internal/module/classpath.c +42 -0
  127. data/ext/cached/ruby-1.9.0/internal/module/classpath.h +17 -0
  128. data/ext/cached/ruby-1.9.0/internal/node/block.h +12 -0
  129. data/ext/cached/ruby-1.9.0/internal/node/global_entry.h +10 -0
  130. data/ext/cached/ruby-1.9.0/internal/node/node_type_descrip.c +149 -0
  131. data/ext/cached/ruby-1.9.0/internal/node/nodeinfo.c +5579 -0
  132. data/ext/cached/ruby-1.9.0/internal/node/nodeinfo.h +70 -0
  133. data/ext/cached/ruby-1.9.0/internal/proc/block.h +12 -0
  134. data/ext/cached/ruby-1.9.0/internal/tag/tag.h +6 -0
  135. data/ext/cached/ruby-1.9.0/internal/vm/instruction/insns_info.c +5936 -0
  136. data/ext/cached/ruby-1.9.0/internal/vm/instruction/insns_info.h +891 -0
  137. data/ext/cached/ruby-1.9.0/internal/vm/iseq/insns_info.inc +700 -0
  138. data/ext/cached/ruby-1.9.0/internal/yarv-headers/debug.h +36 -0
  139. data/ext/cached/ruby-1.9.0/internal/yarv-headers/dln.h +41 -0
  140. data/ext/cached/ruby-1.9.0/internal/yarv-headers/encdb.h +147 -0
  141. data/ext/cached/ruby-1.9.0/internal/yarv-headers/eval_intern.h +221 -0
  142. data/ext/cached/ruby-1.9.0/internal/yarv-headers/gc.h +75 -0
  143. data/ext/cached/ruby-1.9.0/internal/yarv-headers/id.h +83 -0
  144. data/ext/cached/ruby-1.9.0/internal/yarv-headers/iseq.h +94 -0
  145. data/ext/cached/ruby-1.9.0/internal/yarv-headers/node.h +516 -0
  146. data/ext/cached/ruby-1.9.0/internal/yarv-headers/parse.h +303 -0
  147. data/ext/cached/ruby-1.9.0/internal/yarv-headers/regenc.h +207 -0
  148. data/ext/cached/ruby-1.9.0/internal/yarv-headers/regint.h +842 -0
  149. data/ext/cached/ruby-1.9.0/internal/yarv-headers/regparse.h +351 -0
  150. data/ext/cached/ruby-1.9.0/internal/yarv-headers/revision.h +1 -0
  151. data/ext/cached/ruby-1.9.0/internal/yarv-headers/thread_pthread.h +24 -0
  152. data/ext/cached/ruby-1.9.0/internal/yarv-headers/thread_win32.h +33 -0
  153. data/ext/cached/ruby-1.9.0/internal/yarv-headers/transcode_data.h +99 -0
  154. data/ext/cached/ruby-1.9.0/internal/yarv-headers/transdb.h +67 -0
  155. data/ext/cached/ruby-1.9.0/internal/yarv-headers/version.h +57 -0
  156. data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_core.h +663 -0
  157. data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_exec.h +187 -0
  158. data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_insnhelper.h +191 -0
  159. data/ext/cached/ruby-1.9.0/internal/yarv-headers/vm_opts.h +51 -0
  160. data/ext/cached/ruby-1.9.1/internal/binding/block.h +12 -0
  161. data/ext/cached/ruby-1.9.1/internal/method/method.h +20 -0
  162. data/ext/cached/ruby-1.9.1/internal/module/classpath.c +42 -0
  163. data/ext/cached/ruby-1.9.1/internal/module/classpath.h +17 -0
  164. data/ext/cached/ruby-1.9.1/internal/node/block.h +12 -0
  165. data/ext/cached/ruby-1.9.1/internal/node/global_entry.h +10 -0
  166. data/ext/cached/ruby-1.9.1/internal/node/node_type_descrip.c +149 -0
  167. data/ext/cached/ruby-1.9.1/internal/node/nodeinfo.c +5579 -0
  168. data/ext/cached/ruby-1.9.1/internal/node/nodeinfo.h +70 -0
  169. data/ext/cached/ruby-1.9.1/internal/proc/block.h +12 -0
  170. data/ext/cached/ruby-1.9.1/internal/tag/tag.h +6 -0
  171. data/ext/cached/ruby-1.9.1/internal/vm/instruction/insns_info.c +5936 -0
  172. data/ext/cached/ruby-1.9.1/internal/vm/instruction/insns_info.h +891 -0
  173. data/ext/cached/ruby-1.9.1/internal/vm/iseq/insns_info.inc +700 -0
  174. data/ext/cached/ruby-1.9.1/internal/yarv-headers/debug.h +36 -0
  175. data/ext/cached/ruby-1.9.1/internal/yarv-headers/dln.h +41 -0
  176. data/ext/cached/ruby-1.9.1/internal/yarv-headers/encdb.h +147 -0
  177. data/ext/cached/ruby-1.9.1/internal/yarv-headers/eval_intern.h +209 -0
  178. data/ext/cached/ruby-1.9.1/internal/yarv-headers/gc.h +75 -0
  179. data/ext/cached/ruby-1.9.1/internal/yarv-headers/id.h +184 -0
  180. data/ext/cached/ruby-1.9.1/internal/yarv-headers/iseq.h +94 -0
  181. data/ext/cached/ruby-1.9.1/internal/yarv-headers/node.h +516 -0
  182. data/ext/cached/ruby-1.9.1/internal/yarv-headers/parse.h +303 -0
  183. data/ext/cached/ruby-1.9.1/internal/yarv-headers/regenc.h +207 -0
  184. data/ext/cached/ruby-1.9.1/internal/yarv-headers/regint.h +842 -0
  185. data/ext/cached/ruby-1.9.1/internal/yarv-headers/regparse.h +351 -0
  186. data/ext/cached/ruby-1.9.1/internal/yarv-headers/revision.h +1 -0
  187. data/ext/cached/ruby-1.9.1/internal/yarv-headers/thread_pthread.h +24 -0
  188. data/ext/cached/ruby-1.9.1/internal/yarv-headers/thread_win32.h +33 -0
  189. data/ext/cached/ruby-1.9.1/internal/yarv-headers/transcode_data.h +99 -0
  190. data/ext/cached/ruby-1.9.1/internal/yarv-headers/transdb.h +85 -0
  191. data/ext/cached/ruby-1.9.1/internal/yarv-headers/version.h +60 -0
  192. data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_core.h +655 -0
  193. data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_exec.h +187 -0
  194. data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_insnhelper.h +194 -0
  195. data/ext/cached/ruby-1.9.1/internal/yarv-headers/vm_opts.h +51 -0
  196. data/ext/internal/binding/binding.c +45 -0
  197. data/ext/internal/binding/block.h.rpp +44 -0
  198. data/ext/internal/binding/extconf.rb +6 -0
  199. data/ext/internal/method/extconf.rb +8 -0
  200. data/ext/internal/method/method.c +269 -0
  201. data/ext/internal/method/method.h.rpp +58 -0
  202. data/ext/internal/module/classpath.c.rpp +29 -0
  203. data/ext/internal/module/classpath.h.rpp +36 -0
  204. data/ext/internal/module/extconf.rb +11 -0
  205. data/ext/internal/module/module.c +797 -0
  206. data/ext/internal/module/module.h +7 -0
  207. data/ext/internal/node/block.h.rpp +44 -0
  208. data/ext/internal/node/builtins.h +41 -0
  209. data/ext/internal/node/extconf.rb +66 -0
  210. data/ext/internal/node/global_entry.h.rpp +26 -0
  211. data/ext/internal/node/node.c +1147 -0
  212. data/ext/internal/node/node_type_descrip.c.rpp +72 -0
  213. data/ext/internal/node/node_type_descrip.h +17 -0
  214. data/ext/internal/node/node_type_descrip.rb +39 -0
  215. data/ext/internal/node/nodeinfo.c.rpp +587 -0
  216. data/ext/internal/node/nodeinfo.h.rpp +30 -0
  217. data/ext/internal/node/nodes.rb +78 -0
  218. data/ext/internal/node/read_node_h.rb +34 -0
  219. data/ext/internal/node/ruby_internal_node.h +31 -0
  220. data/ext/internal/noex/extconf.rb +6 -0
  221. data/ext/internal/noex/noex.c +44 -0
  222. data/ext/internal/object/extconf.rb +4 -0
  223. data/ext/internal/object/object.c +75 -0
  224. data/ext/internal/proc/block.h.rpp +44 -0
  225. data/ext/internal/proc/extconf.rb +9 -0
  226. data/ext/internal/proc/proc.c +331 -0
  227. data/ext/internal/tag/extconf.rb +3 -0
  228. data/ext/internal/tag/tag.c +17 -0
  229. data/ext/internal/tag/tag.h.rpp +22 -0
  230. data/ext/internal/thread/extconf.rb +3 -0
  231. data/ext/internal/thread/thread.c +107 -0
  232. data/ext/internal/vm/constants/constants.c +33 -0
  233. data/ext/internal/vm/constants/extconf.rb +3 -0
  234. data/ext/internal/vm/control_frame/control_frame.c +185 -0
  235. data/ext/internal/vm/control_frame/control_frame.h +18 -0
  236. data/ext/internal/vm/control_frame/extconf.rb +3 -0
  237. data/ext/internal/vm/extconf.rb +3 -0
  238. data/ext/internal/vm/inline_cache/extconf.rb +6 -0
  239. data/ext/internal/vm/inline_cache/inline_cache.c +79 -0
  240. data/ext/internal/vm/instruction/extconf.rb +6 -0
  241. data/ext/internal/vm/instruction/insns_info.c.rpp +213 -0
  242. data/ext/internal/vm/instruction/insns_info.h.rpp +53 -0
  243. data/ext/internal/vm/instruction/instruction.c +78 -0
  244. data/ext/internal/vm/instruction/instruction.h +10 -0
  245. data/ext/internal/vm/iseq/extconf.rb +7 -0
  246. data/ext/internal/vm/iseq/insns_info.inc.rpp +30 -0
  247. data/ext/internal/vm/iseq/internal_iseq.h +9 -0
  248. data/ext/internal/vm/iseq/iseq.c +555 -0
  249. data/ext/internal/vm/vm.c +55 -0
  250. data/ext/mkmf-ruby-internal.rb +111 -0
  251. data/ext/ruby_source_dir.rb +24 -0
  252. data/ext/rubypp.rb +97 -0
  253. data/generate_rdoc.rb +33 -0
  254. data/lib/internal/binding.rb +1 -0
  255. data/lib/internal/classtree.rb +55 -0
  256. data/lib/internal/debug.rb +16 -0
  257. data/lib/internal/method.rb +1 -0
  258. data/lib/internal/method/as_code.rb +33 -0
  259. data/lib/internal/method/as_expression.rb +34 -0
  260. data/lib/internal/method/signature.rb +442 -0
  261. data/lib/internal/module.rb +1 -0
  262. data/lib/internal/module/as_code.rb +45 -0
  263. data/lib/internal/node.rb +3 -0
  264. data/lib/internal/node/as_code.rb +233 -0
  265. data/lib/internal/node/as_expression.rb +619 -0
  266. data/lib/internal/node/dump.rb +53 -0
  267. data/lib/internal/node/pp.rb +72 -0
  268. data/lib/internal/node/to_a.rb +52 -0
  269. data/lib/internal/noex.rb +1 -0
  270. data/lib/internal/obfusc.rb +57 -0
  271. data/lib/internal/object.rb +1 -0
  272. data/lib/internal/object/as_code.rb +10 -0
  273. data/lib/internal/proc.rb +1 -0
  274. data/lib/internal/proc/as_code.rb +21 -0
  275. data/lib/internal/proc/as_expression.rb +14 -0
  276. data/lib/internal/proc/signature.rb +184 -0
  277. data/lib/internal/tag.rb +1 -0
  278. data/lib/internal/thread.rb +1 -0
  279. data/lib/internal/vm.rb +1 -0
  280. data/lib/internal/vm/bytedecoder.rb +866 -0
  281. data/lib/internal/vm/constants.rb +1 -0
  282. data/lib/internal/vm/control_frame.rb +1 -0
  283. data/lib/internal/vm/inline_cache.rb +1 -0
  284. data/lib/internal/vm/instruction.rb +1 -0
  285. data/lib/internal/vm/iseq.rb +1 -0
  286. data/lib/internal/vm/iseq/as_code.rb +27 -0
  287. data/lib/internal/vm/iseq/as_expression.rb +26 -0
  288. data/metaconfig +19 -0
  289. data/post-config.rb +1 -0
  290. data/post-install.rb +4 -0
  291. data/post-setup.rb +7 -0
  292. data/pre-config.rb +96 -0
  293. data/pre-install.rb +13 -0
  294. data/pre-setup.rb +8 -0
  295. data/run_tests.rb +26 -0
  296. data/setup.rb +1599 -0
  297. data/test/expression_samples.rb +160 -0
  298. data/test/node_samples.rb +122 -0
  299. data/test/test_as_code.rb +261 -0
  300. data/test/test_as_expression.rb +229 -0
  301. data/test/test_dump_class.rb +187 -0
  302. data/test/test_dump_method.rb +144 -0
  303. data/test/test_dump_proc.rb +118 -0
  304. data/test/test_helpers.rb +61 -0
  305. data/test/test_method.rb +72 -0
  306. data/test/test_methodsig.rb +267 -0
  307. data/test/test_module.rb +49 -0
  308. data/test/test_node.rb +77 -0
  309. data/test/test_proc.rb +47 -0
  310. metadata +377 -0
@@ -0,0 +1,3 @@
1
+ require 'internal/node/node'
2
+ require 'internal/node/to_a'
3
+ require 'internal/node/pp'
@@ -0,0 +1,233 @@
1
+ require 'internal/node'
2
+ require 'internal/node/as_expression'
3
+ require 'internal/object/as_code'
4
+ require 'rbconfig'
5
+
6
+ class Node
7
+ public
8
+
9
+ def as_code(indent=0, *args)
10
+ return as_code_impl(self, indent, *args)
11
+ end
12
+
13
+ private
14
+
15
+ def as_code_impl(node, indent, *args)
16
+ # default -- most code is just an expression
17
+ expression = node.as_expression(*args)
18
+ if not expression.nil? then
19
+ return "#{' '*indent}#{expression}"
20
+ else
21
+ return nil
22
+ end
23
+ end
24
+
25
+ class << self
26
+ def define_code(klass, &block)
27
+ if const_defined?(klass) then
28
+ const_get(klass).instance_eval { define_method(:as_code_impl, &block) }
29
+ end
30
+ end
31
+ end
32
+
33
+ define_code(:IF) do |node, indent|
34
+ if node.body.class == Node::BLOCK or
35
+ node.else.class == Node::BLOCK then
36
+ s = "#{' '*indent}if #{node.cond.as_expression} then\n"
37
+ s << "#{' '*indent}#{node.body.as_code(indent+1)}\n"
38
+ if node.else then
39
+ s << "#{' '*indent}else\n"
40
+ s << "#{' '*indent}#{node.else.as_code(indent+1)}\n"
41
+ end
42
+ s << "#{' '*indent}end"
43
+ s
44
+ else
45
+ "#{' '*indent}#{node.as_expression}"
46
+ end
47
+ end
48
+
49
+ define_code(:BLOCK) do |node, indent|
50
+ a = node.to_a
51
+ if a[0].class == Node::DASGN_CURR then
52
+ vardefs = a[0]
53
+ while vardefs.class == Node::DASGN_CURR do
54
+ vardefs = vardefs.value
55
+ end
56
+ if not vardefs then
57
+ # ignore variable definitions
58
+ a.shift
59
+ end
60
+ end
61
+ lines = a.map { |n| n.as_code(indent) }
62
+ lines.reject! { |e| e.nil? }
63
+ if lines.size == 0 then
64
+ "#{' '*indent}nil"
65
+ else
66
+ lines.join("\n")
67
+ end
68
+ end
69
+
70
+ define_code(:ITER) do |node, indent|
71
+ "#{' '*indent}#{node.iter.as_expression} {\n" +
72
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
73
+ "#{' '*indent}}"
74
+ end
75
+
76
+ define_code(:WHILE) do |node, indent|
77
+ if node.state == 1 then
78
+ "#{' '*indent}while #{node.cond.as_expression} do\n" +
79
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
80
+ "#{' '*indent}end"
81
+ else
82
+ "#{' '*indent}begin\n" +
83
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
84
+ "#{' '*indent}end while #{node.cond.as_expression}"
85
+ end
86
+ end
87
+
88
+ define_code(:UNTIL) do |node, indent|
89
+ if node.state == 1 then
90
+ "#{' '*indent}until #{node.cond.as_expression} do\n" +
91
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
92
+ "#{' '*indent}end"
93
+ else
94
+ "#{' '*indent}begin\n" +
95
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
96
+ "#{' '*indent}end until #{node.cond.as_expression}"
97
+ end
98
+ end
99
+
100
+ define_code(:BEGIN) do |node, indent|
101
+ if node.body.class == Node::RESCUE or
102
+ node.body.class == Node::ENSURE then
103
+ s = "#{' '*indent}begin\n" +
104
+ "#{node.body.as_code(indent+1, true)}\n" +
105
+ "#{' '*indent}end"
106
+ elsif node.body then
107
+ "#{' '*indent}begin\n" +
108
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
109
+ "#{' '*indent}end"
110
+ else
111
+ "#{' '*indent}begin\n" +
112
+ "#{' '*indent}end\n"
113
+ end
114
+ end
115
+
116
+ def self.begin_end(indent, have_begin)
117
+ s = ''
118
+ if not have_begin then
119
+ s << "#{' '*indent}begin\n"
120
+ indent += 1
121
+ end
122
+ yield s, indent, true
123
+ if not have_begin then
124
+ indent -= 1
125
+ s << "\n#{' '*indent}end"
126
+ end
127
+ return s
128
+ end
129
+
130
+ define_code(:ENSURE) do |node, indent, *args|
131
+ begin_ensure = args[0] || false
132
+ Node.begin_end(indent, begin_ensure) do |s, indent_, begin_ensure|
133
+ if node.head then
134
+ s << "#{node.head.as_code(indent_)}\n"
135
+ end
136
+ s << "#{' '*(indent_-1)}ensure\n"
137
+ s << "#{node.ensr.as_code(indent_)}"
138
+ end
139
+ end
140
+
141
+ define_code(:RESCUE) do |node, indent, *args|
142
+ begin_rescue = args[0] || false
143
+ Node.begin_end(indent, begin_rescue) do |s, indent_, begin_rescue|
144
+ if node.head then
145
+ if begin_rescue then
146
+ s << "#{node.head.as_code(indent_)}\n"
147
+ s << "#{' '*(indent_-1)}rescue #{node.resq.as_code(indent_+1, begin_rescue)}"
148
+ else
149
+ s << "#{node.head.as_expression} rescue #{node.resq.as_expression(begin_rescue)}"
150
+ end
151
+ else
152
+ s << "rescue #{node.resq.as_expression(begin_rescue)}"
153
+ end
154
+ end
155
+ end
156
+
157
+ define_code(:RESBODY) do |node, indent, *args|
158
+ begin_rescue = args[0] || false
159
+ if begin_rescue then
160
+ if node.args then
161
+ a = node.args.to_a.map { |n| n.as_expression }
162
+ "#{a.join(', ')}\n" +
163
+ "#{' '*indent}#{node.body.as_code(indent+1)}"
164
+ else
165
+ node.body ? "\n#{' '*indent}#{node.body.as_code(indent+1)}" : ''
166
+ end
167
+ else
168
+ # TODO: assuming node.args is false...
169
+ node.body ? node.body.as_code : ''
170
+ end
171
+ end
172
+
173
+ define_code(:NEWLINE) do |node, indent|
174
+ node.next.as_code(indent)
175
+ end
176
+
177
+ define_code(:CASE) do |node, indent|
178
+ "#{' '*indent}case #{node.head.as_expression}\n" +
179
+ "#{node.body.as_code(indent)}end"
180
+ end
181
+
182
+ define_code(:WHEN) do |node, indent|
183
+ args = node.head.to_a.map { |n| n.as_expression }
184
+ s = "#{' '*indent}when #{args.join(', ')}\n"
185
+ if node.body then
186
+ s << "#{' '*indent}#{node.body.as_code(indent+1)}; "
187
+ end
188
+ if node.next then
189
+ s << node.next.as_code
190
+ end
191
+ s
192
+ end
193
+
194
+ define_code(:CLASS) do |node, indent|
195
+ s_super = node.super ? " < #{node.super.as_expression}" : ''
196
+ if node.respond_to?(:cpath) then
197
+ path = node.cpath.as_expression
198
+ else
199
+ path = node.cname
200
+ end
201
+ "#{' '*indent}class #{path}#{s_super}\n" +
202
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
203
+ "#{' '*indent}end"
204
+ end
205
+
206
+ define_code(:SCLASS) do |node, indent|
207
+ "#{' '*indent}class << #{node.recv.as_expression}\n" +
208
+ "#{' '*indent}#{node.body.as_code(indent+1)}\n" +
209
+ "#{' '*indent}end"
210
+ end
211
+
212
+ define_code(:DEFN) do |node, indent|
213
+ # TODO: what to do about noex?
214
+ "#{' '*indent}def #{node.mid}\n" +
215
+ "#{' '*indent}#{node.next.as_code(indent+1)}\n" +
216
+ "#{' '*indent}end"
217
+ end
218
+
219
+ define_code(:DEFS) do |node, indent|
220
+ "#{' '*indent}def #{node.recv.as_expression}.#{node.mid}\n" +
221
+ "#{' '*indent}#{node.next.as_code(indent+1)}\n" +
222
+ "#{' '*indent}end"
223
+ end
224
+
225
+ define_code(:SCOPE) do |node, indent|
226
+ case node.next
227
+ when nil then ''
228
+ when Node::ARGS then "#{' '*indent}nil"
229
+ when Node::BLOCK_ARG then "#{' '*indent}nil"
230
+ else node.next.as_code(indent)
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,619 @@
1
+ require 'internal/node'
2
+ require 'internal/node/to_a'
3
+ require 'rbconfig'
4
+
5
+ class Node
6
+ public
7
+
8
+ # Return an string describing this node as a single expression. By
9
+ # default, this just returns the name of the node's type, but some
10
+ # node types override this method to produce more meaningful output.
11
+ def as_expression(*args)
12
+ return as_expression_impl(self, *args)
13
+ end
14
+
15
+ # Return a string as with as_expression, but surround it with parens
16
+ # if it is a composite expression, so that it can be used to form more
17
+ # complex expressions.
18
+ def as_paren_expression(*args)
19
+ expr = self.as_expression(*args)
20
+ if not OMIT_PARENS[self.class] then
21
+ expr = "(#{expr})"
22
+ end
23
+ return expr
24
+ end
25
+
26
+ private
27
+
28
+ # default
29
+ def as_expression_impl(node)
30
+ return "<#{node.nd_type.to_s}>"
31
+ end
32
+
33
+ class << self
34
+ def define_expression(klass, &block)
35
+ if const_defined?(klass) then
36
+ const_get(klass).instance_eval { define_method(:as_expression_impl, &block) }
37
+ end
38
+ end
39
+ end
40
+
41
+ define_expression(:LIT) do |node|
42
+ # TODO: #inspect might not give an eval-able expression
43
+ node.lit.inspect
44
+ end
45
+
46
+ define_expression(:FCALL) do |node|
47
+ # args will either be an ARRAY or ARGSCAT
48
+ args = node.args
49
+ "#{node.mid}(#{args ? args.as_expression(false) : ''})"
50
+ end
51
+
52
+ define_expression(:VCALL) do |node|
53
+ node.mid.to_s
54
+ end
55
+
56
+ arithmetic_expressions = [
57
+ :+, :-, :*, :/, :<, :>, :<=, :>=, :==, :===, :<=>, :<<, :>>, :&, :|,
58
+ :^, :%, '!'.intern, '!='.intern
59
+ ]
60
+
61
+ # TODO: there should be a way to detect if the expressions need to be
62
+ # in parens
63
+ define_expression(:CALL) do |node|
64
+ recv_expr = node.recv.as_paren_expression
65
+
66
+ case node.mid
67
+ when *arithmetic_expressions
68
+ args = node.args
69
+ "#{recv_expr} #{node.mid} #{args ? args.as_paren_expression(false) : ''}"
70
+ when :[]
71
+ args = node.args
72
+ "#{recv_expr}[#{args ? args.as_expression(false) : ''}]"
73
+ else
74
+ args = node.args
75
+ "#{recv_expr}.#{node.mid}(#{args ? args.as_expression(false) : ''})"
76
+ end
77
+ end
78
+
79
+ define_expression(:ZSUPER) do |node|
80
+ "super"
81
+ end
82
+
83
+ define_expression(:SUPER) do |node|
84
+ "super(#{node.args ? node.args.as_expression(false) : ''})"
85
+ end
86
+
87
+ define_expression(:REDO) do |node|
88
+ "redo"
89
+ end
90
+
91
+ define_expression(:RETRY) do |node|
92
+ "retry"
93
+ end
94
+
95
+ define_expression(:NOT) do |node|
96
+ "not #{node.body.as_expression}"
97
+ end
98
+
99
+ define_expression(:AND) do |node|
100
+ "#{node.first.as_expression} and #{node.second.as_expression}"
101
+ end
102
+
103
+ define_expression(:OR) do |node|
104
+ "#{node.first.as_expression} or #{node.second.as_expression}"
105
+ end
106
+
107
+ class ARRAY < Node
108
+ def as_expression_impl(node, brackets = true)
109
+ s = brackets ? '[' : ''
110
+ s << (node.to_a.map { |n| n.as_expression }.join(', '))
111
+ s << (brackets ? ']' : '')
112
+ s
113
+ end
114
+ end
115
+
116
+ class ARGSCAT < Node
117
+ def as_expression_impl(node, brackets = true)
118
+ s = brackets ? '[' : ''
119
+ s << node.head.as_expression(false)
120
+ s << ", "
121
+ s << "*#{node.body.as_expression}"
122
+ s << (brackets ? ']' : '')
123
+ s
124
+ end
125
+ end
126
+
127
+ class ZARRAY < Node
128
+ def as_expression_impl(node, brackets = true)
129
+ brackets ? '[]' : ''
130
+ end
131
+ end
132
+
133
+ class BLOCK < Node
134
+ def as_expression_impl(node)
135
+ a = node.to_a
136
+ if a.size == 1 then
137
+ return 'nil'
138
+ end
139
+ d = a[0]
140
+ while d.class == Node::DASGN_CURR do
141
+ d = d.value
142
+ end
143
+ a.shift if not d
144
+ expressions = a.map { |n| n.as_expression }
145
+ expressions.reject! { |e| e.nil? }
146
+ if expressions.nitems == 0 then
147
+ return 'nil'
148
+ else
149
+ return expressions.join('; ')
150
+ end
151
+ end
152
+ end
153
+
154
+ define_expression(:HASH) do |node|
155
+ if not node.head then
156
+ "{}"
157
+ else
158
+ a = node.head.to_a
159
+ elems = []
160
+ i = 0
161
+ while i < a.size do
162
+ elems << "(#{a[i].as_expression})=>(#{a[i+1].as_expression})"
163
+ i += 2
164
+ end
165
+ "{#{elems.join(', ')}}"
166
+ end
167
+ end
168
+
169
+ define_expression(:IF) do |node|
170
+ if Node.const_defined?(:NEWLINE) then
171
+ bodynode = node.body.class == Node::NEWLINE ? node.body.next : node.body
172
+ elsenode = node.else.class == Node::NEWLINE ? node.else.next : node.else
173
+ else
174
+ bodynode = node.body
175
+ elsenode = node.else
176
+ end
177
+ if elsenode then
178
+ "#{node.cond.as_paren_expression} ? " +
179
+ "#{bodynode.as_paren_expression} : " +
180
+ "#{elsenode.as_paren_expression}"
181
+ else
182
+ "#{bodynode.as_paren_expression} if " +
183
+ "#{node.cond.as_paren_expression}"
184
+ end
185
+ end
186
+
187
+ define_expression(:TRUE) do |node|
188
+ "true"
189
+ end
190
+
191
+ define_expression(:FALSE) do |node|
192
+ "false"
193
+ end
194
+
195
+ define_expression(:NIL) do |node|
196
+ "nil"
197
+ end
198
+
199
+ define_expression(:SELF) do |node|
200
+ "self"
201
+ end
202
+
203
+ define_expression(:DOT2) do |node|
204
+ "#{node.beg.as_paren_expression}..#{node.end.as_paren_expression}"
205
+ end
206
+
207
+ define_expression(:DOT3) do |node|
208
+ "#{node.beg.as_paren_expression}...#{node.end.as_paren_expression}"
209
+ end
210
+
211
+ define_expression(:GVAR) do |node|
212
+ "#{node.vid}"
213
+ end
214
+
215
+ define_expression(:IVAR) do |node|
216
+ "#{node.vid}"
217
+ end
218
+
219
+ define_expression(:CVAR) do |node|
220
+ "#{node.vid}"
221
+ end
222
+
223
+ define_expression(:DVAR) do |node|
224
+ "#{node.vid}"
225
+ end
226
+
227
+ define_expression(:NTH_REF) do |node|
228
+ "$#{node.nth}"
229
+ end
230
+
231
+ define_expression(:BACK_REF) do |node|
232
+ "$`"
233
+ end
234
+
235
+ define_expression(:DASGN_CURR) do |node|
236
+ # node.value is unset for MASGN
237
+ node.value ? "#{node.vid} = #{node.value.as_expression}" : "#{node.vid}"
238
+ end
239
+
240
+ define_expression(:DASGN) do |node|
241
+ "#{node.vid} = #{node.value.as_expression}"
242
+ end
243
+
244
+ define_expression(:IASGN) do |node|
245
+ "#{node.vid} = #{node.value.as_expression}"
246
+ end
247
+
248
+ define_expression(:LASGN) do |node|
249
+ "#{node.vid} = #{node.value.as_expression}"
250
+ end
251
+
252
+ define_expression(:MASGN) do |node|
253
+ lhs = node.head.to_a.map { |n| n.as_expression }
254
+ rhs = node.value.to_a.map { |n| n.as_expression }
255
+ "#{lhs.join(', ')} = #{rhs.join(', ')}"
256
+ end
257
+
258
+ define_expression(:OP_ASGN1) do |node|
259
+ # TODO
260
+ raise "Not implemented"
261
+ end
262
+
263
+ define_expression(:OP_ASGN2) do |node|
264
+ recv = node.recv.as_expression
265
+ attr = node.next.vid # TODO: we assume it's the same as aid
266
+ op = case node.next.mid
267
+ when false then '||'
268
+ when nil then '&&'
269
+ else node.next.mid
270
+ end
271
+ value = node.value.as_expression
272
+ "#{recv}.#{attr} #{op}= #{value}"
273
+ end
274
+
275
+ define_expression(:CDECL) do |node|
276
+ "#{node.vid} = #{node.value.as_expression}"
277
+ end
278
+
279
+ define_expression(:CVDECL) do |node|
280
+ "#{node.vid} = #{node.value.as_expression}"
281
+ end
282
+
283
+ define_expression(:CVASGN) do |node|
284
+ "#{node.vid} = #{node.value.as_expression}"
285
+ end
286
+
287
+ define_expression(:ATTRASGN) do |node|
288
+ case node.mid
289
+ when :[]=
290
+ args = node.args.to_a
291
+ attrs = args[1..-2].map { |n| n.as_expression }
292
+ value = args[-1].as_expression
293
+ "#{node.recv.as_paren_expression}[#{attrs.join(', ')}] = #{value}"
294
+ else
295
+ "#{node.recv.as_paren_expression}.#{node.mid}#{node.args.as_expression(false)}"
296
+ end
297
+ end
298
+
299
+ define_expression(:CONST) do |node|
300
+ "#{node.vid}"
301
+ end
302
+
303
+ define_expression(:COLON2) do |node|
304
+ # TODO: shouldn't COLON2 have args if it's a method?
305
+ if node.head then
306
+ "#{node.head.as_expression}::#{node.mid}"
307
+ else
308
+ node.mid.to_s
309
+ end
310
+ end
311
+
312
+ define_expression(:COLON3) do |node|
313
+ "::#{node.mid}"
314
+ end
315
+
316
+ define_expression(:LVAR) do |node|
317
+ "#{node.vid}"
318
+ end
319
+
320
+ define_expression(:NEWLINE) do |node|
321
+ node.next.as_expression
322
+ end
323
+
324
+ define_expression(:STR) do |node|
325
+ "\"#{node.lit.inspect[1..-2]}\""
326
+ end
327
+
328
+ define_expression(:REGX) do |node|
329
+ # TODO: cflag
330
+ "/#{node.lit.inspect[1..-2]}/"
331
+ end
332
+
333
+ define_expression(:REGX_ONCE) do |node|
334
+ # TODO: cflag
335
+ "/#{node.lit.inspect[1..-2]}/o"
336
+ end
337
+
338
+ define_expression(:XSTR) do |node|
339
+ "`#{node.lit.inspect[1..-2]}`"
340
+ end
341
+
342
+ define_expression(:DSTR) do |node|
343
+ a = node.next.to_a
344
+ s = "\"#{node.lit.inspect[1..-2]}"
345
+ a.each do |elem|
346
+ case elem
347
+ when Node::STR then s += elem.lit
348
+ else s += elem.as_expression
349
+ end
350
+ end
351
+ s += "\""
352
+ s
353
+ end
354
+
355
+ define_expression(:DREGX) do |node|
356
+ a = node.next.to_a
357
+ s = "/#{node.lit.inspect[1..-2]}"
358
+ a.each do |elem|
359
+ case elem
360
+ when Node::STR then s += elem.lit
361
+ else s += elem.as_expression
362
+ end
363
+ end
364
+ s += "/"
365
+ # TODO: cflag
366
+ s
367
+ end
368
+
369
+ define_expression(:DREGX_ONCE) do |node|
370
+ a = node.next.to_a
371
+ s = "/#{node.lit.inspect[1..-2]}"
372
+ a.each do |elem|
373
+ case elem
374
+ when Node::STR then s += elem.lit
375
+ else s += elem.as_expression
376
+ end
377
+ end
378
+ s += "/o"
379
+ # TODO: cflag
380
+ s
381
+ end
382
+
383
+ define_expression(:DXSTR) do |node|
384
+ a = node.next.to_a
385
+ s = "`#{node.lit.inspect[1..-2]}"
386
+ a.each do |elem|
387
+ case elem
388
+ when Node::STR then s += elem.lit
389
+ else s += elem.as_expression
390
+ end
391
+ end
392
+ s += "`"
393
+ s
394
+ end
395
+
396
+ major = Config::CONFIG['MAJOR'].to_i
397
+ minor = Config::CONFIG['MINOR'].to_i
398
+ teeny = Config::CONFIG['TEENY'].to_i
399
+ ruby_version_code = major * 100 + minor * 10 + teeny
400
+
401
+ if ruby_version_code >= 180 then
402
+
403
+ define_expression(:EVSTR) do |node|
404
+ "\#\{#{node.body.as_expression}\}"
405
+ end
406
+
407
+ else
408
+
409
+ define_expression(:EVSTR) do |node|
410
+ "\#\{#{node.lit}\}"
411
+ end
412
+
413
+ end
414
+
415
+ define_expression(:ITER) do |node|
416
+ iter = node.iter.as_expression
417
+ body = node.body ? (node.body.as_expression + " ") : ""
418
+ "#{iter} { #{body} }"
419
+ end
420
+
421
+ define_expression(:WHILE) do |node|
422
+ if node.state == 1 then
423
+ "while #{node.cond.as_expression} do; #{node.body.as_expression}; end"
424
+ else
425
+ "begin; #{node.body.as_expression}; end while #{node.cond.as_expression}"
426
+ end
427
+ end
428
+
429
+ define_expression(:UNTIL) do |node|
430
+ if node.state == 1 then
431
+ "until #{node.cond.as_expression} do; #{node.body.as_expression}; end"
432
+ else
433
+ "begin; #{node.body.as_expression}; end until #{node.cond.as_expression}"
434
+ end
435
+ end
436
+
437
+ define_expression(:BREAK) do |node|
438
+ s = "break"
439
+ if node.stts then
440
+ s += " #{node.stts.as_expression}"
441
+ end
442
+ s
443
+ end
444
+
445
+ define_expression(:RETURN) do |node|
446
+ s = "return"
447
+ if node.stts then
448
+ s += " #{node.stts.as_expression}"
449
+ end
450
+ s
451
+ end
452
+
453
+ define_expression(:YIELD) do |node|
454
+ s = "yield"
455
+ if node.stts then
456
+ s += " #{node.stts.as_expression}"
457
+ end
458
+ s
459
+ end
460
+
461
+ define_expression(:BEGIN) do |node|
462
+ if node.body.class == Node::RESCUE or
463
+ node.body.class == Node::ENSURE then
464
+ "begin; #{node.body.as_expression(true)}; end"
465
+ elsif node.body then
466
+ "begin; #{node.body.as_expression}; end"
467
+ else
468
+ "begin; end"
469
+ end
470
+ end
471
+
472
+ define_expression(:ENSURE) do |node, *args|
473
+ begin_ensure = args[0] || false
474
+ if node.head then
475
+ if begin_ensure then
476
+ "#{node.head.as_expression} ensure #{node.ensr.as_expression}"
477
+ else
478
+ "begin; #{node.head.as_expression} ensure #{node.ensr.as_expression}; end"
479
+ end
480
+ else
481
+ if begin_ensure then
482
+ "ensure #{node.ensr.as_expression}"
483
+ else
484
+ "begin; ensure #{node.ensr.as_expression}; end"
485
+ end
486
+ end
487
+ end
488
+
489
+ define_expression(:RESCUE) do |node, *args|
490
+ begin_rescue = args[0] || false
491
+ if node.head then
492
+ if begin_rescue then
493
+ "#{node.head.as_expression}; rescue #{node.resq.as_expression(begin_rescue)}"
494
+ else
495
+ if not node.resq or not node.resq.body then
496
+ "begin; #{node.head.as_expression}; rescue; end"
497
+ else
498
+ "#{node.head.as_paren_expression} rescue #{node.resq.as_expression(begin_rescue)}"
499
+ end
500
+ end
501
+ else
502
+ if not node.resq or not node.resq.body then
503
+ "begin; rescue; end"
504
+ else
505
+ "rescue #{node.resq.as_expression(begin_rescue)}"
506
+ end
507
+ end
508
+ end
509
+
510
+ define_expression(:RESBODY) do |node, *args|
511
+ begin_rescue = args[0] || false
512
+ if begin_rescue then
513
+ if node.args then
514
+ a = node.args.to_a.map { |n| n.as_expression }
515
+ "#{a.join(', ')}; #{node.resq.as_expression}"
516
+ else
517
+ node.body ? "; #{node.body.as_expression}" : ''
518
+ end
519
+ else
520
+ # TODO: assuming node.args is false...
521
+ node.body ? node.body.as_expression : ''
522
+ end
523
+ end
524
+
525
+ define_expression(:CASE) do |node|
526
+ "case #{node.head.as_expression}; #{node.body.as_expression}end"
527
+ end
528
+
529
+ define_expression(:WHEN) do |node|
530
+ args = node.head.to_a.map { |n| n.as_expression }
531
+ s = ''
532
+ if node.body then
533
+ s = "when #{args.join(', ')} then #{node.body.as_expression}; "
534
+ else
535
+ s = "when #{args.join(', ')}; "
536
+ end
537
+ if node.next then
538
+ s += node.next.as_expression
539
+ end
540
+ s
541
+ end
542
+
543
+ define_expression(:ALIAS) do |node|
544
+ "alias #{node.new} #{node.old}"
545
+ end
546
+
547
+ define_expression(:VALIAS) do |node|
548
+ "alias #{node.new} #{node.old}"
549
+ end
550
+
551
+ define_expression(:UNDEF) do |node|
552
+ if defined? node.mid then
553
+ # < 1.8.5
554
+ "undef #{node.mid}"
555
+ else
556
+ # >= 1.8.5
557
+ "undef #{node.body.as_expression}"
558
+ end
559
+ end
560
+
561
+ define_expression(:CLASS) do |node|
562
+ s_super = node.super ? " < #{node.super.as_expression}" : ''
563
+ if node.respond_to?(:cpath) then
564
+ path = node.cpath.as_expression
565
+ else
566
+ path = node.cname
567
+ end
568
+ "class #{path}#{s_super}; #{node.body.as_expression}; end"
569
+ end
570
+
571
+ define_expression(:SCLASS) do |node|
572
+ "class << #{node.recv.as_expression}; #{node.body.as_expression}; end"
573
+ end
574
+
575
+ define_expression(:SCOPE) do |node|
576
+ case node.next
577
+ when nil then ''
578
+ when Node::ARGS then 'nil'
579
+ when Node::BLOCK_ARG then 'nil'
580
+ else node.next.as_expression
581
+ end
582
+ end
583
+
584
+ define_expression(:DEFN) do |node|
585
+ # TODO: what to do about noex?
586
+ "def #{node.mid}; #{node.next.as_expression}; end"
587
+ end
588
+
589
+ define_expression(:DEFS) do |node|
590
+ "def #{node.recv.as_expression}.#{node.mid}; #{node.next.as_expression}; end"
591
+ end
592
+
593
+ define_expression(:DEFINED) do |node|
594
+ "defined?(#{node.head.as_expression})"
595
+ end
596
+
597
+ define_expression(:ARGS) do |node|
598
+ nil
599
+ end
600
+
601
+ define_expression(:BLOCK_ARG) do |node|
602
+ nil
603
+ end
604
+
605
+ # TODO: MATCH3
606
+
607
+ OMIT_PARENS = {
608
+ LVAR => true,
609
+ GVAR => true,
610
+ IVAR => true,
611
+ CVAR => true,
612
+ DVAR => true,
613
+ LIT => true,
614
+ ARRAY => true,
615
+ ZARRAY => true,
616
+ HASH => true,
617
+ }
618
+ end
619
+