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,320 @@
1
+ #include "conversions.h"
2
+ #include "js_land_proxy.h"
3
+ #include "ruby_land_proxy.h"
4
+
5
+ DEFINE_RUBY_WRAPPER(convert_to_ruby, convert_to_ruby, ARGLIST2(runtime, js_value))
6
+
7
+ DECLARE_RUBY_WRAPPER(rb_funcall_0, VALUE obj; ID sym; int argc)
8
+ DEFINE_RUBY_WRAPPER(rb_funcall_0, rb_funcall, ARGLIST3(obj, sym, argc))
9
+
10
+ DECLARE_RUBY_WRAPPER(rb_funcall_2, VALUE obj; ID sym; int argc; VALUE a; VALUE b)
11
+ DEFINE_RUBY_WRAPPER(rb_funcall_2, rb_funcall, ARGLIST5(obj, sym, argc, a, b))
12
+
13
+ static JSBool convert_float_or_bignum_to_js(JohnsonRuntime* runtime, VALUE float_or_bignum, jsval* retval)
14
+ {
15
+ JSContext * context = johnson_get_current_context(runtime);
16
+ return JS_NewDoubleValue(context, NUM2DBL(float_or_bignum), retval);
17
+ }
18
+
19
+ static JSBool convert_symbol_to_js(JohnsonRuntime* runtime, VALUE symbol, jsval* retval)
20
+ {
21
+ JSContext * context = johnson_get_current_context(runtime);
22
+ PREPARE_JROOTS(context, 2);
23
+
24
+ VALUE to_s = CALL_RUBY_WRAPPER(rb_funcall_0, symbol, rb_intern("to_s"), 0);
25
+ jsval name = STRING_TO_JSVAL(JS_NewStringCopyN(context, StringValuePtr(to_s), (size_t) StringValueLen(to_s)));
26
+
27
+ JROOT(name);
28
+
29
+ // calls Johnson.symbolize(name) in JS-land. See lib/prelude.js
30
+
31
+ jsval nsJohnson;
32
+ JCHECK(JS_GetProperty(context, runtime->global, "Johnson", &nsJohnson));
33
+ JROOT(nsJohnson);
34
+
35
+ JCHECK(JS_CallFunctionName(context, JSVAL_TO_OBJECT(nsJohnson), "symbolize", 1, &name, retval));
36
+
37
+ JRETURN;
38
+ }
39
+
40
+ static JSBool convert_regexp_to_js(JohnsonRuntime* runtime, VALUE regexp, jsval* retval)
41
+ {
42
+ JSContext * context = johnson_get_current_context(runtime);
43
+ PREPARE_JROOTS(context, 0);
44
+ VALUE source = rb_funcall(regexp, rb_intern("source"), 0);
45
+ jsint options = (jsint)(NUM2INT(rb_funcall(regexp, rb_intern("options"), 0)));
46
+
47
+ JSObject* obj = JS_NewRegExpObject(context,
48
+ StringValuePtr(source),
49
+ (size_t) StringValueLen(source),
50
+ (unsigned) options);
51
+
52
+ JCHECK(obj);
53
+ *retval = OBJECT_TO_JSVAL(obj);
54
+ JRETURN;
55
+ }
56
+
57
+ JSBool convert_to_js(JohnsonRuntime* runtime, VALUE ruby, jsval* retval)
58
+ {
59
+ JSContext * context = johnson_get_current_context(runtime);
60
+ PREPARE_JROOTS(context, 0);
61
+ switch(TYPE(ruby))
62
+ {
63
+ case T_NONE:
64
+ JERROR("I don't know how to handle T_NONE.");
65
+ JRETURN;
66
+
67
+ case T_ICLASS:
68
+ JERROR("I don't know how to handle T_ICLASS.");
69
+ JRETURN;
70
+
71
+ case T_MATCH:
72
+ JERROR("I don't know how to handle T_MATCH.");
73
+ JRETURN;
74
+
75
+ case T_BLKTAG:
76
+ JERROR("I don't know how to handle T_BLKTAG.");
77
+ JRETURN;
78
+
79
+ case T_NODE:
80
+ JERROR("I don't know how to handle T_NODE | T_MASK.");
81
+ JRETURN;
82
+
83
+ case T_UNDEF:
84
+ JERROR("I don't know how to handle T_UNDEF.");
85
+ JRETURN;
86
+
87
+ case T_VARMAP:
88
+ JERROR("I don't know how to handle T_VARMAP.");
89
+ JRETURN;
90
+
91
+ case T_NIL:
92
+ *retval = JSVAL_NULL;
93
+ JRETURN;
94
+
95
+ case T_TRUE:
96
+ *retval = JSVAL_TRUE;
97
+ JRETURN;
98
+
99
+ case T_FALSE:
100
+ *retval = JSVAL_FALSE;
101
+ JRETURN;
102
+
103
+ case T_STRING:
104
+ {
105
+ JSString* str = JS_NewStringCopyN(context, StringValuePtr(ruby), (size_t) StringValueLen(ruby));
106
+ JCHECK(str);
107
+ *retval = STRING_TO_JSVAL(str);
108
+ JRETURN;
109
+ }
110
+
111
+ case T_FIXNUM:
112
+ {
113
+ long val = NUM2LONG(ruby);
114
+ if (val >= JSVAL_INT_MIN && val <= JSVAL_INT_MAX)
115
+ {
116
+ *retval = INT_TO_JSVAL((jsint)val);
117
+ JRETURN;
118
+ }
119
+ }
120
+
121
+ case T_FLOAT:
122
+ case T_BIGNUM:
123
+ JCHECK(convert_float_or_bignum_to_js(runtime, ruby, retval));
124
+ JRETURN;
125
+
126
+ case T_SYMBOL:
127
+ JCHECK(convert_symbol_to_js(runtime, ruby, retval));
128
+ JRETURN;
129
+
130
+ case T_CLASS:
131
+ case T_ARRAY:
132
+ case T_HASH:
133
+ case T_MODULE:
134
+ case T_FILE:
135
+ case T_STRUCT:
136
+ case T_OBJECT:
137
+ JCHECK(make_js_land_proxy(runtime, ruby, retval));
138
+ JRETURN;
139
+
140
+ case T_REGEXP:
141
+ JCHECK(convert_regexp_to_js(runtime, ruby, retval));
142
+ JRETURN;
143
+
144
+ case T_DATA: // HEY! keep T_DATA last for fall-through
145
+ if (ruby_value_is_proxy(ruby))
146
+ JCHECK(unwrap_ruby_land_proxy(runtime, ruby, retval));
147
+ else // If we can't identify the object, just wrap it
148
+ JCHECK(make_js_land_proxy(runtime, ruby, retval));
149
+ JRETURN;
150
+
151
+ default:
152
+ JERROR("unknown ruby type in switch");
153
+ }
154
+
155
+ *retval = JSVAL_NULL;
156
+ JRETURN;
157
+ }
158
+
159
+ VALUE convert_js_string_to_ruby(JohnsonRuntime* runtime, JSString* str)
160
+ {
161
+ JSContext * context = johnson_get_current_context(runtime);
162
+ PREPARE_RUBY_JROOTS(context, 1);
163
+ JROOT(str);
164
+ char* bytes = JS_GetStringBytes(str);
165
+ JCHECK(bytes);
166
+ JRETURN_RUBY(rb_str_new(bytes, (signed long)JS_GetStringLength(str)));
167
+ }
168
+
169
+ static VALUE convert_regexp_to_ruby(JohnsonRuntime* runtime, jsval regexp)
170
+ {
171
+ JSContext * context = johnson_get_current_context(runtime);
172
+ PREPARE_RUBY_JROOTS(context, 1);
173
+ JROOT(regexp);
174
+ JSRegExp* re = (JSRegExp*)JS_GetPrivate(context, JSVAL_TO_OBJECT(regexp));
175
+
176
+ JRETURN_RUBY(CALL_RUBY_WRAPPER(rb_funcall_2, rb_cRegexp, rb_intern("new"), 2,
177
+ convert_js_string_to_ruby(runtime, re->source),
178
+ INT2NUM((long)re->flags)));
179
+ }
180
+
181
+ static bool js_value_is_regexp(JohnsonRuntime* runtime, jsval maybe_regexp)
182
+ {
183
+ JSContext * context = johnson_get_current_context(runtime);
184
+ PREPARE_RUBY_JROOTS(context, 1);
185
+ JROOT(maybe_regexp);
186
+ JSBool result = JS_InstanceOf(context, JSVAL_TO_OBJECT(maybe_regexp), &js_RegExpClass, NULL);
187
+ JRETURN_RUBY(result ? true : false);
188
+ }
189
+
190
+ static bool js_value_is_symbol(JohnsonRuntime* runtime, jsval maybe_symbol)
191
+ {
192
+ jsval nsJohnson, cSymbol;
193
+ JSContext * context = johnson_get_current_context(runtime);
194
+
195
+ PREPARE_RUBY_JROOTS(context, 3);
196
+ JROOT(maybe_symbol);
197
+
198
+ JCHECK(JS_GetProperty(context, runtime->global, "Johnson", &nsJohnson));
199
+ if (!JSVAL_IS_OBJECT(nsJohnson))
200
+ JERROR("Unable to retrieve Johnson from JSLand");
201
+ JROOT(nsJohnson);
202
+
203
+ JCHECK(JS_GetProperty(context, JSVAL_TO_OBJECT(nsJohnson), "Symbol", &cSymbol));
204
+ if (!JSVAL_IS_OBJECT(cSymbol))
205
+ JERROR("Unable to retrieve Johnson.Symbol from JSLand");
206
+ JROOT(cSymbol);
207
+
208
+ JSBool is_a_symbol;
209
+ JCHECK(JS_HasInstance(context, JSVAL_TO_OBJECT(cSymbol), maybe_symbol, &is_a_symbol));
210
+
211
+ JRETURN_RUBY(is_a_symbol != JS_FALSE);
212
+ }
213
+
214
+ VALUE convert_to_ruby(JohnsonRuntime* runtime, jsval js)
215
+ {
216
+ if (JSVAL_NULL == js) return Qnil;
217
+
218
+ JSContext * context = johnson_get_current_context(runtime);
219
+
220
+ PREPARE_RUBY_JROOTS(context, 1);
221
+ JROOT(js);
222
+
223
+ switch (JS_TypeOfValue(context, js))
224
+ {
225
+ case JSTYPE_VOID:
226
+ JRETURN_RUBY(Qnil);
227
+
228
+ case JSTYPE_FUNCTION:
229
+ case JSTYPE_OBJECT:
230
+ if (OBJECT_TO_JSVAL(runtime->global) == js)
231
+ // global gets special treatment, since the Prelude might not be loaded
232
+ JRETURN_RUBY(make_ruby_land_proxy(runtime, js, "GlobalProxy"));
233
+
234
+ // this conditional requires the Prelude
235
+ if (js_value_is_symbol(runtime, js))
236
+ JRETURN_RUBY(ID2SYM(rb_intern(JS_GetStringBytes(JS_ValueToString(context, js)))));
237
+
238
+ if (js_value_is_proxy(runtime, js))
239
+ JRETURN_RUBY(unwrap_js_land_proxy(runtime, js));
240
+
241
+ if (js_value_is_regexp(runtime, js))
242
+ JRETURN_RUBY(convert_regexp_to_ruby(runtime, js));
243
+
244
+ JRETURN_RUBY(make_ruby_land_proxy(runtime, js, "RubyLandProxy"));
245
+
246
+ case JSTYPE_BOOLEAN:
247
+ JRETURN_RUBY(JSVAL_TRUE == js ? Qtrue : Qfalse);
248
+
249
+ case JSTYPE_STRING:
250
+ JRETURN_RUBY(convert_js_string_to_ruby(runtime, JSVAL_TO_STRING(js)));
251
+
252
+ case JSTYPE_NUMBER:
253
+ if (JSVAL_IS_INT(js)) JRETURN_RUBY(INT2FIX(JSVAL_TO_INT(js)));
254
+ else JRETURN_RUBY(rb_float_new(*JSVAL_TO_DOUBLE(js)));
255
+
256
+ default:
257
+ JERROR("unknown js type in switch");
258
+ }
259
+
260
+ JRETURN_RUBY(Qnil);
261
+ }
262
+
263
+ NORETURN(void) raise_js_error_in_ruby(JohnsonRuntime* runtime)
264
+ {
265
+ JSContext * context = johnson_get_current_context(runtime);
266
+ JohnsonContext * johnson_context = OUR_CONTEXT(context);
267
+ if (JS_IsExceptionPending(context))
268
+ {
269
+ assert(JS_GetPendingException(context, &(johnson_context->ex)));
270
+ JS_AddNamedRoot(context, &(johnson_context->ex), "raise_js_error_in_ruby");
271
+ JS_ClearPendingException(context);
272
+ JS_RemoveRoot(context, &(johnson_context->ex));
273
+ }
274
+
275
+ VALUE ruby_runtime = (VALUE)JS_GetRuntimePrivate(runtime->js);
276
+ if (johnson_context->ex)
277
+ RAISE_JS_ERROR(ruby_runtime, johnson_context->ex);
278
+
279
+ // FIXME: I don't think this is needed, it should
280
+ // be done on the Ruby side.
281
+ if (!johnson_context->msg)
282
+ rb_raise(rb_eRuntimeError, "Unknown JavaScriptError");
283
+
284
+ // FIXME: I don't think this can ever happen....
285
+ rb_raise(rb_eRuntimeError, johnson_context->msg);
286
+ }
287
+
288
+ #define TAG_RAISE 0x6
289
+ #define TAG_THROW 0x7
290
+
291
+ JSBool report_ruby_error_in_js(JohnsonRuntime* runtime, int state, VALUE old_errinfo)
292
+ {
293
+ JSContext * context = johnson_get_current_context(runtime);
294
+ assert(state);
295
+ switch (state)
296
+ {
297
+ case TAG_RAISE:
298
+ {
299
+ VALUE local_error = ruby_errinfo;
300
+ jsval js_err;
301
+ ruby_errinfo = old_errinfo;
302
+ if (!convert_to_js(runtime, local_error, &js_err))
303
+ return JS_FALSE;
304
+ JS_SetPendingException(context, js_err);
305
+ return JS_FALSE;
306
+ }
307
+
308
+ case TAG_THROW:
309
+ // FIXME: This should be propagated to JS... as an exception?
310
+
311
+ default:
312
+ {
313
+ JSString* str = JS_NewStringCopyZ(context, "Unexpected longjmp from ruby!");
314
+ if (str)
315
+ JS_SetPendingException(context, STRING_TO_JSVAL(str));
316
+ return JS_FALSE;
317
+ }
318
+ }
319
+ }
320
+
@@ -0,0 +1,18 @@
1
+ #ifndef JOHNSON_SPIDERMONKEY_CONVERSIONS_H
2
+ #define JOHNSON_SPIDERMONKEY_CONVERSIONS_H
3
+
4
+ #include "spidermonkey.h"
5
+ #include "context.h"
6
+ #include "runtime.h"
7
+
8
+ DECLARE_RUBY_WRAPPER(convert_to_ruby, JohnsonRuntime* runtime; jsval js_value)
9
+ #define CONVERT_TO_RUBY(runtime, js) CALL_RUBY_WRAPPER(convert_to_ruby, runtime, js)
10
+
11
+ JSBool convert_to_js(JohnsonRuntime* runtime, VALUE ruby, jsval* retval);
12
+ VALUE convert_to_ruby(JohnsonRuntime* runtime, jsval js);
13
+ VALUE convert_js_string_to_ruby(JohnsonRuntime* runtime, JSString* str);
14
+
15
+ NORETURN(void raise_js_error_in_ruby(JohnsonRuntime* runtime));
16
+ JSBool report_ruby_error_in_js(JohnsonRuntime* runtime, int state, VALUE old_errinfo);
17
+
18
+ #endif
@@ -0,0 +1,226 @@
1
+ #include "debugger.h"
2
+ #include "context.h"
3
+ #include "conversions.h"
4
+ #include "immutable_node.h"
5
+
6
+ /*
7
+ * call-seq:
8
+ * frame_pc(context, frame)
9
+ *
10
+ * Get the frame parse context
11
+ */
12
+ static VALUE frame_pc(VALUE UNUSED(self), VALUE context, VALUE frame)
13
+ {
14
+ JSContext * js = NULL;
15
+ JSStackFrame * fp = NULL;
16
+ Data_Get_Struct(context, JSContext, js);
17
+ Data_Get_Struct(frame, JSStackFrame, fp);
18
+ return Data_Wrap_Struct(rb_cObject, NULL, NULL, JS_GetFramePC(js, fp));
19
+ }
20
+
21
+ /*
22
+ * call-seq:
23
+ * line_number(context, script, bytecode)
24
+ *
25
+ * Get the line number of the +bytecode+ given +context+ and +script+
26
+ */
27
+ static VALUE line_number(VALUE UNUSED(self), VALUE context, VALUE script, VALUE bytecode)
28
+ {
29
+ JSContext * js = NULL;
30
+ JSScript * js_script = NULL;
31
+ jsbytecode * js_bytecode = NULL;
32
+
33
+ Data_Get_Struct(context, JSContext, js);
34
+ Data_Get_Struct(script, JSScript, js_script);
35
+ Data_Get_Struct(bytecode, jsbytecode, js_bytecode);
36
+
37
+ return INT2NUM((long)JS_PCToLineNumber(js, js_script, js_bytecode));
38
+ }
39
+
40
+ /*
41
+ * call-seq:
42
+ * file_name(context, script)
43
+ *
44
+ * Get the file name of the +script+ given +context+
45
+ */
46
+ static VALUE file_name(VALUE UNUSED(self), VALUE context, VALUE script)
47
+ {
48
+ JSContext * js = NULL;
49
+ JSScript * js_script = NULL;
50
+
51
+ Data_Get_Struct(context, JSContext, js);
52
+ Data_Get_Struct(script, JSScript, js_script);
53
+
54
+ return rb_str_new2(JS_GetScriptFilename(js, js_script));
55
+ }
56
+
57
+ static JSTrapStatus interrupt_handler(JSContext *js, JSScript *script,
58
+ jsbytecode *pc, jsval *UNUSED(rval), void *rb)
59
+ {
60
+ assert(js);
61
+ assert(rb);
62
+ assert(pc);
63
+
64
+ VALUE self = (VALUE)rb;
65
+ VALUE rb_cx = Data_Wrap_Struct(rb_cObject, NULL, NULL, js);
66
+ VALUE rb_script = Data_Wrap_Struct(rb_cObject, NULL, NULL, script);
67
+ VALUE rb_pc = Data_Wrap_Struct(rb_cObject, NULL, NULL, pc);
68
+
69
+ return NUM2INT(rb_funcall(self, rb_intern("interrupt_handler"), 3,
70
+ rb_cx,
71
+ rb_script,
72
+ rb_pc
73
+ ));
74
+ }
75
+
76
+ static void new_script_hook(JSContext *UNUSED(js),
77
+ const char *filename,
78
+ uintN lineno,
79
+ JSScript *UNUSED(script),
80
+ JSFunction *UNUSED(fun),
81
+ void *rb)
82
+ {
83
+ VALUE self = (VALUE)rb;
84
+ VALUE rb_filename = rb_str_new2(filename);
85
+ VALUE rb_linenum = UINT2NUM((unsigned long)lineno);
86
+
87
+ /* FIXME: Pass the rest of this crap to the debugger? */
88
+ rb_funcall(self, rb_intern("new_script_hook"), 2, rb_filename, rb_linenum);
89
+ }
90
+
91
+ static void destroy_script_hook(JSContext *UNUSED(js),
92
+ JSScript *UNUSED(script),
93
+ void *rb)
94
+ {
95
+ VALUE self = (VALUE)rb;
96
+ rb_funcall(self, rb_intern("destroy_script_hook"), 0);
97
+ }
98
+
99
+ static JSTrapStatus debugger_handler(JSContext *js, JSScript *script,
100
+ jsbytecode *pc, jsval *UNUSED(rval), void *rb)
101
+ {
102
+ assert(js);
103
+ assert(rb);
104
+ assert(pc);
105
+
106
+ VALUE self = (VALUE)rb;
107
+ VALUE rb_cx = Data_Wrap_Struct(rb_cObject, NULL, NULL, js);
108
+ VALUE rb_script = Data_Wrap_Struct(rb_cObject, NULL, NULL, script);
109
+ VALUE rb_pc = Data_Wrap_Struct(rb_cObject, NULL, NULL, pc);
110
+
111
+ return NUM2INT(rb_funcall(self, rb_intern("debugger_handler"), 3,
112
+ rb_cx,
113
+ rb_script,
114
+ rb_pc
115
+ ));
116
+ }
117
+
118
+ static void source_handler(const char *filename, uintN lineno,
119
+ jschar *str, size_t length,
120
+ void **UNUSED(listenerTSData), void *rb)
121
+ {
122
+ VALUE self = (VALUE)rb;
123
+ VALUE rb_filename = rb_str_new2(filename);
124
+ VALUE rb_lineno = ULONG2NUM((unsigned long)lineno);
125
+ VALUE rb_str = rb_str_new((char *)str, (signed long)(length * sizeof(jschar)));
126
+
127
+ rb_funcall(self, rb_intern("source_handler"), 3, rb_filename, rb_lineno, rb_str);
128
+ }
129
+
130
+ static void * execute_hook(JSContext *js, JSStackFrame *fp, JSBool before,
131
+ JSBool *ok, void *rb)
132
+ {
133
+ VALUE self = (VALUE)rb;
134
+ VALUE rb_before = JS_TRUE == before ? Qtrue : Qfalse;
135
+ VALUE rb_ok = ok ? Qtrue : Qfalse;
136
+ VALUE rb_js = Data_Wrap_Struct(rb_cObject, NULL, NULL, (void *)js);
137
+ VALUE rb_fp = Data_Wrap_Struct(rb_cObject, NULL, NULL, (void *)fp);
138
+
139
+ rb_funcall(self, rb_intern("execute_hook"), 4, rb_js,rb_fp,rb_before,rb_ok);
140
+ return rb;
141
+ }
142
+
143
+ static void * call_hook(JSContext *UNUSED(js), JSStackFrame *UNUSED(fp), JSBool before,
144
+ JSBool *ok, void *rb)
145
+ {
146
+ VALUE self = (VALUE)rb;
147
+ VALUE rb_before = before ? Qtrue : Qfalse;
148
+ VALUE rb_ok = ok ? Qtrue : Qfalse;
149
+
150
+ rb_funcall(self, rb_intern("call_hook"), 2, rb_before, rb_ok);
151
+ return rb;
152
+ }
153
+
154
+ static void object_hook(JSContext *js, JSObject *obj, JSBool isNew, void *rb)
155
+ {
156
+ assert(rb);
157
+ assert(js);
158
+ assert(obj);
159
+ VALUE self = (VALUE)rb;
160
+
161
+ VALUE rb_is_new = isNew ? Qtrue : Qfalse;
162
+
163
+ rb_funcall(self, rb_intern("object_hook"), 1, rb_is_new);
164
+ }
165
+
166
+ static JSTrapStatus throw_hook(JSContext *UNUSED(js), JSScript *UNUSED(script),
167
+ jsbytecode *pc, jsval *UNUSED(rval), void *rb)
168
+ {
169
+ VALUE self = (VALUE)rb;
170
+ VALUE rb_bytecode = jsop_to_symbol(*pc);
171
+ return NUM2INT(rb_funcall(self, rb_intern("throw_hook"), 1, rb_bytecode));
172
+ }
173
+
174
+ static JSBool debug_error_hook(JSContext *UNUSED(js), const char *message,
175
+ JSErrorReport *UNUSED(report), void *rb)
176
+ {
177
+ VALUE self = (VALUE)rb;
178
+ VALUE rb_message = rb_str_new2(message);
179
+ rb_funcall(self, rb_intern("debug_error_hook"), 1, rb_message);
180
+ return JS_TRUE;
181
+ }
182
+
183
+ static VALUE allocate(VALUE klass)
184
+ {
185
+ JSDebugHooks* debug = calloc(1L, sizeof(JSDebugHooks));
186
+ VALUE self = Data_Wrap_Struct(klass, 0, 0, debug);
187
+
188
+ debug->interruptHandler = interrupt_handler;
189
+ debug->interruptHandlerData = (void *)self;
190
+ debug->newScriptHook = new_script_hook;
191
+ debug->newScriptHookData = (void *)self;
192
+ debug->destroyScriptHook = destroy_script_hook;
193
+ debug->destroyScriptHookData = (void *)self;
194
+ debug->debuggerHandler = debugger_handler;
195
+ debug->debuggerHandlerData = (void *)self;
196
+ debug->sourceHandler = source_handler;
197
+ debug->sourceHandlerData = (void *)self;
198
+ debug->executeHook = execute_hook;
199
+ debug->executeHookData = (void *)self;
200
+ debug->callHook = call_hook;
201
+ debug->callHookData = (void *)self;
202
+ debug->objectHook = object_hook;
203
+ debug->objectHookData = (void *)self;
204
+ debug->throwHook = throw_hook;
205
+ debug->throwHookData = (void *)self;
206
+ debug->debugErrorHook = debug_error_hook;
207
+ debug->debugErrorHookData = (void *)self;
208
+
209
+ return self;
210
+ }
211
+
212
+ void init_Johnson_SpiderMonkey_Debugger(VALUE spidermonkey)
213
+ {
214
+ /* HACK: These comments are *only* to make RDoc happy.
215
+ VALUE johnson = rb_define_module("Johnson");
216
+ VALUE spidermonkey = rb_define_module_under(johnson, "SpiderMonkey");
217
+ */
218
+
219
+ /* This is the debugging hooks used with SpiderMonkey. */
220
+ VALUE debugger = rb_define_class_under(spidermonkey, "Debugger", rb_cObject);
221
+ rb_define_private_method(debugger, "frame_pc", frame_pc, 2);
222
+ rb_define_private_method(debugger, "line_number", line_number, 3);
223
+ rb_define_private_method(debugger, "file_name", file_name, 2);
224
+
225
+ rb_define_alloc_func(debugger, allocate);
226
+ }