ruby-internal 0.6.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 (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,442 @@
1
+ require 'internal/method'
2
+ require 'internal/node'
3
+ require 'internal/node/as_expression'
4
+
5
+ if defined?(RubyVM) then
6
+ require 'internal/vm/bytedecoder'
7
+ end
8
+
9
+ module MethodSig
10
+ class Argument
11
+ attr_reader :name
12
+
13
+ def required?
14
+ return !optional?
15
+ end
16
+
17
+ def optional?
18
+ return rest? || block?
19
+ end
20
+
21
+ def rest?
22
+ return @is_rest
23
+ end
24
+
25
+ def block?
26
+ return @is_block
27
+ end
28
+
29
+ def default
30
+ return nil
31
+ end
32
+
33
+ def initialize(name, is_rest, is_block)
34
+ @name = name
35
+ @is_rest = is_rest
36
+ @is_block = is_block
37
+ end
38
+
39
+ def to_s
40
+ if @is_rest then
41
+ prefix = "*"
42
+ elsif @is_block then
43
+ prefix = "&"
44
+ end
45
+
46
+ if self.default then
47
+ suffix = "=#{default()}"
48
+ end
49
+
50
+ return "#{prefix}#{@name}#{suffix}"
51
+ end
52
+ end
53
+
54
+ class OptionalArgument < Argument
55
+ def optional?
56
+ return true
57
+ end
58
+ end
59
+
60
+ class NodeOptionalArgument < OptionalArgument
61
+ attr_reader :node_for_default
62
+ attr_reader :default
63
+
64
+ def initialize(name, default, node_for_default, is_rest, is_block)
65
+ super(name, is_rest, is_block)
66
+ @default = default
67
+ @node_for_default = node_for_default
68
+ end
69
+ end
70
+
71
+ class YarvOptionalArgument < OptionalArgument
72
+ attr_reader :iseq
73
+ attr_reader :pc_start
74
+ attr_reader :local_idx
75
+
76
+ def initialize(name, iseq, pc_start, local_idx, is_rest, is_block)
77
+ super(name, is_rest, is_block)
78
+ @iseq = iseq
79
+ @pc_start = pc_start
80
+ @local_idx = local_idx
81
+ @default = nil
82
+ end
83
+
84
+ def inspect
85
+ default()
86
+ super
87
+ end
88
+
89
+ def default
90
+ return @default if @default
91
+
92
+ env = Nodewrap::ByteDecoder::Environment.new(@iseq.local_table())
93
+ local_table_idx = local_table_idx()
94
+ @iseq.bytedecode(env, @pc_start) do |instr|
95
+ RubyVM::Instruction::SETLOCAL === instr &&
96
+ instr.operands[0] == local_table_idx
97
+ end
98
+ expressions = env.expressions + env.stack
99
+
100
+ @default = expressions[0].rhs.to_s
101
+ return @default
102
+ end
103
+
104
+ def local_table_idx
105
+ return @iseq.local_table.size - @local_idx + 1
106
+ end
107
+ end
108
+
109
+ def local_vars
110
+ return self.body.local_vars
111
+ end
112
+
113
+ # Return the names of the arguments this method takes, in the order in
114
+ # which they appear in the argument list.
115
+ def argument_names
116
+ return self.body.argument_names
117
+ end
118
+
119
+ def args_node
120
+ return self.body.args_node
121
+ end
122
+ private :args_node
123
+
124
+ # If this method has a "rest" argument, that is, it has an argument
125
+ # that is preceded by an asterisk (*) in the argument list, then
126
+ # return its index, otherwise return nil.
127
+ def rest_arg
128
+ return self.body.rest_arg
129
+ end
130
+
131
+ # If this method has a "block" argument, that is, it has an argument
132
+ # that is preceded by an ampersand (&) in the argument list, then
133
+ # return its index, otherwise return nil.
134
+ def block_arg
135
+ return self.body.block_arg
136
+ end
137
+
138
+ def set_optional_args(args, args_node, names)
139
+ self.body.set_optional_args(args, args_node, names)
140
+ end
141
+ private :set_optional_args
142
+
143
+ # Return a hash mapping each argument name to a description of that
144
+ # argument.
145
+ def arguments
146
+ names = self.argument_names()
147
+ block_arg = self.block_arg()
148
+
149
+ args = {}
150
+ names.each do |name|
151
+ args[name] = Argument.new(name, false, false)
152
+ end
153
+
154
+ # Optional args
155
+ args_node = args_node()
156
+ set_optional_args(args, args_node, names)
157
+
158
+ # Rest arg
159
+ if self.rest_arg then
160
+ rest_name = names[rest_arg]
161
+ args[rest_name] = Argument.new(rest_name, true, false)
162
+ end
163
+
164
+ # Block arg
165
+ if block_arg then
166
+ block_name = names[block_arg]
167
+ args[block_name] = Argument.new(block_name, false, true)
168
+ end
169
+
170
+ return args
171
+ end
172
+
173
+ # An abstraction for a method signature.
174
+ class Signature
175
+ attr_reader :origin_class, :name, :arg_names, :args
176
+
177
+ def initialize(origin_class, name, arg_names, args)
178
+ @origin_class = origin_class
179
+ @name = name
180
+ @arg_names = arg_names
181
+ @args = args
182
+ end
183
+
184
+ def to_s
185
+ return "#{@origin_class}\##{@name}(#{param_list})"
186
+ end
187
+
188
+ def param_list
189
+ params = @arg_names.map{ |n| args[n].to_s }
190
+ return params.join(', ')
191
+ end
192
+ end
193
+
194
+ # An abstraction for a method origin.
195
+ class Origin
196
+ attr_reader :file, :line
197
+
198
+ def initialize(file, line)
199
+ @file = file
200
+ @line = line
201
+ end
202
+
203
+ def to_s
204
+ return "#{file}:#{line}"
205
+ end
206
+ end
207
+
208
+ # Return a Method::Origin representing where the method was defined.
209
+ def origin
210
+ block = body().next
211
+ return Origin.new(block.nd_file, block.nd_line)
212
+ end
213
+ end
214
+
215
+ class Method
216
+ include MethodSig
217
+
218
+ # Return a String representing the method's signature.
219
+ def signature
220
+ return Signature.new(
221
+ attached_class(),
222
+ method_oid().to_s,
223
+ argument_names(),
224
+ arguments())
225
+ end
226
+ end
227
+
228
+ class UnboundMethod
229
+ include MethodSig
230
+
231
+ # Return a String representing the method's signature.
232
+ def signature
233
+ return Signature.new(
234
+ origin_class(),
235
+ method_oid().to_s,
236
+ argument_names(),
237
+ arguments())
238
+ end
239
+ end
240
+
241
+ class Node
242
+ # pre-YARV
243
+ class SCOPE
244
+ include MethodSig
245
+
246
+ def local_vars
247
+ return self.tbl || []
248
+ end
249
+
250
+ def argument_names
251
+ local_vars = self.local_vars
252
+ args = self.args_node
253
+ num_required_args = args.cnt
254
+ num_optional_args = 0
255
+ opt = args.opt
256
+ while opt do
257
+ num_optional_args += 1
258
+ opt = opt.next
259
+ end
260
+ num_args = \
261
+ num_required_args + \
262
+ num_optional_args + \
263
+ (rest_arg ? 1 : 0) + \
264
+ (block_arg ? 1 : 0)
265
+ return local_vars[0...num_args]
266
+ end
267
+
268
+ def args_node
269
+ if self.next.class == Node::ARGS then
270
+ return self.next
271
+ elsif self.next.head.class == Node::ARGS then
272
+ return self.next.head
273
+ else
274
+ raise "Could not find method arguments"
275
+ end
276
+ end
277
+
278
+ def rest_arg
279
+ args_node = args_node()
280
+ rest = args_node.rest()
281
+ if rest.class == Node::LASGN then
282
+ # subtract 2 to account for implicit vars
283
+ return rest.cnt - 2
284
+ elsif not rest
285
+ return nil
286
+ else
287
+ return rest > 0 ? rest - 2 : nil
288
+ end
289
+ end
290
+
291
+ def block_arg
292
+ block = self.next
293
+ if block.class == Node::BLOCK and
294
+ block.next.head.class == Node::BLOCK_ARG then
295
+ # subtract 2 to account for implicit vars
296
+ return block.next.head.cnt - 2
297
+ else
298
+ return nil
299
+ end
300
+ end
301
+
302
+ def set_optional_args(args, args_node, names)
303
+ opt = args_node.opt
304
+ while opt do
305
+ head = opt.head
306
+ if head.class == Node::LASGN then
307
+ args[head.vid] = NodeOptionalArgument.new(
308
+ head.vid, head.value.as_expression, head.value, false, false)
309
+ else
310
+ raise "Unexpected node type: #{opt.class}"
311
+ end
312
+ opt = opt.next
313
+ end
314
+ end
315
+ end
316
+
317
+ # Pre-YARV, I think
318
+ class BMETHOD
319
+ def local_vars
320
+ raise "TODO: Not implemented yet"
321
+ end
322
+
323
+ def argument_names
324
+ return self.cval.arguments.names
325
+ end
326
+
327
+ def arguments
328
+ return self.cval.arguments
329
+ end
330
+
331
+ def args_node
332
+ raise "TODO: Not implemented yet"
333
+ end
334
+
335
+ def rest_arg
336
+ raise "TODO: Not implemented yet"
337
+ end
338
+
339
+ def block_arg
340
+ raise "TODO: Not implemented yet"
341
+ end
342
+
343
+ def set_optional_args(args, args_node, names)
344
+ raise "TODO: Not implemented yet"
345
+ end
346
+ end
347
+
348
+ # YARV
349
+ class METHOD
350
+ include MethodSig
351
+
352
+ def local_vars
353
+ iseq = self.body
354
+ local_vars = iseq.local_table
355
+ return local_vars
356
+ end
357
+
358
+ def argument_names
359
+ local_vars = self.local_vars
360
+ iseq = self.body
361
+ opt_args = iseq.arg_opt_table
362
+ opt_args.pop # last arg is a pointer to the start of the code
363
+ num_args = \
364
+ iseq.argc + \
365
+ opt_args.size + \
366
+ (rest_arg ? 1 : 0) + \
367
+ (block_arg ? 1 : 0)
368
+ return local_vars[0...num_args]
369
+ end
370
+
371
+ def args_node
372
+ return nil
373
+ end
374
+
375
+ def rest_arg
376
+ arg_rest = self.body.arg_rest
377
+ return arg_rest >= 0 ? arg_rest : nil
378
+ end
379
+
380
+ def block_arg
381
+ arg_block = self.body.arg_block
382
+ return arg_block >= 0 ? arg_block : nil
383
+ end
384
+
385
+ def set_optional_args(args, args_node, names)
386
+ opt_table = self.body.arg_opt_table
387
+ opt_table.pop
388
+ first_opt_idx =
389
+ names.size -
390
+ opt_table.size -
391
+ (self.rest_arg ? 1 : 0) -
392
+ (self.block_arg ? 1 : 0)
393
+ opt_table.each_with_index do |pc, idx|
394
+ name = names[first_opt_idx + idx]
395
+ args[name] = YarvOptionalArgument.new(name, self.body, pc, idx, false, false)
396
+ end
397
+ end
398
+ end
399
+ end
400
+
401
+ if __FILE__ == $0 then
402
+ def foo(); end
403
+ puts method(:foo).signature
404
+
405
+ def foo(foo); end
406
+ puts method(:foo).signature
407
+
408
+ def foo(foo, bar); end
409
+ puts method(:foo).signature
410
+
411
+ def foo(foo=42, bar=10); end
412
+ puts method(:foo).signature
413
+
414
+ def foo(*args); end
415
+ puts method(:foo).signature
416
+
417
+ def foo(foo, bar=42, *args, &block); end
418
+ puts method(:foo).signature
419
+ puts method(:foo).origin
420
+
421
+ def foo(foo, bar=obj.foo(1, 2, foo(10)), *args, &block); end
422
+ puts method(:foo).signature
423
+
424
+ def foo(foo, bar=obj.foo(1 + 1), *args, &block); end
425
+ puts method(:foo).signature
426
+
427
+ def foo(foo, bar=true ? false : 0, *args, &block); end
428
+ puts method(:foo).signature
429
+
430
+ def foo(foo, bar=true, *args, &block); end
431
+ puts method(:foo).signature
432
+
433
+ def foo(foo, bar=nil, *args, &block); end
434
+ puts method(:foo).signature
435
+
436
+ def foo(foo, bar={1=>2}, *args, &block); end
437
+ puts method(:foo).signature
438
+
439
+ def foo(foo, bar=[1,2], *args, &block); end
440
+ puts method(:foo).signature
441
+ end
442
+
@@ -0,0 +1 @@
1
+ require 'internal/module/module'
@@ -0,0 +1,45 @@
1
+ require 'internal/node/as_code'
2
+ require 'internal/module'
3
+
4
+ class Module
5
+ # TODO: it would be nice if we could go back and find the AST
6
+ # for the class instead of recreating the code from the class's
7
+ # current state.
8
+ def as_code(indent=0)
9
+ imethods = self.instance_methods - self.superclass.instance_methods
10
+ cmethods = self.instance_methods - self.superclass.instance_methods
11
+ constants = self.constants - self.superclass.constants
12
+ name = self.name.gsub(/.*::/, '')
13
+
14
+ # TODO: included modules?
15
+ if self.class == Class then
16
+ s = "#{' '*indent}class #{name} < #{self.superclass}\n"
17
+ else
18
+ s = "#{' '*indent}module #{name}\n"
19
+ end
20
+
21
+ constants.each do |constant|
22
+ s += "#{' '*indent} #{constant}=#{self.const_get(constant).as_code}\n"
23
+ end
24
+
25
+ # TODO: protected/private
26
+ imethods.each do |method|
27
+ s += self.instance_method(method).as_code(indent+1)
28
+ s += "\n"
29
+ end
30
+
31
+ cmethods.each do |method|
32
+ s += self.instance_method(method).as_code(indent+1, "self.#{method}")
33
+ s += "\n"
34
+ end
35
+
36
+ # TODO: singleton class constants
37
+ # TODO: class variables
38
+ # TODO: singleton instance variables
39
+
40
+ s += "#{' '*indent}end"
41
+
42
+ return s
43
+ end
44
+ end
45
+