johnson 1.2.0 → 2.0.0.pre0

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 (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,161 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2
+ *
3
+ * ***** BEGIN LICENSE BLOCK *****
4
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
+ *
6
+ * The contents of this file are subject to the Mozilla Public License Version
7
+ * 1.1 (the "License"); you may not use this file except in compliance with
8
+ * the License. You may obtain a copy of the License at
9
+ * http://www.mozilla.org/MPL/
10
+ *
11
+ * Software distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
+ * for the specific language governing rights and limitations under the
14
+ * License.
15
+ *
16
+ * The Original Code is Mozilla Communicator client code, released
17
+ * March 31, 1998.
18
+ *
19
+ * The Initial Developer of the Original Code is
20
+ * Netscape Communications Corporation.
21
+ * Portions created by the Initial Developer are Copyright (C) 1998
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
28
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ /*
41
+ * This is a copy of the NSPR hash-table library, but it has been slightly
42
+ * modified to allow an additional argument to be passed into the hash
43
+ * key-comparison function. This is used to maintain thread-safety by
44
+ * passing in a JNIEnv pointer to the key-comparison function rather
45
+ * than storing it in a global. All types,function names, etc. have
46
+ * been renamed from their original NSPR names to protect the innocent.
47
+ */
48
+
49
+ #ifndef jsj_hash_h___
50
+ #define jsj_hash_h___
51
+ /*
52
+ * API to portable hash table code.
53
+ */
54
+ #include <stddef.h>
55
+ #include <stdio.h>
56
+ #include "jstypes.h"
57
+
58
+ JS_BEGIN_EXTERN_C
59
+
60
+ typedef struct JSJHashEntry JSJHashEntry;
61
+ typedef struct JSJHashTable JSJHashTable;
62
+ typedef JSUint32 JSJHashNumber;
63
+ #define JSJ_HASH_BITS 32
64
+ typedef JSJHashNumber (* JSJHashFunction)(const void *key, void *arg);
65
+ typedef JSIntn (* JSJHashComparator)(const void *v1, const void *v2, void *arg);
66
+ typedef JSIntn (* JSJHashEnumerator)(JSJHashEntry *he, JSIntn i, void *arg);
67
+
68
+ /* Flag bits in JSJHashEnumerator's return value */
69
+ #define HT_ENUMERATE_NEXT 0 /* continue enumerating entries */
70
+ #define HT_ENUMERATE_STOP 1 /* stop enumerating entries */
71
+ #define HT_ENUMERATE_REMOVE 2 /* remove and free the current entry */
72
+ #define HT_ENUMERATE_UNHASH 4 /* just unhash the current entry */
73
+
74
+ typedef struct JSJHashAllocOps {
75
+ void * (*allocTable)(void *pool, size_t size);
76
+ void (*freeTable)(void *pool, void *item);
77
+ JSJHashEntry * (*allocEntry)(void *pool, const void *key);
78
+ void (*freeEntry)(void *pool, JSJHashEntry *he, JSUintn flag);
79
+ } JSJHashAllocOps;
80
+
81
+ #define HT_FREE_VALUE 0 /* just free the entry's value */
82
+ #define HT_FREE_ENTRY 1 /* free value and entire entry */
83
+
84
+ struct JSJHashEntry {
85
+ JSJHashEntry *next; /* hash chain linkage */
86
+ JSJHashNumber keyHash; /* key hash function result */
87
+ const void *key; /* ptr to opaque key */
88
+ void *value; /* ptr to opaque value */
89
+ };
90
+
91
+ struct JSJHashTable {
92
+ JSJHashEntry **buckets; /* vector of hash buckets */
93
+ JSUint32 nentries; /* number of entries in table */
94
+ JSUint32 shift; /* multiplicative hash shift */
95
+ JSJHashFunction keyHash; /* key hash function */
96
+ JSJHashComparator keyCompare; /* key comparison function */
97
+ JSJHashComparator valueCompare; /* value comparison function */
98
+ JSJHashAllocOps *allocOps; /* allocation operations */
99
+ void *allocPriv; /* allocation private data */
100
+ #ifdef HASHMETER
101
+ JSUint32 nlookups; /* total number of lookups */
102
+ JSUint32 nsteps; /* number of hash chains traversed */
103
+ JSUint32 ngrows; /* number of table expansions */
104
+ JSUint32 nshrinks; /* number of table contractions */
105
+ #endif
106
+ };
107
+
108
+ /*
109
+ * Create a new hash table.
110
+ * If allocOps is null, use default allocator ops built on top of malloc().
111
+ */
112
+ JS_EXTERN_API(JSJHashTable *)
113
+ JSJ_NewHashTable(JSUint32 n, JSJHashFunction keyHash,
114
+ JSJHashComparator keyCompare, JSJHashComparator valueCompare,
115
+ JSJHashAllocOps *allocOps, void *allocPriv);
116
+
117
+ JS_EXTERN_API(void)
118
+ JSJ_HashTableDestroy(JSJHashTable *ht);
119
+
120
+ /* Low level access methods */
121
+ JS_EXTERN_API(JSJHashEntry **)
122
+ JSJ_HashTableRawLookup(JSJHashTable *ht, JSJHashNumber keyHash, const void *key, void *arg);
123
+
124
+ JS_EXTERN_API(JSJHashEntry *)
125
+ JSJ_HashTableRawAdd(JSJHashTable *ht, JSJHashEntry **hep, JSJHashNumber keyHash,
126
+ const void *key, void *value, void *arg);
127
+
128
+ JS_EXTERN_API(void)
129
+ JSJ_HashTableRawRemove(JSJHashTable *ht, JSJHashEntry **hep, JSJHashEntry *he, void *arg);
130
+
131
+ /* Higher level access methods */
132
+ JS_EXTERN_API(JSJHashEntry *)
133
+ JSJ_HashTableAdd(JSJHashTable *ht, const void *key, void *value, void *arg);
134
+
135
+ JS_EXTERN_API(JSBool)
136
+ JSJ_HashTableRemove(JSJHashTable *ht, const void *key, void *arg);
137
+
138
+ JS_EXTERN_API(JSIntn)
139
+ JSJ_HashTableEnumerateEntries(JSJHashTable *ht, JSJHashEnumerator f, void *arg);
140
+
141
+ JS_EXTERN_API(void *)
142
+ JSJ_HashTableLookup(JSJHashTable *ht, const void *key, void *arg);
143
+
144
+ JS_EXTERN_API(JSIntn)
145
+ JSJ_HashTableDump(JSJHashTable *ht, JSJHashEnumerator dump, FILE *fp);
146
+
147
+ /* General-purpose C string hash function. */
148
+ JS_EXTERN_API(JSJHashNumber)
149
+ JSJ_HashString(const void *key);
150
+
151
+ /* Compare strings using strcmp(), return true if equal. */
152
+ JS_EXTERN_API(int)
153
+ JSJ_CompareStrings(const void *v1, const void *v2);
154
+
155
+ /* Stub function just returns v1 == v2 */
156
+ JS_EXTERN_API(JSIntn)
157
+ JSJ_CompareValues(const void *v1, const void *v2);
158
+
159
+ JS_END_EXTERN_C
160
+
161
+ #endif /* jsj_hash_h___ */
@@ -0,0 +1,1825 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ *
3
+ * ***** BEGIN LICENSE BLOCK *****
4
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
+ *
6
+ * The contents of this file are subject to the Mozilla Public License Version
7
+ * 1.1 (the "License"); you may not use this file except in compliance with
8
+ * the License. You may obtain a copy of the License at
9
+ * http://www.mozilla.org/MPL/
10
+ *
11
+ * Software distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
+ * for the specific language governing rights and limitations under the
14
+ * License.
15
+ *
16
+ * The Original Code is Mozilla Communicator client code, released
17
+ * March 31, 1998.
18
+ *
19
+ * The Initial Developer of the Original Code is
20
+ * Netscape Communications Corporation.
21
+ * Portions created by the Initial Developer are Copyright (C) 1998
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
28
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * This Original Code has been modified by IBM Corporation. Modifications made
39
+ * by IBM described herein are Copyright (c) International Business Machines
40
+ * Corporation, 2000.
41
+ * Modifications to Mozilla code or documentation identified per MPL Section 3.3
42
+ *
43
+ * Date Modified by Description of modification
44
+ * 04/20/2000 IBM Corp. OS/2 VisualAge build.
45
+ *
46
+ * ***** END LICENSE BLOCK ***** */
47
+
48
+ /*
49
+ * This file is part of the Java-vendor-neutral implementation of LiveConnect
50
+ *
51
+ * It contains the code used to reflect Java methods as properties of
52
+ * JavaObject objects and the code to invoke those methods.
53
+ *
54
+ */
55
+
56
+ #include <stdlib.h>
57
+ #include <string.h>
58
+
59
+ #include "jsj_private.h" /* LiveConnect internals */
60
+ #include "jsjava.h" /* LiveConnect external API */
61
+ #include "jsclist.h" /* Circular linked lists */
62
+
63
+ /* A list of Java methods */
64
+ typedef JSCList MethodList;
65
+
66
+ /* An element in a list of Java methods */
67
+ typedef struct MethodListElement {
68
+ JSCList linkage;
69
+ JavaMethodSpec *method;
70
+ } MethodListElement;
71
+
72
+ /*
73
+ * This is the return value of functions which compare either two types or two
74
+ * method signatures to see if either is "preferred" when converting from
75
+ * specified JavaScript value(s).
76
+ */
77
+ typedef enum JSJTypePreference {
78
+ JSJPREF_FIRST_ARG = 1, /* First argument preferred */
79
+ JSJPREF_SECOND_ARG = 2, /* Second argument preferred */
80
+ JSJPREF_AMBIGUOUS = 3 /* Neither preferred over the other */
81
+ } JSJTypePreference;
82
+
83
+ /*
84
+ * Classification of JS types with slightly different granularity than JSType.
85
+ * This is used to resolve among overloaded Java methods.
86
+ */
87
+ typedef enum JSJType {
88
+ JSJTYPE_VOID, /* undefined */
89
+ JSJTYPE_BOOLEAN, /* boolean */
90
+ JSJTYPE_NUMBER, /* number */
91
+ JSJTYPE_STRING, /* string */
92
+ JSJTYPE_NULL, /* null */
93
+ JSJTYPE_JAVACLASS, /* JavaClass */
94
+ JSJTYPE_JAVAOBJECT, /* JavaObject */
95
+ JSJTYPE_JAVAARRAY, /* JavaArray */
96
+ JSJTYPE_JSARRAY, /* JS Array */
97
+ JSJTYPE_OBJECT, /* Any other JS Object, including functions */
98
+ JSJTYPE_LIMIT
99
+ } JSJType;
100
+
101
+ /*
102
+ * A helper function for jsj_ConvertJavaMethodSignatureToString():
103
+ * Compute JNI-style (string) signatures for an array of JavaSignature objects
104
+ * and concatenate the results into a single string.
105
+ *
106
+ * If an error is encountered, NULL is returned and the error reporter is called.
107
+ */
108
+ static const char *
109
+ convert_java_method_arg_signatures_to_string(JSContext *cx,
110
+ JavaSignature **arg_signatures,
111
+ int num_args)
112
+ {
113
+ const char *first_arg_signature, *rest_arg_signatures, *sig;
114
+ JavaSignature **rest_args;
115
+
116
+ /* Convert the first method argument in the array to a string */
117
+ first_arg_signature = jsj_ConvertJavaSignatureToString(cx, arg_signatures[0]);
118
+ if (!first_arg_signature)
119
+ return NULL;
120
+
121
+ /* If this is the last method argument in the array, we're done. */
122
+ if (num_args == 1)
123
+ return first_arg_signature;
124
+
125
+ /* Convert the remaining method arguments to a string */
126
+ rest_args = &arg_signatures[1];
127
+ rest_arg_signatures =
128
+ convert_java_method_arg_signatures_to_string(cx, rest_args, num_args - 1);
129
+ if (!rest_arg_signatures) {
130
+ JS_smprintf_free((char*)first_arg_signature);
131
+ return NULL;
132
+ }
133
+
134
+ /* Concatenate the signature string of this argument with the signature
135
+ strings of all the remaining arguments. */
136
+ sig = JS_smprintf("%s%s", first_arg_signature, rest_arg_signatures);
137
+ JS_smprintf_free((char*)first_arg_signature);
138
+ JS_smprintf_free((char*)rest_arg_signatures);
139
+ if (!sig) {
140
+ JS_ReportOutOfMemory(cx);
141
+ return NULL;
142
+ }
143
+
144
+ return sig;
145
+ }
146
+
147
+ /*
148
+ * A helper function for jsj_ConvertJavaMethodSignatureToHRString():
149
+ * Compute human-readable string signatures for an array of JavaSignatures
150
+ * and concatenate the results into a single string.
151
+ *
152
+ * If an error is encountered, NULL is returned and the error reporter is called.
153
+ */
154
+ static const char *
155
+ convert_java_method_arg_signatures_to_hr_string(JSContext *cx,
156
+ JavaSignature **arg_signatures,
157
+ int num_args,
158
+ JSBool whitespace)
159
+ {
160
+ const char *first_arg_signature, *rest_arg_signatures, *sig, *separator;
161
+ JavaSignature **rest_args;
162
+
163
+ if (num_args == 0)
164
+ return JS_smprintf("%s", "");
165
+
166
+ /* Convert the first method argument in the array to a string */
167
+ first_arg_signature = jsj_ConvertJavaSignatureToHRString(cx, arg_signatures[0]);
168
+ if (!first_arg_signature)
169
+ return NULL;
170
+
171
+ /* If this is the last method argument in the array, we're done. */
172
+ if (num_args == 1)
173
+ return first_arg_signature;
174
+
175
+ /* Convert the remaining method arguments to a string */
176
+ rest_args = &arg_signatures[1];
177
+ rest_arg_signatures =
178
+ convert_java_method_arg_signatures_to_hr_string(cx, rest_args, num_args - 1, whitespace);
179
+ if (!rest_arg_signatures) {
180
+ JS_smprintf_free((char*)first_arg_signature);
181
+ return NULL;
182
+ }
183
+
184
+ /* Concatenate the signature string of this argument with the signature
185
+ strings of all the remaining arguments. */
186
+ separator = whitespace ? " " : "";
187
+ sig = JS_smprintf("%s,%s%s", first_arg_signature, separator, rest_arg_signatures);
188
+ JS_smprintf_free((char*)first_arg_signature);
189
+ JS_smprintf_free((char*)rest_arg_signatures);
190
+ if (!sig) {
191
+ JS_ReportOutOfMemory(cx);
192
+ return NULL;
193
+ }
194
+
195
+ return sig;
196
+ }
197
+ /*
198
+ * Compute a string signature for the given method using the same type names
199
+ * that appear in Java source files, e.g. "int[][]", rather than the JNI-style
200
+ * type strings that are provided by the functions above. An example return
201
+ * value might be "String MyFunc(int, byte, char[][], java.lang.String)".
202
+ *
203
+ * If an error is encountered, NULL is returned and the error reporter is called.
204
+ */
205
+ const char *
206
+ jsj_ConvertJavaMethodSignatureToHRString(JSContext *cx,
207
+ const char *method_name,
208
+ JavaMethodSignature *method_signature)
209
+ {
210
+ JavaSignature **arg_signatures, *return_val_signature;
211
+ const char *arg_sigs_cstr;
212
+ const char *return_val_sig_cstr;
213
+ const char *sig_cstr;
214
+
215
+ arg_signatures = method_signature->arg_signatures;
216
+ return_val_signature = method_signature->return_val_signature;
217
+
218
+ /* Convert the method argument signatures to a C-string */
219
+ arg_sigs_cstr =
220
+ convert_java_method_arg_signatures_to_hr_string(cx, arg_signatures,
221
+ method_signature->num_args,
222
+ JS_TRUE);
223
+ if (!arg_sigs_cstr)
224
+ return NULL;
225
+
226
+ /* Convert the method return value signature to a C-string */
227
+ return_val_sig_cstr = jsj_ConvertJavaSignatureToHRString(cx, return_val_signature);
228
+ if (!return_val_sig_cstr) {
229
+ JS_smprintf_free((char*)arg_sigs_cstr);
230
+ return NULL;
231
+ }
232
+
233
+ /* Compose method arg signatures string and return val signature string */
234
+ sig_cstr = JS_smprintf("%s %s(%s)", return_val_sig_cstr, method_name, arg_sigs_cstr);
235
+ JS_smprintf_free((char*)arg_sigs_cstr);
236
+ JS_smprintf_free((char*)return_val_sig_cstr);
237
+
238
+ if (!sig_cstr) {
239
+ JS_ReportOutOfMemory(cx);
240
+ return NULL;
241
+ }
242
+ return sig_cstr;
243
+ }
244
+ /*
245
+ * Destroy the sub-structure of a JavaMethodSignature object without free'ing
246
+ * the method signature itself.
247
+ */
248
+ void
249
+ jsj_PurgeJavaMethodSignature(JSContext *cx, JNIEnv *jEnv, JavaMethodSignature *method_signature)
250
+ {
251
+ int i, num_args;
252
+ JavaSignature **arg_signatures;
253
+
254
+ if (!method_signature) /* Paranoia */
255
+ return;
256
+
257
+ /* Free the method argument signatures */
258
+ num_args = method_signature->num_args;
259
+ arg_signatures = method_signature->arg_signatures;
260
+ for (i = 0; i < num_args; i++)
261
+ jsj_ReleaseJavaClassDescriptor(cx, jEnv, arg_signatures[i]);
262
+ if (arg_signatures)
263
+ JS_free(cx, arg_signatures);
264
+
265
+ /* Free the return type signature */
266
+ if (method_signature->return_val_signature)
267
+ jsj_ReleaseJavaClassDescriptor(cx, jEnv, method_signature->return_val_signature);
268
+ }
269
+
270
+ /*
271
+ * Fill in the members of a JavaMethodSignature object using the method
272
+ * argument, which can be either an instance of either java.lang.reflect.Method
273
+ * or java.lang.reflect.Constructor.
274
+ *
275
+ * With normal completion, return the original method_signature argument.
276
+ * If an error occurs, return NULL and call the error reporter.
277
+ */
278
+ JavaMethodSignature *
279
+ jsj_InitJavaMethodSignature(JSContext *cx, JNIEnv *jEnv,
280
+ jobject method,
281
+ JavaMethodSignature *method_signature)
282
+ {
283
+ int i;
284
+ jboolean is_constructor;
285
+ jclass return_val_class;
286
+ jsize num_args;
287
+ JavaSignature *return_val_signature;
288
+ jarray arg_classes;
289
+ jmethodID getParameterTypes;
290
+
291
+ memset(method_signature, 0, sizeof (JavaMethodSignature));
292
+
293
+ is_constructor = (*jEnv)->IsInstanceOf(jEnv, method, jlrConstructor);
294
+
295
+ /* Get a Java array that lists the class of each of the method's arguments */
296
+ if (is_constructor)
297
+ getParameterTypes = jlrConstructor_getParameterTypes;
298
+ else
299
+ getParameterTypes = jlrMethod_getParameterTypes;
300
+ arg_classes = (*jEnv)->CallObjectMethod(jEnv, method, getParameterTypes);
301
+ if (!arg_classes) {
302
+ jsj_UnexpectedJavaError(cx, jEnv,
303
+ "Can't determine argument signature of method");
304
+ goto error;
305
+ }
306
+
307
+ /* Compute the number of method arguments */
308
+ num_args = jsj_GetJavaArrayLength(cx, jEnv, arg_classes);
309
+ if (num_args < 0)
310
+ goto error;
311
+ method_signature->num_args = num_args;
312
+
313
+ /* Build a JavaSignature array corresponding to the method's arguments */
314
+ if (num_args) {
315
+ JavaSignature **arg_signatures;
316
+
317
+ /* Allocate an array of JavaSignatures, one for each method argument */
318
+ size_t arg_signatures_size = num_args * sizeof(JavaSignature *);
319
+ arg_signatures = (JavaSignature **)JS_malloc(cx, arg_signatures_size);
320
+ if (!arg_signatures)
321
+ goto error;
322
+ memset(arg_signatures, 0, arg_signatures_size);
323
+ method_signature->arg_signatures = arg_signatures;
324
+
325
+ /* Build an array of JavaSignature objects, each of which corresponds
326
+ to the type of an individual method argument. */
327
+ for (i = 0; i < num_args; i++) {
328
+ JavaSignature *a;
329
+ jclass arg_class = (*jEnv)->GetObjectArrayElement(jEnv, arg_classes, i);
330
+
331
+ a = arg_signatures[i] = jsj_GetJavaClassDescriptor(cx, jEnv, arg_class);
332
+ (*jEnv)->DeleteLocalRef(jEnv, arg_class);
333
+ if (!a) {
334
+ jsj_UnexpectedJavaError(cx, jEnv, "Could not determine Java class "
335
+ "signature using java.lang.reflect");
336
+ goto error;
337
+ }
338
+ }
339
+ }
340
+
341
+ /* Get the Java class of the method's return value */
342
+ if (is_constructor) {
343
+ /* Constructors always have a "void" return type */
344
+ return_val_signature = jsj_GetJavaClassDescriptor(cx, jEnv, jlVoid_TYPE);
345
+ } else {
346
+ return_val_class =
347
+ (*jEnv)->CallObjectMethod(jEnv, method, jlrMethod_getReturnType);
348
+ if (!return_val_class) {
349
+ jsj_UnexpectedJavaError(cx, jEnv,
350
+ "Can't determine return type of method "
351
+ "using java.lang.reflect.Method.getReturnType()");
352
+ goto error;
353
+ }
354
+
355
+ /* Build a JavaSignature object corresponding to the method's return value */
356
+ return_val_signature = jsj_GetJavaClassDescriptor(cx, jEnv, return_val_class);
357
+ (*jEnv)->DeleteLocalRef(jEnv, return_val_class);
358
+ }
359
+
360
+ if (!return_val_signature)
361
+ goto error;
362
+ method_signature->return_val_signature = return_val_signature;
363
+
364
+ (*jEnv)->DeleteLocalRef(jEnv, arg_classes);
365
+ return method_signature;
366
+
367
+ error:
368
+
369
+ if (arg_classes)
370
+ (*jEnv)->DeleteLocalRef(jEnv, arg_classes);
371
+ jsj_PurgeJavaMethodSignature(cx, jEnv, method_signature);
372
+ return NULL;
373
+ }
374
+
375
+ /*
376
+ * Compute a JNI-style (string) signature for the given method, e.g. the method
377
+ * "String MyFunc(int, byte)" is translated to "(IB)Ljava/lang/String;".
378
+ *
379
+ * If an error is encountered, NULL is returned and the error reporter is called.
380
+ */
381
+ const char *
382
+ jsj_ConvertJavaMethodSignatureToString(JSContext *cx,
383
+ JavaMethodSignature *method_signature)
384
+ {
385
+ JavaSignature **arg_signatures, *return_val_signature;
386
+ const char *arg_sigs_cstr;
387
+ const char *return_val_sig_cstr;
388
+ const char *sig_cstr;
389
+
390
+ arg_signatures = method_signature->arg_signatures;
391
+ return_val_signature = method_signature->return_val_signature;
392
+
393
+ /* Convert the method argument signatures to a C-string */
394
+ arg_sigs_cstr = NULL;
395
+ if (arg_signatures) {
396
+ arg_sigs_cstr =
397
+ convert_java_method_arg_signatures_to_string(cx, arg_signatures,
398
+ method_signature->num_args);
399
+ if (!arg_sigs_cstr)
400
+ return NULL;
401
+ }
402
+
403
+ /* Convert the method return value signature to a C-string */
404
+ return_val_sig_cstr = jsj_ConvertJavaSignatureToString(cx, return_val_signature);
405
+ if (!return_val_sig_cstr) {
406
+ JS_smprintf_free((char*)arg_sigs_cstr);
407
+ return NULL;
408
+ }
409
+
410
+ /* Compose method arg signatures string and return val signature string */
411
+ if (arg_sigs_cstr) {
412
+ sig_cstr = JS_smprintf("(%s)%s", arg_sigs_cstr, return_val_sig_cstr);
413
+ JS_smprintf_free((char*)arg_sigs_cstr);
414
+ } else {
415
+ sig_cstr = JS_smprintf("()%s", return_val_sig_cstr);
416
+ }
417
+
418
+ JS_smprintf_free((char*)return_val_sig_cstr);
419
+
420
+ if (!sig_cstr) {
421
+ JS_ReportOutOfMemory(cx);
422
+ return NULL;
423
+ }
424
+ return sig_cstr;
425
+ }
426
+
427
+ static JSBool
428
+ add_java_method_to_class_descriptor(JSContext *cx, JNIEnv *jEnv,
429
+ JavaClassDescriptor *class_descriptor,
430
+ jstring method_name_jstr,
431
+ jobject java_method,
432
+ JSBool is_static_method,
433
+ JSBool is_constructor)
434
+ {
435
+ jmethodID methodID;
436
+ JSFunction *fun;
437
+ jclass java_class = class_descriptor->java_class;
438
+
439
+ JavaMemberDescriptor *member_descriptor = NULL;
440
+ const char *sig_cstr = NULL;
441
+ const char *method_name = NULL;
442
+ JavaMethodSignature *signature = NULL;
443
+ JavaMethodSpec **specp, *method_spec = NULL;
444
+
445
+ if (is_constructor) {
446
+ member_descriptor = jsj_GetJavaClassConstructors(cx, class_descriptor);
447
+ } else {
448
+ if (is_static_method) {
449
+ member_descriptor = jsj_GetJavaStaticMemberDescriptor(cx, jEnv, class_descriptor, method_name_jstr);
450
+ } else {
451
+ member_descriptor = jsj_GetJavaMemberDescriptor(cx, jEnv, class_descriptor, method_name_jstr);
452
+ }
453
+ fun = JS_NewFunction(cx, jsj_JavaInstanceMethodWrapper, 0,
454
+ JSFUN_BOUND_METHOD, NULL, member_descriptor->name);
455
+ member_descriptor->invoke_func_obj = JS_GetFunctionObject(fun);
456
+ JS_AddNamedRoot(cx, &member_descriptor->invoke_func_obj,
457
+ "&member_descriptor->invoke_func_obj");
458
+ }
459
+ if (!member_descriptor)
460
+ return JS_FALSE;
461
+
462
+ method_spec = (JavaMethodSpec*)JS_malloc(cx, sizeof(JavaMethodSpec));
463
+ if (!method_spec)
464
+ goto error;
465
+ memset(method_spec, 0, sizeof(JavaMethodSpec));
466
+
467
+ signature = jsj_InitJavaMethodSignature(cx, jEnv, java_method, &method_spec->signature);
468
+ if (!signature)
469
+ goto error;
470
+
471
+ method_name = JS_strdup(cx, member_descriptor->name);
472
+ if (!method_name)
473
+ goto error;
474
+ method_spec->name = method_name;
475
+
476
+ sig_cstr = jsj_ConvertJavaMethodSignatureToString(cx, signature);
477
+ if (!sig_cstr)
478
+ goto error;
479
+
480
+ if (is_static_method)
481
+ methodID = (*jEnv)->GetStaticMethodID(jEnv, java_class, method_name, sig_cstr);
482
+ else
483
+ methodID = (*jEnv)->GetMethodID(jEnv, java_class, method_name, sig_cstr);
484
+ method_spec->methodID = methodID;
485
+
486
+ if (!methodID) {
487
+ jsj_UnexpectedJavaError(cx, jEnv,
488
+ "Can't get Java method ID for %s.%s() (sig=%s)",
489
+ class_descriptor->name, method_name, sig_cstr);
490
+ goto error;
491
+ }
492
+
493
+ JS_free(cx, (char*)sig_cstr);
494
+
495
+ /* Add method to end of list of overloaded methods for this class member */
496
+ specp = &member_descriptor->methods;
497
+ while (*specp) {
498
+ specp = &(*specp)->next;
499
+ }
500
+ *specp = method_spec;
501
+
502
+ return JS_TRUE;
503
+
504
+ error:
505
+ if (method_spec)
506
+ JS_FREE_IF(cx, (char*)method_spec->name);
507
+ JS_FREE_IF(cx, (char*)sig_cstr);
508
+ if (signature)
509
+ jsj_PurgeJavaMethodSignature(cx, jEnv, signature);
510
+ JS_FREE_IF(cx, method_spec);
511
+ return JS_FALSE;
512
+ }
513
+
514
+ JSBool
515
+ jsj_ReflectJavaMethods(JSContext *cx, JNIEnv *jEnv,
516
+ JavaClassDescriptor *class_descriptor,
517
+ JSBool reflect_only_static_methods)
518
+ {
519
+ jarray joMethodArray, joConstructorArray;
520
+ jsize num_methods, num_constructors;
521
+ int i;
522
+ jclass java_class;
523
+ JSBool ok, reflect_only_instance_methods;
524
+
525
+ reflect_only_instance_methods = !reflect_only_static_methods;
526
+
527
+ /* Get a java array of java.lang.reflect.Method objects, by calling
528
+ java.lang.Class.getMethods(). */
529
+ java_class = class_descriptor->java_class;
530
+ joMethodArray = (*jEnv)->CallObjectMethod(jEnv, java_class, jlClass_getMethods);
531
+ if (!joMethodArray) {
532
+ jsj_UnexpectedJavaError(cx, jEnv,
533
+ "Can't determine Java object's methods "
534
+ "using java.lang.Class.getMethods()");
535
+ return JS_FALSE;
536
+ }
537
+
538
+ /* Iterate over the class methods */
539
+ num_methods = (*jEnv)->GetArrayLength(jEnv, joMethodArray);
540
+ for (i = 0; i < num_methods; i++) {
541
+ jstring method_name_jstr;
542
+
543
+ /* Get the i'th reflected method */
544
+ jobject java_method = (*jEnv)->GetObjectArrayElement(jEnv, joMethodArray, i);
545
+
546
+ /* Get the method modifiers, eg static, public, private, etc. */
547
+ jint modifiers = (*jEnv)->CallIntMethod(jEnv, java_method, jlrMethod_getModifiers);
548
+
549
+ /* Don't allow access to private or protected Java methods. */
550
+ if (!(modifiers & ACC_PUBLIC))
551
+ goto dont_reflect_method;
552
+
553
+ /* Abstract methods can't be invoked */
554
+ if (modifiers & ACC_ABSTRACT)
555
+ goto dont_reflect_method;
556
+
557
+ /* Reflect all instance methods or all static methods, but not both */
558
+ if (reflect_only_static_methods != ((modifiers & ACC_STATIC) != 0))
559
+ goto dont_reflect_method;
560
+
561
+ /* Add a JavaMethodSpec object to the JavaClassDescriptor */
562
+ method_name_jstr = (*jEnv)->CallObjectMethod(jEnv, java_method, jlrMethod_getName);
563
+ ok = add_java_method_to_class_descriptor(cx, jEnv, class_descriptor, method_name_jstr, java_method,
564
+ reflect_only_static_methods, JS_FALSE);
565
+ (*jEnv)->DeleteLocalRef(jEnv, method_name_jstr);
566
+ if (!ok) {
567
+ (*jEnv)->DeleteLocalRef(jEnv, java_method);
568
+ (*jEnv)->DeleteLocalRef(jEnv, joMethodArray);
569
+ return JS_FALSE;
570
+ }
571
+
572
+ dont_reflect_method:
573
+ (*jEnv)->DeleteLocalRef(jEnv, java_method);
574
+ }
575
+
576
+ (*jEnv)->DeleteLocalRef(jEnv, joMethodArray);
577
+ if (reflect_only_instance_methods)
578
+ return JS_TRUE;
579
+
580
+ joConstructorArray = (*jEnv)->CallObjectMethod(jEnv, java_class, jlClass_getConstructors);
581
+ if (!joConstructorArray) {
582
+ jsj_UnexpectedJavaError(cx, jEnv, "internal error: "
583
+ "Can't determine Java class's constructors "
584
+ "using java.lang.Class.getConstructors()");
585
+ return JS_FALSE;
586
+ }
587
+
588
+ /* Iterate over the class constructors */
589
+ num_constructors = (*jEnv)->GetArrayLength(jEnv, joConstructorArray);
590
+ for (i = 0; i < num_constructors; i++) {
591
+ /* Get the i'th reflected constructor */
592
+ jobject java_constructor =
593
+ (*jEnv)->GetObjectArrayElement(jEnv, joConstructorArray, i);
594
+
595
+ /* Get the method modifiers, eg public, private, etc. */
596
+ jint modifiers = (*jEnv)->CallIntMethod(jEnv, java_constructor,
597
+ jlrConstructor_getModifiers);
598
+
599
+ /* Don't allow access to private or protected Java methods. */
600
+ if (!(modifiers & ACC_PUBLIC))
601
+ goto dont_reflect_constructor;
602
+
603
+ /* Add a JavaMethodSpec object to the JavaClassDescriptor */
604
+ ok = add_java_method_to_class_descriptor(cx, jEnv, class_descriptor, NULL,
605
+ java_constructor,
606
+ JS_FALSE, JS_TRUE);
607
+ if (!ok) {
608
+ (*jEnv)->DeleteLocalRef(jEnv, joConstructorArray);
609
+ (*jEnv)->DeleteLocalRef(jEnv, java_constructor);
610
+ return JS_FALSE;
611
+ }
612
+
613
+ dont_reflect_constructor:
614
+ (*jEnv)->DeleteLocalRef(jEnv, java_constructor);
615
+ }
616
+
617
+ (*jEnv)->DeleteLocalRef(jEnv, joConstructorArray);
618
+ return JS_TRUE;
619
+ }
620
+
621
+ /*
622
+ * Free up a JavaMethodSpec and all its resources.
623
+ */
624
+ void
625
+ jsj_DestroyMethodSpec(JSContext *cx, JNIEnv *jEnv, JavaMethodSpec *method_spec)
626
+ {
627
+ if (!method_spec->is_alias) {
628
+ JS_FREE_IF(cx, (char*)method_spec->name);
629
+ jsj_PurgeJavaMethodSignature(cx, jEnv, &method_spec->signature);
630
+ }
631
+ JS_free(cx, method_spec);
632
+ }
633
+
634
+ static JavaMethodSpec *
635
+ copy_java_method_descriptor(JSContext *cx, JavaMethodSpec *method)
636
+ {
637
+ JavaMethodSpec *copy;
638
+
639
+ copy = (JavaMethodSpec*)JS_malloc(cx, sizeof(JavaMethodSpec));
640
+ if (!copy)
641
+ return NULL;
642
+ memcpy(copy, method, sizeof(JavaMethodSpec));
643
+ copy->next = NULL;
644
+ copy->is_alias = JS_TRUE;
645
+ return copy;
646
+ }
647
+
648
+ /*
649
+ * See if a reference to a JavaObject/JavaClass's property looks like the
650
+ * explicit resolution of an overloaded method, e.g.
651
+ * java.lang.String["max(double,double)"]. If so, add a new member
652
+ * (JavaMemberDescriptor) to the object that is an alias for the resolved
653
+ * method.
654
+ */
655
+ JavaMemberDescriptor *
656
+ jsj_ResolveExplicitMethod(JSContext *cx, JNIEnv *jEnv,
657
+ JavaClassDescriptor *class_descriptor,
658
+ jsid method_name_id,
659
+ JSBool is_static)
660
+ {
661
+ JavaMethodSpec *method;
662
+ JavaMemberDescriptor *member_descriptor;
663
+ JavaMethodSignature *ms;
664
+ JSString *simple_name_jsstr;
665
+ JSFunction *fun;
666
+ JSBool is_constructor;
667
+ int left_paren;
668
+ const char *sig_cstr, *method_name;
669
+ char *arg_start;
670
+ jsid id;
671
+ jsval method_name_jsval;
672
+
673
+ /*
674
+ * Get the simple name of the explicit method, i.e. get "cos" from
675
+ * "cos(double)", and use it to create a new JS string.
676
+ */
677
+ JS_IdToValue(cx, method_name_id, &method_name_jsval);
678
+ method_name = JS_GetStringBytes(JSVAL_TO_STRING(method_name_jsval));
679
+ arg_start = strchr(method_name, '('); /* Skip until '(' */
680
+ /* If no left-paren, then this is not a case of explicit method resolution */
681
+ if (!arg_start)
682
+ return NULL;
683
+ /* Left-paren must be first character for constructors */
684
+ is_constructor = (is_static && (arg_start == method_name));
685
+
686
+ left_paren = arg_start - method_name;
687
+ simple_name_jsstr = JS_NewStringCopyN(cx, method_name, left_paren);
688
+ if (!simple_name_jsstr)
689
+ return NULL;
690
+
691
+ /* Find all the methods in the same class with the same simple name */
692
+ JS_ValueToId(cx, STRING_TO_JSVAL(simple_name_jsstr), &id);
693
+ if (is_constructor)
694
+ member_descriptor = jsj_LookupJavaClassConstructors(cx, jEnv, class_descriptor);
695
+ else if (is_static)
696
+ member_descriptor = jsj_LookupJavaStaticMemberDescriptorById(cx, jEnv, class_descriptor, id);
697
+ else
698
+ member_descriptor = jsj_LookupJavaMemberDescriptorById(cx, jEnv, class_descriptor, id);
699
+ if (!member_descriptor) /* No member with matching simple name ? */
700
+ return NULL;
701
+
702
+ /*
703
+ * Do a UTF8 comparison of method signatures with all methods of the same name,
704
+ * so as to discover a method which exactly matches the specified argument types.
705
+ */
706
+ if (!strlen(arg_start + 1))
707
+ return NULL;
708
+ arg_start = JS_strdup(cx, arg_start + 1);
709
+ if (!arg_start)
710
+ return NULL;
711
+ arg_start[strlen(arg_start) - 1] = '\0'; /* Get rid of ')' */
712
+ sig_cstr = NULL; /* Quiet gcc warning about uninitialized variable */
713
+ for (method = member_descriptor->methods; method; method = method->next) {
714
+ ms = &method->signature;
715
+ sig_cstr = convert_java_method_arg_signatures_to_hr_string(cx, ms->arg_signatures,
716
+ ms->num_args, JS_FALSE);
717
+ if (!sig_cstr) {
718
+ JS_free(cx, arg_start);
719
+ return NULL;
720
+ }
721
+
722
+ if (!strcmp(sig_cstr, arg_start))
723
+ break;
724
+ JS_smprintf_free((char*)sig_cstr);
725
+ }
726
+ JS_free(cx, arg_start);
727
+ if (!method)
728
+ return NULL;
729
+ JS_smprintf_free((char*)sig_cstr);
730
+
731
+ /* Don't bother doing anything if the method isn't overloaded */
732
+ if (!member_descriptor->methods->next)
733
+ return member_descriptor;
734
+
735
+ /*
736
+ * To speed up performance for future accesses, create a new member descriptor
737
+ * with a name equal to the explicit method name, i.e. "cos(double)".
738
+ */
739
+ member_descriptor = JS_malloc(cx, sizeof(JavaMemberDescriptor));
740
+ if (!member_descriptor)
741
+ return NULL;
742
+ memset(member_descriptor, 0, sizeof(JavaMemberDescriptor));
743
+
744
+ member_descriptor->id = method_name_id;
745
+ member_descriptor->name =
746
+ JS_strdup(cx, is_constructor ? "<init>" : JS_GetStringBytes(simple_name_jsstr));
747
+ if (!member_descriptor->name) {
748
+ JS_free(cx, member_descriptor);
749
+ return NULL;
750
+ }
751
+
752
+ member_descriptor->methods = copy_java_method_descriptor(cx, method);
753
+ if (!member_descriptor->methods) {
754
+ JS_free(cx, (void*)member_descriptor->name);
755
+ JS_free(cx, member_descriptor);
756
+ return NULL;
757
+ }
758
+
759
+ fun = JS_NewFunction(cx, jsj_JavaInstanceMethodWrapper, 0,
760
+ JSFUN_BOUND_METHOD, NULL, method_name);
761
+ member_descriptor->invoke_func_obj = JS_GetFunctionObject(fun);
762
+ JS_AddNamedRoot(cx, &member_descriptor->invoke_func_obj,
763
+ "&member_descriptor->invoke_func_obj");
764
+
765
+ /* THREADSAFETY */
766
+ /* Add the new aliased member to the list of all members for the class */
767
+ if (is_static) {
768
+ member_descriptor->next = class_descriptor->static_members;
769
+ class_descriptor->static_members = member_descriptor;
770
+ } else {
771
+ member_descriptor->next = class_descriptor->instance_members;
772
+ class_descriptor->instance_members = member_descriptor;
773
+ }
774
+
775
+ return member_descriptor;
776
+ }
777
+
778
+ /*
779
+ * Return the JavaScript types that a JavaScript method was invoked with
780
+ * as a string, e.g. a JS method invoked like foo(3, 'hey', 'you', true)
781
+ * would cause a return value of "(number, string, string, boolean)".
782
+ * The returned string must be free'ed by the caller.
783
+ * Returns NULL and reports an error if out-of-memory.
784
+ */
785
+ static const char *
786
+ get_js_arg_types_as_string(JSContext *cx, uintN argc, jsval *argv)
787
+ {
788
+ uintN i;
789
+ const char *arg_type, *arg_string, *tmp;
790
+
791
+ if (argc == 0)
792
+ return JS_smprintf("%s", "()");
793
+
794
+ arg_string = strdup("(");
795
+ if (!arg_string)
796
+ goto out_of_memory;
797
+ for (i = 0; i < argc; i++) {
798
+ arg_type = JS_GetTypeName(cx, JS_TypeOfValue(cx, argv[i]));
799
+ tmp = JS_smprintf("%s%s%s%s", arg_string, i ? ", " : "", arg_type,
800
+ (i == argc-1) ? ")" : "");
801
+ free((char*)arg_string);
802
+ if (!tmp)
803
+ goto out_of_memory;
804
+ arg_string = tmp;
805
+ }
806
+
807
+ return arg_string;
808
+
809
+ out_of_memory:
810
+ JS_ReportOutOfMemory(cx);
811
+ return NULL;
812
+ }
813
+
814
+ /*
815
+ * This is an error reporting routine used when a method of the correct name
816
+ * and class exists but either the number of arguments is incorrect or the
817
+ * arguments are of the wrong type.
818
+ */
819
+ static void
820
+ report_method_match_failure(JSContext *cx,
821
+ JavaMemberDescriptor *member_descriptor,
822
+ JavaClassDescriptor *class_descriptor,
823
+ JSBool is_static_method,
824
+ uintN argc, jsval *argv)
825
+ {
826
+ const char *err, *js_arg_string, *tmp, *method_str, *method_name;
827
+ JSBool is_constructor;
828
+ JavaMethodSpec *method;
829
+
830
+ err = NULL;
831
+ is_constructor = (!strcmp(member_descriptor->name, "<init>"));
832
+
833
+ js_arg_string = get_js_arg_types_as_string(cx, argc, argv);
834
+ if (!js_arg_string)
835
+ goto out_of_memory;
836
+
837
+ if (is_constructor) {
838
+ err = JS_smprintf("There is no Java constructor for class %s that matches "
839
+ "JavaScript argument types %s.\n", class_descriptor->name,
840
+ js_arg_string);
841
+ method_name = class_descriptor->name;
842
+ } else {
843
+ err = JS_smprintf("There is no %sJava method %s.%s that matches "
844
+ "JavaScript argument types %s.\n",
845
+ is_static_method ? "static ": "",
846
+ class_descriptor->name, member_descriptor->name, js_arg_string);
847
+ method_name = member_descriptor->name;
848
+ }
849
+ if (!err)
850
+ goto out_of_memory;
851
+
852
+ tmp = JS_smprintf("%sCandidate methods with the same name are:\n", err);
853
+ if (!tmp)
854
+ goto out_of_memory;
855
+ err = tmp;
856
+
857
+ method = member_descriptor->methods;
858
+ while (method) {
859
+ method_str =
860
+ jsj_ConvertJavaMethodSignatureToHRString(cx, method_name, &method->signature);
861
+ if (!method_str)
862
+ goto out_of_memory;
863
+ tmp = JS_smprintf("%s %s\n", err, method_str);
864
+ JS_smprintf_free((char*)method_str);
865
+ if (!tmp)
866
+ goto out_of_memory;
867
+ err = tmp;
868
+
869
+ method = method->next;
870
+ }
871
+
872
+ JS_ReportError(cx, err);
873
+ return;
874
+
875
+ out_of_memory:
876
+ if (js_arg_string)
877
+ JS_smprintf_free((char*)js_arg_string);
878
+ if (err)
879
+ JS_smprintf_free((char*)err);
880
+ }
881
+
882
+ /*
883
+ * This is an error reporting routine used when a method of the correct name
884
+ * and class exists but more than one Java method in a set of overloaded
885
+ * methods are compatible with the JavaScript argument types and none of them
886
+ * match any better than all the others.
887
+ */
888
+ static void
889
+ report_ambiguous_method_match(JSContext *cx,
890
+ JavaMemberDescriptor *member_descriptor,
891
+ JavaClassDescriptor *class_descriptor,
892
+ MethodList *ambiguous_methods,
893
+ JSBool is_static_method,
894
+ uintN argc, jsval *argv)
895
+ {
896
+ const char *err, *js_arg_string, *tmp, *method_str, *method_name;
897
+ JSBool is_constructor;
898
+ JavaMethodSpec *method;
899
+ MethodListElement *method_list_element;
900
+
901
+ err = NULL;
902
+ is_constructor = (!strcmp(member_descriptor->name, "<init>"));
903
+
904
+ js_arg_string = get_js_arg_types_as_string(cx, argc, argv);
905
+ if (!js_arg_string)
906
+ goto out_of_memory;
907
+
908
+ if (is_constructor) {
909
+ err = JS_smprintf("The choice of Java constructor for class %s with "
910
+ "JavaScript argument types %s is ambiguous.\n",
911
+ class_descriptor->name,
912
+ js_arg_string);
913
+ method_name = class_descriptor->name;
914
+ } else {
915
+ err = JS_smprintf("The choice of %sJava method %s.%s matching "
916
+ "JavaScript argument types %s is ambiguous.\n",
917
+ is_static_method ? "static ": "",
918
+ class_descriptor->name, member_descriptor->name,
919
+ js_arg_string);
920
+ method_name = member_descriptor->name;
921
+ }
922
+ if (!err)
923
+ goto out_of_memory;
924
+
925
+ tmp = JS_smprintf("%sCandidate methods are:\n", err);
926
+ if (!tmp)
927
+ goto out_of_memory;
928
+ err = tmp;
929
+
930
+ method_list_element = (MethodListElement*)JS_LIST_HEAD(ambiguous_methods);
931
+ while ((MethodList*)method_list_element != ambiguous_methods) {
932
+ method = method_list_element->method;
933
+ method_str =
934
+ jsj_ConvertJavaMethodSignatureToHRString(cx, method_name, &method->signature);
935
+ if (!method_str)
936
+ goto out_of_memory;
937
+ tmp = JS_smprintf("%s %s\n", err, method_str);
938
+ JS_smprintf_free((char*)method_str);
939
+ if (!tmp)
940
+ goto out_of_memory;
941
+ err = tmp;
942
+
943
+ method_list_element = (MethodListElement*)method_list_element->linkage.next;
944
+ }
945
+
946
+ JS_ReportError(cx, err);
947
+ return;
948
+
949
+ out_of_memory:
950
+ if (js_arg_string)
951
+ JS_smprintf_free((char*)js_arg_string);
952
+ if (err)
953
+ JS_smprintf_free((char*)err);
954
+ }
955
+
956
+ /*
957
+ * Compute classification of JS types with slightly different granularity
958
+ * than JSType. This is used to resolve among overloaded Java methods.
959
+ */
960
+ static JSJType
961
+ compute_jsj_type(JSContext *cx, jsval v)
962
+ {
963
+ JSObject *js_obj;
964
+
965
+ if (JSVAL_IS_OBJECT(v)) {
966
+ if (JSVAL_IS_NULL(v))
967
+ return JSJTYPE_NULL;
968
+ js_obj = JSVAL_TO_OBJECT(v);
969
+ if (JS_InstanceOf(cx, js_obj, &JavaObject_class, 0))
970
+ return JSJTYPE_JAVAOBJECT;
971
+ if (JS_InstanceOf(cx, js_obj, &JavaArray_class, 0))
972
+ return JSJTYPE_JAVAARRAY;
973
+ if (JS_InstanceOf(cx, js_obj, &JavaClass_class, 0))
974
+ return JSJTYPE_JAVACLASS;
975
+ if (JS_IsArrayObject(cx, js_obj))
976
+ return JSJTYPE_JSARRAY;
977
+ return JSJTYPE_OBJECT;
978
+ } else if (JSVAL_IS_NUMBER(v)) {
979
+ return JSJTYPE_NUMBER;
980
+ } else if (JSVAL_IS_STRING(v)) {
981
+ return JSJTYPE_STRING;
982
+ } else if (JSVAL_IS_BOOLEAN(v)) {
983
+ return JSJTYPE_BOOLEAN;
984
+ } else if (JSVAL_IS_VOID(v)) {
985
+ return JSJTYPE_VOID;
986
+ }
987
+ JS_ASSERT(0); /* Unknown JS type ! */
988
+ return JSJTYPE_VOID;
989
+ }
990
+
991
+ /*
992
+ * Ranking table used to establish preferences among Java types when converting
993
+ * from JavaScript types. Each row represents a different JavaScript source
994
+ * type and each column represents a different target Java type. Lower values
995
+ * in the table indicate conversions that are ranked higher. The special
996
+ * value 99 indicates a disallowed JS->Java conversion. The special value of
997
+ * 0 indicates special handling is required to determine ranking.
998
+ */
999
+ static int rank_table[JSJTYPE_LIMIT][JAVA_SIGNATURE_LIMIT] = {
1000
+ /* boolean long
1001
+ | char | float java.lang.Boolean
1002
+ | | byte | | double | java.lang.Class
1003
+ | | | short | | | array | | java.lang.Double
1004
+ | | | | int | | | | object | | netscape.javascript.JSObject
1005
+ | | | | | | | | | | | | | | java.lang.Object
1006
+ | | | | | | | | | | | | | | | java.lang.String */
1007
+
1008
+ {99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 1, 1}, /* undefined */
1009
+ { 1, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 99, 99, 99, 3, 4}, /* boolean */
1010
+ {99, 7, 8, 6, 5, 4, 3, 1, 99, 99, 99, 99, 2, 99, 11, 9}, /* number */
1011
+ {99, 3, 4, 4, 4, 4, 4, 4, 99, 99, 99, 99, 99, 99, 2, 1}, /* string */
1012
+ {99, 99, 99, 99, 99, 99, 99, 99, 1, 1, 1, 1, 1, 1, 1, 1}, /* null */
1013
+ {99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 1, 99, 2, 3, 4}, /* JavaClass */
1014
+ {99, 7, 8, 6, 5, 4, 3, 2, 0, 0, 0, 0, 0, 0, 0, 1}, /* JavaObject */
1015
+ {99, 99, 99, 99, 99, 99, 99, 99, 0, 0, 99, 99, 99, 99, 0, 1}, /* JavaArray */
1016
+ {99, 99, 99, 99, 99, 99, 99, 99, 2, 99, 99, 99, 99, 1, 3, 4}, /* JS Array */
1017
+ {99, 9, 10, 8, 7, 6, 5, 4, 99, 99, 99, 99, 99, 1, 2, 3} /* other JS object */
1018
+ };
1019
+
1020
+ /*
1021
+ * Returns JS_TRUE if JavaScript arguments are compatible with the specified
1022
+ * Java method signature.
1023
+ */
1024
+ static JSBool
1025
+ method_signature_matches_JS_args(JSContext *cx, JNIEnv *jEnv, uintN argc, jsval *argv,
1026
+ JavaMethodSignature *method_signature)
1027
+ {
1028
+ uintN i;
1029
+ JavaClassDescriptor *descriptor;
1030
+ JavaObjectWrapper *java_wrapper;
1031
+ jclass java_class;
1032
+ jobject java_obj;
1033
+ JSObject *js_obj;
1034
+ JSJType js_type;
1035
+ jsval js_val;
1036
+ int rank;
1037
+
1038
+ if (argc != (uintN)method_signature->num_args)
1039
+ return JS_FALSE;
1040
+
1041
+ for (i = 0; i < argc; i++) {
1042
+ js_val = argv[i];
1043
+ js_type = compute_jsj_type(cx, js_val);
1044
+ descriptor = method_signature->arg_signatures[i];
1045
+ rank = rank_table[js_type][(int)descriptor->type - 2];
1046
+
1047
+ /* Check for disallowed JS->Java conversion */
1048
+ if (rank == 99)
1049
+ return JS_FALSE;
1050
+
1051
+ /* Check for special handling required by conversion from JavaObject */
1052
+ if (rank == 0) {
1053
+ java_class = descriptor->java_class;
1054
+
1055
+ js_obj = JSVAL_TO_OBJECT(js_val);
1056
+ java_wrapper = JS_GetPrivate(cx, js_obj);
1057
+ java_obj = java_wrapper->java_obj;
1058
+
1059
+ if (!(*jEnv)->IsInstanceOf(jEnv, java_obj, java_class))
1060
+ return JS_FALSE;
1061
+ }
1062
+ }
1063
+
1064
+ return JS_TRUE;
1065
+ }
1066
+
1067
+ #ifdef HAS_OLD_STYLE_METHOD_RESOLUTION
1068
+
1069
+ static JavaMethodSpec *
1070
+ resolve_overloaded_method(JSContext *cx, JNIEnv *jEnv, JavaMemberDescriptor *member_descriptor,
1071
+ JavaClassDescriptor *class_descriptor,
1072
+ JSBool is_static_method,
1073
+ uintN argc, jsval *argv)
1074
+ {
1075
+ int cost, lowest_cost, num_method_matches;
1076
+ JavaMethodSpec *best_method_match, *method;
1077
+
1078
+ num_method_matches = 0;
1079
+ lowest_cost = 10000;
1080
+ best_method_match = NULL;
1081
+
1082
+ for (method = member_descriptor->methods; method; method = method->next) {
1083
+ cost = 0;
1084
+ if (!method_signature_matches_JS_args(cx, jEnv, argc, argv, &method->signature, &cost))
1085
+ continue;
1086
+
1087
+ if (cost < lowest_cost) {
1088
+ lowest_cost = cost;
1089
+ best_method_match = method;
1090
+ num_method_matches++;
1091
+ }
1092
+ }
1093
+
1094
+ if (!best_method_match)
1095
+ report_method_match_failure(cx, member_descriptor, class_descriptor,
1096
+ is_static_method, argc, argv);
1097
+
1098
+ if (lowest_cost != 0)
1099
+ return NULL;
1100
+
1101
+ return best_method_match;
1102
+ }
1103
+
1104
+ #else /* !OLD_STYLE_METHOD_RESOLUTION */
1105
+
1106
+ /*
1107
+ * Determine the more natural (preferred) JavaScript->Java conversion
1108
+ * given one JavaScript value and two Java types.
1109
+ * See http://www.mozilla.org/js/liveconnect/lc3_method_overloading.html
1110
+ * for details.
1111
+ */
1112
+ static JSJTypePreference
1113
+ preferred_conversion(JSContext *cx, JNIEnv *jEnv, jsval js_val,
1114
+ JavaClassDescriptor *descriptor1,
1115
+ JavaClassDescriptor *descriptor2)
1116
+ {
1117
+ JSJType js_type;
1118
+ int rank1, rank2;
1119
+ jclass java_class1, java_class2;
1120
+ JavaObjectWrapper *java_wrapper;
1121
+ jobject java_obj;
1122
+ JSObject *js_obj;
1123
+
1124
+ js_type = compute_jsj_type(cx, js_val);
1125
+ rank1 = rank_table[js_type][(int)descriptor1->type - 2];
1126
+ rank2 = rank_table[js_type][(int)descriptor2->type - 2];
1127
+
1128
+ /* Fast path for conversion from most JS types */
1129
+ if (rank1 < rank2)
1130
+ return JSJPREF_FIRST_ARG;
1131
+
1132
+ /*
1133
+ * Special logic is required for matching the classes of wrapped
1134
+ * Java objects.
1135
+ */
1136
+ if (rank2 == 0) {
1137
+ java_class1 = descriptor1->java_class;
1138
+ java_class2 = descriptor2->java_class;
1139
+
1140
+ js_obj = JSVAL_TO_OBJECT(js_val);
1141
+ java_wrapper = JS_GetPrivate(cx, js_obj);
1142
+ java_obj = java_wrapper->java_obj;
1143
+
1144
+ /* Unwrapped JavaObject must be compatible with Java arg type */
1145
+ if (!(*jEnv)->IsInstanceOf(jEnv, java_obj, java_class2))
1146
+ return JSJPREF_FIRST_ARG;
1147
+
1148
+ /*
1149
+ * For JavaObject arguments, any compatible reference type is preferable
1150
+ * to any primitive Java type or to java.lang.String.
1151
+ */
1152
+ if (rank1 != 0)
1153
+ return JSJPREF_SECOND_ARG;
1154
+
1155
+ /*
1156
+ * If argument of type descriptor1 is subclass of type descriptor 2, then
1157
+ * descriptor1 is preferred and vice-versa.
1158
+ */
1159
+ if ((*jEnv)->IsAssignableFrom(jEnv, java_class1, java_class2))
1160
+ return JSJPREF_FIRST_ARG;
1161
+
1162
+ if ((*jEnv)->IsAssignableFrom(jEnv, java_class2, java_class1))
1163
+ return JSJPREF_SECOND_ARG;
1164
+
1165
+ /* This can happen in unusual situations involving interface types. */
1166
+ return JSJPREF_AMBIGUOUS;
1167
+ }
1168
+
1169
+ if (rank1 > rank2)
1170
+ return JSJPREF_SECOND_ARG;
1171
+
1172
+ return JSJPREF_AMBIGUOUS;
1173
+ }
1174
+
1175
+ static JSJTypePreference
1176
+ method_preferred(JSContext *cx, JNIEnv *jEnv, jsval *argv,
1177
+ JavaMethodSignature *method_signature1,
1178
+ JavaMethodSignature *method_signature2)
1179
+ {
1180
+ int arg_index, argc, preference;
1181
+ jsval val;
1182
+ JavaSignature* *arg_signatures1;
1183
+ JavaSignature* *arg_signatures2;
1184
+ JavaSignature *arg_type1, *arg_type2;
1185
+
1186
+ arg_signatures1 = method_signature1->arg_signatures;
1187
+ arg_signatures2 = method_signature2->arg_signatures;
1188
+ argc = method_signature1->num_args;
1189
+ JS_ASSERT(argc == method_signature2->num_args);
1190
+
1191
+ preference = 0;
1192
+ for (arg_index = 0; arg_index < argc; arg_index++) {
1193
+ val = argv[arg_index];
1194
+ arg_type1 = *arg_signatures1++;
1195
+ arg_type2 = *arg_signatures2++;
1196
+
1197
+ if (arg_type1 == arg_type2)
1198
+ continue;
1199
+
1200
+ preference |= preferred_conversion(cx, jEnv, val, arg_type1, arg_type2);
1201
+
1202
+ if ((JSJTypePreference)preference == JSJPREF_AMBIGUOUS)
1203
+ return JSJPREF_AMBIGUOUS;
1204
+ }
1205
+ return (JSJTypePreference)preference;
1206
+ }
1207
+
1208
+ /*
1209
+ * This routine applies heuristics to guess the intended Java method given the
1210
+ * runtime JavaScript argument types and the type signatures of the candidate
1211
+ * methods. Informally, the method with Java parameter types that most closely
1212
+ * match the JavaScript types is chosen. A more precise specification is
1213
+ * provided in the lc3_method_resolution.html file. The code uses a very
1214
+ * brute-force approach.
1215
+ */
1216
+ static JavaMethodSpec *
1217
+ resolve_overloaded_method(JSContext *cx, JNIEnv *jEnv,
1218
+ JavaMemberDescriptor *member_descriptor,
1219
+ JavaClassDescriptor *class_descriptor,
1220
+ JSBool is_static_method,
1221
+ uintN argc, jsval *argv)
1222
+ {
1223
+ JSJTypePreference preference;
1224
+ JavaMethodSpec *method, *best_method_match;
1225
+ MethodList ambiguous_methods;
1226
+ MethodListElement *method_list_element, *next_element;
1227
+
1228
+ /*
1229
+ * Determine the first Java method among the overloaded methods of the same name
1230
+ * that matches all the JS arguments.
1231
+ */
1232
+ for (method = member_descriptor->methods; method; method = method->next) {
1233
+ if (method_signature_matches_JS_args(cx, jEnv, argc, argv, &method->signature))
1234
+ break;
1235
+ }
1236
+
1237
+ /* Report an error if no method matched the JS arguments */
1238
+ if (!method) {
1239
+ report_method_match_failure(cx, member_descriptor, class_descriptor,
1240
+ is_static_method, argc, argv);
1241
+ return NULL;
1242
+ }
1243
+
1244
+ /* Shortcut a common case */
1245
+ if (!method->next)
1246
+ return method;
1247
+
1248
+ /*
1249
+ * Form a list of all methods that are neither more or less preferred than the
1250
+ * best matching method discovered so far.
1251
+ */
1252
+ JS_INIT_CLIST(&ambiguous_methods);
1253
+
1254
+ best_method_match = method;
1255
+
1256
+ /* See if there are any Java methods that are a better fit for the JS args */
1257
+ for (method = method->next; method; method = method->next) {
1258
+ if (method->signature.num_args != (int)argc)
1259
+ continue;
1260
+ preference = method_preferred(cx, jEnv, argv, &best_method_match->signature,
1261
+ &method->signature);
1262
+ if (preference == JSJPREF_SECOND_ARG) {
1263
+ best_method_match = method;
1264
+ } else if (preference == JSJPREF_AMBIGUOUS) {
1265
+ /* Add this method to the list of ambiguous methods */
1266
+ method_list_element =
1267
+ (MethodListElement*)JS_malloc(cx, sizeof(MethodListElement));
1268
+ if (!method_list_element)
1269
+ goto error;
1270
+ method_list_element->method = method;
1271
+ JS_APPEND_LINK(&method_list_element->linkage, &ambiguous_methods);
1272
+ }
1273
+ }
1274
+
1275
+ /*
1276
+ * Ensure that best_method_match is preferred to all methods on the
1277
+ * ambiguous_methods list.
1278
+ */
1279
+
1280
+ for (method_list_element = (MethodListElement*)JS_LIST_HEAD(&ambiguous_methods);
1281
+ (MethodList*)method_list_element != &ambiguous_methods;
1282
+ method_list_element = next_element) {
1283
+ next_element = (MethodListElement*)method_list_element->linkage.next;
1284
+ method = method_list_element->method;
1285
+ preference = method_preferred(cx, jEnv, argv, &best_method_match->signature,
1286
+ &method->signature);
1287
+ if (preference != JSJPREF_FIRST_ARG)
1288
+ continue;
1289
+ JS_REMOVE_LINK(&method_list_element->linkage);
1290
+ JS_free(cx, method_list_element);
1291
+ }
1292
+
1293
+ /*
1294
+ * The chosen method must be maximally preferred, i.e. there can be no other
1295
+ * method that is just as preferred.
1296
+ */
1297
+ if (!JS_CLIST_IS_EMPTY(&ambiguous_methods)) {
1298
+ /* Add the best_method_match to the list of ambiguous methods */
1299
+ method_list_element =
1300
+ (MethodListElement*)JS_malloc(cx, sizeof(MethodListElement));
1301
+ if (!method_list_element)
1302
+ goto error;
1303
+ method_list_element->method = best_method_match;
1304
+ JS_APPEND_LINK(&method_list_element->linkage, &ambiguous_methods);
1305
+
1306
+ /* Report the problem */
1307
+ report_ambiguous_method_match(cx, member_descriptor, class_descriptor,
1308
+ &ambiguous_methods, is_static_method, argc, argv);
1309
+ goto error;
1310
+ }
1311
+
1312
+ return best_method_match;
1313
+
1314
+ error:
1315
+ /* Delete the storage for the ambiguous_method list */
1316
+ while (!JS_CLIST_IS_EMPTY(&ambiguous_methods)) {
1317
+ method_list_element = (MethodListElement*)JS_LIST_HEAD(&ambiguous_methods);
1318
+ JS_REMOVE_LINK(&method_list_element->linkage);
1319
+ JS_free(cx, method_list_element);
1320
+ }
1321
+
1322
+ return NULL;
1323
+ }
1324
+
1325
+ #endif /* !HAS_OLD_STYLE_METHOD_RESOLUTION */
1326
+
1327
+ static jvalue *
1328
+ convert_JS_method_args_to_java_argv(JSContext *cx, JNIEnv *jEnv, jsval *argv,
1329
+ JavaMethodSpec *method, JSBool **localvp)
1330
+ {
1331
+ jvalue *jargv;
1332
+ JSBool ok, *localv;
1333
+ uintN i, argc;
1334
+ JavaSignature **arg_signatures;
1335
+ JavaMethodSignature *signature;
1336
+
1337
+
1338
+ signature = &method->signature;
1339
+ argc = signature->num_args;
1340
+ JS_ASSERT(argc != 0);
1341
+ arg_signatures = signature->arg_signatures;
1342
+
1343
+ jargv = (jvalue *)JS_malloc(cx, sizeof(jvalue) * argc);
1344
+
1345
+ if (!jargv)
1346
+ return NULL;
1347
+
1348
+ /*
1349
+ * Allocate an array that contains a flag for each argument, indicating whether
1350
+ * or not the conversion from a JS value to a Java value resulted in a new
1351
+ * JNI local reference.
1352
+ */
1353
+ localv = (JSBool *)JS_malloc(cx, sizeof(JSBool) * argc);
1354
+ *localvp = localv;
1355
+ if (!localv) {
1356
+ JS_free(cx, jargv);
1357
+ return NULL;
1358
+ }
1359
+
1360
+ for (i = 0; i < argc; i++) {
1361
+ int dummy_cost;
1362
+
1363
+ ok = jsj_ConvertJSValueToJavaValue(cx, jEnv, argv[i], arg_signatures[i],
1364
+ &dummy_cost, &jargv[i], &localv[i]);
1365
+ if (!ok) {
1366
+ JS_free(cx, jargv);
1367
+ JS_free(cx, localv);
1368
+ *localvp = NULL;
1369
+ return NULL;
1370
+ }
1371
+ }
1372
+
1373
+ return jargv;
1374
+ }
1375
+
1376
+ static JSBool
1377
+ invoke_java_method(JSContext *cx, JSJavaThreadState *jsj_env,
1378
+ jobject java_class_or_instance,
1379
+ JavaClassDescriptor *class_descriptor,
1380
+ JavaMethodSpec *method,
1381
+ JSBool is_static_method,
1382
+ jsval *argv, jsval *vp)
1383
+ {
1384
+ jvalue java_value;
1385
+ jvalue *jargv;
1386
+ uintN argc, i;
1387
+ jobject java_object;
1388
+ jclass java_class;
1389
+ jmethodID methodID;
1390
+ JavaMethodSignature *signature;
1391
+ JavaSignature *return_val_signature;
1392
+ JNIEnv *jEnv;
1393
+ JSBool *localv, error_occurred, success;
1394
+
1395
+ success = error_occurred = JS_FALSE;
1396
+ return_val_signature = NULL; /* Quiet gcc uninitialized variable warning */
1397
+
1398
+ methodID = method->methodID;
1399
+ signature = &method->signature;
1400
+ argc = signature->num_args;
1401
+
1402
+ jEnv = jsj_env->jEnv;
1403
+
1404
+ if (is_static_method) {
1405
+ java_object = NULL;
1406
+ java_class = java_class_or_instance;
1407
+ } else {
1408
+ java_object = java_class_or_instance;
1409
+ java_class = NULL;
1410
+ }
1411
+
1412
+ jargv = NULL;
1413
+ localv = NULL;
1414
+ if (argc) {
1415
+ jargv = convert_JS_method_args_to_java_argv(cx, jEnv, argv, method, &localv);
1416
+ if (!jargv) {
1417
+ error_occurred = JS_TRUE;
1418
+ goto out;
1419
+ }
1420
+ }
1421
+
1422
+ /* Prevent deadlocking if we re-enter JS on another thread as a result of a Java
1423
+ method call and that new thread wants to perform a GC. */
1424
+ #ifdef JSJ_THREADSAFE
1425
+ JS_EndRequest(cx);
1426
+ #endif
1427
+
1428
+ #define CALL_JAVA_METHOD(type, member) \
1429
+ JS_BEGIN_MACRO \
1430
+ if (is_static_method) { \
1431
+ java_value.member = (*jEnv)->CallStatic##type##MethodA(jEnv, java_class, methodID, jargv);\
1432
+ } else { \
1433
+ java_value.member = (*jEnv)->Call##type##MethodA(jEnv, java_object, methodID, jargv);\
1434
+ } \
1435
+ if ((*jEnv)->ExceptionOccurred(jEnv)) { \
1436
+ jsj_ReportJavaError(cx, jEnv, "Error calling method %s.%s()", \
1437
+ class_descriptor->name, method->name); \
1438
+ error_occurred = JS_TRUE; \
1439
+ goto out; \
1440
+ } \
1441
+ JS_END_MACRO
1442
+
1443
+ return_val_signature = signature->return_val_signature;
1444
+ switch(return_val_signature->type) {
1445
+ case JAVA_SIGNATURE_BYTE:
1446
+ CALL_JAVA_METHOD(Byte, b);
1447
+ break;
1448
+
1449
+ case JAVA_SIGNATURE_CHAR:
1450
+ CALL_JAVA_METHOD(Char, c);
1451
+ break;
1452
+
1453
+ case JAVA_SIGNATURE_FLOAT:
1454
+ CALL_JAVA_METHOD(Float, f);
1455
+ break;
1456
+
1457
+ case JAVA_SIGNATURE_DOUBLE:
1458
+ CALL_JAVA_METHOD(Double, d);
1459
+ break;
1460
+
1461
+ case JAVA_SIGNATURE_INT:
1462
+ CALL_JAVA_METHOD(Int, i);
1463
+ break;
1464
+
1465
+ case JAVA_SIGNATURE_LONG:
1466
+ CALL_JAVA_METHOD(Long, j);
1467
+ break;
1468
+
1469
+ case JAVA_SIGNATURE_SHORT:
1470
+ CALL_JAVA_METHOD(Short, s);
1471
+ break;
1472
+
1473
+ case JAVA_SIGNATURE_BOOLEAN:
1474
+ CALL_JAVA_METHOD(Boolean, z);
1475
+ break;
1476
+
1477
+ case JAVA_SIGNATURE_VOID:
1478
+ if (is_static_method)
1479
+ (*jEnv)->CallStaticVoidMethodA(jEnv, java_class, methodID, jargv);
1480
+ else
1481
+ (*jEnv)->CallVoidMethodA(jEnv, java_object, methodID, jargv);
1482
+ if ((*jEnv)->ExceptionOccurred(jEnv)) {
1483
+ jsj_ReportJavaError(cx, jEnv, "Error calling method %s.%s()",
1484
+ class_descriptor->name, method->name);
1485
+ error_occurred = JS_TRUE;
1486
+ goto out;
1487
+ }
1488
+ break;
1489
+
1490
+ case JAVA_SIGNATURE_UNKNOWN:
1491
+ JS_ASSERT(0);
1492
+ error_occurred = JS_TRUE;
1493
+ goto out;
1494
+
1495
+ /* Non-primitive (reference) type */
1496
+ default:
1497
+ JS_ASSERT(IS_REFERENCE_TYPE(return_val_signature->type));
1498
+ CALL_JAVA_METHOD(Object, l);
1499
+ break;
1500
+ }
1501
+
1502
+ out:
1503
+
1504
+ if (localv) {
1505
+ for (i = 0; i < argc; i++) {
1506
+ if (localv[i])
1507
+ (*jEnv)->DeleteLocalRef(jEnv, jargv[i].l);
1508
+ }
1509
+ JS_free(cx, localv);
1510
+ }
1511
+ if (jargv)
1512
+ JS_free(cx, jargv);
1513
+
1514
+ #ifdef JSJ_THREADSAFE
1515
+ JS_BeginRequest(cx);
1516
+ #endif
1517
+
1518
+ if (!error_occurred) {
1519
+ success = jsj_ConvertJavaValueToJSValue(cx, jEnv, return_val_signature, &java_value, vp);
1520
+ if (IS_REFERENCE_TYPE(return_val_signature->type))
1521
+ (*jEnv)->DeleteLocalRef(jEnv, java_value.l);
1522
+ }
1523
+ return success;
1524
+ }
1525
+
1526
+ static JSBool
1527
+ invoke_overloaded_java_method(JSContext *cx, JSJavaThreadState *jsj_env,
1528
+ JavaMemberDescriptor *member,
1529
+ JSBool is_static_method,
1530
+ jobject java_class_or_instance,
1531
+ JavaClassDescriptor *class_descriptor,
1532
+ uintN argc, jsval *argv,
1533
+ jsval *vp)
1534
+ {
1535
+ JavaMethodSpec *method;
1536
+ JNIEnv *jEnv;
1537
+
1538
+ jEnv = jsj_env->jEnv;
1539
+
1540
+ method = resolve_overloaded_method(cx, jEnv, member, class_descriptor,
1541
+ is_static_method, argc, argv);
1542
+ if (!method)
1543
+ return JS_FALSE;
1544
+
1545
+ return invoke_java_method(cx, jsj_env, java_class_or_instance, class_descriptor,
1546
+ method, is_static_method, argv, vp);
1547
+ }
1548
+
1549
+ static JSBool
1550
+ invoke_java_constructor(JSContext *cx,
1551
+ JSJavaThreadState *jsj_env,
1552
+ jclass java_class,
1553
+ JavaMethodSpec *method,
1554
+ jsval *argv, jsval *vp)
1555
+ {
1556
+ jvalue *jargv;
1557
+ uintN argc, i;
1558
+ jobject java_object;
1559
+ jmethodID methodID;
1560
+ JavaMethodSignature *signature;
1561
+ JNIEnv *jEnv;
1562
+ JSBool *localv;
1563
+ JSBool success, error_occurred;
1564
+ java_object = NULL; /* Stifle gcc uninitialized variable warning */
1565
+
1566
+ success = error_occurred = JS_FALSE;
1567
+
1568
+ methodID = method->methodID;
1569
+ signature = &method->signature;
1570
+ argc = signature->num_args;
1571
+
1572
+ jEnv = jsj_env->jEnv;
1573
+
1574
+ jargv = NULL;
1575
+ localv = NULL;
1576
+ if (argc) {
1577
+ jargv = convert_JS_method_args_to_java_argv(cx, jEnv, argv, method, &localv);
1578
+ if (!jargv) {
1579
+ error_occurred = JS_TRUE;
1580
+ goto out;
1581
+ }
1582
+ }
1583
+
1584
+ /* Prevent deadlocking if we re-enter JS on another thread as a result of a Java
1585
+ method call and that new thread wants to perform a GC. */
1586
+ #ifdef JSJ_THREADSAFE
1587
+ JS_EndRequest(cx);
1588
+ #endif
1589
+
1590
+ /* Call the constructor */
1591
+ java_object = (*jEnv)->NewObjectA(jEnv, java_class, methodID, jargv);
1592
+
1593
+ #ifdef JSJ_THREADSAFE
1594
+ JS_BeginRequest(cx);
1595
+ #endif
1596
+
1597
+ if (!java_object) {
1598
+ jsj_ReportJavaError(cx, jEnv, "Error while constructing instance of %s",
1599
+ jsj_GetJavaClassName(cx, jEnv, java_class));
1600
+ error_occurred = JS_TRUE;
1601
+ goto out;
1602
+ }
1603
+
1604
+ out:
1605
+ if (localv) {
1606
+ for (i = 0; i < argc; i++) {
1607
+ if (localv[i])
1608
+ (*jEnv)->DeleteLocalRef(jEnv, jargv[i].l);
1609
+ }
1610
+ JS_free(cx, localv);
1611
+ }
1612
+ if (jargv)
1613
+ JS_free(cx, jargv);
1614
+
1615
+ if (!error_occurred)
1616
+ success = jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_object, vp);
1617
+ (*jEnv)->DeleteLocalRef(jEnv, java_object);
1618
+ return success;
1619
+ }
1620
+
1621
+ static JSBool
1622
+ invoke_overloaded_java_constructor(JSContext *cx,
1623
+ JSJavaThreadState *jsj_env,
1624
+ JavaMemberDescriptor *member,
1625
+ JavaClassDescriptor *class_descriptor,
1626
+ uintN argc, jsval *argv,
1627
+ jsval *vp)
1628
+ {
1629
+ jclass java_class;
1630
+ JavaMethodSpec *method;
1631
+ JNIEnv *jEnv;
1632
+
1633
+ jEnv = jsj_env->jEnv;
1634
+
1635
+ method = resolve_overloaded_method(cx, jEnv, member, class_descriptor, JS_TRUE,
1636
+ argc, argv);
1637
+ if (!method)
1638
+ return JS_FALSE;
1639
+
1640
+ java_class = class_descriptor->java_class;
1641
+ return invoke_java_constructor(cx, jsj_env, java_class, method, argv, vp);
1642
+ }
1643
+
1644
+ static JSBool
1645
+ java_constructor_wrapper(JSContext *cx, JSJavaThreadState *jsj_env,
1646
+ JavaMemberDescriptor *member_descriptor,
1647
+ JavaClassDescriptor *class_descriptor,
1648
+ uintN argc, jsval *argv, jsval *vp)
1649
+ {
1650
+ jint modifiers;
1651
+ JNIEnv *jEnv;
1652
+
1653
+ jEnv = jsj_env->jEnv;
1654
+
1655
+ /* Get class/interface flags and check them */
1656
+ modifiers = class_descriptor->modifiers;
1657
+ if (modifiers & ACC_ABSTRACT) {
1658
+ JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
1659
+ JSJMSG_ABSTRACT_JCLASS, class_descriptor->name);
1660
+ return JS_FALSE;
1661
+ }
1662
+ if (modifiers & ACC_INTERFACE) {
1663
+ JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
1664
+ JSJMSG_IS_INTERFACE, class_descriptor->name);
1665
+ return JS_FALSE;
1666
+ }
1667
+ if ( !(modifiers & ACC_PUBLIC) ) {
1668
+ JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
1669
+ JSJMSG_NOT_PUBLIC, class_descriptor->name);
1670
+ return JS_FALSE;
1671
+ }
1672
+
1673
+ if (!member_descriptor) {
1674
+ JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
1675
+ JSJMSG_NO_CONSTRUCTORS, class_descriptor->name);
1676
+ return JS_FALSE;
1677
+ }
1678
+
1679
+ return invoke_overloaded_java_constructor(cx, jsj_env, member_descriptor,
1680
+ class_descriptor, argc, argv, vp);
1681
+ }
1682
+
1683
+ JS_EXPORT_API(JSBool)
1684
+ jsj_JavaConstructorWrapper(JSContext *cx, JSObject *obj,
1685
+ uintN argc, jsval *argv, jsval *vp)
1686
+ {
1687
+ JavaClassDescriptor *class_descriptor;
1688
+ JavaMemberDescriptor *member_descriptor;
1689
+ JSJavaThreadState *jsj_env;
1690
+ JNIEnv *jEnv;
1691
+ JSBool result;
1692
+
1693
+ obj = JSVAL_TO_OBJECT(argv[-2]);
1694
+ class_descriptor = JS_GetPrivate(cx, obj);
1695
+ JS_ASSERT(class_descriptor);
1696
+ if (!class_descriptor)
1697
+ return JS_FALSE;
1698
+
1699
+ /* XXX, workaround for bug 200016, all classes in sun.plugin package should not
1700
+ be accessible in liveconnect.
1701
+ Ideally, this checking should be done in JPI side, but it's not going to happen
1702
+ until Sun JRE 1.5.1 */
1703
+ if (strstr(class_descriptor->name, "sun.plugin.") == class_descriptor->name)
1704
+ return JS_FALSE;
1705
+
1706
+ /* Get the Java per-thread environment pointer for this JSContext */
1707
+ jsj_env = jsj_EnterJava(cx, &jEnv);
1708
+ if (!jEnv)
1709
+ return JS_FALSE;
1710
+ member_descriptor = jsj_LookupJavaClassConstructors(cx, jEnv, class_descriptor);
1711
+ result = java_constructor_wrapper(cx, jsj_env, member_descriptor,
1712
+ class_descriptor, argc, argv, vp);
1713
+ jsj_ExitJava(jsj_env);
1714
+ return result;
1715
+ }
1716
+
1717
+
1718
+ static JSBool
1719
+ static_method_wrapper(JSContext *cx, JSJavaThreadState *jsj_env,
1720
+ JavaClassDescriptor *class_descriptor,
1721
+ jsid id,
1722
+ uintN argc, jsval *argv, jsval *vp)
1723
+ {
1724
+ JNIEnv *jEnv;
1725
+ JavaMemberDescriptor *member_descriptor;
1726
+
1727
+ jEnv = jsj_env->jEnv;
1728
+ member_descriptor = jsj_LookupJavaStaticMemberDescriptorById(cx, jEnv, class_descriptor, id);
1729
+
1730
+ /* Is it a static method that is not a constructor ? */
1731
+ if (member_descriptor && strcmp(member_descriptor->name, "<init>")) {
1732
+ return invoke_overloaded_java_method(cx, jsj_env, member_descriptor, JS_TRUE,
1733
+ class_descriptor->java_class,
1734
+ class_descriptor, argc, argv, vp);
1735
+ }
1736
+
1737
+ JS_ASSERT(member_descriptor);
1738
+ if (!member_descriptor)
1739
+ return JS_FALSE;
1740
+
1741
+ /* Must be an explicitly resolved overloaded constructor */
1742
+ return java_constructor_wrapper(cx, jsj_env, member_descriptor,
1743
+ class_descriptor, argc, argv, vp);
1744
+ }
1745
+
1746
+ JS_EXTERN_API(JSBool)
1747
+ jsj_JavaStaticMethodWrapper(JSContext *cx, JSObject *obj,
1748
+ uintN argc, jsval *argv, jsval *vp)
1749
+ {
1750
+ JSFunction *function;
1751
+ JavaClassDescriptor *class_descriptor;
1752
+ jsid id;
1753
+ jsval idval;
1754
+ JNIEnv *jEnv;
1755
+ JSJavaThreadState *jsj_env;
1756
+ JSBool result;
1757
+
1758
+ class_descriptor = JS_GetPrivate(cx, obj);
1759
+ if (!class_descriptor)
1760
+ return JS_FALSE;
1761
+
1762
+ /* Get the Java per-thread environment pointer for this JSContext */
1763
+ jsj_env = jsj_EnterJava(cx, &jEnv);
1764
+ if (!jEnv)
1765
+ return JS_FALSE;
1766
+
1767
+ JS_ASSERT(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION);
1768
+ function = JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[-2]));
1769
+ idval = STRING_TO_JSVAL(JS_InternString(cx, JS_GetFunctionName(function)));
1770
+ JS_ValueToId(cx, idval, &id);
1771
+
1772
+ result = static_method_wrapper(cx, jsj_env, class_descriptor, id, argc, argv, vp);
1773
+ jsj_ExitJava(jsj_env);
1774
+ return result;
1775
+ }
1776
+
1777
+ JS_EXPORT_API(JSBool)
1778
+ jsj_JavaInstanceMethodWrapper(JSContext *cx, JSObject *obj,
1779
+ uintN argc, jsval *argv, jsval *vp)
1780
+ {
1781
+ JSFunction *function;
1782
+ JavaMemberDescriptor *member_descriptor;
1783
+ JavaObjectWrapper *java_wrapper;
1784
+ JavaClassDescriptor *class_descriptor;
1785
+ jsid id;
1786
+ jsval idval;
1787
+ JSJavaThreadState *jsj_env;
1788
+ JNIEnv *jEnv;
1789
+ jobject java_obj;
1790
+ JSBool result;
1791
+
1792
+ java_wrapper = JS_GetPrivate(cx, obj);
1793
+ if (!java_wrapper)
1794
+ return JS_FALSE;
1795
+ java_obj = java_wrapper->java_obj;
1796
+
1797
+ JS_ASSERT(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION);
1798
+ function = JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[-2]));
1799
+ idval = STRING_TO_JSVAL(JS_InternString(cx, JS_GetFunctionName(function)));
1800
+ JS_ValueToId(cx, idval, &id);
1801
+ class_descriptor = java_wrapper->class_descriptor;
1802
+
1803
+ /* Get the Java per-thread environment pointer for this JSContext */
1804
+ jsj_env = jsj_EnterJava(cx, &jEnv);
1805
+ if (!jEnv)
1806
+ return JS_FALSE;
1807
+
1808
+ if (jaApplet && (*jEnv)->IsInstanceOf(jEnv, java_obj, jaApplet)) {
1809
+ jsj_JSIsCallingApplet = JS_TRUE;
1810
+ }
1811
+
1812
+ /* Try to find an instance method with the given name first */
1813
+ member_descriptor = jsj_LookupJavaMemberDescriptorById(cx, jEnv, class_descriptor, id);
1814
+ if (member_descriptor)
1815
+ result = invoke_overloaded_java_method(cx, jsj_env, member_descriptor,
1816
+ JS_FALSE, java_obj,
1817
+ class_descriptor, argc, argv, vp);
1818
+
1819
+ /* If no instance method was found, try for a static method or constructor */
1820
+ else
1821
+ result = static_method_wrapper(cx, jsj_env, class_descriptor, id, argc, argv, vp);
1822
+ jsj_ExitJava(jsj_env);
1823
+ return result;
1824
+ }
1825
+