johnson 2.0.0.pre1 → 2.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/Manifest.txt +4 -285
  3. data/Rakefile +13 -20
  4. data/ext/tracemonkey/global.cc +4 -1
  5. data/ext/tracemonkey/js.cc +30 -33
  6. data/ext/tracemonkey/runtime.cc +96 -6
  7. data/ext/tracemonkey/split_global.cc +0 -5
  8. data/ext/tracemonkey/tracemonkey.h +2 -2
  9. data/lib/johnson.rb +2 -2
  10. data/lib/johnson/runtime.rb +25 -15
  11. data/lib/johnson/tracemonkey/runtime.rb +6 -3
  12. data/vendor/tracemonkey/config/system-headers +1 -3
  13. data/vendor/tracemonkey/jscntxt.h +5 -2
  14. data/vendor/tracemonkey/jsdbgapi.cpp +9 -1
  15. data/vendor/tracemonkey/jsdbgapi.h +4 -0
  16. data/vendor/tracemonkey/tests/ecma/NativeObjects/browser.js +0 -0
  17. data/vendor/tracemonkey/tests/ecma/NativeObjects/jstests.list +0 -0
  18. data/vendor/tracemonkey/tests/ecma_3_1/Object/jstests.list +1 -1
  19. data/vendor/tracemonkey/tests/js1_3/misc/browser.js +0 -0
  20. data/vendor/tracemonkey/tests/js1_3/misc/jstests.list +0 -0
  21. data/vendor/tracemonkey/tests/js1_5/Regress/jstests.list +4 -4
  22. data/vendor/tracemonkey/tests/js1_5/Scope/jstests.list +1 -1
  23. data/vendor/tracemonkey/tests/js1_5/decompilation/jstests.list +2 -2
  24. data/vendor/tracemonkey/tests/js1_7/decompilation/jstests.list +1 -1
  25. data/vendor/tracemonkey/tests/shell.js +2 -1
  26. metadata +51 -309
  27. data/ext/spidermonkey/context.c +0 -116
  28. data/ext/spidermonkey/context.h +0 -19
  29. data/ext/spidermonkey/conversions.c +0 -361
  30. data/ext/spidermonkey/conversions.h +0 -31
  31. data/ext/spidermonkey/debugger.c +0 -234
  32. data/ext/spidermonkey/debugger.h +0 -10
  33. data/ext/spidermonkey/extconf.rb +0 -32
  34. data/ext/spidermonkey/extensions.c +0 -37
  35. data/ext/spidermonkey/extensions.h +0 -12
  36. data/ext/spidermonkey/global.c +0 -40
  37. data/ext/spidermonkey/global.h +0 -11
  38. data/ext/spidermonkey/idhash.c +0 -16
  39. data/ext/spidermonkey/idhash.h +0 -8
  40. data/ext/spidermonkey/immutable_node.c +0 -1153
  41. data/ext/spidermonkey/immutable_node.c.erb +0 -523
  42. data/ext/spidermonkey/immutable_node.h +0 -22
  43. data/ext/spidermonkey/jroot.h +0 -197
  44. data/ext/spidermonkey/js_land_proxy.c +0 -620
  45. data/ext/spidermonkey/js_land_proxy.h +0 -20
  46. data/ext/spidermonkey/ruby_land_proxy.c +0 -618
  47. data/ext/spidermonkey/ruby_land_proxy.h +0 -38
  48. data/ext/spidermonkey/runtime.c +0 -396
  49. data/ext/spidermonkey/runtime.h +0 -27
  50. data/ext/spidermonkey/spidermonkey.c +0 -22
  51. data/ext/spidermonkey/spidermonkey.h +0 -29
  52. data/lib/johnson/spidermonkey.rb +0 -12
  53. data/lib/johnson/spidermonkey/context.rb +0 -10
  54. data/lib/johnson/spidermonkey/debugger.rb +0 -67
  55. data/lib/johnson/spidermonkey/immutable_node.rb +0 -282
  56. data/lib/johnson/spidermonkey/js_land_proxy.rb +0 -64
  57. data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +0 -242
  58. data/lib/johnson/spidermonkey/ruby_land_proxy.rb +0 -17
  59. data/lib/johnson/spidermonkey/runtime.rb +0 -74
  60. data/test/johnson/spidermonkey/context_test.rb +0 -21
  61. data/test/johnson/spidermonkey/immutable_node_test.rb +0 -34
  62. data/test/johnson/spidermonkey/js_land_proxy_test.rb +0 -273
  63. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +0 -274
  64. data/test/johnson/spidermonkey/runtime_test.rb +0 -41
  65. data/vendor/spidermonkey/.cvsignore +0 -9
  66. data/vendor/spidermonkey/Makefile.in +0 -449
  67. data/vendor/spidermonkey/Makefile.ref +0 -365
  68. data/vendor/spidermonkey/README.html +0 -820
  69. data/vendor/spidermonkey/SpiderMonkey.rsp +0 -12
  70. data/vendor/spidermonkey/Y.js +0 -19
  71. data/vendor/spidermonkey/build.mk +0 -43
  72. data/vendor/spidermonkey/config.mk +0 -192
  73. data/vendor/spidermonkey/config/AIX4.1.mk +0 -65
  74. data/vendor/spidermonkey/config/AIX4.2.mk +0 -64
  75. data/vendor/spidermonkey/config/AIX4.3.mk +0 -65
  76. data/vendor/spidermonkey/config/Darwin.mk +0 -83
  77. data/vendor/spidermonkey/config/Darwin1.3.mk +0 -81
  78. data/vendor/spidermonkey/config/Darwin1.4.mk +0 -41
  79. data/vendor/spidermonkey/config/Darwin5.2.mk +0 -81
  80. data/vendor/spidermonkey/config/Darwin5.3.mk +0 -81
  81. data/vendor/spidermonkey/config/HP-UXB.10.10.mk +0 -77
  82. data/vendor/spidermonkey/config/HP-UXB.10.20.mk +0 -77
  83. data/vendor/spidermonkey/config/HP-UXB.11.00.mk +0 -80
  84. data/vendor/spidermonkey/config/IRIX.mk +0 -87
  85. data/vendor/spidermonkey/config/IRIX5.3.mk +0 -44
  86. data/vendor/spidermonkey/config/IRIX6.1.mk +0 -44
  87. data/vendor/spidermonkey/config/IRIX6.2.mk +0 -44
  88. data/vendor/spidermonkey/config/IRIX6.3.mk +0 -44
  89. data/vendor/spidermonkey/config/IRIX6.5.mk +0 -44
  90. data/vendor/spidermonkey/config/Linux_All.mk +0 -103
  91. data/vendor/spidermonkey/config/Mac_OS10.0.mk +0 -82
  92. data/vendor/spidermonkey/config/OSF1V4.0.mk +0 -72
  93. data/vendor/spidermonkey/config/OSF1V5.0.mk +0 -69
  94. data/vendor/spidermonkey/config/SunOS4.1.4.mk +0 -101
  95. data/vendor/spidermonkey/config/SunOS5.10.mk +0 -50
  96. data/vendor/spidermonkey/config/SunOS5.3.mk +0 -91
  97. data/vendor/spidermonkey/config/SunOS5.4.mk +0 -92
  98. data/vendor/spidermonkey/config/SunOS5.5.1.mk +0 -44
  99. data/vendor/spidermonkey/config/SunOS5.5.mk +0 -87
  100. data/vendor/spidermonkey/config/SunOS5.6.mk +0 -89
  101. data/vendor/spidermonkey/config/SunOS5.7.mk +0 -44
  102. data/vendor/spidermonkey/config/SunOS5.8.mk +0 -44
  103. data/vendor/spidermonkey/config/SunOS5.9.mk +0 -44
  104. data/vendor/spidermonkey/config/WINNT4.0.mk +0 -117
  105. data/vendor/spidermonkey/config/WINNT5.0.mk +0 -117
  106. data/vendor/spidermonkey/config/WINNT5.1.mk +0 -117
  107. data/vendor/spidermonkey/config/WINNT5.2.mk +0 -117
  108. data/vendor/spidermonkey/config/WINNT6.0.mk +0 -117
  109. data/vendor/spidermonkey/config/dgux.mk +0 -64
  110. data/vendor/spidermonkey/editline/Makefile.ref +0 -144
  111. data/vendor/spidermonkey/editline/README +0 -83
  112. data/vendor/spidermonkey/editline/editline.3 +0 -175
  113. data/vendor/spidermonkey/editline/editline.c +0 -1369
  114. data/vendor/spidermonkey/editline/editline.h +0 -135
  115. data/vendor/spidermonkey/editline/sysunix.c +0 -182
  116. data/vendor/spidermonkey/editline/unix.h +0 -82
  117. data/vendor/spidermonkey/fdlibm/.cvsignore +0 -7
  118. data/vendor/spidermonkey/fdlibm/Makefile.in +0 -127
  119. data/vendor/spidermonkey/fdlibm/Makefile.ref +0 -192
  120. data/vendor/spidermonkey/fdlibm/e_acos.c +0 -147
  121. data/vendor/spidermonkey/fdlibm/e_acosh.c +0 -105
  122. data/vendor/spidermonkey/fdlibm/e_asin.c +0 -156
  123. data/vendor/spidermonkey/fdlibm/e_atan2.c +0 -165
  124. data/vendor/spidermonkey/fdlibm/e_atanh.c +0 -110
  125. data/vendor/spidermonkey/fdlibm/e_cosh.c +0 -133
  126. data/vendor/spidermonkey/fdlibm/e_exp.c +0 -202
  127. data/vendor/spidermonkey/fdlibm/e_fmod.c +0 -184
  128. data/vendor/spidermonkey/fdlibm/e_gamma.c +0 -71
  129. data/vendor/spidermonkey/fdlibm/e_gamma_r.c +0 -70
  130. data/vendor/spidermonkey/fdlibm/e_hypot.c +0 -173
  131. data/vendor/spidermonkey/fdlibm/e_j0.c +0 -524
  132. data/vendor/spidermonkey/fdlibm/e_j1.c +0 -523
  133. data/vendor/spidermonkey/fdlibm/e_jn.c +0 -315
  134. data/vendor/spidermonkey/fdlibm/e_lgamma.c +0 -71
  135. data/vendor/spidermonkey/fdlibm/e_lgamma_r.c +0 -347
  136. data/vendor/spidermonkey/fdlibm/e_log.c +0 -184
  137. data/vendor/spidermonkey/fdlibm/e_log10.c +0 -134
  138. data/vendor/spidermonkey/fdlibm/e_pow.c +0 -386
  139. data/vendor/spidermonkey/fdlibm/e_rem_pio2.c +0 -222
  140. data/vendor/spidermonkey/fdlibm/e_remainder.c +0 -120
  141. data/vendor/spidermonkey/fdlibm/e_scalb.c +0 -89
  142. data/vendor/spidermonkey/fdlibm/e_sinh.c +0 -122
  143. data/vendor/spidermonkey/fdlibm/e_sqrt.c +0 -497
  144. data/vendor/spidermonkey/fdlibm/fdlibm.h +0 -273
  145. data/vendor/spidermonkey/fdlibm/fdlibm.mak +0 -1453
  146. data/vendor/spidermonkey/fdlibm/fdlibm.mdp +0 -0
  147. data/vendor/spidermonkey/fdlibm/k_cos.c +0 -135
  148. data/vendor/spidermonkey/fdlibm/k_rem_pio2.c +0 -354
  149. data/vendor/spidermonkey/fdlibm/k_sin.c +0 -114
  150. data/vendor/spidermonkey/fdlibm/k_standard.c +0 -785
  151. data/vendor/spidermonkey/fdlibm/k_tan.c +0 -170
  152. data/vendor/spidermonkey/fdlibm/s_asinh.c +0 -101
  153. data/vendor/spidermonkey/fdlibm/s_atan.c +0 -175
  154. data/vendor/spidermonkey/fdlibm/s_cbrt.c +0 -133
  155. data/vendor/spidermonkey/fdlibm/s_ceil.c +0 -120
  156. data/vendor/spidermonkey/fdlibm/s_copysign.c +0 -72
  157. data/vendor/spidermonkey/fdlibm/s_cos.c +0 -118
  158. data/vendor/spidermonkey/fdlibm/s_erf.c +0 -356
  159. data/vendor/spidermonkey/fdlibm/s_expm1.c +0 -267
  160. data/vendor/spidermonkey/fdlibm/s_fabs.c +0 -70
  161. data/vendor/spidermonkey/fdlibm/s_finite.c +0 -71
  162. data/vendor/spidermonkey/fdlibm/s_floor.c +0 -121
  163. data/vendor/spidermonkey/fdlibm/s_frexp.c +0 -99
  164. data/vendor/spidermonkey/fdlibm/s_ilogb.c +0 -85
  165. data/vendor/spidermonkey/fdlibm/s_isnan.c +0 -74
  166. data/vendor/spidermonkey/fdlibm/s_ldexp.c +0 -66
  167. data/vendor/spidermonkey/fdlibm/s_lib_version.c +0 -73
  168. data/vendor/spidermonkey/fdlibm/s_log1p.c +0 -211
  169. data/vendor/spidermonkey/fdlibm/s_logb.c +0 -79
  170. data/vendor/spidermonkey/fdlibm/s_matherr.c +0 -64
  171. data/vendor/spidermonkey/fdlibm/s_modf.c +0 -132
  172. data/vendor/spidermonkey/fdlibm/s_nextafter.c +0 -124
  173. data/vendor/spidermonkey/fdlibm/s_rint.c +0 -131
  174. data/vendor/spidermonkey/fdlibm/s_scalbn.c +0 -107
  175. data/vendor/spidermonkey/fdlibm/s_signgam.c +0 -40
  176. data/vendor/spidermonkey/fdlibm/s_significand.c +0 -68
  177. data/vendor/spidermonkey/fdlibm/s_sin.c +0 -118
  178. data/vendor/spidermonkey/fdlibm/s_tan.c +0 -112
  179. data/vendor/spidermonkey/fdlibm/s_tanh.c +0 -122
  180. data/vendor/spidermonkey/fdlibm/w_acos.c +0 -78
  181. data/vendor/spidermonkey/fdlibm/w_acosh.c +0 -78
  182. data/vendor/spidermonkey/fdlibm/w_asin.c +0 -80
  183. data/vendor/spidermonkey/fdlibm/w_atan2.c +0 -79
  184. data/vendor/spidermonkey/fdlibm/w_atanh.c +0 -81
  185. data/vendor/spidermonkey/fdlibm/w_cosh.c +0 -77
  186. data/vendor/spidermonkey/fdlibm/w_exp.c +0 -88
  187. data/vendor/spidermonkey/fdlibm/w_fmod.c +0 -78
  188. data/vendor/spidermonkey/fdlibm/w_gamma.c +0 -85
  189. data/vendor/spidermonkey/fdlibm/w_gamma_r.c +0 -81
  190. data/vendor/spidermonkey/fdlibm/w_hypot.c +0 -78
  191. data/vendor/spidermonkey/fdlibm/w_j0.c +0 -105
  192. data/vendor/spidermonkey/fdlibm/w_j1.c +0 -106
  193. data/vendor/spidermonkey/fdlibm/w_jn.c +0 -128
  194. data/vendor/spidermonkey/fdlibm/w_lgamma.c +0 -85
  195. data/vendor/spidermonkey/fdlibm/w_lgamma_r.c +0 -81
  196. data/vendor/spidermonkey/fdlibm/w_log.c +0 -78
  197. data/vendor/spidermonkey/fdlibm/w_log10.c +0 -81
  198. data/vendor/spidermonkey/fdlibm/w_pow.c +0 -99
  199. data/vendor/spidermonkey/fdlibm/w_remainder.c +0 -77
  200. data/vendor/spidermonkey/fdlibm/w_scalb.c +0 -95
  201. data/vendor/spidermonkey/fdlibm/w_sinh.c +0 -77
  202. data/vendor/spidermonkey/fdlibm/w_sqrt.c +0 -77
  203. data/vendor/spidermonkey/javascript-trace.d +0 -73
  204. data/vendor/spidermonkey/js.c +0 -3951
  205. data/vendor/spidermonkey/js.mdp +0 -0
  206. data/vendor/spidermonkey/js.msg +0 -308
  207. data/vendor/spidermonkey/js.pkg +0 -2
  208. data/vendor/spidermonkey/js3240.rc +0 -79
  209. data/vendor/spidermonkey/jsOS240.def +0 -654
  210. data/vendor/spidermonkey/jsapi.c +0 -5836
  211. data/vendor/spidermonkey/jsapi.h +0 -2624
  212. data/vendor/spidermonkey/jsarena.c +0 -450
  213. data/vendor/spidermonkey/jsarena.h +0 -318
  214. data/vendor/spidermonkey/jsarray.c +0 -2996
  215. data/vendor/spidermonkey/jsarray.h +0 -127
  216. data/vendor/spidermonkey/jsatom.c +0 -1045
  217. data/vendor/spidermonkey/jsatom.h +0 -442
  218. data/vendor/spidermonkey/jsbit.h +0 -253
  219. data/vendor/spidermonkey/jsbool.c +0 -176
  220. data/vendor/spidermonkey/jsbool.h +0 -73
  221. data/vendor/spidermonkey/jsclist.h +0 -139
  222. data/vendor/spidermonkey/jscntxt.c +0 -1348
  223. data/vendor/spidermonkey/jscntxt.h +0 -1120
  224. data/vendor/spidermonkey/jscompat.h +0 -57
  225. data/vendor/spidermonkey/jsconfig.h +0 -248
  226. data/vendor/spidermonkey/jsconfig.mk +0 -181
  227. data/vendor/spidermonkey/jscpucfg.c +0 -396
  228. data/vendor/spidermonkey/jscpucfg.h +0 -212
  229. data/vendor/spidermonkey/jsdate.c +0 -2390
  230. data/vendor/spidermonkey/jsdate.h +0 -124
  231. data/vendor/spidermonkey/jsdbgapi.c +0 -1802
  232. data/vendor/spidermonkey/jsdbgapi.h +0 -464
  233. data/vendor/spidermonkey/jsdhash.c +0 -868
  234. data/vendor/spidermonkey/jsdhash.h +0 -592
  235. data/vendor/spidermonkey/jsdtoa.c +0 -3167
  236. data/vendor/spidermonkey/jsdtoa.h +0 -130
  237. data/vendor/spidermonkey/jsdtracef.c +0 -317
  238. data/vendor/spidermonkey/jsdtracef.h +0 -77
  239. data/vendor/spidermonkey/jsemit.c +0 -6909
  240. data/vendor/spidermonkey/jsemit.h +0 -741
  241. data/vendor/spidermonkey/jsexn.c +0 -1371
  242. data/vendor/spidermonkey/jsexn.h +0 -96
  243. data/vendor/spidermonkey/jsfile.c +0 -2736
  244. data/vendor/spidermonkey/jsfile.h +0 -56
  245. data/vendor/spidermonkey/jsfile.msg +0 -90
  246. data/vendor/spidermonkey/jsfun.c +0 -2634
  247. data/vendor/spidermonkey/jsfun.h +0 -254
  248. data/vendor/spidermonkey/jsgc.c +0 -3562
  249. data/vendor/spidermonkey/jsgc.h +0 -403
  250. data/vendor/spidermonkey/jshash.c +0 -476
  251. data/vendor/spidermonkey/jshash.h +0 -151
  252. data/vendor/spidermonkey/jsify.pl +0 -485
  253. data/vendor/spidermonkey/jsinterp.c +0 -7007
  254. data/vendor/spidermonkey/jsinterp.h +0 -525
  255. data/vendor/spidermonkey/jsinvoke.c +0 -43
  256. data/vendor/spidermonkey/jsiter.c +0 -1067
  257. data/vendor/spidermonkey/jsiter.h +0 -122
  258. data/vendor/spidermonkey/jskeyword.tbl +0 -124
  259. data/vendor/spidermonkey/jskwgen.c +0 -460
  260. data/vendor/spidermonkey/jslibmath.h +0 -266
  261. data/vendor/spidermonkey/jslock.c +0 -1309
  262. data/vendor/spidermonkey/jslock.h +0 -313
  263. data/vendor/spidermonkey/jslocko.asm +0 -60
  264. data/vendor/spidermonkey/jslog2.c +0 -94
  265. data/vendor/spidermonkey/jslong.c +0 -264
  266. data/vendor/spidermonkey/jslong.h +0 -412
  267. data/vendor/spidermonkey/jsmath.c +0 -567
  268. data/vendor/spidermonkey/jsmath.h +0 -57
  269. data/vendor/spidermonkey/jsnum.c +0 -1239
  270. data/vendor/spidermonkey/jsnum.h +0 -283
  271. data/vendor/spidermonkey/jsobj.c +0 -5282
  272. data/vendor/spidermonkey/jsobj.h +0 -709
  273. data/vendor/spidermonkey/jsopcode.c +0 -5245
  274. data/vendor/spidermonkey/jsopcode.h +0 -394
  275. data/vendor/spidermonkey/jsopcode.tbl +0 -523
  276. data/vendor/spidermonkey/jsotypes.h +0 -202
  277. data/vendor/spidermonkey/jsparse.c +0 -6704
  278. data/vendor/spidermonkey/jsparse.h +0 -511
  279. data/vendor/spidermonkey/jsprf.c +0 -1264
  280. data/vendor/spidermonkey/jsprf.h +0 -150
  281. data/vendor/spidermonkey/jsproto.tbl +0 -128
  282. data/vendor/spidermonkey/jsprvtd.h +0 -267
  283. data/vendor/spidermonkey/jspubtd.h +0 -744
  284. data/vendor/spidermonkey/jsregexp.c +0 -4364
  285. data/vendor/spidermonkey/jsregexp.h +0 -183
  286. data/vendor/spidermonkey/jsreops.tbl +0 -145
  287. data/vendor/spidermonkey/jsscan.c +0 -2012
  288. data/vendor/spidermonkey/jsscan.h +0 -387
  289. data/vendor/spidermonkey/jsscope.c +0 -1957
  290. data/vendor/spidermonkey/jsscope.h +0 -418
  291. data/vendor/spidermonkey/jsscript.c +0 -1832
  292. data/vendor/spidermonkey/jsscript.h +0 -287
  293. data/vendor/spidermonkey/jsshell.msg +0 -50
  294. data/vendor/spidermonkey/jsstddef.h +0 -83
  295. data/vendor/spidermonkey/jsstr.c +0 -5005
  296. data/vendor/spidermonkey/jsstr.h +0 -641
  297. data/vendor/spidermonkey/jstypes.h +0 -475
  298. data/vendor/spidermonkey/jsutil.c +0 -345
  299. data/vendor/spidermonkey/jsutil.h +0 -157
  300. data/vendor/spidermonkey/jsxdrapi.c +0 -800
  301. data/vendor/spidermonkey/jsxdrapi.h +0 -218
  302. data/vendor/spidermonkey/jsxml.c +0 -8476
  303. data/vendor/spidermonkey/jsxml.h +0 -349
  304. data/vendor/spidermonkey/lock_SunOS.s +0 -119
  305. data/vendor/spidermonkey/perfect.js +0 -39
  306. data/vendor/spidermonkey/plify_jsdhash.sed +0 -36
  307. data/vendor/spidermonkey/prmjtime.c +0 -846
  308. data/vendor/spidermonkey/prmjtime.h +0 -103
  309. data/vendor/spidermonkey/resource.h +0 -15
  310. data/vendor/spidermonkey/rules.mk +0 -197
  311. data/vendor/spidermonkey/win32.order +0 -384
@@ -1,116 +0,0 @@
1
- #include "context.h"
2
- #include "conversions.h"
3
- #include "global.h"
4
- #include "extensions.h"
5
- #include "idhash.h"
6
- #include "jsdbgapi.h"
7
-
8
- // callback for JS_SetErrorReporter
9
- static void report_js_error(JSContext* js, const char* message, JSErrorReport* UNUSED(report))
10
- {
11
- // first we find ourselves
12
- VALUE self = (VALUE)JS_GetContextPrivate(js);
13
-
14
- // then we find our bridge
15
- JohnsonContext* context;
16
- Data_Get_Struct(self, JohnsonContext, context);
17
-
18
- // NOTE: SpiderMonkey REALLY doesn't like being interrupted. If we
19
- // jump over to Ruby and raise here, segfaults and such ensue.
20
- // Instead, we store the exception (if any) and the error message
21
- // on the context. They're dealt with in the if (!ok) block of evaluate().
22
-
23
- strncpy(context->msg, message, MAX_EXCEPTION_MESSAGE_SIZE);
24
- JS_GetPendingException(context->js, &context->ex);
25
- }
26
-
27
- // callback for JS_SetBranchCallback
28
- static JSBool branch_callback(JSContext* js, JSScript* UNUSED(script))
29
- {
30
- static unsigned long branch_counter = 0;
31
- if( ++branch_counter % 0x1000 == 0 )
32
- JS_MaybeGC( js );
33
- return JS_TRUE;
34
- }
35
-
36
- /*
37
- * call-seq:
38
- * native_initialize(runtime, options)
39
- *
40
- * Create the underlying SpiderMonkey context. This must be called
41
- * first, and only once. Called by +initialize+ by default.
42
- */
43
- static VALUE
44
- initialize_native(VALUE self, VALUE rb_runtime, VALUE UNUSED(options))
45
- {
46
- JohnsonContext* context;
47
- JohnsonRuntime* runtime;
48
-
49
- Data_Get_Struct(self, JohnsonContext, context);
50
- Data_Get_Struct(rb_runtime, JohnsonRuntime, runtime);
51
-
52
- if ((context->js = JS_NewContext(runtime->js, 8192L)))
53
- {
54
- // See if the runtime already has a shared global object.
55
- JSObject* global = runtime->global;
56
-
57
- // If it does, use it. If not,
58
- if (!global)
59
- // create one of our global objects.
60
- global = johnson_create_global_object(context->js);
61
-
62
- // Manually set the context's global object.
63
- JS_SetGlobalObject(context->js, global);
64
- JS_SetErrorReporter(context->js, report_js_error);
65
- JS_SetBranchCallback(context->js, branch_callback);
66
- JS_SetContextPrivate(context->js, (void *)self);
67
-
68
- JS_SetOptions(context->js, JS_GetOptions(context->js)
69
- #ifdef JSOPTION_DONT_REPORT_UNCAUGHT
70
- | JSOPTION_DONT_REPORT_UNCAUGHT
71
- #endif
72
- #ifdef JSOPTION_VAROBJFIX
73
- | JSOPTION_VAROBJFIX
74
- #endif
75
- // #ifdef JSOPTION_XML
76
- // | JSOPTION_XML
77
- // #endif
78
- );
79
-
80
- // Success.
81
- return init_spidermonkey_extensions(context, self);
82
- }
83
-
84
- if (context->js) JS_DestroyContext(context->js);
85
-
86
- rb_raise(rb_eRuntimeError, "Failed to initialize SpiderMonkey context");
87
- }
88
-
89
- ///////////////////////////////////////////////////////////////////////////
90
- //// INFRASTRUCTURE BELOW HERE ////////////////////////////////////////////
91
- ///////////////////////////////////////////////////////////////////////////
92
-
93
- static VALUE allocate(VALUE klass)
94
- {
95
- JohnsonContext* context = calloc(1L, sizeof(JohnsonContext));
96
- return Data_Wrap_Struct(klass, 0, 0, context);
97
- }
98
-
99
- void init_Johnson_SpiderMonkey_Context(VALUE spidermonkey)
100
- {
101
- /* HACK: These comments are *only* to make RDoc happy.
102
- VALUE johnson = rb_define_module("Johnson");
103
- VALUE spidermonkey = rb_define_module_under(johnson, "SpiderMonkey");
104
- */
105
-
106
- /* This is the private context used for SpiderMonkey. */
107
- VALUE context = rb_define_class_under(spidermonkey, "Context", rb_cObject);
108
-
109
- rb_define_alloc_func(context, allocate);
110
- rb_define_private_method(context, "initialize_native", initialize_native, 2);
111
- }
112
-
113
- VALUE Johnson_SpiderMonkey_JSLandProxy()
114
- {
115
- return rb_eval_string("Johnson::SpiderMonkey::JSLandProxy");
116
- }
@@ -1,19 +0,0 @@
1
- #ifndef JOHNSON_SPIDERMONKEY_CONTEXT_H
2
- #define JOHNSON_SPIDERMONKEY_CONTEXT_H
3
-
4
- #include "spidermonkey.h"
5
-
6
- #define MAX_EXCEPTION_MESSAGE_SIZE 2048L
7
-
8
- typedef struct {
9
- JSContext *js;
10
-
11
- jsval ex; // an exception value
12
- char msg[MAX_EXCEPTION_MESSAGE_SIZE]; // the 'backup' message
13
-
14
- } JohnsonContext;
15
-
16
- void init_Johnson_SpiderMonkey_Context(VALUE spidermonkey);
17
- VALUE Johnson_SpiderMonkey_JSLandProxy();
18
-
19
- #endif
@@ -1,361 +0,0 @@
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
- DEFINE_RUBY_WRAPPER(convert_js_string_to_ruby, convert_js_string_to_ruby, ARGLIST2(runtime, str))
8
-
9
- static VALUE convert_regexp_to_ruby(JohnsonRuntime* runtime, jsval regexp);
10
- DECLARE_RUBY_WRAPPER(convert_regexp_to_ruby, JohnsonRuntime* runtime; jsval regexp)
11
- DEFINE_RUBY_WRAPPER(convert_regexp_to_ruby, convert_regexp_to_ruby, ARGLIST2(runtime, regexp))
12
-
13
- DEFINE_RUBY_WRAPPER(rb_funcall_0, rb_funcall, ARGLIST3(obj, sym, argc))
14
- DEFINE_RUBY_WRAPPER(rb_funcall_1, rb_funcall, ARGLIST4(obj, sym, argc, a))
15
- DEFINE_RUBY_WRAPPER(rb_funcall_2, rb_funcall, ARGLIST5(obj, sym, argc, a, b))
16
-
17
- DECLARE_RUBY_WRAPPER(rb_float_new, double v)
18
- DEFINE_RUBY_WRAPPER(rb_float_new, rb_float_new, ARGLIST1(v))
19
-
20
- DEFINE_RUBY_WRAPPER(rb_intern, rb_intern, ARGLIST1(name))
21
-
22
- static JSBool convert_float_or_bignum_to_js(JohnsonRuntime* runtime, VALUE float_or_bignum, jsval* retval)
23
- {
24
- JSContext * context = johnson_get_current_context(runtime);
25
- return JS_NewDoubleValue(context, NUM2DBL(float_or_bignum), retval);
26
- }
27
-
28
- static JSBool convert_symbol_to_js(JohnsonRuntime* runtime, VALUE symbol, jsval* retval)
29
- {
30
- JSContext * context = johnson_get_current_context(runtime);
31
- PREPARE_JROOTS(context, 2);
32
-
33
- VALUE to_s = CALL_RUBY_WRAPPER(rb_funcall_0, symbol, RB_INTERN("to_s"), 0);
34
- CALL_RUBY_WRAPPER(rb_string_value, &to_s);
35
- jsval name = STRING_TO_JSVAL(JS_NewStringCopyN(context, StringValuePtr(to_s), (size_t) StringValueLen(to_s)));
36
-
37
- JROOT(name);
38
-
39
- // calls Johnson.symbolize(name) in JS-land. See lib/prelude.js
40
-
41
- jsval nsJohnson;
42
- JCHECK(JS_GetProperty(context, runtime->global, "Johnson", &nsJohnson));
43
- JROOT(nsJohnson);
44
-
45
- JCHECK(JS_CallFunctionName(context, JSVAL_TO_OBJECT(nsJohnson), "symbolize", 1, &name, retval));
46
-
47
- JRETURN;
48
- }
49
-
50
- static JSBool convert_regexp_to_js(JohnsonRuntime* runtime, VALUE regexp, jsval* retval)
51
- {
52
- JSContext * context = johnson_get_current_context(runtime);
53
- PREPARE_JROOTS(context, 0);
54
- VALUE source = rb_funcall(regexp, RB_INTERN("source"), 0);
55
- CALL_RUBY_WRAPPER(rb_string_value, &source);
56
- jsint options = (jsint)(NUM2INT(rb_funcall(regexp, RB_INTERN("options"), 0)));
57
-
58
- JSObject* obj = JS_NewRegExpObject(context,
59
- StringValuePtr(source),
60
- (size_t) StringValueLen(source),
61
- (unsigned) options);
62
-
63
- JCHECK(obj);
64
- *retval = OBJECT_TO_JSVAL(obj);
65
- JRETURN;
66
- }
67
-
68
- JSBool convert_to_js(JohnsonRuntime* runtime, VALUE ruby, jsval* retval)
69
- {
70
- JSContext * context = johnson_get_current_context(runtime);
71
- PREPARE_JROOTS(context, 0);
72
- switch(TYPE(ruby))
73
- {
74
- case T_NONE:
75
- JERROR("I don't know how to handle T_NONE.");
76
- JRETURN;
77
-
78
- case T_ICLASS:
79
- JERROR("I don't know how to handle T_ICLASS.");
80
- JRETURN;
81
-
82
- case T_MATCH:
83
- JERROR("I don't know how to handle T_MATCH.");
84
- JRETURN;
85
-
86
- case T_BLKTAG:
87
- JERROR("I don't know how to handle T_BLKTAG.");
88
- JRETURN;
89
-
90
- case T_NODE:
91
- JERROR("I don't know how to handle T_NODE | T_MASK.");
92
- JRETURN;
93
-
94
- case T_UNDEF:
95
- JERROR("I don't know how to handle T_UNDEF.");
96
- JRETURN;
97
-
98
- case T_VARMAP:
99
- JERROR("I don't know how to handle T_VARMAP.");
100
- JRETURN;
101
-
102
- case T_NIL:
103
- *retval = JSVAL_NULL;
104
- JRETURN;
105
-
106
- case T_TRUE:
107
- *retval = JSVAL_TRUE;
108
- JRETURN;
109
-
110
- case T_FALSE:
111
- *retval = JSVAL_FALSE;
112
- JRETURN;
113
-
114
- case T_STRING:
115
- {
116
- CALL_RUBY_WRAPPER(rb_string_value, &ruby);
117
- const char * src = StringValuePtr(ruby);
118
- const size_t srclen = StringValueLen(ruby);
119
- size_t dstlen = 0;
120
- JCHECK(JS_DecodeBytes(context, src, srclen, NULL, &dstlen));
121
- jschar* dstchars = JS_malloc(context, sizeof(jschar) * (1 + dstlen));
122
- JCHECK(dstchars);
123
- JCHECK(JS_DecodeBytes(context, src, srclen, dstchars, &dstlen));
124
- JSString* str = JS_NewUCString(context, dstchars, dstlen);
125
- JCHECK(str);
126
- *retval = STRING_TO_JSVAL(str);
127
- JRETURN;
128
- }
129
-
130
- case T_FIXNUM:
131
- {
132
- long val = NUM2LONG(ruby);
133
- if (val >= JSVAL_INT_MIN && val <= JSVAL_INT_MAX)
134
- {
135
- *retval = INT_TO_JSVAL((jsint)val);
136
- JRETURN;
137
- }
138
- }
139
-
140
- case T_FLOAT:
141
- case T_BIGNUM:
142
- JCHECK(convert_float_or_bignum_to_js(runtime, ruby, retval));
143
- JRETURN;
144
-
145
- case T_SYMBOL:
146
- JCHECK(convert_symbol_to_js(runtime, ruby, retval));
147
- JRETURN;
148
-
149
- case T_CLASS:
150
- case T_ARRAY:
151
- case T_HASH:
152
- case T_MODULE:
153
- case T_FILE:
154
- case T_STRUCT:
155
- case T_OBJECT:
156
- JCHECK(make_js_land_proxy(runtime, ruby, retval));
157
- JRETURN;
158
-
159
- case T_REGEXP:
160
- JCHECK(convert_regexp_to_js(runtime, ruby, retval));
161
- JRETURN;
162
-
163
- case T_DATA:
164
- if (ruby_value_is_proxy(ruby))
165
- JCHECK(unwrap_ruby_land_proxy(runtime, ruby, retval));
166
- else // If we can't identify the object, just wrap it
167
- JCHECK(make_js_land_proxy(runtime, ruby, retval));
168
- JRETURN;
169
-
170
- default:
171
- JERROR("unknown ruby type in switch");
172
- }
173
-
174
- *retval = JSVAL_NULL;
175
- JRETURN;
176
- }
177
-
178
- VALUE convert_js_string_to_ruby(JohnsonRuntime* runtime, JSString* str)
179
- {
180
- JSContext * context = johnson_get_current_context(runtime);
181
- PREPARE_RUBY_JROOTS(context, 1);
182
- JROOT(str);
183
- jschar* src = JS_GetStringChars(str);
184
- JCHECK(src);
185
- size_t srclen = JS_GetStringLength(str);
186
- size_t dstlen = 0;
187
- JCHECK(JS_EncodeCharacters(context, src, srclen, NULL, &dstlen));
188
- char* dst = JS_malloc(context, sizeof(char) * (1 + dstlen));
189
- JCHECK(dst);
190
- JCHECK(JS_EncodeCharacters(context, src, srclen, dst, &dstlen));
191
- // This will leak dst if rb_str_new raises
192
- VALUE ruby_str = rb_str_new(dst, dstlen);
193
- JS_free(context, dst);
194
- JRETURN_RUBY(ruby_str);
195
- }
196
-
197
- static VALUE convert_regexp_to_ruby(JohnsonRuntime* runtime, jsval regexp)
198
- {
199
- JSContext * context = johnson_get_current_context(runtime);
200
- PREPARE_RUBY_JROOTS(context, 1);
201
- JROOT(regexp);
202
- JSRegExp* re = (JSRegExp*)JS_GetPrivate(context, JSVAL_TO_OBJECT(regexp));
203
-
204
- JRETURN_RUBY(RB_FUNCALL_2(rb_cRegexp, RB_INTERN("new"),
205
- CONVERT_JS_STRING_TO_RUBY(runtime, re->source),
206
- INT2NUM((long)re->flags)));
207
- }
208
-
209
- static JSBool js_value_is_regexp(JohnsonRuntime* runtime, jsval maybe_regexp, bool* is_regexp)
210
- {
211
- JSContext * context = johnson_get_current_context(runtime);
212
- PREPARE_JROOTS(context, 1);
213
- JROOT(maybe_regexp);
214
- JSBool result = JS_InstanceOf(context, JSVAL_TO_OBJECT(maybe_regexp), &js_RegExpClass, NULL);
215
- *is_regexp = (result ? true : false);
216
- JRETURN;
217
- }
218
-
219
- static JSBool js_value_is_symbol(JohnsonRuntime* runtime, jsval maybe_symbol, bool* is_symbol)
220
- {
221
- jsval nsJohnson, cSymbol;
222
- JSContext * context = johnson_get_current_context(runtime);
223
-
224
- PREPARE_JROOTS(context, 3);
225
- JROOT(maybe_symbol);
226
-
227
- JCHECK(JS_GetProperty(context, runtime->global, "Johnson", &nsJohnson));
228
- if (!JSVAL_IS_OBJECT(nsJohnson))
229
- JERROR("Unable to retrieve Johnson from JSLand");
230
- JROOT(nsJohnson);
231
-
232
- JCHECK(JS_GetProperty(context, JSVAL_TO_OBJECT(nsJohnson), "Symbol", &cSymbol));
233
- if (!JSVAL_IS_OBJECT(cSymbol))
234
- JERROR("Unable to retrieve Johnson.Symbol from JSLand");
235
- JROOT(cSymbol);
236
-
237
- JSBool is_a_symbol;
238
- JCHECK(JS_HasInstance(context, JSVAL_TO_OBJECT(cSymbol), maybe_symbol, &is_a_symbol));
239
-
240
- *is_symbol = (is_a_symbol != JS_FALSE);
241
- JRETURN;
242
- }
243
-
244
- VALUE convert_to_ruby(JohnsonRuntime* runtime, jsval js)
245
- {
246
- if (JSVAL_NULL == js) return Qnil;
247
-
248
- JSContext * context = johnson_get_current_context(runtime);
249
-
250
- PREPARE_RUBY_JROOTS(context, 1);
251
- JROOT(js);
252
-
253
- switch (JS_TypeOfValue(context, js))
254
- {
255
- case JSTYPE_VOID:
256
- JRETURN_RUBY(Qnil);
257
-
258
- case JSTYPE_FUNCTION:
259
- case JSTYPE_OBJECT:
260
- if (OBJECT_TO_JSVAL(runtime->global) == js)
261
- // global gets special treatment, since the Prelude might not be loaded
262
- JRETURN_RUBY(CALL_RUBY_WRAPPER(make_ruby_land_proxy, runtime, js, "GlobalProxy"));
263
-
264
- // this conditional requires the Prelude
265
- bool is_symbol = false;
266
- JCHECK(js_value_is_symbol(runtime, js, &is_symbol));
267
- if (is_symbol)
268
- JRETURN_RUBY(ID2SYM(RB_INTERN(JS_GetStringBytes(JS_ValueToString(context, js)))));
269
-
270
- if (js_value_is_proxy(runtime, js))
271
- JRETURN_RUBY(unwrap_js_land_proxy(runtime, js));
272
-
273
- bool is_regexp = false;
274
- JCHECK(js_value_is_regexp(runtime, js, &is_regexp));
275
- if (is_regexp)
276
- JRETURN_RUBY(CALL_RUBY_WRAPPER(convert_regexp_to_ruby, runtime, js));
277
-
278
- JRETURN_RUBY(CALL_RUBY_WRAPPER(make_ruby_land_proxy, runtime, js, LEAKY_ROOT_NAME("RubyLandProxy", JS_GetStringBytes(JS_ValueToString(context, js)))));
279
-
280
- case JSTYPE_BOOLEAN:
281
- JRETURN_RUBY(JSVAL_TRUE == js ? Qtrue : Qfalse);
282
-
283
- case JSTYPE_STRING:
284
- JRETURN_RUBY(CONVERT_JS_STRING_TO_RUBY(runtime, JSVAL_TO_STRING(js)));
285
-
286
- case JSTYPE_NUMBER:
287
- if (JSVAL_IS_INT(js)) JRETURN_RUBY(INT2FIX(JSVAL_TO_INT(js)));
288
- else JRETURN_RUBY(CALL_RUBY_WRAPPER(rb_float_new, *JSVAL_TO_DOUBLE(js)));
289
-
290
- default:
291
- JERROR("unknown js type in switch");
292
- }
293
-
294
- JRETURN_RUBY(Qnil);
295
- }
296
-
297
- NORETURN(void) raise_js_error_in_ruby(JohnsonRuntime* runtime)
298
- {
299
- JSContext * context = johnson_get_current_context(runtime);
300
- JohnsonContext * johnson_context = OUR_CONTEXT(context);
301
- if (JS_IsExceptionPending(context))
302
- {
303
- assert(JS_GetPendingException(context, &(johnson_context->ex)));
304
- JS_AddNamedRoot(context, &(johnson_context->ex), "raise_js_error_in_ruby");
305
- JS_ClearPendingException(context);
306
- JS_RemoveRoot(context, &(johnson_context->ex));
307
- }
308
-
309
- VALUE ruby_runtime = (VALUE)JS_GetRuntimePrivate(runtime->js);
310
- if (johnson_context->ex)
311
- RAISE_JS_ERROR(ruby_runtime, johnson_context->ex);
312
-
313
- // FIXME: I don't think this is needed, it should
314
- // be done on the Ruby side.
315
- if (!johnson_context->msg)
316
- rb_raise(rb_eRuntimeError, "Unknown JavaScriptError");
317
-
318
- // FIXME: I don't think this can ever happen....
319
- rb_raise(rb_eRuntimeError, johnson_context->msg);
320
- }
321
-
322
- #define TAG_RAISE 0x6
323
- #define TAG_THROW 0x7
324
-
325
- JSBool report_ruby_error_in_js(JohnsonRuntime* runtime, int state, VALUE old_errinfo)
326
- {
327
- JSContext * context = johnson_get_current_context(runtime);
328
- assert(state);
329
- switch (state)
330
- {
331
- case TAG_RAISE:
332
- {
333
- VALUE local_error = ruby_errinfo;
334
- ruby_errinfo = old_errinfo;
335
-
336
- if (rb_funcall(local_error, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("copy_ruby_stack_to_deck"))))
337
- rb_funcall(local_error, rb_intern("copy_ruby_stack_to_deck"), 0);
338
-
339
- VALUE rb_runtime = (VALUE)JS_GetRuntimePrivate(runtime->js);
340
- rb_iv_set(local_error, "@js_stack", rb_funcall(rb_runtime, rb_intern("current_stack"), 0));
341
-
342
- jsval js_error;
343
- convert_to_js(runtime, local_error, &js_error);
344
- JS_SetPendingException(context, js_error);
345
-
346
- return JS_FALSE ;
347
- }
348
-
349
- case TAG_THROW:
350
- // FIXME: This should be propagated to JS... as an exception?
351
-
352
- default:
353
- {
354
- JSString* str = JS_NewStringCopyZ(context, "Unexpected longjmp from ruby!");
355
- if (str)
356
- JS_SetPendingException(context, STRING_TO_JSVAL(str));
357
- return JS_FALSE;
358
- }
359
- }
360
- }
361
-