johnson 1.2.0 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,1338 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ * vim: set ts=8 sw=4 et tw=99:
3
+ *
4
+ * ***** BEGIN LICENSE BLOCK *****
5
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6
+ *
7
+ * The contents of this file are subject to the Mozilla Public License Version
8
+ * 1.1 (the "License"); you may not use this file except in compliance with
9
+ * the License. You may obtain a copy of the License at
10
+ * http://www.mozilla.org/MPL/
11
+ *
12
+ * Software distributed under the License is distributed on an "AS IS" basis,
13
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14
+ * for the specific language governing rights and limitations under the
15
+ * License.
16
+ *
17
+ * The Original Code is SpiderMonkey JSON.
18
+ *
19
+ * The Initial Developer of the Original Code is
20
+ * Mozilla Corporation.
21
+ * Portions created by the Initial Developer are Copyright (C) 1998-1999
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ * Robert Sayre <sayrer@gmail.com>
26
+ *
27
+ * Alternatively, the contents of this file may be used under the terms of
28
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
29
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30
+ * in which case the provisions of the GPL or the LGPL are applicable instead
31
+ * of those above. If you wish to allow use of your version of this file only
32
+ * under the terms of either the GPL or the LGPL, and not to allow others to
33
+ * use your version of this file under the terms of the MPL, indicate your
34
+ * decision by deleting the provisions above and replace them with the notice
35
+ * and other provisions required by the GPL or the LGPL. If you do not delete
36
+ * the provisions above, a recipient may use your version of this file under
37
+ * the terms of any one of the MPL, the GPL or the LGPL.
38
+ *
39
+ * ***** END LICENSE BLOCK ***** */
40
+
41
+ #include <string.h> /* memset */
42
+ #include "jsapi.h"
43
+ #include "jsarena.h"
44
+ #include "jsarray.h"
45
+ #include "jsatom.h"
46
+ #include "jsbool.h"
47
+ #include "jscntxt.h"
48
+ #include "jsdtoa.h"
49
+ #include "jsfun.h"
50
+ #include "jsinterp.h"
51
+ #include "jsiter.h"
52
+ #include "jsnum.h"
53
+ #include "jsobj.h"
54
+ #include "jsprf.h"
55
+ #include "jsscan.h"
56
+ #include "jsstr.h"
57
+ #include "jstypes.h"
58
+ #include "jsutil.h"
59
+ #include "jsxml.h"
60
+
61
+ #include "json.h"
62
+
63
+ JSClass js_JSONClass = {
64
+ js_JSON_str,
65
+ JSCLASS_HAS_CACHED_PROTO(JSProto_JSON),
66
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
67
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
68
+ JSCLASS_NO_OPTIONAL_MEMBERS
69
+ };
70
+
71
+ JSBool
72
+ js_json_parse(JSContext *cx, uintN argc, jsval *vp)
73
+ {
74
+ JSString *s = NULL;
75
+ jsval *argv = vp + 2;
76
+ jsval reviver = JSVAL_NULL;
77
+ JSAutoTempValueRooter tvr(cx, 1, &reviver);
78
+
79
+ if (!JS_ConvertArguments(cx, argc, argv, "S / v", &s, &reviver))
80
+ return JS_FALSE;
81
+
82
+ JSONParser *jp = js_BeginJSONParse(cx, vp);
83
+ JSBool ok = jp != NULL;
84
+ if (ok) {
85
+ ok = js_ConsumeJSONText(cx, jp, JS_GetStringChars(s), JS_GetStringLength(s));
86
+ ok &= js_FinishJSONParse(cx, jp, reviver);
87
+ }
88
+
89
+ return ok;
90
+ }
91
+
92
+ class WriterContext
93
+ {
94
+ public:
95
+ WriterContext(JSContext *cx) : cx(cx), didWrite(JS_FALSE)
96
+ {
97
+ js_InitStringBuffer(&sb);
98
+ }
99
+
100
+ ~WriterContext()
101
+ {
102
+ js_FinishStringBuffer(&sb);
103
+ }
104
+
105
+ JSStringBuffer sb;
106
+ JSContext *cx;
107
+ JSBool didWrite;
108
+ };
109
+
110
+ static JSBool
111
+ WriteCallback(const jschar *buf, uint32 len, void *data)
112
+ {
113
+ WriterContext *wc = static_cast<WriterContext*>(data);
114
+ wc->didWrite = JS_TRUE;
115
+
116
+ js_AppendUCString(&wc->sb, buf, len);
117
+ if (!STRING_BUFFER_OK(&wc->sb)) {
118
+ JS_ReportOutOfMemory(wc->cx);
119
+ return JS_FALSE;
120
+ }
121
+
122
+ return JS_TRUE;
123
+ }
124
+
125
+ JSBool
126
+ js_json_stringify(JSContext *cx, uintN argc, jsval *vp)
127
+ {
128
+ jsval *argv = vp + 2;
129
+ JSObject *replacer = NULL;
130
+ jsval space = JSVAL_NULL;
131
+ JSAutoTempValueRooter tvr(cx, replacer);
132
+ JSAutoTempValueRooter tvr2(cx, 1, &space);
133
+
134
+ // Must throw an Error if there isn't a first arg
135
+ if (!JS_ConvertArguments(cx, argc, argv, "v / o v", vp, &replacer, &space))
136
+ return JS_FALSE;
137
+
138
+ WriterContext wc(cx);
139
+
140
+ if (!js_Stringify(cx, vp, replacer, space, &WriteCallback, &wc))
141
+ return JS_FALSE;
142
+
143
+ // XXX This can never happen to nsJSON.cpp, but the JSON object
144
+ // needs to support returning undefined. So this is a little awkward
145
+ // for the API, because we want to support streaming writers.
146
+ if (wc.didWrite) {
147
+ JSStringBuffer *sb = &wc.sb;
148
+ JSString *s = JS_NewUCStringCopyN(cx, sb->base, STRING_BUFFER_OFFSET(sb));
149
+ if (!s)
150
+ return JS_FALSE;
151
+ *vp = STRING_TO_JSVAL(s);
152
+ } else {
153
+ *vp = JSVAL_VOID;
154
+ }
155
+
156
+ return JS_TRUE;
157
+ }
158
+
159
+ JSBool
160
+ js_TryJSON(JSContext *cx, jsval *vp)
161
+ {
162
+ // Checks whether the return value implements toJSON()
163
+ JSBool ok = JS_TRUE;
164
+
165
+ if (!JSVAL_IS_PRIMITIVE(*vp)) {
166
+ JSObject *obj = JSVAL_TO_OBJECT(*vp);
167
+ ok = js_TryMethod(cx, obj, cx->runtime->atomState.toJSONAtom, 0, NULL, vp);
168
+ }
169
+
170
+ return ok;
171
+ }
172
+
173
+
174
+ static const jschar quote = jschar('"');
175
+ static const jschar backslash = jschar('\\');
176
+ static const jschar unicodeEscape[] = {'\\', 'u', '0', '0'};
177
+ static const jschar null_ucstr[] = {'n', 'u', 'l', 'l'};
178
+ static const jschar true_ucstr[] = {'t', 'r', 'u', 'e'};
179
+ static const jschar false_ucstr[] = {'f', 'a', 'l', 's', 'e'};
180
+
181
+ static JSBool
182
+ write_string(JSContext *cx, JSONWriteCallback callback, void *data, const jschar *buf, uint32 len)
183
+ {
184
+ if (!callback(&quote, 1, data))
185
+ return JS_FALSE;
186
+
187
+ uint32 mark = 0;
188
+ uint32 i;
189
+ for (i = 0; i < len; ++i) {
190
+ if (buf[i] == quote || buf[i] == backslash) {
191
+ if (!callback(&buf[mark], i - mark, data) || !callback(&backslash, 1, data) ||
192
+ !callback(&buf[i], 1, data)) {
193
+ return JS_FALSE;
194
+ }
195
+ mark = i + 1;
196
+ } else if (buf[i] <= 31 || buf[i] == 127) {
197
+ if (!callback(&buf[mark], i - mark, data) || !callback(unicodeEscape, 4, data))
198
+ return JS_FALSE;
199
+ char ubuf[3];
200
+ size_t len = JS_snprintf(ubuf, sizeof(ubuf), "%.2x", buf[i]);
201
+ JS_ASSERT(len == 2);
202
+ jschar wbuf[3];
203
+ size_t wbufSize = JS_ARRAY_LENGTH(wbuf);
204
+ if (!js_InflateStringToBuffer(cx, ubuf, len, wbuf, &wbufSize) ||
205
+ !callback(wbuf, wbufSize, data)) {
206
+ return JS_FALSE;
207
+ }
208
+ mark = i + 1;
209
+ }
210
+ }
211
+
212
+ if (mark < len && !callback(&buf[mark], len - mark, data))
213
+ return JS_FALSE;
214
+
215
+ return callback(&quote, 1, data);
216
+ }
217
+
218
+ class StringifyContext
219
+ {
220
+ public:
221
+ StringifyContext(JSONWriteCallback callback, JSObject *replacer, void *data)
222
+ : callback(callback), replacer(replacer), data(data), depth(0)
223
+ {
224
+ js_InitStringBuffer(&gap);
225
+ }
226
+
227
+ ~StringifyContext()
228
+ {
229
+ if (STRING_BUFFER_OK(&gap))
230
+ js_FinishStringBuffer(&gap);
231
+ }
232
+
233
+ JSONWriteCallback callback;
234
+ JSStringBuffer gap;
235
+ JSObject *replacer;
236
+ void *data;
237
+ uint32 depth;
238
+ };
239
+
240
+ static JSBool CallReplacerFunction(JSContext *cx, jsid id, JSObject *holder,
241
+ StringifyContext *scx, jsval *vp);
242
+ static JSBool Str(JSContext *cx, jsid id, JSObject *holder,
243
+ StringifyContext *scx, jsval *vp, bool callReplacer = true);
244
+
245
+ static JSBool
246
+ WriteIndent(JSContext *cx, StringifyContext *scx, uint32 limit)
247
+ {
248
+ if (STRING_BUFFER_OFFSET(&scx->gap) > 0) {
249
+ jschar c = jschar('\n');
250
+ if (!scx->callback(&c, 1, scx->data))
251
+ return JS_FALSE;
252
+ for (uint32 i = 0; i < limit; i++) {
253
+ if (!scx->callback(scx->gap.base, STRING_BUFFER_OFFSET(&scx->gap), scx->data))
254
+ return JS_FALSE;
255
+ }
256
+ }
257
+
258
+ return JS_TRUE;
259
+ }
260
+
261
+ static JSBool
262
+ JO(JSContext *cx, jsval *vp, StringifyContext *scx)
263
+ {
264
+ JSObject *obj = JSVAL_TO_OBJECT(*vp);
265
+
266
+ jschar c = jschar('{');
267
+ if (!scx->callback(&c, 1, scx->data))
268
+ return JS_FALSE;
269
+
270
+ jsval vec[3] = {JSVAL_NULL, JSVAL_NULL, JSVAL_NULL};
271
+ JSAutoTempValueRooter tvr(cx, 3, vec);
272
+ jsval& key = vec[0];
273
+ jsval& outputValue = vec[1];
274
+
275
+ JSObject *iterObj = NULL;
276
+ jsval *keySource = vp;
277
+ bool usingWhitelist = false;
278
+
279
+ // if the replacer is an array, we use the keys from it
280
+ if (scx->replacer && JS_IsArrayObject(cx, scx->replacer)) {
281
+ usingWhitelist = true;
282
+ vec[2] = OBJECT_TO_JSVAL(scx->replacer);
283
+ keySource = &vec[2];
284
+ }
285
+
286
+ if (!js_ValueToIterator(cx, JSITER_ENUMERATE, keySource))
287
+ return JS_FALSE;
288
+ iterObj = JSVAL_TO_OBJECT(*keySource);
289
+
290
+ JSBool memberWritten = JS_FALSE;
291
+ JSBool ok;
292
+
293
+ do {
294
+ outputValue = JSVAL_VOID;
295
+ ok = js_CallIteratorNext(cx, iterObj, &key);
296
+ if (!ok)
297
+ break;
298
+ if (key == JSVAL_HOLE)
299
+ break;
300
+
301
+ jsuint index = 0;
302
+ if (usingWhitelist) {
303
+ // skip non-index properties
304
+ if (!js_IdIsIndex(key, &index))
305
+ continue;
306
+
307
+ jsval newKey;
308
+ if (!OBJ_GET_PROPERTY(cx, scx->replacer, key, &newKey))
309
+ return JS_FALSE;
310
+ key = newKey;
311
+ }
312
+
313
+ JSString *ks;
314
+ if (JSVAL_IS_STRING(key)) {
315
+ ks = JSVAL_TO_STRING(key);
316
+ } else {
317
+ ks = js_ValueToString(cx, key);
318
+ if (!ks) {
319
+ ok = JS_FALSE;
320
+ break;
321
+ }
322
+ }
323
+ JSAutoTempValueRooter keyStringRoot(cx, ks);
324
+
325
+ // Don't include prototype properties, since this operation is
326
+ // supposed to be implemented as if by ES3.1 Object.keys()
327
+ jsid id;
328
+ jsval v = JS_FALSE;
329
+ if (!js_ValueToStringId(cx, STRING_TO_JSVAL(ks), &id) ||
330
+ !js_HasOwnProperty(cx, obj->map->ops->lookupProperty, obj, id, &v)) {
331
+ ok = JS_FALSE;
332
+ break;
333
+ }
334
+
335
+ if (v != JSVAL_TRUE)
336
+ continue;
337
+
338
+ ok = JS_GetPropertyById(cx, obj, id, &outputValue);
339
+ if (!ok)
340
+ break;
341
+
342
+ if (JSVAL_IS_OBJECT(outputValue)) {
343
+ ok = js_TryJSON(cx, &outputValue);
344
+ if (!ok)
345
+ break;
346
+ }
347
+
348
+ // call this here, so we don't write out keys if the replacer function
349
+ // wants to elide the value.
350
+ if (!CallReplacerFunction(cx, id, obj, scx, &outputValue))
351
+ return JS_FALSE;
352
+
353
+ JSType type = JS_TypeOfValue(cx, outputValue);
354
+
355
+ // elide undefined values and functions and XML
356
+ if (outputValue == JSVAL_VOID || type == JSTYPE_FUNCTION || type == JSTYPE_XML)
357
+ continue;
358
+
359
+ // output a comma unless this is the first member to write
360
+ if (memberWritten) {
361
+ c = jschar(',');
362
+ ok = scx->callback(&c, 1, scx->data);
363
+ if (!ok)
364
+ break;
365
+ }
366
+ memberWritten = JS_TRUE;
367
+
368
+ if (!WriteIndent(cx, scx, scx->depth))
369
+ return JS_FALSE;
370
+
371
+ // Be careful below, this string is weakly rooted
372
+ JSString *s = js_ValueToString(cx, key);
373
+ if (!s) {
374
+ ok = JS_FALSE;
375
+ break;
376
+ }
377
+
378
+ ok = write_string(cx, scx->callback, scx->data, JS_GetStringChars(s), JS_GetStringLength(s));
379
+ if (!ok)
380
+ break;
381
+
382
+ c = jschar(':');
383
+ ok = scx->callback(&c, 1, scx->data);
384
+ if (!ok)
385
+ break;
386
+
387
+ ok = Str(cx, id, obj, scx, &outputValue, false);
388
+ if (!ok)
389
+ break;
390
+
391
+ } while (ok);
392
+
393
+ if (iterObj) {
394
+ // Always close the iterator, but make sure not to stomp on OK
395
+ JS_ASSERT(OBJECT_TO_JSVAL(iterObj) == *keySource);
396
+ ok &= js_CloseIterator(cx, *keySource);
397
+ }
398
+
399
+ if (!ok)
400
+ return JS_FALSE;
401
+
402
+ if (memberWritten && !WriteIndent(cx, scx, scx->depth - 1))
403
+ return JS_FALSE;
404
+
405
+ c = jschar('}');
406
+
407
+ return scx->callback(&c, 1, scx->data);
408
+ }
409
+
410
+ static JSBool
411
+ JA(JSContext *cx, jsval *vp, StringifyContext *scx)
412
+ {
413
+ JSObject *obj = JSVAL_TO_OBJECT(*vp);
414
+
415
+ jschar c = jschar('[');
416
+ if (!scx->callback(&c, 1, scx->data))
417
+ return JS_FALSE;
418
+
419
+ jsuint length;
420
+ if (!js_GetLengthProperty(cx, obj, &length))
421
+ return JS_FALSE;
422
+
423
+ jsval outputValue = JSVAL_NULL;
424
+ JSAutoTempValueRooter tvr(cx, 1, &outputValue);
425
+
426
+ jsid id;
427
+ jsuint i;
428
+ for (i = 0; i < length; i++) {
429
+ id = INT_TO_JSID(i);
430
+
431
+ if (!OBJ_GET_PROPERTY(cx, obj, id, &outputValue))
432
+ return JS_FALSE;
433
+
434
+ if (!Str(cx, id, obj, scx, &outputValue))
435
+ return JS_FALSE;
436
+
437
+ if (outputValue == JSVAL_VOID) {
438
+ if (!scx->callback(null_ucstr, JS_ARRAY_LENGTH(null_ucstr), scx->data))
439
+ return JS_FALSE;
440
+ }
441
+
442
+ if (i < length - 1) {
443
+ c = jschar(',');
444
+ if (!scx->callback(&c, 1, scx->data))
445
+ return JS_FALSE;
446
+ if (!WriteIndent(cx, scx, scx->depth))
447
+ return JS_FALSE;
448
+ }
449
+ }
450
+
451
+ if (length != 0 && !WriteIndent(cx, scx, scx->depth - 1))
452
+ return JS_FALSE;
453
+
454
+ c = jschar(']');
455
+
456
+ return scx->callback(&c, 1, scx->data);
457
+ }
458
+
459
+ static JSBool
460
+ CallReplacerFunction(JSContext *cx, jsid id, JSObject *holder, StringifyContext *scx, jsval *vp)
461
+ {
462
+ if (scx->replacer && js_IsCallable(scx->replacer, cx)) {
463
+ jsval vec[2] = {ID_TO_VALUE(id), *vp};
464
+ if (!JS_CallFunctionValue(cx, holder, OBJECT_TO_JSVAL(scx->replacer), 2, vec, vp))
465
+ return JS_FALSE;
466
+ }
467
+
468
+ return JS_TRUE;
469
+ }
470
+
471
+ static JSBool
472
+ Str(JSContext *cx, jsid id, JSObject *holder, StringifyContext *scx, jsval *vp, bool callReplacer)
473
+ {
474
+ JS_CHECK_RECURSION(cx, return JS_FALSE);
475
+
476
+ if (!OBJ_GET_PROPERTY(cx, holder, id, vp))
477
+ return JS_FALSE;
478
+
479
+ if (!JSVAL_IS_PRIMITIVE(*vp) && !js_TryJSON(cx, vp))
480
+ return JS_FALSE;
481
+
482
+ if (callReplacer && !CallReplacerFunction(cx, id, holder, scx, vp))
483
+ return JS_FALSE;
484
+
485
+ // catches string and number objects with no toJSON
486
+ if (!JSVAL_IS_PRIMITIVE(*vp)) {
487
+ JSClass *clasp = OBJ_GET_CLASS(cx, JSVAL_TO_OBJECT(*vp));
488
+ if (clasp == &js_StringClass || clasp == &js_NumberClass)
489
+ *vp = JSVAL_TO_OBJECT(*vp)->fslots[JSSLOT_PRIVATE];
490
+ }
491
+
492
+ if (JSVAL_IS_STRING(*vp)) {
493
+ JSString *s = JSVAL_TO_STRING(*vp);
494
+ return write_string(cx, scx->callback, scx->data, JS_GetStringChars(s), JS_GetStringLength(s));
495
+ }
496
+
497
+ if (JSVAL_IS_NULL(*vp)) {
498
+ return scx->callback(null_ucstr, JS_ARRAY_LENGTH(null_ucstr), scx->data);
499
+ }
500
+
501
+ if (JSVAL_IS_BOOLEAN(*vp)) {
502
+ uint32 len = JS_ARRAY_LENGTH(true_ucstr);
503
+ const jschar *chars = true_ucstr;
504
+ JSBool b = JSVAL_TO_BOOLEAN(*vp);
505
+
506
+ if (!b) {
507
+ chars = false_ucstr;
508
+ len = JS_ARRAY_LENGTH(false_ucstr);
509
+ }
510
+
511
+ return scx->callback(chars, len, scx->data);
512
+ }
513
+
514
+ if (JSVAL_IS_NUMBER(*vp)) {
515
+ if (JSVAL_IS_DOUBLE(*vp)) {
516
+ jsdouble d = *JSVAL_TO_DOUBLE(*vp);
517
+ if (!JSDOUBLE_IS_FINITE(d))
518
+ return scx->callback(null_ucstr, JS_ARRAY_LENGTH(null_ucstr), scx->data);
519
+ }
520
+
521
+ char numBuf[DTOSTR_STANDARD_BUFFER_SIZE], *numStr;
522
+ jsdouble d = JSVAL_IS_INT(*vp) ? jsdouble(JSVAL_TO_INT(*vp)) : *JSVAL_TO_DOUBLE(*vp);
523
+ numStr = JS_dtostr(numBuf, sizeof numBuf, DTOSTR_STANDARD, 0, d);
524
+ if (!numStr) {
525
+ JS_ReportOutOfMemory(cx);
526
+ return JS_FALSE;
527
+ }
528
+
529
+ jschar dstr[DTOSTR_STANDARD_BUFFER_SIZE];
530
+ size_t dbufSize = DTOSTR_STANDARD_BUFFER_SIZE;
531
+ if (!js_InflateStringToBuffer(cx, numStr, strlen(numStr), dstr, &dbufSize))
532
+ return JS_FALSE;
533
+
534
+ return scx->callback(dstr, dbufSize, scx->data);
535
+ }
536
+
537
+ if (JSVAL_IS_OBJECT(*vp) && !VALUE_IS_FUNCTION(cx, *vp) && !VALUE_IS_XML(cx, *vp)) {
538
+ JSBool ok;
539
+
540
+ scx->depth++;
541
+ ok = (JS_IsArrayObject(cx, JSVAL_TO_OBJECT(*vp)) ? JA : JO)(cx, vp, scx);
542
+ scx->depth--;
543
+
544
+ return ok;
545
+ }
546
+
547
+ *vp = JSVAL_VOID;
548
+ return JS_TRUE;
549
+ }
550
+
551
+ static JSBool
552
+ WriteStringGap(JSContext *cx, jsval space, JSStringBuffer *sb)
553
+ {
554
+ JSString *s = js_ValueToString(cx, space);
555
+ if (!s)
556
+ return JS_FALSE;
557
+
558
+ js_AppendUCString(sb, JS_GetStringChars(s), JS_GetStringLength(s));
559
+ if (!STRING_BUFFER_OK(sb)) {
560
+ JS_ReportOutOfMemory(cx);
561
+ return JS_FALSE;
562
+ }
563
+
564
+ return JS_TRUE;
565
+ }
566
+
567
+ static JSBool
568
+ InitializeGap(JSContext *cx, jsval space, JSStringBuffer *sb)
569
+ {
570
+ if (!JSVAL_IS_PRIMITIVE(space)) {
571
+ JSClass *clasp = OBJ_GET_CLASS(cx, JSVAL_TO_OBJECT(space));
572
+ if (clasp == &js_StringClass || clasp == &js_NumberClass)
573
+ return WriteStringGap(cx, space, sb);
574
+ }
575
+
576
+ if (JSVAL_IS_STRING(space))
577
+ return WriteStringGap(cx, space, sb);
578
+
579
+ if (JSVAL_IS_NUMBER(space)) {
580
+ uint32 i;
581
+ if (!JS_ValueToECMAUint32(cx, space, &i))
582
+ return JS_FALSE;
583
+
584
+ js_RepeatChar(sb, jschar(' '), i);
585
+
586
+ if (!STRING_BUFFER_OK(sb)) {
587
+ JS_ReportOutOfMemory(cx);
588
+ return JS_FALSE;
589
+ }
590
+ }
591
+
592
+ return JS_TRUE;
593
+ }
594
+
595
+ JSBool
596
+ js_Stringify(JSContext *cx, jsval *vp, JSObject *replacer, jsval space,
597
+ JSONWriteCallback callback, void *data)
598
+ {
599
+ // XXX stack
600
+ JSObject *stack = JS_NewArrayObject(cx, 0, NULL);
601
+ if (!stack)
602
+ return JS_FALSE;
603
+
604
+ StringifyContext scx(callback, replacer, data);
605
+ if (!InitializeGap(cx, space, &scx.gap))
606
+ return JS_FALSE;
607
+
608
+ JSObject *obj = js_NewObject(cx, &js_ObjectClass, NULL, NULL, 0);
609
+ if (!obj)
610
+ return JS_FALSE;
611
+
612
+ if (!OBJ_DEFINE_PROPERTY(cx, obj, ATOM_TO_JSID(cx->runtime->atomState.emptyAtom),
613
+ *vp, NULL, NULL, JSPROP_ENUMERATE, NULL)) {
614
+ return JS_FALSE;
615
+ }
616
+
617
+ return Str(cx, ATOM_TO_JSID(cx->runtime->atomState.emptyAtom), obj, &scx, vp);
618
+ }
619
+
620
+ // helper to determine whether a character could be part of a number
621
+ static JSBool IsNumChar(jschar c)
622
+ {
623
+ return ((c <= '9' && c >= '0') || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E');
624
+ }
625
+
626
+ static JSBool HandleData(JSContext *cx, JSONParser *jp, JSONDataType type);
627
+ static JSBool PopState(JSContext *cx, JSONParser *jp);
628
+
629
+ static JSBool
630
+ DestroyIdArrayOnError(JSContext *cx, JSIdArray *ida) {
631
+ JS_DestroyIdArray(cx, ida);
632
+ return JS_FALSE;
633
+ }
634
+
635
+ static JSBool
636
+ Walk(JSContext *cx, jsid id, JSObject *holder, jsval reviver, jsval *vp)
637
+ {
638
+ JS_CHECK_RECURSION(cx, return JS_FALSE);
639
+
640
+ if (!OBJ_GET_PROPERTY(cx, holder, id, vp))
641
+ return JS_FALSE;
642
+
643
+ JSObject *obj;
644
+
645
+ if (!JSVAL_IS_PRIMITIVE(*vp) && !js_IsCallable(obj = JSVAL_TO_OBJECT(*vp), cx)) {
646
+ jsval propValue = JSVAL_NULL;
647
+ JSAutoTempValueRooter tvr(cx, 1, &propValue);
648
+
649
+ if(OBJ_IS_ARRAY(cx, obj)) {
650
+ jsuint length = 0;
651
+ if (!js_GetLengthProperty(cx, obj, &length))
652
+ return JS_FALSE;
653
+
654
+ for (jsuint i = 0; i < length; i++) {
655
+ jsid index;
656
+ if (!js_IndexToId(cx, i, &index))
657
+ return JS_FALSE;
658
+
659
+ if (!Walk(cx, index, obj, reviver, &propValue))
660
+ return JS_FALSE;
661
+
662
+ if (!OBJ_DEFINE_PROPERTY(cx, obj, index, propValue,
663
+ NULL, NULL, JSPROP_ENUMERATE, NULL)) {
664
+ return JS_FALSE;
665
+ }
666
+ }
667
+ } else {
668
+ JSIdArray *ida = JS_Enumerate(cx, obj);
669
+ if (!ida)
670
+ return JS_FALSE;
671
+
672
+ JSAutoTempValueRooter idaroot(cx, JS_ARRAY_LENGTH(ida), (jsval*)ida);
673
+
674
+ for(jsint i = 0; i < ida->length; i++) {
675
+ jsid idName = ida->vector[i];
676
+ if (!Walk(cx, idName, obj, reviver, &propValue))
677
+ return DestroyIdArrayOnError(cx, ida);
678
+ if (propValue == JSVAL_VOID) {
679
+ if (!js_DeleteProperty(cx, obj, idName, &propValue))
680
+ return DestroyIdArrayOnError(cx, ida);
681
+ } else {
682
+ if (!OBJ_DEFINE_PROPERTY(cx, obj, idName, propValue,
683
+ NULL, NULL, JSPROP_ENUMERATE, NULL)) {
684
+ return DestroyIdArrayOnError(cx, ida);
685
+ }
686
+ }
687
+ }
688
+
689
+ JS_DestroyIdArray(cx, ida);
690
+ }
691
+ }
692
+
693
+ // return reviver.call(holder, key, value);
694
+ jsval value = *vp;
695
+ JSString *key = js_ValueToString(cx, ID_TO_VALUE(id));
696
+ if (!key)
697
+ return JS_FALSE;
698
+
699
+ jsval vec[2] = {STRING_TO_JSVAL(key), value};
700
+ jsval reviverResult;
701
+ if (!JS_CallFunctionValue(cx, holder, reviver, 2, vec, &reviverResult))
702
+ return JS_FALSE;
703
+
704
+ *vp = reviverResult;
705
+
706
+ return JS_TRUE;
707
+ }
708
+
709
+ static JSBool
710
+ Revive(JSContext *cx, jsval reviver, jsval *vp)
711
+ {
712
+
713
+ JSObject *obj = js_NewObject(cx, &js_ObjectClass, NULL, NULL, 0);
714
+ if (!obj)
715
+ return JS_FALSE;
716
+
717
+ jsval v = OBJECT_TO_JSVAL(obj);
718
+ JSAutoTempValueRooter tvr(cx, 1, &v);
719
+ if (!OBJ_DEFINE_PROPERTY(cx, obj, ATOM_TO_JSID(cx->runtime->atomState.emptyAtom),
720
+ *vp, NULL, NULL, JSPROP_ENUMERATE, NULL)) {
721
+ return JS_FALSE;
722
+ }
723
+
724
+ return Walk(cx, ATOM_TO_JSID(cx->runtime->atomState.emptyAtom), obj, reviver, vp);
725
+ }
726
+
727
+ #define JSON_INITIAL_BUFSIZE 256
728
+
729
+ JSONParser *
730
+ js_BeginJSONParse(JSContext *cx, jsval *rootVal)
731
+ {
732
+ if (!cx)
733
+ return NULL;
734
+
735
+ JSObject *arr = js_NewArrayObject(cx, 0, NULL);
736
+ if (!arr)
737
+ return NULL;
738
+
739
+ JSONParser *jp = (JSONParser*) JS_malloc(cx, sizeof(JSONParser));
740
+ if (!jp)
741
+ return NULL;
742
+ memset(jp, 0, sizeof *jp);
743
+
744
+ jp->objectStack = arr;
745
+ if (!js_AddRoot(cx, &jp->objectStack, "JSON parse stack"))
746
+ goto bad;
747
+
748
+ jp->statep = jp->stateStack;
749
+ *jp->statep = JSON_PARSE_STATE_INIT;
750
+ jp->rootVal = rootVal;
751
+
752
+ js_InitStringBuffer(&jp->objectKey);
753
+ js_InitStringBuffer(&jp->buffer);
754
+
755
+ if (!jp->buffer.grow(&jp->buffer, JSON_INITIAL_BUFSIZE)) {
756
+ JS_ReportOutOfMemory(cx);
757
+ goto bad;
758
+ }
759
+ return jp;
760
+
761
+ bad:
762
+ js_FinishJSONParse(cx, jp, JSVAL_NULL);
763
+ return NULL;
764
+ }
765
+
766
+ JSBool
767
+ js_FinishJSONParse(JSContext *cx, JSONParser *jp, jsval reviver)
768
+ {
769
+ if (!jp)
770
+ return JS_TRUE;
771
+
772
+ JSBool early_ok = JS_TRUE;
773
+
774
+ // Check for unprocessed primitives at the root. This doesn't happen for
775
+ // strings because a closing quote triggers value processing.
776
+ if ((jp->statep - jp->stateStack) == 1) {
777
+ if (*jp->statep == JSON_PARSE_STATE_KEYWORD) {
778
+ early_ok = HandleData(cx, jp, JSON_DATA_KEYWORD);
779
+ if (early_ok)
780
+ PopState(cx, jp);
781
+ } else if (*jp->statep == JSON_PARSE_STATE_NUMBER) {
782
+ early_ok = HandleData(cx, jp, JSON_DATA_NUMBER);
783
+ if (early_ok)
784
+ PopState(cx, jp);
785
+ }
786
+ }
787
+
788
+ js_FinishStringBuffer(&jp->objectKey);
789
+ js_FinishStringBuffer(&jp->buffer);
790
+
791
+ /* This internal API is infallible, in spite of its JSBool return type. */
792
+ js_RemoveRoot(cx->runtime, &jp->objectStack);
793
+
794
+ JSBool ok = *jp->statep == JSON_PARSE_STATE_FINISHED;
795
+ jsval *vp = jp->rootVal;
796
+ JS_free(cx, jp);
797
+
798
+ if (!early_ok)
799
+ return JS_FALSE;
800
+
801
+ if (!ok) {
802
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
803
+ return JS_FALSE;
804
+ }
805
+
806
+ if (!JSVAL_IS_PRIMITIVE(reviver) && js_IsCallable(JSVAL_TO_OBJECT(reviver), cx))
807
+ ok = Revive(cx, reviver, vp);
808
+
809
+ return ok;
810
+ }
811
+
812
+ static JSBool
813
+ PushState(JSContext *cx, JSONParser *jp, JSONParserState state)
814
+ {
815
+ if (*jp->statep == JSON_PARSE_STATE_FINISHED) {
816
+ // extra input
817
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
818
+ return JS_FALSE;
819
+ }
820
+
821
+ jp->statep++;
822
+ if ((uint32)(jp->statep - jp->stateStack) >= JS_ARRAY_LENGTH(jp->stateStack)) {
823
+ // too deep
824
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
825
+ return JS_FALSE;
826
+ }
827
+
828
+ *jp->statep = state;
829
+
830
+ return JS_TRUE;
831
+ }
832
+
833
+ static JSBool
834
+ PopState(JSContext *cx, JSONParser *jp)
835
+ {
836
+ jp->statep--;
837
+ if (jp->statep < jp->stateStack) {
838
+ jp->statep = jp->stateStack;
839
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
840
+ return JS_FALSE;
841
+ }
842
+
843
+ if (*jp->statep == JSON_PARSE_STATE_INIT)
844
+ *jp->statep = JSON_PARSE_STATE_FINISHED;
845
+
846
+ return JS_TRUE;
847
+ }
848
+
849
+ static JSBool
850
+ PushValue(JSContext *cx, JSONParser *jp, JSObject *parent, jsval value)
851
+ {
852
+ JSBool ok;
853
+ if (OBJ_IS_ARRAY(cx, parent)) {
854
+ jsuint len;
855
+ ok = js_GetLengthProperty(cx, parent, &len);
856
+ if (ok) {
857
+ jsid index;
858
+ if (!js_IndexToId(cx, len, &index))
859
+ return JS_FALSE;
860
+ ok = OBJ_DEFINE_PROPERTY(cx, parent, index, value,
861
+ NULL, NULL, JSPROP_ENUMERATE, NULL);
862
+ }
863
+ } else {
864
+ ok = JS_DefineUCProperty(cx, parent, jp->objectKey.base,
865
+ STRING_BUFFER_OFFSET(&jp->objectKey), value,
866
+ NULL, NULL, JSPROP_ENUMERATE);
867
+ js_RewindStringBuffer(&jp->objectKey);
868
+ }
869
+
870
+ return ok;
871
+ }
872
+
873
+ static JSBool
874
+ PushObject(JSContext *cx, JSONParser *jp, JSObject *obj)
875
+ {
876
+ jsuint len;
877
+ if (!js_GetLengthProperty(cx, jp->objectStack, &len))
878
+ return JS_FALSE;
879
+ if (len >= JSON_MAX_DEPTH) {
880
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
881
+ return JS_FALSE;
882
+ }
883
+
884
+ jsval v = OBJECT_TO_JSVAL(obj);
885
+ JSAutoTempValueRooter tvr(cx, v);
886
+
887
+ // Check if this is the root object
888
+ if (len == 0) {
889
+ *jp->rootVal = v;
890
+ // This property must be enumerable to keep the array dense
891
+ if (!OBJ_DEFINE_PROPERTY(cx, jp->objectStack, INT_TO_JSID(0), *jp->rootVal,
892
+ NULL, NULL, JSPROP_ENUMERATE, NULL)) {
893
+ return JS_FALSE;
894
+ }
895
+ return JS_TRUE;
896
+ }
897
+
898
+ jsval p;
899
+ if (!OBJ_GET_PROPERTY(cx, jp->objectStack, INT_TO_JSID(len - 1), &p))
900
+ return JS_FALSE;
901
+
902
+ JS_ASSERT(JSVAL_IS_OBJECT(p));
903
+ JSObject *parent = JSVAL_TO_OBJECT(p);
904
+ if (!PushValue(cx, jp, parent, v))
905
+ return JS_FALSE;
906
+
907
+ // This property must be enumerable to keep the array dense
908
+ if (!OBJ_DEFINE_PROPERTY(cx, jp->objectStack, INT_TO_JSID(len), v,
909
+ NULL, NULL, JSPROP_ENUMERATE, NULL)) {
910
+ return JS_FALSE;
911
+ }
912
+
913
+ return JS_TRUE;
914
+ }
915
+
916
+ static JSBool
917
+ OpenObject(JSContext *cx, JSONParser *jp)
918
+ {
919
+ JSObject *obj = js_NewObject(cx, &js_ObjectClass, NULL, NULL, 0);
920
+ if (!obj)
921
+ return JS_FALSE;
922
+
923
+ return PushObject(cx, jp, obj);
924
+ }
925
+
926
+ static JSBool
927
+ OpenArray(JSContext *cx, JSONParser *jp)
928
+ {
929
+ // Add an array to an existing array or object
930
+ JSObject *arr = js_NewArrayObject(cx, 0, NULL);
931
+ if (!arr)
932
+ return JS_FALSE;
933
+
934
+ return PushObject(cx, jp, arr);
935
+ }
936
+
937
+ static JSBool
938
+ CloseObject(JSContext *cx, JSONParser *jp)
939
+ {
940
+ jsuint len;
941
+ if (!js_GetLengthProperty(cx, jp->objectStack, &len))
942
+ return JS_FALSE;
943
+ if (!js_SetLengthProperty(cx, jp->objectStack, len - 1))
944
+ return JS_FALSE;
945
+
946
+ return JS_TRUE;
947
+ }
948
+
949
+ static JSBool
950
+ CloseArray(JSContext *cx, JSONParser *jp)
951
+ {
952
+ return CloseObject(cx, jp);
953
+ }
954
+
955
+ static JSBool
956
+ PushPrimitive(JSContext *cx, JSONParser *jp, jsval value)
957
+ {
958
+ JSAutoTempValueRooter tvr(cx, 1, &value);
959
+
960
+ jsuint len;
961
+ if (!js_GetLengthProperty(cx, jp->objectStack, &len))
962
+ return JS_FALSE;
963
+
964
+ if (len > 0) {
965
+ jsval o;
966
+ if (!OBJ_GET_PROPERTY(cx, jp->objectStack, INT_TO_JSID(len - 1), &o))
967
+ return JS_FALSE;
968
+
969
+ JS_ASSERT(!JSVAL_IS_PRIMITIVE(o));
970
+ return PushValue(cx, jp, JSVAL_TO_OBJECT(o), value);
971
+ }
972
+
973
+ // root value must be primitive
974
+ *jp->rootVal = value;
975
+ return JS_TRUE;
976
+ }
977
+
978
+ static JSBool
979
+ HandleNumber(JSContext *cx, JSONParser *jp, const jschar *buf, uint32 len)
980
+ {
981
+ const jschar *ep;
982
+ double val;
983
+ if (!js_strtod(cx, buf, buf + len, &ep, &val))
984
+ return JS_FALSE;
985
+ if (ep != buf + len) {
986
+ // bad number input
987
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
988
+ return JS_FALSE;
989
+ }
990
+
991
+ jsval numVal;
992
+ if (!JS_NewNumberValue(cx, val, &numVal))
993
+ return JS_FALSE;
994
+
995
+ return PushPrimitive(cx, jp, numVal);
996
+ }
997
+
998
+ static JSBool
999
+ HandleString(JSContext *cx, JSONParser *jp, const jschar *buf, uint32 len)
1000
+ {
1001
+ JSString *str = js_NewStringCopyN(cx, buf, len);
1002
+ if (!str)
1003
+ return JS_FALSE;
1004
+
1005
+ return PushPrimitive(cx, jp, STRING_TO_JSVAL(str));
1006
+ }
1007
+
1008
+ static JSBool
1009
+ HandleKeyword(JSContext *cx, JSONParser *jp, const jschar *buf, uint32 len)
1010
+ {
1011
+ jsval keyword;
1012
+ JSTokenType tt = js_CheckKeyword(buf, len);
1013
+ if (tt != TOK_PRIMARY) {
1014
+ // bad keyword
1015
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1016
+ return JS_FALSE;
1017
+ }
1018
+
1019
+ if (buf[0] == 'n') {
1020
+ keyword = JSVAL_NULL;
1021
+ } else if (buf[0] == 't') {
1022
+ keyword = JSVAL_TRUE;
1023
+ } else if (buf[0] == 'f') {
1024
+ keyword = JSVAL_FALSE;
1025
+ } else {
1026
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1027
+ return JS_FALSE;
1028
+ }
1029
+
1030
+ return PushPrimitive(cx, jp, keyword);
1031
+ }
1032
+
1033
+ static JSBool
1034
+ HandleData(JSContext *cx, JSONParser *jp, JSONDataType type)
1035
+ {
1036
+ JSBool ok;
1037
+
1038
+ switch (type) {
1039
+ case JSON_DATA_STRING:
1040
+ ok = HandleString(cx, jp, jp->buffer.base, STRING_BUFFER_OFFSET(&jp->buffer));
1041
+ break;
1042
+
1043
+ case JSON_DATA_KEYSTRING:
1044
+ js_AppendUCString(&jp->objectKey, jp->buffer.base, STRING_BUFFER_OFFSET(&jp->buffer));
1045
+ ok = STRING_BUFFER_OK(&jp->objectKey);
1046
+ if (!ok)
1047
+ JS_ReportOutOfMemory(cx);
1048
+ break;
1049
+
1050
+ case JSON_DATA_NUMBER:
1051
+ ok = HandleNumber(cx, jp, jp->buffer.base, STRING_BUFFER_OFFSET(&jp->buffer));
1052
+ break;
1053
+
1054
+ default:
1055
+ JS_ASSERT(type == JSON_DATA_KEYWORD);
1056
+ ok = HandleKeyword(cx, jp, jp->buffer.base, STRING_BUFFER_OFFSET(&jp->buffer));
1057
+ break;
1058
+ }
1059
+
1060
+ if (ok) {
1061
+ ok = STRING_BUFFER_OK(&jp->buffer);
1062
+ if (ok)
1063
+ js_RewindStringBuffer(&jp->buffer);
1064
+ else
1065
+ JS_ReportOutOfMemory(cx);
1066
+ }
1067
+ return ok;
1068
+ }
1069
+
1070
+ JSBool
1071
+ js_ConsumeJSONText(JSContext *cx, JSONParser *jp, const jschar *data, uint32 len)
1072
+ {
1073
+ uint32 i;
1074
+
1075
+ if (*jp->statep == JSON_PARSE_STATE_INIT) {
1076
+ PushState(cx, jp, JSON_PARSE_STATE_VALUE);
1077
+ }
1078
+
1079
+ for (i = 0; i < len; i++) {
1080
+ jschar c = data[i];
1081
+ switch (*jp->statep) {
1082
+ case JSON_PARSE_STATE_VALUE:
1083
+ if (c == ']') {
1084
+ // empty array
1085
+ if (!PopState(cx, jp))
1086
+ return JS_FALSE;
1087
+
1088
+ if (*jp->statep != JSON_PARSE_STATE_ARRAY) {
1089
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1090
+ return JS_FALSE;
1091
+ }
1092
+
1093
+ if (!CloseArray(cx, jp) || !PopState(cx, jp))
1094
+ return JS_FALSE;
1095
+
1096
+ break;
1097
+ }
1098
+
1099
+ if (c == '}') {
1100
+ // we should only find these in OBJECT_KEY state
1101
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1102
+ return JS_FALSE;
1103
+ }
1104
+
1105
+ if (c == '"') {
1106
+ *jp->statep = JSON_PARSE_STATE_STRING;
1107
+ break;
1108
+ }
1109
+
1110
+ if (IsNumChar(c)) {
1111
+ *jp->statep = JSON_PARSE_STATE_NUMBER;
1112
+ js_FastAppendChar(&jp->buffer, c);
1113
+ break;
1114
+ }
1115
+
1116
+ if (JS7_ISLET(c)) {
1117
+ *jp->statep = JSON_PARSE_STATE_KEYWORD;
1118
+ js_FastAppendChar(&jp->buffer, c);
1119
+ break;
1120
+ }
1121
+
1122
+ // fall through in case the value is an object or array
1123
+ case JSON_PARSE_STATE_OBJECT_VALUE:
1124
+ if (c == '{') {
1125
+ *jp->statep = JSON_PARSE_STATE_OBJECT;
1126
+ if (!OpenObject(cx, jp) || !PushState(cx, jp, JSON_PARSE_STATE_OBJECT_PAIR))
1127
+ return JS_FALSE;
1128
+ } else if (c == '[') {
1129
+ *jp->statep = JSON_PARSE_STATE_ARRAY;
1130
+ if (!OpenArray(cx, jp) || !PushState(cx, jp, JSON_PARSE_STATE_VALUE))
1131
+ return JS_FALSE;
1132
+ } else if (!JS_ISXMLSPACE(c)) {
1133
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1134
+ return JS_FALSE;
1135
+ }
1136
+ break;
1137
+
1138
+ case JSON_PARSE_STATE_OBJECT:
1139
+ if (c == '}') {
1140
+ if (!CloseObject(cx, jp) || !PopState(cx, jp))
1141
+ return JS_FALSE;
1142
+ } else if (c == ',') {
1143
+ if (!PushState(cx, jp, JSON_PARSE_STATE_OBJECT_PAIR))
1144
+ return JS_FALSE;
1145
+ } else if (c == ']' || !JS_ISXMLSPACE(c)) {
1146
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1147
+ return JS_FALSE;
1148
+ }
1149
+ break;
1150
+
1151
+ case JSON_PARSE_STATE_ARRAY :
1152
+ if (c == ']') {
1153
+ if (!CloseArray(cx, jp) || !PopState(cx, jp))
1154
+ return JS_FALSE;
1155
+ } else if (c == ',') {
1156
+ if (!PushState(cx, jp, JSON_PARSE_STATE_VALUE))
1157
+ return JS_FALSE;
1158
+ } else if (!JS_ISXMLSPACE(c)) {
1159
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1160
+ return JS_FALSE;
1161
+ }
1162
+ break;
1163
+
1164
+ case JSON_PARSE_STATE_OBJECT_PAIR :
1165
+ if (c == '"') {
1166
+ // we want to be waiting for a : when the string has been read
1167
+ *jp->statep = JSON_PARSE_STATE_OBJECT_IN_PAIR;
1168
+ if (!PushState(cx, jp, JSON_PARSE_STATE_STRING))
1169
+ return JS_FALSE;
1170
+ } else if (c == '}') {
1171
+ // pop off the object pair state and the object state
1172
+ if (!CloseObject(cx, jp) || !PopState(cx, jp) || !PopState(cx, jp))
1173
+ return JS_FALSE;
1174
+ } else if (c == ']' || !JS_ISXMLSPACE(c)) {
1175
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1176
+ return JS_FALSE;
1177
+ }
1178
+ break;
1179
+
1180
+ case JSON_PARSE_STATE_OBJECT_IN_PAIR:
1181
+ if (c == ':') {
1182
+ *jp->statep = JSON_PARSE_STATE_VALUE;
1183
+ } else if (!JS_ISXMLSPACE(c)) {
1184
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1185
+ return JS_FALSE;
1186
+ }
1187
+ break;
1188
+
1189
+ case JSON_PARSE_STATE_STRING:
1190
+ if (c == '"') {
1191
+ if (!PopState(cx, jp))
1192
+ return JS_FALSE;
1193
+ JSONDataType jdt;
1194
+ if (*jp->statep == JSON_PARSE_STATE_OBJECT_IN_PAIR) {
1195
+ jdt = JSON_DATA_KEYSTRING;
1196
+ } else {
1197
+ jdt = JSON_DATA_STRING;
1198
+ }
1199
+ if (!HandleData(cx, jp, jdt))
1200
+ return JS_FALSE;
1201
+ } else if (c == '\\') {
1202
+ *jp->statep = JSON_PARSE_STATE_STRING_ESCAPE;
1203
+ } else {
1204
+ js_FastAppendChar(&jp->buffer, c);
1205
+ }
1206
+ break;
1207
+
1208
+ case JSON_PARSE_STATE_STRING_ESCAPE:
1209
+ switch (c) {
1210
+ case '"':
1211
+ case '\\':
1212
+ case '/':
1213
+ break;
1214
+ case 'b' : c = '\b'; break;
1215
+ case 'f' : c = '\f'; break;
1216
+ case 'n' : c = '\n'; break;
1217
+ case 'r' : c = '\r'; break;
1218
+ case 't' : c = '\t'; break;
1219
+ default :
1220
+ if (c == 'u') {
1221
+ jp->numHex = 0;
1222
+ jp->hexChar = 0;
1223
+ *jp->statep = JSON_PARSE_STATE_STRING_HEX;
1224
+ continue;
1225
+ } else {
1226
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1227
+ return JS_FALSE;
1228
+ }
1229
+ }
1230
+
1231
+ js_FastAppendChar(&jp->buffer, c);
1232
+ *jp->statep = JSON_PARSE_STATE_STRING;
1233
+ break;
1234
+
1235
+ case JSON_PARSE_STATE_STRING_HEX:
1236
+ if (('0' <= c) && (c <= '9')) {
1237
+ jp->hexChar = (jp->hexChar << 4) | (c - '0');
1238
+ } else if (('a' <= c) && (c <= 'f')) {
1239
+ jp->hexChar = (jp->hexChar << 4) | (c - 'a' + 0x0a);
1240
+ } else if (('A' <= c) && (c <= 'F')) {
1241
+ jp->hexChar = (jp->hexChar << 4) | (c - 'A' + 0x0a);
1242
+ } else {
1243
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1244
+ return JS_FALSE;
1245
+ }
1246
+
1247
+ if (++(jp->numHex) == 4) {
1248
+ js_FastAppendChar(&jp->buffer, jp->hexChar);
1249
+ jp->hexChar = 0;
1250
+ jp->numHex = 0;
1251
+ *jp->statep = JSON_PARSE_STATE_STRING;
1252
+ }
1253
+ break;
1254
+
1255
+ case JSON_PARSE_STATE_KEYWORD:
1256
+ if (JS7_ISLET(c)) {
1257
+ js_FastAppendChar(&jp->buffer, c);
1258
+ } else {
1259
+ // this character isn't part of the keyword, process it again
1260
+ i--;
1261
+ if (!PopState(cx, jp))
1262
+ return JS_FALSE;
1263
+
1264
+ if (!HandleData(cx, jp, JSON_DATA_KEYWORD))
1265
+ return JS_FALSE;
1266
+ }
1267
+ break;
1268
+
1269
+ case JSON_PARSE_STATE_NUMBER:
1270
+ if (IsNumChar(c)) {
1271
+ js_FastAppendChar(&jp->buffer, c);
1272
+ } else {
1273
+ // this character isn't part of the number, process it again
1274
+ i--;
1275
+ if (!PopState(cx, jp))
1276
+ return JS_FALSE;
1277
+ if (!HandleData(cx, jp, JSON_DATA_NUMBER))
1278
+ return JS_FALSE;
1279
+ }
1280
+ break;
1281
+
1282
+ case JSON_PARSE_STATE_FINISHED:
1283
+ if (!JS_ISXMLSPACE(c)) {
1284
+ // extra input
1285
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_JSON_BAD_PARSE);
1286
+ return JS_FALSE;
1287
+ }
1288
+ break;
1289
+
1290
+ default:
1291
+ JS_NOT_REACHED("Invalid JSON parser state");
1292
+ }
1293
+
1294
+ if (!STRING_BUFFER_OK(&jp->buffer)) {
1295
+ JS_ReportOutOfMemory(cx);
1296
+ return JS_FALSE;
1297
+ }
1298
+ }
1299
+
1300
+ *jp->buffer.ptr = 0;
1301
+ return JS_TRUE;
1302
+ }
1303
+
1304
+ #if JS_HAS_TOSOURCE
1305
+ static JSBool
1306
+ json_toSource(JSContext *cx, uintN argc, jsval *vp)
1307
+ {
1308
+ *vp = ATOM_KEY(CLASS_ATOM(cx, JSON));
1309
+ return JS_TRUE;
1310
+ }
1311
+ #endif
1312
+
1313
+ static JSFunctionSpec json_static_methods[] = {
1314
+ #if JS_HAS_TOSOURCE
1315
+ JS_FN(js_toSource_str, json_toSource, 0, 0),
1316
+ #endif
1317
+ JS_FN("parse", js_json_parse, 1, 0),
1318
+ JS_FN("stringify", js_json_stringify, 1, 0),
1319
+ JS_FS_END
1320
+ };
1321
+
1322
+ JSObject *
1323
+ js_InitJSONClass(JSContext *cx, JSObject *obj)
1324
+ {
1325
+ JSObject *JSON;
1326
+
1327
+ JSON = JS_NewObject(cx, &js_JSONClass, NULL, obj);
1328
+ if (!JSON)
1329
+ return NULL;
1330
+ if (!JS_DefineProperty(cx, obj, js_JSON_str, OBJECT_TO_JSVAL(JSON),
1331
+ JS_PropertyStub, JS_PropertyStub, 0))
1332
+ return NULL;
1333
+
1334
+ if (!JS_DefineFunctions(cx, JSON, json_static_methods))
1335
+ return NULL;
1336
+
1337
+ return JSON;
1338
+ }