johnson 1.2.0 → 2.0.0.pre0

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