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,20 +0,0 @@
1
- #ifndef JOHNSON_SPIDERMONKEY_JS_LAND_PROXY_H
2
- #define JOHNSON_SPIDERMONKEY_JS_LAND_PROXY_H
3
-
4
- #include "spidermonkey.h"
5
- #include "runtime.h"
6
-
7
- bool js_value_is_proxy(JohnsonRuntime* runtime, jsval maybe_proxy);
8
- VALUE unwrap_js_land_proxy(JohnsonRuntime* runtime, jsval proxy);
9
- JSBool make_js_land_proxy(JohnsonRuntime* runtime, VALUE value, jsval* retval);
10
-
11
- #include "node.h"
12
- typedef struct {
13
- VALUE klass, rklass;
14
- VALUE recv;
15
- ID id, oid;
16
- int safe_level;
17
- NODE *body;
18
- } METHOD;
19
-
20
- #endif
@@ -1,618 +0,0 @@
1
- #include "ruby_land_proxy.h"
2
- #include "conversions.h"
3
-
4
- DECLARE_RUBY_WRAPPER(rb_call_super, int argc; const VALUE* argv)
5
- DEFINE_RUBY_WRAPPER(rb_call_super, rb_call_super, ARGLIST2(argc, argv))
6
-
7
- DECLARE_RUBY_WRAPPER(rb_yield, VALUE v)
8
- DEFINE_RUBY_WRAPPER(rb_yield, rb_yield, ARGLIST1(v))
9
-
10
- DECLARE_RUBY_WRAPPER(rb_check_type, VALUE o; int t)
11
- DEFINE_VOID_RUBY_WRAPPER(rb_check_type, rb_check_type, ARGLIST2(o, t))
12
-
13
- DEFINE_RUBY_WRAPPER(rb_string_value, rb_string_value, ARGLIST1(v))
14
- DEFINE_VOID_RUBY_WRAPPER(rb_string_value_cstr, rb_string_value_cstr, ARGLIST1(v))
15
-
16
- DEFINE_RUBY_WRAPPER(make_ruby_land_proxy, make_ruby_land_proxy, ARGLIST3(runtime, value, root_name))
17
-
18
- static VALUE proxy_class = Qnil;
19
- static VALUE script_class = Qnil;
20
-
21
- static inline JSBool get_jsval_for_proxy(RubyLandProxy* proxy, jsval* jv)
22
- {
23
- *jv = (jsval)(proxy->key);
24
- return JS_TRUE;
25
- }
26
-
27
- static VALUE call_js_function_value(JohnsonRuntime* runtime, jsval target, jsval function, int argc, VALUE* argv)
28
- {
29
- JSContext * context = johnson_get_current_context(runtime);
30
- PREPARE_RUBY_JROOTS(context, argc + 2);
31
-
32
- JROOT(target);
33
- JROOT(function);
34
-
35
- assert(JSVAL_IS_OBJECT(target));
36
-
37
- jsval args[argc];
38
- jsval result;
39
-
40
- int i;
41
- for(i = 0; i < argc; ++i)
42
- {
43
- JCHECK(convert_to_js(runtime, argv[i], &(args[i])));
44
- JROOT(args[i]);
45
- }
46
-
47
- JCHECK(JS_CallFunctionValue(context,
48
- JSVAL_TO_OBJECT(target), function, (unsigned) argc, args, &result));
49
-
50
- JRETURN_RUBY(CONVERT_TO_RUBY(runtime, result));
51
- }
52
-
53
- /*
54
- * call-seq:
55
- * [](name)
56
- *
57
- * Retrieves the current value of the +name+ property of this JavaScript
58
- * object.
59
- */
60
- static VALUE
61
- get(VALUE self, VALUE name)
62
- {
63
- RubyLandProxy* proxy;
64
- Data_Get_Struct(self, RubyLandProxy, proxy);
65
-
66
- JSContext * context = johnson_get_current_context(proxy->runtime);
67
- PREPARE_RUBY_JROOTS(context, 1);
68
-
69
- jsval proxy_value;
70
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
71
- JROOT(proxy_value);
72
-
73
- jsval js_value;
74
-
75
- switch(TYPE(name)) {
76
- case T_FIXNUM:
77
- JCHECK(JS_GetElement(context,
78
- JSVAL_TO_OBJECT(proxy_value), (jsint)(NUM2INT(name)), &js_value));
79
- break;
80
- case T_SYMBOL:
81
- name = RB_FUNCALL_0(name, RB_INTERN("to_s"));
82
- default:
83
- CALL_RUBY_WRAPPER(rb_string_value_cstr, &name);
84
- JCHECK(JS_GetProperty(context,
85
- JSVAL_TO_OBJECT(proxy_value), StringValueCStr(name), &js_value));
86
- break;
87
- }
88
-
89
- JRETURN_RUBY(CONVERT_TO_RUBY(proxy->runtime, js_value));
90
- }
91
-
92
- /*
93
- * call-seq:
94
- * []=(name, value)
95
- *
96
- * Sets this JavaScript object's +name+ property to +value+.
97
- */
98
- static VALUE
99
- set(VALUE self, VALUE name, VALUE value)
100
- {
101
- RubyLandProxy* proxy;
102
- Data_Get_Struct(self, RubyLandProxy, proxy);
103
- JSContext * context = johnson_get_current_context(proxy->runtime);
104
-
105
- PREPARE_RUBY_JROOTS(context, 2);
106
-
107
- jsval proxy_value;
108
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
109
- JROOT(proxy_value);
110
-
111
- jsval js_value;
112
- JCHECK(convert_to_js(proxy->runtime, value, &js_value));
113
-
114
- JROOT(js_value);
115
-
116
- switch(TYPE(name)) {
117
- case T_FIXNUM:
118
- JCHECK(JS_SetElement(context,
119
- JSVAL_TO_OBJECT(proxy_value), (jsint)(NUM2INT(name)), &js_value));
120
- break;
121
- case T_SYMBOL:
122
- name = RB_FUNCALL_0(name, RB_INTERN("to_s"));
123
- default:
124
- CALL_RUBY_WRAPPER(rb_string_value_cstr, &name);
125
- JCHECK(JS_SetProperty(context,
126
- JSVAL_TO_OBJECT(proxy_value), StringValueCStr(name), &js_value));
127
- break;
128
- }
129
-
130
- JRETURN_RUBY(value);
131
- }
132
-
133
- /*
134
- * call-seq:
135
- * function?()
136
- *
137
- * Returns <code>true</code> if this JavaScript object is a function.
138
- */
139
- static VALUE
140
- function_p(VALUE self)
141
- {
142
- RubyLandProxy* proxy;
143
- Data_Get_Struct(self, RubyLandProxy, proxy);
144
- JSContext * context = johnson_get_current_context(proxy->runtime);
145
- PREPARE_RUBY_JROOTS(context, 1);
146
- jsval proxy_value;
147
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
148
- JROOT(proxy_value);
149
- JRETURN_RUBY(JS_TypeOfValue(context, proxy_value) == JSTYPE_FUNCTION ? Qtrue : Qfalse);
150
- }
151
-
152
- static VALUE
153
- callable_test_p(VALUE self, VALUE proxy)
154
- {
155
- return function_p(proxy);
156
- }
157
-
158
- /*
159
- * call-seq:
160
- * respond_to?(symbol)
161
- *
162
- * Returns <code>true</code> if this JavaScript object responds to the
163
- * named method.
164
- */
165
- static VALUE
166
- respond_to_p(int argc, const VALUE* argv, VALUE self)
167
- {
168
- VALUE sym, priv;
169
-
170
- rb_scan_args(argc, argv, "11", &sym, &priv);
171
-
172
- RubyLandProxy* proxy;
173
- Data_Get_Struct(self, RubyLandProxy, proxy);
174
-
175
- JSContext * context = johnson_get_current_context(proxy->runtime);
176
- PREPARE_RUBY_JROOTS(context, 2);
177
-
178
- VALUE stringval = rb_funcall(sym, rb_intern("to_s"), 0);
179
- char* name = StringValuePtr(stringval);
180
-
181
- // assignment is always okay
182
- if (name[strlen(name) - 1] == '=')
183
- JRETURN_RUBY(Qtrue);
184
-
185
- jsval proxy_value;
186
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
187
- JROOT(proxy_value);
188
-
189
- JSObject *obj;
190
- JSBool found;
191
-
192
- JCHECK(JS_ValueToObject(context, proxy_value, &obj));
193
- JROOT(obj);
194
-
195
- JCHECK(JS_HasProperty(context, obj, name, &found));
196
-
197
- JRETURN_RUBY(found ? Qtrue : CALL_RUBY_WRAPPER(rb_call_super, argc, argv));
198
- }
199
-
200
- /*
201
- * call-seq:
202
- * native_call(this, *args)
203
- *
204
- * Call this Ruby Object as a function, with the given +this+ object and
205
- * arguments. Equivalent to the call method in JavaScript.
206
- */
207
- static VALUE
208
- native_call(int argc, VALUE* argv, VALUE self)
209
- {
210
- if (!function_p(self))
211
- rb_raise(rb_eRuntimeError,
212
- "This Johnson::SpiderMonkey::RubyLandProxy isn't a function.");
213
-
214
- if (argc < 1)
215
- rb_raise(rb_eArgError, "Target object required");
216
-
217
- RubyLandProxy* proxy;
218
- Data_Get_Struct(self, RubyLandProxy, proxy);
219
-
220
- jsval proxy_value;
221
-
222
- if (!get_jsval_for_proxy(proxy, &proxy_value))
223
- raise_js_error_in_ruby(proxy->runtime);
224
-
225
- jsval global;
226
-
227
- if (!convert_to_js(proxy->runtime, argv[0], &global))
228
- raise_js_error_in_ruby(proxy->runtime);
229
-
230
- return call_js_function_value(proxy->runtime, global, proxy_value,
231
- argc - 1, &(argv[1]));
232
- }
233
-
234
- static void
235
- destroy_id_array(JSContext* context, void* data)
236
- {
237
- JS_DestroyIdArray(context, (JSIdArray*)data);
238
- }
239
-
240
- /*
241
- * call-seq:
242
- * each {| element | block }
243
- * each {| name, value | block }
244
- *
245
- * Calls <em>block</em> with each item in this JavaScript array, or with
246
- * each +name+/+value+ pair (like a Hash) for any other JavaScript
247
- * object.
248
- */
249
- static VALUE
250
- each(VALUE self)
251
- {
252
- RubyLandProxy* proxy;
253
- Data_Get_Struct(self, RubyLandProxy, proxy);
254
- JSContext * context = johnson_get_current_context(proxy->runtime);
255
-
256
- PREPARE_RUBY_JROOTS(context, 5);
257
-
258
- jsval proxy_value;
259
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
260
- JROOT(proxy_value);
261
-
262
- JSObject* value = JSVAL_TO_OBJECT(proxy_value);
263
- JROOT(value);
264
-
265
- // arrays behave like you'd expect, indexes in order
266
- if (JS_IsArrayObject(context, value))
267
- {
268
- jsuint length;
269
- JCHECK(JS_GetArrayLength(context, value, &length));
270
-
271
- jsuint i = 0;
272
- for (i = 0; i < length; ++i)
273
- {
274
- jsval element;
275
- JCHECK(JS_GetElement(context, value, (signed) i, &element));
276
- CALL_RUBY_WRAPPER(rb_yield, CONVERT_TO_RUBY(proxy->runtime, element));
277
- }
278
- }
279
- else
280
- {
281
- // not an array? behave like each on Hash; yield [key, value]
282
- JSIdArray* ids = JS_Enumerate(context, value);
283
- JCHECK(ids);
284
-
285
- JCLEANUP(destroy_id_array, ids);
286
-
287
- int i;
288
- for (i = 0; i < ids->length; ++i)
289
- {
290
- jsval js_key, js_value;
291
-
292
- JCHECK(JS_IdToValue(context, ids->vector[i], &js_key));
293
- JROOT(js_key);
294
-
295
- if (JSVAL_IS_STRING(js_key))
296
- {
297
- // regular properties have string keys
298
- JCHECK(JS_GetProperty(context, value,
299
- JS_GetStringBytes(JSVAL_TO_STRING(js_key)), &js_value));
300
- }
301
- else
302
- {
303
- // it's a numeric property, use array access
304
- JCHECK(JS_GetElement(context, value,
305
- JSVAL_TO_INT(js_key), &js_value));
306
- }
307
- JROOT(js_value);
308
-
309
- VALUE key = CONVERT_TO_RUBY(proxy->runtime, js_key);
310
- VALUE value = CONVERT_TO_RUBY(proxy->runtime, js_value);
311
-
312
- CALL_RUBY_WRAPPER(rb_yield, rb_ary_new3(2L, key, value));
313
-
314
- JUNROOT(js_value);
315
- JUNROOT(js_key);
316
- }
317
- }
318
-
319
- JRETURN_RUBY(self);
320
- }
321
-
322
- /*
323
- * call-seq:
324
- * length()
325
- *
326
- * Returns the number of entries in the JavaScript array, or the number
327
- * of properties on the JavaScript object.
328
- */
329
- static VALUE
330
- length(VALUE self)
331
- {
332
- RubyLandProxy* proxy;
333
- Data_Get_Struct(self, RubyLandProxy, proxy);
334
- JSContext * context = johnson_get_current_context(proxy->runtime);
335
-
336
- PREPARE_RUBY_JROOTS(context, 2);
337
-
338
- jsval proxy_value;
339
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
340
- JROOT(proxy_value);
341
-
342
- JSObject* value = JSVAL_TO_OBJECT(proxy_value);
343
- JROOT(value);
344
-
345
- if (JS_IsArrayObject(context, value))
346
- {
347
- jsuint length;
348
- JCHECK(JS_GetArrayLength(context, value, &length));
349
-
350
- JRETURN_RUBY(INT2FIX(length));
351
- }
352
- else
353
- {
354
- JSIdArray* ids = JS_Enumerate(context, value);
355
- JCHECK(ids);
356
- VALUE length = INT2FIX(ids->length);
357
-
358
- JS_DestroyIdArray(context, ids);
359
-
360
- JRETURN_RUBY(length);
361
- }
362
- }
363
-
364
- /*
365
- * call-seq:
366
- * runtime()
367
- *
368
- * Returns the Johnson::SpiderMonkey::Runtime against which this object
369
- * is registered.
370
- */
371
- static VALUE
372
- runtime(VALUE self)
373
- {
374
- RubyLandProxy* proxy;
375
- Data_Get_Struct(self, RubyLandProxy, proxy);
376
- return (VALUE)JS_GetRuntimePrivate(proxy->runtime->js);
377
- }
378
-
379
- /*
380
- * call-seq:
381
- * function_property?(name)
382
- *
383
- * Returns <code>true</code> if this JavaScript object's +name+ property
384
- * is a function.
385
- */
386
- static VALUE
387
- function_property_p(VALUE self, VALUE name)
388
- {
389
- if (TYPE(name) == T_SYMBOL)
390
- name = rb_funcall(name, rb_intern("to_s"), 0);
391
-
392
- rb_string_value_cstr(&name);
393
-
394
- RubyLandProxy* proxy;
395
- Data_Get_Struct(self, RubyLandProxy, proxy);
396
- JSContext * context = johnson_get_current_context(proxy->runtime);
397
-
398
- PREPARE_RUBY_JROOTS(context, 2);
399
-
400
- jsval proxy_value;
401
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
402
- JROOT(proxy_value);
403
-
404
- jsval js_value;
405
-
406
- JCHECK(JS_GetProperty(context,
407
- JSVAL_TO_OBJECT(proxy_value), StringValueCStr(name), &js_value));
408
-
409
- JROOT(js_value);
410
-
411
- JSType type = JS_TypeOfValue(context, js_value);
412
-
413
- JRETURN_RUBY(type == JSTYPE_FUNCTION ? Qtrue : Qfalse);
414
- }
415
-
416
- /*
417
- * call-seq:
418
- * call_function_property(name, arguments)
419
- *
420
- * Calls this JavaScript object's +name+ method, passing the given
421
- * arguments.
422
- *
423
- * Equivalent to:
424
- * proxy[name].native_call(proxy, *arguments)
425
- */
426
- static VALUE
427
- call_function_property(int argc, VALUE* argv, VALUE self)
428
- {
429
- RubyLandProxy* proxy;
430
- Data_Get_Struct(self, RubyLandProxy, proxy);
431
- JSContext * context = johnson_get_current_context(proxy->runtime);
432
-
433
- if (argc < 1)
434
- rb_raise(rb_eArgError, "Function name required");
435
-
436
- PREPARE_RUBY_JROOTS(context, 2);
437
-
438
- jsval proxy_value;
439
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
440
- JROOT(proxy_value);
441
-
442
- jsval function;
443
-
444
- VALUE name = argv[0];
445
- CALL_RUBY_WRAPPER(rb_string_value_cstr, &name);
446
-
447
- JCHECK(JS_GetProperty(context,
448
- JSVAL_TO_OBJECT(proxy_value), StringValueCStr(name), &function));
449
-
450
- JROOT(function);
451
-
452
- // should never be anything but a function
453
- if (!JS_ObjectIsFunction(context, JSVAL_TO_OBJECT(function)))
454
- JERROR("Specified property \"%s\" isn't a function.", StringValueCStr(name));
455
-
456
- REMOVE_JROOTS;
457
-
458
- return call_js_function_value(proxy->runtime, proxy_value, function, argc - 1, &(argv[1]));
459
- }
460
-
461
- /*
462
- * call-seq:
463
- * to_s()
464
- *
465
- * Converts the JavaScript object to a string, using its toString method
466
- * if available.
467
- */
468
- static VALUE to_s(VALUE self)
469
- {
470
- RubyLandProxy* proxy;
471
- Data_Get_Struct(self, RubyLandProxy, proxy);
472
- JSContext * context = johnson_get_current_context(proxy->runtime);
473
-
474
- PREPARE_RUBY_JROOTS(context, 1);
475
-
476
- jsval proxy_value;
477
- JCHECK(get_jsval_for_proxy(proxy, &proxy_value));
478
- JROOT(proxy_value);
479
-
480
- JSString* str = JS_ValueToString(context, proxy_value);
481
- JRETURN_RUBY(CONVERT_JS_STRING_TO_RUBY(proxy->runtime, str));
482
- }
483
-
484
- ///////////////////////////////////////////////////////////////////////////
485
- //// INFRASTRUCTURE BELOW HERE ////////////////////////////////////////////
486
- ///////////////////////////////////////////////////////////////////////////
487
-
488
- static void finalize(RubyLandProxy* proxy)
489
- {
490
- // could get finalized after the context has been freed
491
- if (proxy->runtime && proxy->runtime->jsids)
492
- {
493
- // remove this proxy from the OID map
494
- jsval proxy_value;
495
- get_jsval_for_proxy(proxy, &proxy_value);
496
- JS_HashTableRemove(proxy->runtime->jsids, (void *)proxy_value);
497
- }
498
-
499
- if (proxy->runtime)
500
- {
501
- // remove our GC handle on the JS value
502
- JS_RemoveRootRT(proxy->runtime->js, &(proxy->key));
503
- }
504
-
505
- free(proxy);
506
- }
507
-
508
- bool ruby_value_is_proxy(VALUE maybe_proxy)
509
- {
510
- return rb_obj_is_kind_of(maybe_proxy, proxy_class);
511
- }
512
-
513
- bool ruby_value_is_script_proxy(VALUE maybe_proxy)
514
- {
515
- return rb_obj_is_kind_of(maybe_proxy, script_class);
516
- }
517
-
518
- VALUE apply_wrappers(VALUE proxy)
519
- {
520
- VALUE johnson = rb_const_get(rb_mKernel, rb_intern("Johnson"));
521
- VALUE johnson_proxy = rb_const_get(johnson, rb_intern("RubyLandProxy"));
522
- return rb_funcall(johnson_proxy, rb_intern("apply_wrappers"), 1, proxy);
523
- }
524
-
525
- VALUE apply_conversions(VALUE proxy)
526
- {
527
- VALUE johnson = rb_const_get(rb_mKernel, rb_intern("Johnson"));
528
- VALUE johnson_proxy = rb_const_get(johnson, rb_intern("RubyLandProxy"));
529
- return rb_funcall(johnson_proxy, rb_intern("apply_conversions"), 1, proxy);
530
- }
531
-
532
- JSBool unwrap_ruby_land_proxy(JohnsonRuntime* runtime, VALUE wrapped, jsval* retval)
533
- {
534
- JSContext * context = johnson_get_current_context(runtime);
535
- assert(ruby_value_is_proxy(wrapped));
536
-
537
- PREPARE_JROOTS(context, 0);
538
-
539
- RubyLandProxy* proxy;
540
- Data_Get_Struct(wrapped, RubyLandProxy, proxy);
541
-
542
- JCHECK(get_jsval_for_proxy(proxy, retval));
543
- JRETURN;
544
- }
545
-
546
- VALUE make_ruby_land_proxy(JohnsonRuntime* runtime, jsval value, const char const* root_name)
547
- {
548
- RubyLandProxy * our_proxy = (RubyLandProxy *)JS_HashTableLookup(runtime->jsids, (void *)value);
549
-
550
- if (our_proxy)
551
- {
552
- // if we already have a proxy, return it
553
- return apply_conversions(our_proxy->self);
554
- }
555
- else
556
- {
557
- // otherwise make one and cache it
558
- VALUE proxy = Data_Make_Struct((strncmp(root_name, "JSScriptProxy", strlen("JSScriptProxy")) ? proxy_class : script_class), RubyLandProxy, 0, finalize, our_proxy);
559
-
560
- JSContext * context = johnson_get_current_context(runtime);
561
-
562
- PREPARE_RUBY_JROOTS(context, 1);
563
- JROOT(value);
564
-
565
- VALUE rb_runtime = (VALUE)JS_GetRuntimePrivate(runtime->js);
566
- rb_iv_set(proxy, "@runtime", rb_runtime);
567
-
568
- our_proxy->runtime = runtime;
569
- our_proxy->key = (void *)value;
570
- our_proxy->self = proxy;
571
-
572
- // root the value for JS GC and lookups
573
- JCHECK(JS_AddNamedRootRT(runtime->js, &(our_proxy->key), root_name));
574
-
575
- // put the proxy OID in the id map
576
- JCHECK(JS_HashTableAdd(runtime->jsids, (void *)value, (void *)our_proxy));
577
-
578
- VALUE final_proxy = JPROTECT(apply_wrappers, proxy);
579
-
580
- our_proxy->self = final_proxy;
581
-
582
- JRETURN_RUBY(JPROTECT(apply_conversions, final_proxy));
583
- }
584
- }
585
-
586
- void init_Johnson_SpiderMonkey_Proxy(VALUE spidermonkey)
587
- {
588
- /* HACK: These comments are *only* to make RDoc happy.
589
- VALUE johnson = rb_define_module("Johnson");
590
- VALUE spidermonkey = rb_define_module_under(johnson, "SpiderMonkey");
591
- */
592
-
593
- VALUE johnson = rb_const_get(rb_mKernel, rb_intern("Johnson"));
594
- VALUE johnson_proxy = rb_const_get(johnson, rb_intern("RubyLandProxy"));
595
-
596
- /* RubyLandProxy class. */
597
- proxy_class = rb_define_class_under(spidermonkey, "RubyLandProxy", johnson_proxy);
598
-
599
- rb_define_method(proxy_class, "[]", get, 1);
600
- rb_define_method(proxy_class, "[]=", set, 2);
601
- rb_define_method(proxy_class, "function?", function_p, 0);
602
- rb_define_method(proxy_class, "respond_to?", respond_to_p, -1);
603
- rb_define_method(proxy_class, "each", each, 0);
604
- rb_define_method(proxy_class, "length", length, 0);
605
- rb_define_method(proxy_class, "to_s", to_s, 0);
606
-
607
- rb_define_private_method(proxy_class, "runtime", runtime, 0);
608
- rb_define_private_method(proxy_class, "function_property?", function_property_p, 1);
609
- rb_define_private_method(proxy_class, "call_function_property", call_function_property, -1);
610
-
611
- VALUE callable = rb_define_module_under(proxy_class, "Callable");
612
- rb_define_singleton_method(callable, "test?", callable_test_p, 1);
613
- rb_define_private_method(callable, "native_call", native_call, -1);
614
-
615
- rb_funcall(johnson_proxy, rb_intern("insert_wrapper"), 1, callable);
616
-
617
- script_class = rb_define_class_under(spidermonkey, "RubyLandScript", proxy_class);
618
- }