johnson 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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