johnson 1.1.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 (371) hide show
  1. data/.autotest +14 -0
  2. data/CHANGELOG.rdoc +11 -0
  3. data/Manifest.txt +370 -0
  4. data/README.rdoc +60 -0
  5. data/Rakefile +42 -0
  6. data/bin/johnson +108 -0
  7. data/docs/MINGW32.mk +124 -0
  8. data/docs/cross-compile.txt +38 -0
  9. data/ext/spidermonkey/context.c +115 -0
  10. data/ext/spidermonkey/context.h +19 -0
  11. data/ext/spidermonkey/conversions.c +320 -0
  12. data/ext/spidermonkey/conversions.h +18 -0
  13. data/ext/spidermonkey/debugger.c +226 -0
  14. data/ext/spidermonkey/debugger.h +9 -0
  15. data/ext/spidermonkey/extconf.rb +30 -0
  16. data/ext/spidermonkey/extensions.c +37 -0
  17. data/ext/spidermonkey/extensions.h +12 -0
  18. data/ext/spidermonkey/global.c +40 -0
  19. data/ext/spidermonkey/global.h +11 -0
  20. data/ext/spidermonkey/idhash.c +16 -0
  21. data/ext/spidermonkey/idhash.h +8 -0
  22. data/ext/spidermonkey/immutable_node.c +1153 -0
  23. data/ext/spidermonkey/immutable_node.c.erb +523 -0
  24. data/ext/spidermonkey/immutable_node.h +22 -0
  25. data/ext/spidermonkey/jroot.h +187 -0
  26. data/ext/spidermonkey/js_land_proxy.c +610 -0
  27. data/ext/spidermonkey/js_land_proxy.h +20 -0
  28. data/ext/spidermonkey/ruby_land_proxy.c +543 -0
  29. data/ext/spidermonkey/ruby_land_proxy.h +17 -0
  30. data/ext/spidermonkey/runtime.c +330 -0
  31. data/ext/spidermonkey/runtime.h +25 -0
  32. data/ext/spidermonkey/spidermonkey.c +20 -0
  33. data/ext/spidermonkey/spidermonkey.h +29 -0
  34. data/johnson.gemspec +44 -0
  35. data/js/johnson/cli.js +30 -0
  36. data/js/johnson/prelude.js +80 -0
  37. data/lib/johnson.rb +55 -0
  38. data/lib/johnson/cli.rb +7 -0
  39. data/lib/johnson/cli/options.rb +67 -0
  40. data/lib/johnson/error.rb +4 -0
  41. data/lib/johnson/nodes.rb +7 -0
  42. data/lib/johnson/nodes/binary_node.rb +65 -0
  43. data/lib/johnson/nodes/for.rb +14 -0
  44. data/lib/johnson/nodes/for_in.rb +12 -0
  45. data/lib/johnson/nodes/function.rb +13 -0
  46. data/lib/johnson/nodes/list.rb +28 -0
  47. data/lib/johnson/nodes/node.rb +68 -0
  48. data/lib/johnson/nodes/ternary_node.rb +20 -0
  49. data/lib/johnson/parser.rb +21 -0
  50. data/lib/johnson/parser/syntax_error.rb +13 -0
  51. data/lib/johnson/runtime.rb +63 -0
  52. data/lib/johnson/spidermonkey/context.rb +10 -0
  53. data/lib/johnson/spidermonkey/debugger.rb +67 -0
  54. data/lib/johnson/spidermonkey/immutable_node.rb +282 -0
  55. data/lib/johnson/spidermonkey/js_land_proxy.rb +62 -0
  56. data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +242 -0
  57. data/lib/johnson/spidermonkey/ruby_land_proxy.rb +54 -0
  58. data/lib/johnson/spidermonkey/runtime.rb +103 -0
  59. data/lib/johnson/version.rb +3 -0
  60. data/lib/johnson/visitable.rb +16 -0
  61. data/lib/johnson/visitors.rb +5 -0
  62. data/lib/johnson/visitors/dot_visitor.rb +169 -0
  63. data/lib/johnson/visitors/ecma_visitor.rb +323 -0
  64. data/lib/johnson/visitors/enumerating_visitor.rb +15 -0
  65. data/lib/johnson/visitors/sexp_visitor.rb +174 -0
  66. data/lib/johnson/visitors/visitor.rb +91 -0
  67. data/lib/rails/init.rb +37 -0
  68. data/lib/tasks/gem.rake +9 -0
  69. data/lib/tasks/parsing.rake +37 -0
  70. data/lib/tasks/testing.rake +36 -0
  71. data/lib/tasks/vendor.rake +20 -0
  72. data/test/helper.rb +55 -0
  73. data/test/johnson/browser_test.rb +43 -0
  74. data/test/johnson/conversions/array_test.rb +32 -0
  75. data/test/johnson/conversions/boolean_test.rb +17 -0
  76. data/test/johnson/conversions/callable_test.rb +34 -0
  77. data/test/johnson/conversions/file_test.rb +15 -0
  78. data/test/johnson/conversions/nil_test.rb +20 -0
  79. data/test/johnson/conversions/number_test.rb +34 -0
  80. data/test/johnson/conversions/regexp_test.rb +24 -0
  81. data/test/johnson/conversions/string_test.rb +26 -0
  82. data/test/johnson/conversions/struct_test.rb +15 -0
  83. data/test/johnson/conversions/symbol_test.rb +19 -0
  84. data/test/johnson/conversions/thread_test.rb +24 -0
  85. data/test/johnson/error_test.rb +9 -0
  86. data/test/johnson/extensions_test.rb +56 -0
  87. data/test/johnson/nodes/array_literal_test.rb +57 -0
  88. data/test/johnson/nodes/array_node_test.rb +26 -0
  89. data/test/johnson/nodes/binary_node_test.rb +61 -0
  90. data/test/johnson/nodes/bracket_access_test.rb +16 -0
  91. data/test/johnson/nodes/delete_test.rb +11 -0
  92. data/test/johnson/nodes/do_while_test.rb +12 -0
  93. data/test/johnson/nodes/dot_accessor_test.rb +15 -0
  94. data/test/johnson/nodes/export_test.rb +9 -0
  95. data/test/johnson/nodes/for_test.rb +54 -0
  96. data/test/johnson/nodes/function_test.rb +71 -0
  97. data/test/johnson/nodes/if_test.rb +41 -0
  98. data/test/johnson/nodes/import_test.rb +13 -0
  99. data/test/johnson/nodes/label_test.rb +19 -0
  100. data/test/johnson/nodes/let_test.rb +31 -0
  101. data/test/johnson/nodes/object_literal_test.rb +110 -0
  102. data/test/johnson/nodes/return_test.rb +16 -0
  103. data/test/johnson/nodes/semi_test.rb +8 -0
  104. data/test/johnson/nodes/switch_test.rb +55 -0
  105. data/test/johnson/nodes/ternary_test.rb +25 -0
  106. data/test/johnson/nodes/throw_test.rb +9 -0
  107. data/test/johnson/nodes/try_node_test.rb +59 -0
  108. data/test/johnson/nodes/typeof_test.rb +11 -0
  109. data/test/johnson/nodes/unary_node_test.rb +23 -0
  110. data/test/johnson/nodes/void_test.rb +11 -0
  111. data/test/johnson/nodes/while_test.rb +26 -0
  112. data/test/johnson/nodes/with_test.rb +10 -0
  113. data/test/johnson/prelude_test.rb +56 -0
  114. data/test/johnson/runtime_test.rb +64 -0
  115. data/test/johnson/spidermonkey/context_test.rb +21 -0
  116. data/test/johnson/spidermonkey/immutable_node_test.rb +34 -0
  117. data/test/johnson/spidermonkey/js_land_proxy_test.rb +236 -0
  118. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +240 -0
  119. data/test/johnson/spidermonkey/runtime_test.rb +17 -0
  120. data/test/johnson/version_test.rb +13 -0
  121. data/test/johnson/visitors/dot_visitor_test.rb +39 -0
  122. data/test/johnson/visitors/enumerating_visitor_test.rb +12 -0
  123. data/test/johnson_test.rb +16 -0
  124. data/test/parser_test.rb +276 -0
  125. data/vendor/spidermonkey/.cvsignore +9 -0
  126. data/vendor/spidermonkey/Makefile.in +449 -0
  127. data/vendor/spidermonkey/Makefile.ref +365 -0
  128. data/vendor/spidermonkey/README.html +820 -0
  129. data/vendor/spidermonkey/SpiderMonkey.rsp +12 -0
  130. data/vendor/spidermonkey/Y.js +19 -0
  131. data/vendor/spidermonkey/build.mk +43 -0
  132. data/vendor/spidermonkey/config.mk +192 -0
  133. data/vendor/spidermonkey/config/AIX4.1.mk +65 -0
  134. data/vendor/spidermonkey/config/AIX4.2.mk +64 -0
  135. data/vendor/spidermonkey/config/AIX4.3.mk +65 -0
  136. data/vendor/spidermonkey/config/Darwin.mk +83 -0
  137. data/vendor/spidermonkey/config/Darwin1.3.mk +81 -0
  138. data/vendor/spidermonkey/config/Darwin1.4.mk +41 -0
  139. data/vendor/spidermonkey/config/Darwin5.2.mk +81 -0
  140. data/vendor/spidermonkey/config/Darwin5.3.mk +81 -0
  141. data/vendor/spidermonkey/config/HP-UXB.10.10.mk +77 -0
  142. data/vendor/spidermonkey/config/HP-UXB.10.20.mk +77 -0
  143. data/vendor/spidermonkey/config/HP-UXB.11.00.mk +80 -0
  144. data/vendor/spidermonkey/config/IRIX.mk +87 -0
  145. data/vendor/spidermonkey/config/IRIX5.3.mk +44 -0
  146. data/vendor/spidermonkey/config/IRIX6.1.mk +44 -0
  147. data/vendor/spidermonkey/config/IRIX6.2.mk +44 -0
  148. data/vendor/spidermonkey/config/IRIX6.3.mk +44 -0
  149. data/vendor/spidermonkey/config/IRIX6.5.mk +44 -0
  150. data/vendor/spidermonkey/config/Linux_All.mk +103 -0
  151. data/vendor/spidermonkey/config/Mac_OS10.0.mk +82 -0
  152. data/vendor/spidermonkey/config/OSF1V4.0.mk +72 -0
  153. data/vendor/spidermonkey/config/OSF1V5.0.mk +69 -0
  154. data/vendor/spidermonkey/config/SunOS4.1.4.mk +101 -0
  155. data/vendor/spidermonkey/config/SunOS5.10.mk +50 -0
  156. data/vendor/spidermonkey/config/SunOS5.3.mk +91 -0
  157. data/vendor/spidermonkey/config/SunOS5.4.mk +92 -0
  158. data/vendor/spidermonkey/config/SunOS5.5.1.mk +44 -0
  159. data/vendor/spidermonkey/config/SunOS5.5.mk +87 -0
  160. data/vendor/spidermonkey/config/SunOS5.6.mk +89 -0
  161. data/vendor/spidermonkey/config/SunOS5.7.mk +44 -0
  162. data/vendor/spidermonkey/config/SunOS5.8.mk +44 -0
  163. data/vendor/spidermonkey/config/SunOS5.9.mk +44 -0
  164. data/vendor/spidermonkey/config/WINNT4.0.mk +117 -0
  165. data/vendor/spidermonkey/config/WINNT5.0.mk +117 -0
  166. data/vendor/spidermonkey/config/WINNT5.1.mk +117 -0
  167. data/vendor/spidermonkey/config/WINNT5.2.mk +117 -0
  168. data/vendor/spidermonkey/config/WINNT6.0.mk +117 -0
  169. data/vendor/spidermonkey/config/dgux.mk +64 -0
  170. data/vendor/spidermonkey/editline/Makefile.ref +144 -0
  171. data/vendor/spidermonkey/editline/README +83 -0
  172. data/vendor/spidermonkey/editline/editline.3 +175 -0
  173. data/vendor/spidermonkey/editline/editline.c +1369 -0
  174. data/vendor/spidermonkey/editline/editline.h +135 -0
  175. data/vendor/spidermonkey/editline/sysunix.c +182 -0
  176. data/vendor/spidermonkey/editline/unix.h +82 -0
  177. data/vendor/spidermonkey/fdlibm/.cvsignore +7 -0
  178. data/vendor/spidermonkey/fdlibm/Makefile.in +127 -0
  179. data/vendor/spidermonkey/fdlibm/Makefile.ref +192 -0
  180. data/vendor/spidermonkey/fdlibm/e_acos.c +147 -0
  181. data/vendor/spidermonkey/fdlibm/e_acosh.c +105 -0
  182. data/vendor/spidermonkey/fdlibm/e_asin.c +156 -0
  183. data/vendor/spidermonkey/fdlibm/e_atan2.c +165 -0
  184. data/vendor/spidermonkey/fdlibm/e_atanh.c +110 -0
  185. data/vendor/spidermonkey/fdlibm/e_cosh.c +133 -0
  186. data/vendor/spidermonkey/fdlibm/e_exp.c +202 -0
  187. data/vendor/spidermonkey/fdlibm/e_fmod.c +184 -0
  188. data/vendor/spidermonkey/fdlibm/e_gamma.c +71 -0
  189. data/vendor/spidermonkey/fdlibm/e_gamma_r.c +70 -0
  190. data/vendor/spidermonkey/fdlibm/e_hypot.c +173 -0
  191. data/vendor/spidermonkey/fdlibm/e_j0.c +524 -0
  192. data/vendor/spidermonkey/fdlibm/e_j1.c +523 -0
  193. data/vendor/spidermonkey/fdlibm/e_jn.c +315 -0
  194. data/vendor/spidermonkey/fdlibm/e_lgamma.c +71 -0
  195. data/vendor/spidermonkey/fdlibm/e_lgamma_r.c +347 -0
  196. data/vendor/spidermonkey/fdlibm/e_log.c +184 -0
  197. data/vendor/spidermonkey/fdlibm/e_log10.c +134 -0
  198. data/vendor/spidermonkey/fdlibm/e_pow.c +386 -0
  199. data/vendor/spidermonkey/fdlibm/e_rem_pio2.c +222 -0
  200. data/vendor/spidermonkey/fdlibm/e_remainder.c +120 -0
  201. data/vendor/spidermonkey/fdlibm/e_scalb.c +89 -0
  202. data/vendor/spidermonkey/fdlibm/e_sinh.c +122 -0
  203. data/vendor/spidermonkey/fdlibm/e_sqrt.c +497 -0
  204. data/vendor/spidermonkey/fdlibm/fdlibm.h +273 -0
  205. data/vendor/spidermonkey/fdlibm/fdlibm.mak +1453 -0
  206. data/vendor/spidermonkey/fdlibm/fdlibm.mdp +0 -0
  207. data/vendor/spidermonkey/fdlibm/k_cos.c +135 -0
  208. data/vendor/spidermonkey/fdlibm/k_rem_pio2.c +354 -0
  209. data/vendor/spidermonkey/fdlibm/k_sin.c +114 -0
  210. data/vendor/spidermonkey/fdlibm/k_standard.c +785 -0
  211. data/vendor/spidermonkey/fdlibm/k_tan.c +170 -0
  212. data/vendor/spidermonkey/fdlibm/s_asinh.c +101 -0
  213. data/vendor/spidermonkey/fdlibm/s_atan.c +175 -0
  214. data/vendor/spidermonkey/fdlibm/s_cbrt.c +133 -0
  215. data/vendor/spidermonkey/fdlibm/s_ceil.c +120 -0
  216. data/vendor/spidermonkey/fdlibm/s_copysign.c +72 -0
  217. data/vendor/spidermonkey/fdlibm/s_cos.c +118 -0
  218. data/vendor/spidermonkey/fdlibm/s_erf.c +356 -0
  219. data/vendor/spidermonkey/fdlibm/s_expm1.c +267 -0
  220. data/vendor/spidermonkey/fdlibm/s_fabs.c +70 -0
  221. data/vendor/spidermonkey/fdlibm/s_finite.c +71 -0
  222. data/vendor/spidermonkey/fdlibm/s_floor.c +121 -0
  223. data/vendor/spidermonkey/fdlibm/s_frexp.c +99 -0
  224. data/vendor/spidermonkey/fdlibm/s_ilogb.c +85 -0
  225. data/vendor/spidermonkey/fdlibm/s_isnan.c +74 -0
  226. data/vendor/spidermonkey/fdlibm/s_ldexp.c +66 -0
  227. data/vendor/spidermonkey/fdlibm/s_lib_version.c +73 -0
  228. data/vendor/spidermonkey/fdlibm/s_log1p.c +211 -0
  229. data/vendor/spidermonkey/fdlibm/s_logb.c +79 -0
  230. data/vendor/spidermonkey/fdlibm/s_matherr.c +64 -0
  231. data/vendor/spidermonkey/fdlibm/s_modf.c +132 -0
  232. data/vendor/spidermonkey/fdlibm/s_nextafter.c +124 -0
  233. data/vendor/spidermonkey/fdlibm/s_rint.c +131 -0
  234. data/vendor/spidermonkey/fdlibm/s_scalbn.c +107 -0
  235. data/vendor/spidermonkey/fdlibm/s_signgam.c +40 -0
  236. data/vendor/spidermonkey/fdlibm/s_significand.c +68 -0
  237. data/vendor/spidermonkey/fdlibm/s_sin.c +118 -0
  238. data/vendor/spidermonkey/fdlibm/s_tan.c +112 -0
  239. data/vendor/spidermonkey/fdlibm/s_tanh.c +122 -0
  240. data/vendor/spidermonkey/fdlibm/w_acos.c +78 -0
  241. data/vendor/spidermonkey/fdlibm/w_acosh.c +78 -0
  242. data/vendor/spidermonkey/fdlibm/w_asin.c +80 -0
  243. data/vendor/spidermonkey/fdlibm/w_atan2.c +79 -0
  244. data/vendor/spidermonkey/fdlibm/w_atanh.c +81 -0
  245. data/vendor/spidermonkey/fdlibm/w_cosh.c +77 -0
  246. data/vendor/spidermonkey/fdlibm/w_exp.c +88 -0
  247. data/vendor/spidermonkey/fdlibm/w_fmod.c +78 -0
  248. data/vendor/spidermonkey/fdlibm/w_gamma.c +85 -0
  249. data/vendor/spidermonkey/fdlibm/w_gamma_r.c +81 -0
  250. data/vendor/spidermonkey/fdlibm/w_hypot.c +78 -0
  251. data/vendor/spidermonkey/fdlibm/w_j0.c +105 -0
  252. data/vendor/spidermonkey/fdlibm/w_j1.c +106 -0
  253. data/vendor/spidermonkey/fdlibm/w_jn.c +128 -0
  254. data/vendor/spidermonkey/fdlibm/w_lgamma.c +85 -0
  255. data/vendor/spidermonkey/fdlibm/w_lgamma_r.c +81 -0
  256. data/vendor/spidermonkey/fdlibm/w_log.c +78 -0
  257. data/vendor/spidermonkey/fdlibm/w_log10.c +81 -0
  258. data/vendor/spidermonkey/fdlibm/w_pow.c +99 -0
  259. data/vendor/spidermonkey/fdlibm/w_remainder.c +77 -0
  260. data/vendor/spidermonkey/fdlibm/w_scalb.c +95 -0
  261. data/vendor/spidermonkey/fdlibm/w_sinh.c +77 -0
  262. data/vendor/spidermonkey/fdlibm/w_sqrt.c +77 -0
  263. data/vendor/spidermonkey/javascript-trace.d +73 -0
  264. data/vendor/spidermonkey/js.c +3951 -0
  265. data/vendor/spidermonkey/js.mdp +0 -0
  266. data/vendor/spidermonkey/js.msg +308 -0
  267. data/vendor/spidermonkey/js3240.rc +79 -0
  268. data/vendor/spidermonkey/jsOS240.def +654 -0
  269. data/vendor/spidermonkey/jsapi.c +5836 -0
  270. data/vendor/spidermonkey/jsapi.h +2624 -0
  271. data/vendor/spidermonkey/jsarena.c +450 -0
  272. data/vendor/spidermonkey/jsarena.h +318 -0
  273. data/vendor/spidermonkey/jsarray.c +2996 -0
  274. data/vendor/spidermonkey/jsarray.h +127 -0
  275. data/vendor/spidermonkey/jsatom.c +1045 -0
  276. data/vendor/spidermonkey/jsatom.h +442 -0
  277. data/vendor/spidermonkey/jsbit.h +253 -0
  278. data/vendor/spidermonkey/jsbool.c +176 -0
  279. data/vendor/spidermonkey/jsbool.h +73 -0
  280. data/vendor/spidermonkey/jsclist.h +139 -0
  281. data/vendor/spidermonkey/jscntxt.c +1348 -0
  282. data/vendor/spidermonkey/jscntxt.h +1120 -0
  283. data/vendor/spidermonkey/jscompat.h +57 -0
  284. data/vendor/spidermonkey/jsconfig.h +248 -0
  285. data/vendor/spidermonkey/jsconfig.mk +181 -0
  286. data/vendor/spidermonkey/jscpucfg.c +396 -0
  287. data/vendor/spidermonkey/jscpucfg.h +212 -0
  288. data/vendor/spidermonkey/jsdate.c +2390 -0
  289. data/vendor/spidermonkey/jsdate.h +124 -0
  290. data/vendor/spidermonkey/jsdbgapi.c +1802 -0
  291. data/vendor/spidermonkey/jsdbgapi.h +464 -0
  292. data/vendor/spidermonkey/jsdhash.c +868 -0
  293. data/vendor/spidermonkey/jsdhash.h +592 -0
  294. data/vendor/spidermonkey/jsdtoa.c +3167 -0
  295. data/vendor/spidermonkey/jsdtoa.h +130 -0
  296. data/vendor/spidermonkey/jsdtracef.c +317 -0
  297. data/vendor/spidermonkey/jsdtracef.h +77 -0
  298. data/vendor/spidermonkey/jsemit.c +6909 -0
  299. data/vendor/spidermonkey/jsemit.h +741 -0
  300. data/vendor/spidermonkey/jsexn.c +1371 -0
  301. data/vendor/spidermonkey/jsexn.h +96 -0
  302. data/vendor/spidermonkey/jsfile.c +2736 -0
  303. data/vendor/spidermonkey/jsfile.h +56 -0
  304. data/vendor/spidermonkey/jsfile.msg +90 -0
  305. data/vendor/spidermonkey/jsfun.c +2634 -0
  306. data/vendor/spidermonkey/jsfun.h +254 -0
  307. data/vendor/spidermonkey/jsgc.c +3562 -0
  308. data/vendor/spidermonkey/jsgc.h +403 -0
  309. data/vendor/spidermonkey/jshash.c +476 -0
  310. data/vendor/spidermonkey/jshash.h +151 -0
  311. data/vendor/spidermonkey/jsify.pl +485 -0
  312. data/vendor/spidermonkey/jsinterp.c +7007 -0
  313. data/vendor/spidermonkey/jsinterp.h +525 -0
  314. data/vendor/spidermonkey/jsinvoke.c +43 -0
  315. data/vendor/spidermonkey/jsiter.c +1067 -0
  316. data/vendor/spidermonkey/jsiter.h +122 -0
  317. data/vendor/spidermonkey/jskeyword.tbl +124 -0
  318. data/vendor/spidermonkey/jskwgen.c +460 -0
  319. data/vendor/spidermonkey/jslibmath.h +266 -0
  320. data/vendor/spidermonkey/jslock.c +1309 -0
  321. data/vendor/spidermonkey/jslock.h +313 -0
  322. data/vendor/spidermonkey/jslocko.asm +60 -0
  323. data/vendor/spidermonkey/jslog2.c +94 -0
  324. data/vendor/spidermonkey/jslong.c +264 -0
  325. data/vendor/spidermonkey/jslong.h +412 -0
  326. data/vendor/spidermonkey/jsmath.c +567 -0
  327. data/vendor/spidermonkey/jsmath.h +57 -0
  328. data/vendor/spidermonkey/jsnum.c +1239 -0
  329. data/vendor/spidermonkey/jsnum.h +283 -0
  330. data/vendor/spidermonkey/jsobj.c +5282 -0
  331. data/vendor/spidermonkey/jsobj.h +709 -0
  332. data/vendor/spidermonkey/jsopcode.c +5245 -0
  333. data/vendor/spidermonkey/jsopcode.h +394 -0
  334. data/vendor/spidermonkey/jsopcode.tbl +523 -0
  335. data/vendor/spidermonkey/jsotypes.h +202 -0
  336. data/vendor/spidermonkey/jsparse.c +6704 -0
  337. data/vendor/spidermonkey/jsparse.h +511 -0
  338. data/vendor/spidermonkey/jsprf.c +1262 -0
  339. data/vendor/spidermonkey/jsprf.h +150 -0
  340. data/vendor/spidermonkey/jsproto.tbl +128 -0
  341. data/vendor/spidermonkey/jsprvtd.h +267 -0
  342. data/vendor/spidermonkey/jspubtd.h +744 -0
  343. data/vendor/spidermonkey/jsregexp.c +4364 -0
  344. data/vendor/spidermonkey/jsregexp.h +183 -0
  345. data/vendor/spidermonkey/jsreops.tbl +145 -0
  346. data/vendor/spidermonkey/jsscan.c +2012 -0
  347. data/vendor/spidermonkey/jsscan.h +387 -0
  348. data/vendor/spidermonkey/jsscope.c +1957 -0
  349. data/vendor/spidermonkey/jsscope.h +418 -0
  350. data/vendor/spidermonkey/jsscript.c +1832 -0
  351. data/vendor/spidermonkey/jsscript.h +287 -0
  352. data/vendor/spidermonkey/jsshell.msg +50 -0
  353. data/vendor/spidermonkey/jsstddef.h +83 -0
  354. data/vendor/spidermonkey/jsstr.c +5005 -0
  355. data/vendor/spidermonkey/jsstr.h +641 -0
  356. data/vendor/spidermonkey/jstypes.h +475 -0
  357. data/vendor/spidermonkey/jsutil.c +345 -0
  358. data/vendor/spidermonkey/jsutil.h +157 -0
  359. data/vendor/spidermonkey/jsxdrapi.c +800 -0
  360. data/vendor/spidermonkey/jsxdrapi.h +218 -0
  361. data/vendor/spidermonkey/jsxml.c +8476 -0
  362. data/vendor/spidermonkey/jsxml.h +349 -0
  363. data/vendor/spidermonkey/lock_SunOS.s +119 -0
  364. data/vendor/spidermonkey/perfect.js +39 -0
  365. data/vendor/spidermonkey/plify_jsdhash.sed +36 -0
  366. data/vendor/spidermonkey/prmjtime.c +846 -0
  367. data/vendor/spidermonkey/prmjtime.h +103 -0
  368. data/vendor/spidermonkey/resource.h +15 -0
  369. data/vendor/spidermonkey/rules.mk +197 -0
  370. data/vendor/spidermonkey/win32.order +384 -0
  371. metadata +513 -0
@@ -0,0 +1,3 @@
1
+ module Johnson #:nodoc:
2
+ VERSION = "1.1.0"
3
+ end
@@ -0,0 +1,16 @@
1
+ module Johnson
2
+ module Visitable
3
+ # Based off the visitor pattern from RubyGarden
4
+ def accept(visitor, &block)
5
+ klass = self.class.ancestors.find { |ancestor|
6
+ visitor.respond_to?("visit_#{ancestor.name.split(/::/)[-1]}")
7
+ }
8
+
9
+ if klass
10
+ visitor.send(:"visit_#{klass.name.split(/::/)[-1]}", self, &block)
11
+ else
12
+ raise "No visitor for '#{self.class}' at line #{line}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ require 'johnson/visitors/visitor'
2
+ require 'johnson/visitors/sexp_visitor'
3
+ require 'johnson/visitors/ecma_visitor'
4
+ require 'johnson/visitors/dot_visitor'
5
+ require 'johnson/visitors/enumerating_visitor'
@@ -0,0 +1,169 @@
1
+ module Johnson
2
+ module Visitors
3
+ class DotVisitor
4
+ attr_accessor :nodes, :links
5
+
6
+ ESCAPE = /([<>"\\])/
7
+
8
+ class Node < Struct.new(:node_id, :label, :fields)
9
+ def to_s
10
+ f = fields.map { |field|
11
+ field.to_s.gsub(ESCAPE, '\\\\\1').gsub(/[\r\n]/, ' ')
12
+ }.join('\n')
13
+ f = "\\n#{f}" if f.length > 0
14
+ "\"#{node_id}\" [ label = \"#{label}#{f}\" ];"
15
+ end
16
+ end
17
+ class Link < Struct.new(:from, :to, :attributes)
18
+ def to_s
19
+ attrs = ''
20
+ if attributes
21
+ attrs = " [" + attributes.map { |attribute|
22
+ attribute.join(' = ')
23
+ }.join("; ") + "]"
24
+ end
25
+ "\"#{from}\" -> \"#{to}\"#{attrs};"
26
+ end
27
+ end
28
+
29
+ def initialize
30
+ @nodes = []
31
+ @links = []
32
+ @color = 'lightblue2'
33
+ @style = 'filled'
34
+ yield self if block_given?
35
+ end
36
+
37
+ def to_s
38
+ "digraph parsetree {\n" +
39
+ " node [color=#{@color}, style=#{@style}];\n" +
40
+ @nodes.map { |n| n.to_s }.join("\n") +
41
+ @links.map { |n| n.to_s }.join("\n") +
42
+ "\n}"
43
+ end
44
+
45
+ def visit_SourceElements(o)
46
+ @nodes << Node.new(o.object_id, 'SourceElements', [])
47
+ o.value.each { |x|
48
+ @links << Link.new(o.object_id, x.object_id)
49
+ x.accept(self)
50
+ }
51
+ end
52
+
53
+ %w{
54
+ VarStatement
55
+ LetStatement
56
+ Comma
57
+ ObjectLiteral
58
+ ArrayLiteral
59
+ New
60
+ FunctionCall
61
+ Import
62
+ Export
63
+ }.each do |type|
64
+ define_method(:"visit_#{type}") do |o|
65
+ @nodes << Node.new(o.object_id, type, [])
66
+ o.value.each { |x|
67
+ @links << Link.new(o.object_id, x.object_id)
68
+ x.accept(self)
69
+ }
70
+ end
71
+ end
72
+
73
+ %w{ Name Number Regexp String }.each do |type|
74
+ define_method(:"visit_#{type}") do |o|
75
+ @nodes << Node.new(o.object_id, type, [o.value])
76
+ end
77
+ end
78
+
79
+ %w{ Break Continue False Null This True }.each do |type|
80
+ define_method(:"visit_#{type}") do |o|
81
+ @nodes << Node.new(o.object_id, type, [])
82
+ end
83
+ end
84
+
85
+ def visit_Try(o)
86
+ @nodes << Node.new(o.object_id, 'Try', [])
87
+ @links << Link.new(o.object_id, o.cond.object_id, {'label' => 'cond' })
88
+ o.cond.accept(self)
89
+ if o.b_then
90
+ o.b_then.each { |x|
91
+ @links << Link.new(o.object_id, x.object_id, {'label' => 'b_then' })
92
+ x.accept(self)
93
+ }
94
+ end
95
+ if x = o.b_else
96
+ @links << Link.new(o.object_id, x.object_id, {'label' => 'b_else' })
97
+ x.accept(self)
98
+ end
99
+ end
100
+
101
+ {
102
+ 'For' => [:init, :cond, :update, :body],
103
+ 'ForIn' => [:in_cond, :body],
104
+ 'Ternary' => [:cond, :b_then, :b_else],
105
+ 'If' => [:cond, :b_then, :b_else],
106
+ 'Catch' => [:cond, :b_then, :b_else],
107
+ }.each do |type,attrs|
108
+ define_method(:"visit_#{type}") do |o|
109
+ @nodes << Node.new(o.object_id, type, [])
110
+ attrs.each do |method|
111
+ if x = o.send(method)
112
+ @links << Link.new(o.object_id, x.object_id, {'label' => method })
113
+ x.accept(self)
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ ### UNARY NODES ###
120
+ %w{
121
+ BitwiseNot Delete Not Parenthesis PostfixDecrement PostfixIncrement
122
+ PrefixDecrement PrefixIncrement Return Throw Typeof UnaryNegative
123
+ UnaryPositive Void
124
+ }.each do |node|
125
+ define_method(:"visit_#{node}") do |o|
126
+ @nodes << Node.new(o.object_id, node, [])
127
+ if x = o.value
128
+ @links << Link.new(o.object_id, x.object_id)
129
+ x.accept(self)
130
+ end
131
+ end
132
+ end
133
+
134
+ ### FUNCTION NODES ###
135
+ def visit_Function(o)
136
+ @nodes << Node.new(o.object_id, 'Function', [o.arguments.join(', ')])
137
+ @links << Link.new(o.object_id, o.body.object_id, { 'label' => 'body' })
138
+ o.body.accept(self)
139
+ end
140
+
141
+ ### BINARY NODES ###
142
+ %w{
143
+ And AssignExpr BracketAccess Case Default DoWhile DotAccessor
144
+ Equal GetterProperty GreaterThan GreaterThanOrEqual In
145
+ InstanceOf Label LessThan LessThanOrEqual NotEqual OpAdd OpAddEqual
146
+ OpBitAnd OpBitAndEqual OpBitOr OpBitOrEqual OpBitXor OpBitXorEqual
147
+ OpDivide OpDivideEqual OpEqual OpLShift OpLShiftEqual OpMod
148
+ OpModEqual OpMultiply OpMultiplyEqual OpRShift OpRShiftEqual
149
+ OpSubtract OpSubtractEqual OpURShift OpURShiftEqual Or Property
150
+ SetterProperty StrictEqual StrictNotEqual Switch While With
151
+ LexicalScope
152
+ }.each do |node|
153
+ define_method(:"visit_#{node}") do |o|
154
+ @nodes << Node.new(o.object_id, node, [])
155
+ [:left, :right].each do |side|
156
+ if x = o.send(side)
157
+ @links << Link.new(o.object_id, x.object_id, { 'label' => side })
158
+ x.accept(self)
159
+ end
160
+ end
161
+ end
162
+ end
163
+
164
+ def accept(target)
165
+ target.accept(self)
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,323 @@
1
+ module Johnson
2
+ module Visitors
3
+ class EcmaVisitor
4
+ def initialize
5
+ @depth = 0
6
+ end
7
+
8
+ def visit_SourceElements(o)
9
+ newline = o.value.length > 0 ? "\n" : ' '
10
+ (@depth == 0 ? '' : "{#{newline}") +
11
+ indent {
12
+ o.value.map { |x|
13
+ code = x.accept(self)
14
+ semi = case x
15
+ when Nodes::Function, Nodes::While, Nodes::If, Nodes::Try, Nodes::Switch, Nodes::Case, Nodes::Default, Nodes::For, Nodes::ForIn
16
+ code =~ /\}\Z/ ? '' : ';'
17
+ else
18
+ ';'
19
+ end
20
+ "#{indent}#{code}#{semi}"
21
+ }.join("\n")
22
+ } +
23
+ (@depth == 0 ? '' : "#{newline}}")
24
+ end
25
+
26
+ def visit_For(o)
27
+ "for(#{o.init ? o.init.accept(self) : ' '};" \
28
+ " #{o.cond && o.cond.accept(self)};" \
29
+ " #{o.update && o.update.accept(self)}) #{o.body.accept(self)}"
30
+ end
31
+
32
+ def visit_ForIn(o)
33
+ "for(#{o.in_cond.accept(self)}) #{o.body.accept(self)}"
34
+ end
35
+
36
+ def visit_Ternary(o)
37
+ "#{o.cond.accept(self)} ? #{o.b_then.accept(self)} : " \
38
+ "#{o.b_else.accept(self)}"
39
+ end
40
+
41
+ def visit_VarStatement(o)
42
+ "var #{o.value.map { |x| x.accept(self) }.join(', ')}"
43
+ end
44
+
45
+ def visit_LetStatement(o)
46
+ "let #{o.value.map { |x| x.accept(self) }.join(', ')}"
47
+ end
48
+
49
+ def visit_ArrayLiteral(o)
50
+ "[#{o.value.map { |x| x.accept(self) }.join(', ')}]"
51
+ end
52
+
53
+ def visit_New(o)
54
+ rest = o.value.slice(1..-1)
55
+ "new #{o.value.first.accept(self)}"\
56
+ "(#{rest && rest.map { |x| x.accept(self) }.join(', ')})"
57
+ end
58
+
59
+ def visit_FunctionCall(o)
60
+ rest = o.value.slice(1..-1)
61
+ stmt =
62
+ if o.value.first.is_a?(Nodes::Function)
63
+ "(#{o.value.first.accept(self)})"
64
+ else
65
+ "#{o.value.first.accept(self)}"
66
+ end
67
+ "#{stmt}(#{rest && rest.map { |x| x.accept(self) }.join(', ')})"
68
+ end
69
+
70
+ def visit_Comma(o)
71
+ "#{o.value.map { |x| x.accept(self) }.join(', ') }"
72
+ end
73
+
74
+ %w{ Name Number Regexp }.each do |type|
75
+ define_method(:"visit_#{type}") do |o|
76
+ o.value
77
+ end
78
+ end
79
+
80
+ def visit_If(o)
81
+ semi = ''
82
+ semi = ';' if o.b_else && !o.b_then.is_a?(Nodes::SourceElements)
83
+
84
+ stmt = "if(#{o.cond.accept(self)}) #{o.b_then.accept(self)}#{semi}"
85
+ stmt += " else #{o.b_else.accept(self)}" if o.b_else
86
+ stmt
87
+ end
88
+
89
+ def visit_Function(o)
90
+ "function#{o.name && ' '}#{o.name}(#{o.arguments.join(', ')}) #{o.body.accept(self)}"
91
+ end
92
+
93
+ def visit_String(o)
94
+ h = {
95
+ "\b" => '\b',
96
+ "\t" => '\t',
97
+ "\n" => '\n',
98
+ "\f" => '\f',
99
+ "\r" => '\r',
100
+ }
101
+ "\"#{o.value.gsub(/[\\]/, '\\\\\\').gsub(/"/, '\"').gsub(/[\b\t\n\f\r]/) { |m| h[m] }}\""
102
+ end
103
+
104
+ {
105
+ 'Break' => 'break',
106
+ 'Continue' => 'continue',
107
+ 'Null' => 'null',
108
+ 'True' => 'true',
109
+ 'False' => 'false',
110
+ 'This' => 'this',
111
+ }.each do |type,sym|
112
+ define_method(:"visit_#{type}") do |o|
113
+ sym
114
+ end
115
+ end
116
+
117
+ def visit_BracketAccess(o)
118
+ "#{o.left.accept(self)}[#{o.right.accept(self)}]"
119
+ end
120
+
121
+ def visit_LexicalScope(o)
122
+ "#{o.right.accept(self)}"
123
+ end
124
+
125
+ def visit_DoWhile(o)
126
+ semi = o.left.is_a?(Nodes::SourceElements) ? '' : ';'
127
+ "do #{o.left.accept(self)}#{semi} while(#{o.right.accept(self)})"
128
+ end
129
+
130
+ def visit_Try(o)
131
+ stmt = "try #{o.cond.accept(self)}"
132
+ o.b_then.each do |node|
133
+ stmt << " #{node.accept(self)}"
134
+ end if o.b_then
135
+ stmt << "#{o.b_else && ' finally '}" \
136
+ "#{o.b_else && o.b_else.accept(self)}" if o.b_else
137
+ stmt
138
+ end
139
+
140
+ def visit_Catch(o)
141
+ "catch(#{o.cond.accept(self)}) #{o.b_else.accept(self)}"
142
+ end
143
+
144
+ def visit_Delete(o)
145
+ "delete #{o.value.accept(self)}"
146
+ end
147
+
148
+ def visit_Export(o)
149
+ "export #{o.value.map { |x| x.accept(self) }.join(', ')}"
150
+ end
151
+
152
+ def visit_Import(o)
153
+ "import #{o.value.map { |x| x.accept(self) }.join(', ')}"
154
+ end
155
+
156
+ def visit_Throw(o)
157
+ "throw #{o.value.accept(self)}"
158
+ end
159
+
160
+ def visit_Void(o)
161
+ "void #{o.value.accept(self)}"
162
+ end
163
+
164
+ def visit_Return(o)
165
+ "return#{o.value && ' '}#{o.value && o.value.accept(self)}"
166
+ end
167
+
168
+ def visit_Typeof(o)
169
+ "typeof #{o.value.accept(self)}"
170
+ end
171
+
172
+ {
173
+ 'UnaryPositive' => '+',
174
+ 'UnaryNegative' => '-',
175
+ 'BitwiseNot' => '~',
176
+ 'Not' => '!',
177
+ }.each do |type,op|
178
+ define_method(:"visit_#{type}") do |o|
179
+ "#{op}#{o.value.accept(self)}"
180
+ end
181
+ end
182
+
183
+ def visit_Parenthesis(o)
184
+ "(#{o.value.accept(self)})"
185
+ end
186
+
187
+ def visit_While(o)
188
+ "while(#{o.left.accept(self)}) #{o.right.accept(self)}"
189
+ end
190
+
191
+ def visit_With(o)
192
+ "with(#{o.left.accept(self)}) #{o.right.accept(self)}"
193
+ end
194
+
195
+ def visit_Switch(o)
196
+ "switch(#{o.left.accept(self)}) #{o.right.accept(self)}"
197
+ end
198
+
199
+ def visit_Case(o)
200
+ "case #{o.left.accept(self)}: #{o.right.accept(self)}"
201
+ end
202
+
203
+ def visit_Default(o)
204
+ "default: #{o.right.accept(self)}"
205
+ end
206
+
207
+ def visit_Label(o)
208
+ "#{o.left.accept(self)}: #{o.right.accept(self)}"
209
+ end
210
+ alias :visit_Property :visit_Label
211
+
212
+ def visit_DotAccessor(o)
213
+ stmt =
214
+ if o.right.is_a?(Nodes::Function)
215
+ "(#{o.right.accept(self)})"
216
+ else
217
+ "#{o.right.accept(self)}"
218
+ end
219
+
220
+ rhs = o.left.accept(self)
221
+ if rhs =~ /\A\w+$/
222
+ stmt << ".#{rhs}"
223
+ else
224
+ stmt << "['#{rhs}']"
225
+ end
226
+ stmt
227
+ end
228
+
229
+ def visit_GetterProperty(o)
230
+ "get #{o.left.accept(self)}#{o.right.accept(self).gsub(/function/, '')}"
231
+ end
232
+
233
+ def visit_SetterProperty(o)
234
+ "set #{o.left.accept(self)}#{o.right.accept(self).gsub(/function/, '')}"
235
+ end
236
+
237
+ def visit_ObjectLiteral(o)
238
+ indent {
239
+ "{ #{o.value.map { |x| x.accept(self) }.join(",\n#{indent}")} }"
240
+ }
241
+ end
242
+
243
+ {
244
+ 'PostfixIncrement' => '++',
245
+ 'PostfixDecrement' => '--',
246
+ }.each do |type,op|
247
+ define_method(:"visit_#{type}") do |o|
248
+ "#{o.value.accept(self)}#{op}"
249
+ end
250
+ end
251
+
252
+ {
253
+ 'PrefixIncrement' => '++',
254
+ 'PrefixDecrement' => '--',
255
+ }.each do |type,op|
256
+ define_method(:"visit_#{type}") do |o|
257
+ "#{op}#{o.value.accept(self)}"
258
+ end
259
+ end
260
+
261
+ {
262
+ 'OpEqual' => '=',
263
+ 'StrictNotEqual' => '!==',
264
+ 'StrictEqual' => '===',
265
+ 'Or' => '||',
266
+ 'OpURShift' => '>>>',
267
+ 'OpURShiftEqual' => '>>>=',
268
+ 'OpSubtract' => '-',
269
+ 'OpSubtractEqual' => '-=',
270
+ 'OpRShift' => '>>',
271
+ 'OpRShiftEqual' => '>>=',
272
+ 'OpMultiply' => '*',
273
+ 'OpMultiplyEqual' => '*=',
274
+ 'OpMod' => '%',
275
+ 'OpModEqual' => '%=',
276
+ 'OpLShift' => '<<',
277
+ 'OpLShiftEqual' => '<<=',
278
+ 'OpDivide' => '/',
279
+ 'OpDivideEqual' => '/=',
280
+ 'OpBitXor' => '^',
281
+ 'OpBitXorEqual' => '^=',
282
+ 'OpBitOr' => '|',
283
+ 'OpBitOrEqual' => '|=',
284
+ 'OpBitAnd' => '&',
285
+ 'OpBitAndEqual' => '&=',
286
+ 'OpAdd' => '+',
287
+ 'OpAddEqual' => '+=',
288
+ 'NotEqual' => '!=',
289
+ 'LessThan' => '<',
290
+ 'LessThanOrEqual' => '<=',
291
+ 'GreaterThan' => '>',
292
+ 'GreaterThanOrEqual' => '>=',
293
+ 'And' => '&&',
294
+ 'InstanceOf' => 'instanceof',
295
+ 'In' => 'in',
296
+ 'Equal' => '==',
297
+ 'AssignExpr' => '=',
298
+ }.each do |type,op|
299
+ define_method(:"visit_#{type}") do |o|
300
+ "#{o.left && o.left.accept(self)}" \
301
+ " #{op} " \
302
+ "#{o.right && o.right.accept(self)}"
303
+ end
304
+ end
305
+
306
+ def accept(target)
307
+ target.accept(self)
308
+ end
309
+
310
+ private
311
+ def indent
312
+ if block_given?
313
+ @depth += 1
314
+ x = yield
315
+ @depth -= 1
316
+ x
317
+ else
318
+ ' ' * (@depth - 1) * 2
319
+ end
320
+ end
321
+ end
322
+ end
323
+ end