distil 0.7.0

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 (552) hide show
  1. data/Rakefile +28 -0
  2. data/VERSION +1 -0
  3. data/bin/distil +45 -0
  4. data/distil.gemspec +586 -0
  5. data/lib/bootstrap-template.js +56 -0
  6. data/lib/configurable.rb +125 -0
  7. data/lib/file-set.rb +42 -0
  8. data/lib/file-types/css-file.rb +75 -0
  9. data/lib/file-types/html-file.rb +11 -0
  10. data/lib/file-types/javascript-file.rb +98 -0
  11. data/lib/file-types/json-file.rb +14 -0
  12. data/lib/file-types/nib-file.rb +9 -0
  13. data/lib/jsdoc.conf +18 -0
  14. data/lib/jsl.conf +121 -0
  15. data/lib/project.rb +96 -0
  16. data/lib/source-file.rb +181 -0
  17. data/lib/target.rb +96 -0
  18. data/lib/task.rb +239 -0
  19. data/lib/tasks/copy-task.rb +21 -0
  20. data/lib/tasks/css-task.rb +18 -0
  21. data/lib/tasks/javascript-task.rb +125 -0
  22. data/lib/tasks/multiple-output-task.rb +134 -0
  23. data/lib/tasks/nib-task.rb +83 -0
  24. data/lib/tasks/output-task.rb +73 -0
  25. data/lib/tasks/single-output-task.rb +83 -0
  26. data/lib/tasks/test-task.rb +280 -0
  27. data/lib/test/HtmlTestReporter.js +127 -0
  28. data/lib/test/Test.js +248 -0
  29. data/lib/test/TestReporter.js +79 -0
  30. data/lib/test/TestRunner.js +132 -0
  31. data/lib/test/browser.rb +97 -0
  32. data/lib/test/scriptwrapper.html +10 -0
  33. data/lib/test/unittest.html +127 -0
  34. data/vendor/Makefile +35 -0
  35. data/vendor/extconf.rb +3 -0
  36. data/vendor/jsdoc-extras/plugins/distil-plugin.js +142 -0
  37. data/vendor/jsdoc-extras/plugins/interface-plugin.js +36 -0
  38. data/vendor/jsdoc-extras/templates/coherent/allclasses.tmpl +17 -0
  39. data/vendor/jsdoc-extras/templates/coherent/allfiles.tmpl +53 -0
  40. data/vendor/jsdoc-extras/templates/coherent/class.tmpl +803 -0
  41. data/vendor/jsdoc-extras/templates/coherent/index.tmpl +37 -0
  42. data/vendor/jsdoc-extras/templates/coherent/publish.js +242 -0
  43. data/vendor/jsdoc-extras/templates/coherent/showdown.js +421 -0
  44. data/vendor/jsdoc-extras/templates/coherent/static/code-footer.html +3 -0
  45. data/vendor/jsdoc-extras/templates/coherent/static/code-header.html +7 -0
  46. data/vendor/jsdoc-extras/templates/coherent/static/default.css +297 -0
  47. data/vendor/jsdoc-extras/templates/coherent/static/header.html +2 -0
  48. data/vendor/jsdoc-extras/templates/coherent/static/index.html +19 -0
  49. data/vendor/jsdoc-extras/templates/coherent/symbol.tmpl +35 -0
  50. data/vendor/jsdoc-toolkit/README.txt +183 -0
  51. data/vendor/jsdoc-toolkit/app/frame/Chain.js +102 -0
  52. data/vendor/jsdoc-toolkit/app/frame/Dumper.js +144 -0
  53. data/vendor/jsdoc-toolkit/app/frame/Hash.js +84 -0
  54. data/vendor/jsdoc-toolkit/app/frame/Link.js +171 -0
  55. data/vendor/jsdoc-toolkit/app/frame/Namespace.js +10 -0
  56. data/vendor/jsdoc-toolkit/app/frame/Opt.js +134 -0
  57. data/vendor/jsdoc-toolkit/app/frame/Reflection.js +26 -0
  58. data/vendor/jsdoc-toolkit/app/frame/String.js +93 -0
  59. data/vendor/jsdoc-toolkit/app/frame/Testrun.js +129 -0
  60. data/vendor/jsdoc-toolkit/app/frame.js +33 -0
  61. data/vendor/jsdoc-toolkit/app/handlers/FOODOC.js +26 -0
  62. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +159 -0
  63. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +16 -0
  64. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +292 -0
  65. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC.js +26 -0
  66. data/vendor/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +204 -0
  67. data/vendor/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +300 -0
  68. data/vendor/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +126 -0
  69. data/vendor/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +109 -0
  70. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Lang.js +144 -0
  71. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Parser.js +144 -0
  72. data/vendor/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +33 -0
  73. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +644 -0
  74. data/vendor/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +241 -0
  75. data/vendor/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +41 -0
  76. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Token.js +18 -0
  77. data/vendor/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +332 -0
  78. data/vendor/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +133 -0
  79. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Util.js +32 -0
  80. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Walker.js +499 -0
  81. data/vendor/jsdoc-toolkit/app/lib/JSDOC.js +106 -0
  82. data/vendor/jsdoc-toolkit/app/main.js +129 -0
  83. data/vendor/jsdoc-toolkit/app/plugins/commentSrcJson.js +20 -0
  84. data/vendor/jsdoc-toolkit/app/plugins/frameworkPrototype.js +16 -0
  85. data/vendor/jsdoc-toolkit/app/plugins/functionCall.js +10 -0
  86. data/vendor/jsdoc-toolkit/app/plugins/publishSrcHilite.js +54 -0
  87. data/vendor/jsdoc-toolkit/app/plugins/symbolLink.js +10 -0
  88. data/vendor/jsdoc-toolkit/app/plugins/tagParamConfig.js +31 -0
  89. data/vendor/jsdoc-toolkit/app/plugins/tagSynonyms.js +43 -0
  90. data/vendor/jsdoc-toolkit/app/run.js +348 -0
  91. data/vendor/jsdoc-toolkit/app/t/TestDoc.js +144 -0
  92. data/vendor/jsdoc-toolkit/app/t/runner.js +13 -0
  93. data/vendor/jsdoc-toolkit/app/test/addon.js +24 -0
  94. data/vendor/jsdoc-toolkit/app/test/anon_inner.js +14 -0
  95. data/vendor/jsdoc-toolkit/app/test/augments.js +31 -0
  96. data/vendor/jsdoc-toolkit/app/test/augments2.js +26 -0
  97. data/vendor/jsdoc-toolkit/app/test/borrows.js +46 -0
  98. data/vendor/jsdoc-toolkit/app/test/borrows2.js +23 -0
  99. data/vendor/jsdoc-toolkit/app/test/config.js +22 -0
  100. data/vendor/jsdoc-toolkit/app/test/constructs.js +18 -0
  101. data/vendor/jsdoc-toolkit/app/test/encoding.js +10 -0
  102. data/vendor/jsdoc-toolkit/app/test/encoding_other.js +12 -0
  103. data/vendor/jsdoc-toolkit/app/test/event.js +54 -0
  104. data/vendor/jsdoc-toolkit/app/test/exports.js +14 -0
  105. data/vendor/jsdoc-toolkit/app/test/functions_anon.js +39 -0
  106. data/vendor/jsdoc-toolkit/app/test/functions_nested.js +33 -0
  107. data/vendor/jsdoc-toolkit/app/test/global.js +13 -0
  108. data/vendor/jsdoc-toolkit/app/test/globals.js +25 -0
  109. data/vendor/jsdoc-toolkit/app/test/ignore.js +10 -0
  110. data/vendor/jsdoc-toolkit/app/test/inner.js +16 -0
  111. data/vendor/jsdoc-toolkit/app/test/jsdoc_test.js +477 -0
  112. data/vendor/jsdoc-toolkit/app/test/lend.js +33 -0
  113. data/vendor/jsdoc-toolkit/app/test/memberof.js +19 -0
  114. data/vendor/jsdoc-toolkit/app/test/memberof2.js +38 -0
  115. data/vendor/jsdoc-toolkit/app/test/memberof3.js +33 -0
  116. data/vendor/jsdoc-toolkit/app/test/memberof_constructor.js +17 -0
  117. data/vendor/jsdoc-toolkit/app/test/module.js +17 -0
  118. data/vendor/jsdoc-toolkit/app/test/name.js +19 -0
  119. data/vendor/jsdoc-toolkit/app/test/namespace_nested.js +23 -0
  120. data/vendor/jsdoc-toolkit/app/test/nocode.js +13 -0
  121. data/vendor/jsdoc-toolkit/app/test/oblit_anon.js +20 -0
  122. data/vendor/jsdoc-toolkit/app/test/overview.js +20 -0
  123. data/vendor/jsdoc-toolkit/app/test/param_inline.js +37 -0
  124. data/vendor/jsdoc-toolkit/app/test/params_optional.js +8 -0
  125. data/vendor/jsdoc-toolkit/app/test/prototype.js +17 -0
  126. data/vendor/jsdoc-toolkit/app/test/prototype_nested.js +9 -0
  127. data/vendor/jsdoc-toolkit/app/test/prototype_oblit.js +13 -0
  128. data/vendor/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +24 -0
  129. data/vendor/jsdoc-toolkit/app/test/public.js +10 -0
  130. data/vendor/jsdoc-toolkit/app/test/scripts/code.js +5 -0
  131. data/vendor/jsdoc-toolkit/app/test/scripts/notcode.txt +5 -0
  132. data/vendor/jsdoc-toolkit/app/test/shared.js +42 -0
  133. data/vendor/jsdoc-toolkit/app/test/shared2.js +2 -0
  134. data/vendor/jsdoc-toolkit/app/test/shortcuts.js +22 -0
  135. data/vendor/jsdoc-toolkit/app/test/static_this.js +13 -0
  136. data/vendor/jsdoc-toolkit/app/test/synonyms.js +31 -0
  137. data/vendor/jsdoc-toolkit/app/test/tosource.js +23 -0
  138. data/vendor/jsdoc-toolkit/app/test/variable_redefine.js +14 -0
  139. data/vendor/jsdoc-toolkit/app/test.js +342 -0
  140. data/vendor/jsdoc-toolkit/changes.txt +116 -0
  141. data/vendor/jsdoc-toolkit/conf/sample.conf +31 -0
  142. data/vendor/jsdoc-toolkit/java/build.xml +36 -0
  143. data/vendor/jsdoc-toolkit/java/build_1.4.xml +36 -0
  144. data/vendor/jsdoc-toolkit/java/classes/js.jar +0 -0
  145. data/vendor/jsdoc-toolkit/java/src/JsDebugRun.java +21 -0
  146. data/vendor/jsdoc-toolkit/java/src/JsRun.java +21 -0
  147. data/vendor/jsdoc-toolkit/jsdebug.jar +0 -0
  148. data/vendor/jsdoc-toolkit/jsrun.jar +0 -0
  149. data/vendor/jsdoc-toolkit/jsrun.sh +53 -0
  150. data/vendor/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +17 -0
  151. data/vendor/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +56 -0
  152. data/vendor/jsdoc-toolkit/templates/jsdoc/class.tmpl +649 -0
  153. data/vendor/jsdoc-toolkit/templates/jsdoc/index.tmpl +39 -0
  154. data/vendor/jsdoc-toolkit/templates/jsdoc/publish.js +201 -0
  155. data/vendor/jsdoc-toolkit/templates/jsdoc/static/code-footer.html +3 -0
  156. data/vendor/jsdoc-toolkit/templates/jsdoc/static/code-header.html +14 -0
  157. data/vendor/jsdoc-toolkit/templates/jsdoc/static/default.css +162 -0
  158. data/vendor/jsdoc-toolkit/templates/jsdoc/static/header.html +2 -0
  159. data/vendor/jsdoc-toolkit/templates/jsdoc/static/index.html +19 -0
  160. data/vendor/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +35 -0
  161. data/vendor/jsl-0.3.0/src/JavaScriptLintAPI.cpp +333 -0
  162. data/vendor/jsl-0.3.0/src/JavaScriptLintAPI.h +86 -0
  163. data/vendor/jsl-0.3.0/src/Makefile.in +375 -0
  164. data/vendor/jsl-0.3.0/src/Makefile.ref +372 -0
  165. data/vendor/jsl-0.3.0/src/README.html +826 -0
  166. data/vendor/jsl-0.3.0/src/SpiderMonkey.rsp +12 -0
  167. data/vendor/jsl-0.3.0/src/_jsl_online.php +223 -0
  168. data/vendor/jsl-0.3.0/src/config/AIX4.1.mk +65 -0
  169. data/vendor/jsl-0.3.0/src/config/AIX4.2.mk +64 -0
  170. data/vendor/jsl-0.3.0/src/config/AIX4.3.mk +65 -0
  171. data/vendor/jsl-0.3.0/src/config/Darwin.mk +81 -0
  172. data/vendor/jsl-0.3.0/src/config/Darwin1.3.mk +81 -0
  173. data/vendor/jsl-0.3.0/src/config/Darwin1.4.mk +41 -0
  174. data/vendor/jsl-0.3.0/src/config/Darwin5.2.mk +81 -0
  175. data/vendor/jsl-0.3.0/src/config/Darwin5.3.mk +81 -0
  176. data/vendor/jsl-0.3.0/src/config/HP-UXB.10.10.mk +77 -0
  177. data/vendor/jsl-0.3.0/src/config/HP-UXB.10.20.mk +77 -0
  178. data/vendor/jsl-0.3.0/src/config/HP-UXB.11.00.mk +80 -0
  179. data/vendor/jsl-0.3.0/src/config/IRIX.mk +87 -0
  180. data/vendor/jsl-0.3.0/src/config/IRIX5.3.mk +44 -0
  181. data/vendor/jsl-0.3.0/src/config/IRIX6.1.mk +44 -0
  182. data/vendor/jsl-0.3.0/src/config/IRIX6.2.mk +44 -0
  183. data/vendor/jsl-0.3.0/src/config/IRIX6.3.mk +44 -0
  184. data/vendor/jsl-0.3.0/src/config/IRIX6.5.mk +44 -0
  185. data/vendor/jsl-0.3.0/src/config/Linux_All.mk +103 -0
  186. data/vendor/jsl-0.3.0/src/config/Mac_OS10.0.mk +82 -0
  187. data/vendor/jsl-0.3.0/src/config/OSF1V4.0.mk +72 -0
  188. data/vendor/jsl-0.3.0/src/config/OSF1V5.0.mk +69 -0
  189. data/vendor/jsl-0.3.0/src/config/SunOS4.1.4.mk +101 -0
  190. data/vendor/jsl-0.3.0/src/config/SunOS5.3.mk +91 -0
  191. data/vendor/jsl-0.3.0/src/config/SunOS5.4.mk +92 -0
  192. data/vendor/jsl-0.3.0/src/config/SunOS5.5.1.mk +44 -0
  193. data/vendor/jsl-0.3.0/src/config/SunOS5.5.mk +87 -0
  194. data/vendor/jsl-0.3.0/src/config/SunOS5.6.mk +89 -0
  195. data/vendor/jsl-0.3.0/src/config/SunOS5.7.mk +44 -0
  196. data/vendor/jsl-0.3.0/src/config/SunOS5.8.mk +44 -0
  197. data/vendor/jsl-0.3.0/src/config/SunOS5.9.mk +44 -0
  198. data/vendor/jsl-0.3.0/src/config/WINNT4.0.mk +112 -0
  199. data/vendor/jsl-0.3.0/src/config/WINNT5.0.mk +112 -0
  200. data/vendor/jsl-0.3.0/src/config/WINNT5.1.mk +112 -0
  201. data/vendor/jsl-0.3.0/src/config/WINNT5.2.mk +112 -0
  202. data/vendor/jsl-0.3.0/src/config/dgux.mk +64 -0
  203. data/vendor/jsl-0.3.0/src/config.mk +166 -0
  204. data/vendor/jsl-0.3.0/src/editline/Makefile.ref +144 -0
  205. data/vendor/jsl-0.3.0/src/editline/README +83 -0
  206. data/vendor/jsl-0.3.0/src/editline/editline.3 +175 -0
  207. data/vendor/jsl-0.3.0/src/editline/editline.c +1369 -0
  208. data/vendor/jsl-0.3.0/src/editline/editline.h +135 -0
  209. data/vendor/jsl-0.3.0/src/editline/sysunix.c +182 -0
  210. data/vendor/jsl-0.3.0/src/editline/unix.h +82 -0
  211. data/vendor/jsl-0.3.0/src/fdlibm/Makefile.in +127 -0
  212. data/vendor/jsl-0.3.0/src/fdlibm/Makefile.ref +192 -0
  213. data/vendor/jsl-0.3.0/src/fdlibm/e_acos.c +147 -0
  214. data/vendor/jsl-0.3.0/src/fdlibm/e_acosh.c +105 -0
  215. data/vendor/jsl-0.3.0/src/fdlibm/e_asin.c +156 -0
  216. data/vendor/jsl-0.3.0/src/fdlibm/e_atan2.c +165 -0
  217. data/vendor/jsl-0.3.0/src/fdlibm/e_atanh.c +110 -0
  218. data/vendor/jsl-0.3.0/src/fdlibm/e_cosh.c +133 -0
  219. data/vendor/jsl-0.3.0/src/fdlibm/e_exp.c +202 -0
  220. data/vendor/jsl-0.3.0/src/fdlibm/e_fmod.c +184 -0
  221. data/vendor/jsl-0.3.0/src/fdlibm/e_gamma.c +71 -0
  222. data/vendor/jsl-0.3.0/src/fdlibm/e_gamma_r.c +70 -0
  223. data/vendor/jsl-0.3.0/src/fdlibm/e_hypot.c +173 -0
  224. data/vendor/jsl-0.3.0/src/fdlibm/e_j0.c +524 -0
  225. data/vendor/jsl-0.3.0/src/fdlibm/e_j1.c +523 -0
  226. data/vendor/jsl-0.3.0/src/fdlibm/e_jn.c +315 -0
  227. data/vendor/jsl-0.3.0/src/fdlibm/e_lgamma.c +71 -0
  228. data/vendor/jsl-0.3.0/src/fdlibm/e_lgamma_r.c +347 -0
  229. data/vendor/jsl-0.3.0/src/fdlibm/e_log.c +184 -0
  230. data/vendor/jsl-0.3.0/src/fdlibm/e_log10.c +134 -0
  231. data/vendor/jsl-0.3.0/src/fdlibm/e_pow.c +386 -0
  232. data/vendor/jsl-0.3.0/src/fdlibm/e_rem_pio2.c +221 -0
  233. data/vendor/jsl-0.3.0/src/fdlibm/e_remainder.c +120 -0
  234. data/vendor/jsl-0.3.0/src/fdlibm/e_scalb.c +89 -0
  235. data/vendor/jsl-0.3.0/src/fdlibm/e_sinh.c +122 -0
  236. data/vendor/jsl-0.3.0/src/fdlibm/e_sqrt.c +497 -0
  237. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.dsp +160 -0
  238. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.h +273 -0
  239. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.mak +1453 -0
  240. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.mdp +0 -0
  241. data/vendor/jsl-0.3.0/src/fdlibm/k_cos.c +134 -0
  242. data/vendor/jsl-0.3.0/src/fdlibm/k_rem_pio2.c +354 -0
  243. data/vendor/jsl-0.3.0/src/fdlibm/k_sin.c +114 -0
  244. data/vendor/jsl-0.3.0/src/fdlibm/k_standard.c +785 -0
  245. data/vendor/jsl-0.3.0/src/fdlibm/k_tan.c +170 -0
  246. data/vendor/jsl-0.3.0/src/fdlibm/s_asinh.c +101 -0
  247. data/vendor/jsl-0.3.0/src/fdlibm/s_atan.c +175 -0
  248. data/vendor/jsl-0.3.0/src/fdlibm/s_cbrt.c +133 -0
  249. data/vendor/jsl-0.3.0/src/fdlibm/s_ceil.c +120 -0
  250. data/vendor/jsl-0.3.0/src/fdlibm/s_copysign.c +72 -0
  251. data/vendor/jsl-0.3.0/src/fdlibm/s_cos.c +118 -0
  252. data/vendor/jsl-0.3.0/src/fdlibm/s_erf.c +356 -0
  253. data/vendor/jsl-0.3.0/src/fdlibm/s_expm1.c +267 -0
  254. data/vendor/jsl-0.3.0/src/fdlibm/s_fabs.c +70 -0
  255. data/vendor/jsl-0.3.0/src/fdlibm/s_finite.c +71 -0
  256. data/vendor/jsl-0.3.0/src/fdlibm/s_floor.c +121 -0
  257. data/vendor/jsl-0.3.0/src/fdlibm/s_frexp.c +99 -0
  258. data/vendor/jsl-0.3.0/src/fdlibm/s_ilogb.c +85 -0
  259. data/vendor/jsl-0.3.0/src/fdlibm/s_isnan.c +74 -0
  260. data/vendor/jsl-0.3.0/src/fdlibm/s_ldexp.c +66 -0
  261. data/vendor/jsl-0.3.0/src/fdlibm/s_lib_version.c +73 -0
  262. data/vendor/jsl-0.3.0/src/fdlibm/s_log1p.c +211 -0
  263. data/vendor/jsl-0.3.0/src/fdlibm/s_logb.c +79 -0
  264. data/vendor/jsl-0.3.0/src/fdlibm/s_matherr.c +64 -0
  265. data/vendor/jsl-0.3.0/src/fdlibm/s_modf.c +132 -0
  266. data/vendor/jsl-0.3.0/src/fdlibm/s_nextafter.c +124 -0
  267. data/vendor/jsl-0.3.0/src/fdlibm/s_rint.c +131 -0
  268. data/vendor/jsl-0.3.0/src/fdlibm/s_scalbn.c +107 -0
  269. data/vendor/jsl-0.3.0/src/fdlibm/s_signgam.c +40 -0
  270. data/vendor/jsl-0.3.0/src/fdlibm/s_significand.c +68 -0
  271. data/vendor/jsl-0.3.0/src/fdlibm/s_sin.c +118 -0
  272. data/vendor/jsl-0.3.0/src/fdlibm/s_tan.c +112 -0
  273. data/vendor/jsl-0.3.0/src/fdlibm/s_tanh.c +122 -0
  274. data/vendor/jsl-0.3.0/src/fdlibm/w_acos.c +78 -0
  275. data/vendor/jsl-0.3.0/src/fdlibm/w_acosh.c +78 -0
  276. data/vendor/jsl-0.3.0/src/fdlibm/w_asin.c +80 -0
  277. data/vendor/jsl-0.3.0/src/fdlibm/w_atan2.c +79 -0
  278. data/vendor/jsl-0.3.0/src/fdlibm/w_atanh.c +81 -0
  279. data/vendor/jsl-0.3.0/src/fdlibm/w_cosh.c +77 -0
  280. data/vendor/jsl-0.3.0/src/fdlibm/w_exp.c +88 -0
  281. data/vendor/jsl-0.3.0/src/fdlibm/w_fmod.c +78 -0
  282. data/vendor/jsl-0.3.0/src/fdlibm/w_gamma.c +85 -0
  283. data/vendor/jsl-0.3.0/src/fdlibm/w_gamma_r.c +81 -0
  284. data/vendor/jsl-0.3.0/src/fdlibm/w_hypot.c +78 -0
  285. data/vendor/jsl-0.3.0/src/fdlibm/w_j0.c +105 -0
  286. data/vendor/jsl-0.3.0/src/fdlibm/w_j1.c +106 -0
  287. data/vendor/jsl-0.3.0/src/fdlibm/w_jn.c +128 -0
  288. data/vendor/jsl-0.3.0/src/fdlibm/w_lgamma.c +85 -0
  289. data/vendor/jsl-0.3.0/src/fdlibm/w_lgamma_r.c +81 -0
  290. data/vendor/jsl-0.3.0/src/fdlibm/w_log.c +78 -0
  291. data/vendor/jsl-0.3.0/src/fdlibm/w_log10.c +81 -0
  292. data/vendor/jsl-0.3.0/src/fdlibm/w_pow.c +99 -0
  293. data/vendor/jsl-0.3.0/src/fdlibm/w_remainder.c +77 -0
  294. data/vendor/jsl-0.3.0/src/fdlibm/w_scalb.c +95 -0
  295. data/vendor/jsl-0.3.0/src/fdlibm/w_sinh.c +77 -0
  296. data/vendor/jsl-0.3.0/src/fdlibm/w_sqrt.c +77 -0
  297. data/vendor/jsl-0.3.0/src/js.c +2447 -0
  298. data/vendor/jsl-0.3.0/src/js.dsp +420 -0
  299. data/vendor/jsl-0.3.0/src/js.mak +4025 -0
  300. data/vendor/jsl-0.3.0/src/js.mdp +0 -0
  301. data/vendor/jsl-0.3.0/src/js.msg +291 -0
  302. data/vendor/jsl-0.3.0/src/js.pkg +2 -0
  303. data/vendor/jsl-0.3.0/src/js3240.rc +79 -0
  304. data/vendor/jsl-0.3.0/src/jsOS240.def +654 -0
  305. data/vendor/jsl-0.3.0/src/jsapi.c +4405 -0
  306. data/vendor/jsl-0.3.0/src/jsapi.h +1856 -0
  307. data/vendor/jsl-0.3.0/src/jsarena.c +567 -0
  308. data/vendor/jsl-0.3.0/src/jsarena.h +302 -0
  309. data/vendor/jsl-0.3.0/src/jsarray.c +1428 -0
  310. data/vendor/jsl-0.3.0/src/jsarray.h +77 -0
  311. data/vendor/jsl-0.3.0/src/jsatom.c +927 -0
  312. data/vendor/jsl-0.3.0/src/jsatom.h +426 -0
  313. data/vendor/jsl-0.3.0/src/jsbit.h +113 -0
  314. data/vendor/jsl-0.3.0/src/jsbool.c +220 -0
  315. data/vendor/jsl-0.3.0/src/jsbool.h +62 -0
  316. data/vendor/jsl-0.3.0/src/jsclist.h +139 -0
  317. data/vendor/jsl-0.3.0/src/jscntxt.c +1036 -0
  318. data/vendor/jsl-0.3.0/src/jscntxt.h +608 -0
  319. data/vendor/jsl-0.3.0/src/jscompat.h +57 -0
  320. data/vendor/jsl-0.3.0/src/jsconfig.h +489 -0
  321. data/vendor/jsl-0.3.0/src/jsconfig.mk +181 -0
  322. data/vendor/jsl-0.3.0/src/jscpucfg.c +377 -0
  323. data/vendor/jsl-0.3.0/src/jscpucfg.h +204 -0
  324. data/vendor/jsl-0.3.0/src/jsdate.c +2238 -0
  325. data/vendor/jsl-0.3.0/src/jsdate.h +118 -0
  326. data/vendor/jsl-0.3.0/src/jsdbgapi.c +1260 -0
  327. data/vendor/jsl-0.3.0/src/jsdbgapi.h +345 -0
  328. data/vendor/jsl-0.3.0/src/jsdhash.c +763 -0
  329. data/vendor/jsl-0.3.0/src/jsdhash.h +579 -0
  330. data/vendor/jsl-0.3.0/src/jsdtoa.c +3135 -0
  331. data/vendor/jsl-0.3.0/src/jsdtoa.h +130 -0
  332. data/vendor/jsl-0.3.0/src/jsemit.c +4851 -0
  333. data/vendor/jsl-0.3.0/src/jsemit.h +576 -0
  334. data/vendor/jsl-0.3.0/src/jsexn.c +1084 -0
  335. data/vendor/jsl-0.3.0/src/jsexn.h +102 -0
  336. data/vendor/jsl-0.3.0/src/jsfile.c +2610 -0
  337. data/vendor/jsl-0.3.0/src/jsfile.h +50 -0
  338. data/vendor/jsl-0.3.0/src/jsfile.msg +89 -0
  339. data/vendor/jsl-0.3.0/src/jsfun.c +2015 -0
  340. data/vendor/jsl-0.3.0/src/jsfun.h +158 -0
  341. data/vendor/jsl-0.3.0/src/jsgc.c +1441 -0
  342. data/vendor/jsl-0.3.0/src/jsgc.h +230 -0
  343. data/vendor/jsl-0.3.0/src/jshash.c +471 -0
  344. data/vendor/jsl-0.3.0/src/jshash.h +152 -0
  345. data/vendor/jsl-0.3.0/src/jsify.pl +485 -0
  346. data/vendor/jsl-0.3.0/src/jsinterp.c +4797 -0
  347. data/vendor/jsl-0.3.0/src/jsinterp.h +302 -0
  348. data/vendor/jsl-0.3.0/src/jsl-test.js +28 -0
  349. data/vendor/jsl-0.3.0/src/jsl.c +2371 -0
  350. data/vendor/jsl-0.3.0/src/jsl.conf +127 -0
  351. data/vendor/jsl-0.3.0/src/jsl.conf.old +124 -0
  352. data/vendor/jsl-0.3.0/src/jsl.dsp +242 -0
  353. data/vendor/jsl-0.3.0/src/jsl.dsw +59 -0
  354. data/vendor/jsl-0.3.0/src/jslibmath.h +290 -0
  355. data/vendor/jsl-0.3.0/src/jslock.c +1261 -0
  356. data/vendor/jsl-0.3.0/src/jslock.h +289 -0
  357. data/vendor/jsl-0.3.0/src/jslocko.asm +59 -0
  358. data/vendor/jsl-0.3.0/src/jslog2.c +83 -0
  359. data/vendor/jsl-0.3.0/src/jslong.c +281 -0
  360. data/vendor/jsl-0.3.0/src/jslong.h +437 -0
  361. data/vendor/jsl-0.3.0/src/jsmath.c +477 -0
  362. data/vendor/jsl-0.3.0/src/jsmath.h +55 -0
  363. data/vendor/jsl-0.3.0/src/jsnum.c +1148 -0
  364. data/vendor/jsl-0.3.0/src/jsnum.h +257 -0
  365. data/vendor/jsl-0.3.0/src/jsobj.c +4066 -0
  366. data/vendor/jsl-0.3.0/src/jsobj.h +475 -0
  367. data/vendor/jsl-0.3.0/src/jsopcode.c +2730 -0
  368. data/vendor/jsl-0.3.0/src/jsopcode.h +275 -0
  369. data/vendor/jsl-0.3.0/src/jsopcode.tbl +344 -0
  370. data/vendor/jsl-0.3.0/src/jsosdep.h +127 -0
  371. data/vendor/jsl-0.3.0/src/jsotypes.h +211 -0
  372. data/vendor/jsl-0.3.0/src/jsparse.c +4438 -0
  373. data/vendor/jsl-0.3.0/src/jsparse.h +345 -0
  374. data/vendor/jsl-0.3.0/src/jsprf.c +1212 -0
  375. data/vendor/jsl-0.3.0/src/jsprf.h +148 -0
  376. data/vendor/jsl-0.3.0/src/jsprvtd.h +174 -0
  377. data/vendor/jsl-0.3.0/src/jspubtd.h +586 -0
  378. data/vendor/jsl-0.3.0/src/jsregexp.c +3831 -0
  379. data/vendor/jsl-0.3.0/src/jsregexp.h +180 -0
  380. data/vendor/jsl-0.3.0/src/jsscan.c +1814 -0
  381. data/vendor/jsl-0.3.0/src/jsscan.h +267 -0
  382. data/vendor/jsl-0.3.0/src/jsscope.c +1639 -0
  383. data/vendor/jsl-0.3.0/src/jsscope.h +389 -0
  384. data/vendor/jsl-0.3.0/src/jsscript.c +1284 -0
  385. data/vendor/jsl-0.3.0/src/jsscript.h +179 -0
  386. data/vendor/jsl-0.3.0/src/jsshell.msg +50 -0
  387. data/vendor/jsl-0.3.0/src/jsstddef.h +83 -0
  388. data/vendor/jsl-0.3.0/src/jsstr.c +4502 -0
  389. data/vendor/jsl-0.3.0/src/jsstr.h +448 -0
  390. data/vendor/jsl-0.3.0/src/jstypes.h +391 -0
  391. data/vendor/jsl-0.3.0/src/jsutil.c +157 -0
  392. data/vendor/jsl-0.3.0/src/jsutil.h +75 -0
  393. data/vendor/jsl-0.3.0/src/jsxdrapi.c +686 -0
  394. data/vendor/jsl-0.3.0/src/jsxdrapi.h +193 -0
  395. data/vendor/jsl-0.3.0/src/liveconnect/LiveConnect.dsp +157 -0
  396. data/vendor/jsl-0.3.0/src/liveconnect/LiveConnectShell.dsp +120 -0
  397. data/vendor/jsl-0.3.0/src/liveconnect/LiveConnectShell.dsw +44 -0
  398. data/vendor/jsl-0.3.0/src/liveconnect/Makefile.in +106 -0
  399. data/vendor/jsl-0.3.0/src/liveconnect/Makefile.ref +169 -0
  400. data/vendor/jsl-0.3.0/src/liveconnect/README.html +719 -0
  401. data/vendor/jsl-0.3.0/src/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  402. data/vendor/jsl-0.3.0/src/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  403. data/vendor/jsl-0.3.0/src/liveconnect/classes/Makefile.in +89 -0
  404. data/vendor/jsl-0.3.0/src/liveconnect/classes/Makefile.ref +57 -0
  405. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/Makefile.ref +47 -0
  406. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  407. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  408. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  409. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  410. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  411. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  412. data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.1.mk +45 -0
  413. data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.2.mk +45 -0
  414. data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.3.mk +50 -0
  415. data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.10.10.mk +43 -0
  416. data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.10.20.mk +43 -0
  417. data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.11.00.mk +43 -0
  418. data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.2.mk +43 -0
  419. data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.3.mk +43 -0
  420. data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.5.mk +43 -0
  421. data/vendor/jsl-0.3.0/src/liveconnect/config/Linux_All.mk +73 -0
  422. data/vendor/jsl-0.3.0/src/liveconnect/config/OSF1V4.0.mk +65 -0
  423. data/vendor/jsl-0.3.0/src/liveconnect/config/OSF1V5.0.mk +62 -0
  424. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.5.1.mk +55 -0
  425. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.6.mk +39 -0
  426. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.7.mk +39 -0
  427. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.8.mk +39 -0
  428. data/vendor/jsl-0.3.0/src/liveconnect/config/WINNT4.0.mk +53 -0
  429. data/vendor/jsl-0.3.0/src/liveconnect/jsj.c +884 -0
  430. data/vendor/jsl-0.3.0/src/liveconnect/jsj.msg +98 -0
  431. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JSObject.c +1379 -0
  432. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaArray.c +481 -0
  433. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaClass.c +749 -0
  434. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaMember.c +186 -0
  435. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaObject.c +1099 -0
  436. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaPackage.c +548 -0
  437. data/vendor/jsl-0.3.0/src/liveconnect/jsj_array.c +207 -0
  438. data/vendor/jsl-0.3.0/src/liveconnect/jsj_class.c +765 -0
  439. data/vendor/jsl-0.3.0/src/liveconnect/jsj_convert.c +954 -0
  440. data/vendor/jsl-0.3.0/src/liveconnect/jsj_field.c +421 -0
  441. data/vendor/jsl-0.3.0/src/liveconnect/jsj_hash.c +504 -0
  442. data/vendor/jsl-0.3.0/src/liveconnect/jsj_hash.h +161 -0
  443. data/vendor/jsl-0.3.0/src/liveconnect/jsj_method.c +1823 -0
  444. data/vendor/jsl-0.3.0/src/liveconnect/jsj_nodl.c +1 -0
  445. data/vendor/jsl-0.3.0/src/liveconnect/jsj_private.h +689 -0
  446. data/vendor/jsl-0.3.0/src/liveconnect/jsj_simpleapi.c +219 -0
  447. data/vendor/jsl-0.3.0/src/liveconnect/jsj_utils.c +513 -0
  448. data/vendor/jsl-0.3.0/src/liveconnect/jsjava.h +313 -0
  449. data/vendor/jsl-0.3.0/src/liveconnect/liveconnect.pkg +3 -0
  450. data/vendor/jsl-0.3.0/src/liveconnect/netscape_javascript_JSObject.h +155 -0
  451. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnect.cpp +785 -0
  452. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnect.h +197 -0
  453. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnectFactory.cpp +163 -0
  454. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnectFactory.h +76 -0
  455. data/vendor/jsl-0.3.0/src/liveconnect/nsILiveconnect.h +195 -0
  456. data/vendor/jsl-0.3.0/src/liveconnect/nsISecureLiveconnect.h +84 -0
  457. data/vendor/jsl-0.3.0/src/liveconnect/nsISecurityContext.h +135 -0
  458. data/vendor/jsl-0.3.0/src/liveconnect/win32.order +6 -0
  459. data/vendor/jsl-0.3.0/src/lock_SunOS.s +114 -0
  460. data/vendor/jsl-0.3.0/src/perfect.js +39 -0
  461. data/vendor/jsl-0.3.0/src/perlconnect/JS.def +6 -0
  462. data/vendor/jsl-0.3.0/src/perlconnect/JS.dsp +107 -0
  463. data/vendor/jsl-0.3.0/src/perlconnect/JS.pm +318 -0
  464. data/vendor/jsl-0.3.0/src/perlconnect/JS.xs +1050 -0
  465. data/vendor/jsl-0.3.0/src/perlconnect/Makefile.PL +67 -0
  466. data/vendor/jsl-0.3.0/src/perlconnect/Makefile.ref +152 -0
  467. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.dsp +103 -0
  468. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.dsw +59 -0
  469. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.pm +126 -0
  470. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnectShell.dsp +89 -0
  471. data/vendor/jsl-0.3.0/src/perlconnect/README.html +345 -0
  472. data/vendor/jsl-0.3.0/src/perlconnect/bg.jpg +0 -0
  473. data/vendor/jsl-0.3.0/src/perlconnect/jsperl.c +1100 -0
  474. data/vendor/jsl-0.3.0/src/perlconnect/jsperl.h +52 -0
  475. data/vendor/jsl-0.3.0/src/perlconnect/jsperlbuild.pl +81 -0
  476. data/vendor/jsl-0.3.0/src/perlconnect/jsperlpvt.h +57 -0
  477. data/vendor/jsl-0.3.0/src/perlconnect/test.js +73 -0
  478. data/vendor/jsl-0.3.0/src/perlconnect/test.pl +244 -0
  479. data/vendor/jsl-0.3.0/src/perlconnect/typemap +121 -0
  480. data/vendor/jsl-0.3.0/src/plify_jsdhash.sed +31 -0
  481. data/vendor/jsl-0.3.0/src/prmjtime.c +646 -0
  482. data/vendor/jsl-0.3.0/src/prmjtime.h +95 -0
  483. data/vendor/jsl-0.3.0/src/resource.h +15 -0
  484. data/vendor/jsl-0.3.0/src/rules.mk +193 -0
  485. data/vendor/jsl-0.3.0/src/win32.order +391 -0
  486. data/vendor/jsl-0.3.0/tests/conf/always_use_option_explicit.js +4 -0
  487. data/vendor/jsl-0.3.0/tests/conf/define.js +8 -0
  488. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-1.js +7 -0
  489. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-2.js +8 -0
  490. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-3.js +27 -0
  491. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-4.js +4 -0
  492. data/vendor/jsl-0.3.0/tests/conf/lambda_assign_requires_semicolon.js +24 -0
  493. data/vendor/jsl-0.3.0/tests/conf/legacy_control_comments.js +8 -0
  494. data/vendor/jsl-0.3.0/tests/control_comments/control_comments.js +33 -0
  495. data/vendor/jsl-0.3.0/tests/control_comments/declare.js +26 -0
  496. data/vendor/jsl-0.3.0/tests/control_comments/import-overflow.js +9 -0
  497. data/vendor/jsl-0.3.0/tests/control_comments/import.js +5 -0
  498. data/vendor/jsl-0.3.0/tests/control_comments/import2.js +2 -0
  499. data/vendor/jsl-0.3.0/tests/control_comments/invalid_fallthru.js +13 -0
  500. data/vendor/jsl-0.3.0/tests/control_comments/option_explicit-with.js +12 -0
  501. data/vendor/jsl-0.3.0/tests/control_comments/option_explicit.js +64 -0
  502. data/vendor/jsl-0.3.0/tests/errors/unterminated_comment.js +8 -0
  503. data/vendor/jsl-0.3.0/tests/html/script_tag_in_js_literal.html +14 -0
  504. data/vendor/jsl-0.3.0/tests/run_tests.pl +71 -0
  505. data/vendor/jsl-0.3.0/tests/warnings/ambiguous_else_stmt.js +21 -0
  506. data/vendor/jsl-0.3.0/tests/warnings/ambiguous_nested_stmt.js +66 -0
  507. data/vendor/jsl-0.3.0/tests/warnings/ambiguous_newline.js +261 -0
  508. data/vendor/jsl-0.3.0/tests/warnings/anon_no_return_value.js +26 -0
  509. data/vendor/jsl-0.3.0/tests/warnings/assign_to_function_call.js +16 -0
  510. data/vendor/jsl-0.3.0/tests/warnings/block_without_braces.js +13 -0
  511. data/vendor/jsl-0.3.0/tests/warnings/comma_separated_stmts.js +17 -0
  512. data/vendor/jsl-0.3.0/tests/warnings/comparison_type_conv.js +44 -0
  513. data/vendor/jsl-0.3.0/tests/warnings/default_not_at_end.js +15 -0
  514. data/vendor/jsl-0.3.0/tests/warnings/dup_option_explicit.js +5 -0
  515. data/vendor/jsl-0.3.0/tests/warnings/duplicate_case_in_switch.js +62 -0
  516. data/vendor/jsl-0.3.0/tests/warnings/duplicate_formal.js +5 -0
  517. data/vendor/jsl-0.3.0/tests/warnings/empty_statement.js +29 -0
  518. data/vendor/jsl-0.3.0/tests/warnings/equal_as_assign.js +7 -0
  519. data/vendor/jsl-0.3.0/tests/warnings/inc_dec_within_stmt-ignore.js +21 -0
  520. data/vendor/jsl-0.3.0/tests/warnings/inc_dec_within_stmt.js +63 -0
  521. data/vendor/jsl-0.3.0/tests/warnings/jsl_cc_not_understood.js +5 -0
  522. data/vendor/jsl-0.3.0/tests/warnings/leading_decimal_point.js +7 -0
  523. data/vendor/jsl-0.3.0/tests/warnings/legacy_cc_not_understood.js +9 -0
  524. data/vendor/jsl-0.3.0/tests/warnings/meaningless_block.js +12 -0
  525. data/vendor/jsl-0.3.0/tests/warnings/misplaced_regex.js +20 -0
  526. data/vendor/jsl-0.3.0/tests/warnings/missing_break.js +87 -0
  527. data/vendor/jsl-0.3.0/tests/warnings/missing_break_for_last_case.js +19 -0
  528. data/vendor/jsl-0.3.0/tests/warnings/missing_default_case.js +51 -0
  529. data/vendor/jsl-0.3.0/tests/warnings/missing_option_explicit.js +5 -0
  530. data/vendor/jsl-0.3.0/tests/warnings/missing_semicolon.js +19 -0
  531. data/vendor/jsl-0.3.0/tests/warnings/multiple_plus_minus.js +10 -0
  532. data/vendor/jsl-0.3.0/tests/warnings/nested_comment.js +6 -0
  533. data/vendor/jsl-0.3.0/tests/warnings/no_return_value.js +25 -0
  534. data/vendor/jsl-0.3.0/tests/warnings/octal_number.js +5 -0
  535. data/vendor/jsl-0.3.0/tests/warnings/parseint_missing_radix.js +15 -0
  536. data/vendor/jsl-0.3.0/tests/warnings/partial_option_explicit.js +5 -0
  537. data/vendor/jsl-0.3.0/tests/warnings/redeclared_var.js +10 -0
  538. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/bad_backref.js +5 -0
  539. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/deprecated_usage.js +11 -0
  540. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/invalid_backref.js +5 -0
  541. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/trailing_comma.js +5 -0
  542. data/vendor/jsl-0.3.0/tests/warnings/trailing_comma_in_array.js +8 -0
  543. data/vendor/jsl-0.3.0/tests/warnings/trailing_decimal_point.js +7 -0
  544. data/vendor/jsl-0.3.0/tests/warnings/unreachable_code.js +29 -0
  545. data/vendor/jsl-0.3.0/tests/warnings/use_of_label.js +19 -0
  546. data/vendor/jsl-0.3.0/tests/warnings/useless_assign.js +20 -0
  547. data/vendor/jsl-0.3.0/tests/warnings/useless_comparison.js +55 -0
  548. data/vendor/jsl-0.3.0/tests/warnings/useless_void.js +6 -0
  549. data/vendor/jsl-0.3.0/tests/warnings/var_hides_arg.js +4 -0
  550. data/vendor/jsl-0.3.0/tests/warnings/with_statement.js +7 -0
  551. data/vendor/yuicompressor-2.4.2.jar +0 -0
  552. metadata +605 -0
@@ -0,0 +1,3135 @@
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
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ /*
41
+ * Portable double to alphanumeric string and back converters.
42
+ */
43
+ #include "jsstddef.h"
44
+ #include "jslibmath.h"
45
+ #include "jstypes.h"
46
+ #include "jsdtoa.h"
47
+ #include "jsprf.h"
48
+ #include "jsutil.h" /* Added by JSIFY */
49
+ #include "jspubtd.h"
50
+ #include "jsnum.h"
51
+
52
+ #ifdef JS_THREADSAFE
53
+ #include "prlock.h"
54
+ #endif
55
+
56
+ /****************************************************************
57
+ *
58
+ * The author of this software is David M. Gay.
59
+ *
60
+ * Copyright (c) 1991 by Lucent Technologies.
61
+ *
62
+ * Permission to use, copy, modify, and distribute this software for any
63
+ * purpose without fee is hereby granted, provided that this entire notice
64
+ * is included in all copies of any software which is or includes a copy
65
+ * or modification of this software and in all copies of the supporting
66
+ * documentation for such software.
67
+ *
68
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
69
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
70
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
71
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
72
+ *
73
+ ***************************************************************/
74
+
75
+ /* Please send bug reports to
76
+ David M. Gay
77
+ Bell Laboratories, Room 2C-463
78
+ 600 Mountain Avenue
79
+ Murray Hill, NJ 07974-0636
80
+ U.S.A.
81
+ dmg@bell-labs.com
82
+ */
83
+
84
+ /* On a machine with IEEE extended-precision registers, it is
85
+ * necessary to specify double-precision (53-bit) rounding precision
86
+ * before invoking strtod or dtoa. If the machine uses (the equivalent
87
+ * of) Intel 80x87 arithmetic, the call
88
+ * _control87(PC_53, MCW_PC);
89
+ * does this with many compilers. Whether this or another call is
90
+ * appropriate depends on the compiler; for this to work, it may be
91
+ * necessary to #include "float.h" or another system-dependent header
92
+ * file.
93
+ */
94
+
95
+ /* strtod for IEEE-arithmetic machines.
96
+ *
97
+ * This strtod returns a nearest machine number to the input decimal
98
+ * string (or sets err to JS_DTOA_ERANGE or JS_DTOA_ENOMEM). With IEEE
99
+ * arithmetic, ties are broken by the IEEE round-even rule. Otherwise
100
+ * ties are broken by biased rounding (add half and chop).
101
+ *
102
+ * Inspired loosely by William D. Clinger's paper "How to Read Floating
103
+ * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
104
+ *
105
+ * Modifications:
106
+ *
107
+ * 1. We only require IEEE double-precision
108
+ * arithmetic (not IEEE double-extended).
109
+ * 2. We get by with floating-point arithmetic in a case that
110
+ * Clinger missed -- when we're computing d * 10^n
111
+ * for a small integer d and the integer n is not too
112
+ * much larger than 22 (the maximum integer k for which
113
+ * we can represent 10^k exactly), we may be able to
114
+ * compute (d*10^k) * 10^(e-k) with just one roundoff.
115
+ * 3. Rather than a bit-at-a-time adjustment of the binary
116
+ * result in the hard case, we use floating-point
117
+ * arithmetic to determine the adjustment to within
118
+ * one bit; only in really hard cases do we need to
119
+ * compute a second residual.
120
+ * 4. Because of 3., we don't need a large table of powers of 10
121
+ * for ten-to-e (just some small tables, e.g. of 10^k
122
+ * for 0 <= k <= 22).
123
+ */
124
+
125
+ /*
126
+ * #define IEEE_8087 for IEEE-arithmetic machines where the least
127
+ * significant byte has the lowest address.
128
+ * #define IEEE_MC68k for IEEE-arithmetic machines where the most
129
+ * significant byte has the lowest address.
130
+ * #define Long int on machines with 32-bit ints and 64-bit longs.
131
+ * #define Sudden_Underflow for IEEE-format machines without gradual
132
+ * underflow (i.e., that flush to zero on underflow).
133
+ * #define No_leftright to omit left-right logic in fast floating-point
134
+ * computation of js_dtoa.
135
+ * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
136
+ * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
137
+ * that use extended-precision instructions to compute rounded
138
+ * products and quotients) with IBM.
139
+ * #define ROUND_BIASED for IEEE-format with biased rounding.
140
+ * #define Inaccurate_Divide for IEEE-format with correctly rounded
141
+ * products but inaccurate quotients, e.g., for Intel i860.
142
+ * #define JS_HAVE_LONG_LONG on machines that have a "long long"
143
+ * integer type (of >= 64 bits). If long long is available and the name is
144
+ * something other than "long long", #define Llong to be the name,
145
+ * and if "unsigned Llong" does not work as an unsigned version of
146
+ * Llong, #define #ULLong to be the corresponding unsigned type.
147
+ * #define Bad_float_h if your system lacks a float.h or if it does not
148
+ * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
149
+ * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
150
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
151
+ * if memory is available and otherwise does something you deem
152
+ * appropriate. If MALLOC is undefined, malloc will be invoked
153
+ * directly -- and assumed always to succeed.
154
+ * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
155
+ * memory allocations from a private pool of memory when possible.
156
+ * When used, the private pool is PRIVATE_MEM bytes long: 2000 bytes,
157
+ * unless #defined to be a different length. This default length
158
+ * suffices to get rid of MALLOC calls except for unusual cases,
159
+ * such as decimal-to-binary conversion of a very long string of
160
+ * digits.
161
+ * #define INFNAN_CHECK on IEEE systems to cause strtod to check for
162
+ * Infinity and NaN (case insensitively). On some systems (e.g.,
163
+ * some HP systems), it may be necessary to #define NAN_WORD0
164
+ * appropriately -- to the most significant word of a quiet NaN.
165
+ * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
166
+ * #define MULTIPLE_THREADS if the system offers preemptively scheduled
167
+ * multiple threads. In this case, you must provide (or suitably
168
+ * #define) two locks, acquired by ACQUIRE_DTOA_LOCK() and released
169
+ * by RELEASE_DTOA_LOCK(). (The second lock, accessed
170
+ * in pow5mult, ensures lazy evaluation of only one copy of high
171
+ * powers of 5; omitting this lock would introduce a small
172
+ * probability of wasting memory, but would otherwise be harmless.)
173
+ * You must also invoke freedtoa(s) to free the value s returned by
174
+ * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined.
175
+ * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
176
+ * avoids underflows on inputs whose result does not underflow.
177
+ */
178
+ #ifdef IS_LITTLE_ENDIAN
179
+ #define IEEE_8087
180
+ #else
181
+ #define IEEE_MC68k
182
+ #endif
183
+
184
+ #ifndef Long
185
+ #define Long int32
186
+ #endif
187
+
188
+ #ifndef ULong
189
+ #define ULong uint32
190
+ #endif
191
+
192
+ #define Bug(errorMessageString) JS_ASSERT(!errorMessageString)
193
+
194
+ #include "stdlib.h"
195
+ #include "string.h"
196
+
197
+ #ifdef MALLOC
198
+ extern void *MALLOC(size_t);
199
+ #else
200
+ #define MALLOC malloc
201
+ #endif
202
+
203
+ #define Omit_Private_Memory
204
+ /* Private memory currently doesn't work with JS_THREADSAFE */
205
+ #ifndef Omit_Private_Memory
206
+ #ifndef PRIVATE_MEM
207
+ #define PRIVATE_MEM 2000
208
+ #endif
209
+ #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
210
+ static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
211
+ #endif
212
+
213
+ #ifdef Bad_float_h
214
+ #undef __STDC__
215
+
216
+ #define DBL_DIG 15
217
+ #define DBL_MAX_10_EXP 308
218
+ #define DBL_MAX_EXP 1024
219
+ #define FLT_RADIX 2
220
+ #define FLT_ROUNDS 1
221
+ #define DBL_MAX 1.7976931348623157e+308
222
+
223
+
224
+
225
+ #ifndef LONG_MAX
226
+ #define LONG_MAX 2147483647
227
+ #endif
228
+
229
+ #else /* ifndef Bad_float_h */
230
+ #include "float.h"
231
+ /*
232
+ * MacOS 10.2 defines the macro FLT_ROUNDS to an internal function
233
+ * which does not exist on 10.1. We can safely #define it to 1 here
234
+ * to allow 10.2 builds to run on 10.1, since we can't use fesetround()
235
+ * (which does not exist on 10.1 either).
236
+ */
237
+ #if defined(MACOS_DEPLOYMENT_TARGET) && (MACOS_DEPLOYMENT_TARGET < 100200)
238
+ #undef FLT_ROUNDS
239
+ #define FLT_ROUNDS 1
240
+ #endif
241
+ #endif /* Bad_float_h */
242
+
243
+ #ifndef __MATH_H__
244
+ #include "math.h"
245
+ #endif
246
+
247
+ #ifndef CONST
248
+ #define CONST const
249
+ #endif
250
+
251
+ #if defined(IEEE_8087) + defined(IEEE_MC68k) != 1
252
+ Exactly one of IEEE_8087 or IEEE_MC68k should be defined.
253
+ #endif
254
+
255
+ #define word0(x) JSDOUBLE_HI32(x)
256
+ #define set_word0(x, y) JSDOUBLE_SET_HI32(x, y)
257
+ #define word1(x) JSDOUBLE_LO32(x)
258
+ #define set_word1(x, y) JSDOUBLE_SET_LO32(x, y)
259
+
260
+ #define Storeinc(a,b,c) (*(a)++ = (b) << 16 | (c) & 0xffff)
261
+
262
+ /* #define P DBL_MANT_DIG */
263
+ /* Ten_pmax = floor(P*log(2)/log(5)) */
264
+ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
265
+ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
266
+ /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
267
+
268
+ #define Exp_shift 20
269
+ #define Exp_shift1 20
270
+ #define Exp_msk1 0x100000
271
+ #define Exp_msk11 0x100000
272
+ #define Exp_mask 0x7ff00000
273
+ #define P 53
274
+ #define Bias 1023
275
+ #define Emin (-1022)
276
+ #define Exp_1 0x3ff00000
277
+ #define Exp_11 0x3ff00000
278
+ #define Ebits 11
279
+ #define Frac_mask 0xfffff
280
+ #define Frac_mask1 0xfffff
281
+ #define Ten_pmax 22
282
+ #define Bletch 0x10
283
+ #define Bndry_mask 0xfffff
284
+ #define Bndry_mask1 0xfffff
285
+ #define LSB 1
286
+ #define Sign_bit 0x80000000
287
+ #define Log2P 1
288
+ #define Tiny0 0
289
+ #define Tiny1 1
290
+ #define Quick_max 14
291
+ #define Int_max 14
292
+ #define Infinite(x) (word0(x) == 0x7ff00000) /* sufficient test for here */
293
+ #ifndef NO_IEEE_Scale
294
+ #define Avoid_Underflow
295
+ #endif
296
+
297
+
298
+
299
+ #ifdef RND_PRODQUOT
300
+ #define rounded_product(a,b) a = rnd_prod(a, b)
301
+ #define rounded_quotient(a,b) a = rnd_quot(a, b)
302
+ extern double rnd_prod(double, double), rnd_quot(double, double);
303
+ #else
304
+ #define rounded_product(a,b) a *= b
305
+ #define rounded_quotient(a,b) a /= b
306
+ #endif
307
+
308
+ #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
309
+ #define Big1 0xffffffff
310
+
311
+ #ifndef JS_HAVE_LONG_LONG
312
+ #undef ULLong
313
+ #else /* long long available */
314
+ #ifndef Llong
315
+ #define Llong JSInt64
316
+ #endif
317
+ #ifndef ULLong
318
+ #define ULLong JSUint64
319
+ #endif
320
+ #endif /* JS_HAVE_LONG_LONG */
321
+
322
+ #ifdef JS_THREADSAFE
323
+ #define MULTIPLE_THREADS
324
+ static PRLock *freelist_lock;
325
+ #define ACQUIRE_DTOA_LOCK() \
326
+ JS_BEGIN_MACRO \
327
+ if (!initialized) \
328
+ InitDtoa(); \
329
+ PR_Lock(freelist_lock); \
330
+ JS_END_MACRO
331
+ #define RELEASE_DTOA_LOCK() PR_Unlock(freelist_lock)
332
+ #else
333
+ #undef MULTIPLE_THREADS
334
+ #define ACQUIRE_DTOA_LOCK() /*nothing*/
335
+ #define RELEASE_DTOA_LOCK() /*nothing*/
336
+ #endif
337
+
338
+ #define Kmax 15
339
+
340
+ struct Bigint {
341
+ struct Bigint *next; /* Free list link */
342
+ int32 k; /* lg2(maxwds) */
343
+ int32 maxwds; /* Number of words allocated for x */
344
+ int32 sign; /* Zero if positive, 1 if negative. Ignored by most Bigint routines! */
345
+ int32 wds; /* Actual number of words. If value is nonzero, the most significant word must be nonzero. */
346
+ ULong x[1]; /* wds words of number in little endian order */
347
+ };
348
+
349
+ #ifdef ENABLE_OOM_TESTING
350
+ /* Out-of-memory testing. Use a good testcase (over and over) and then use
351
+ * these routines to cause a memory failure on every possible Balloc allocation,
352
+ * to make sure that all out-of-memory paths can be followed. See bug 14044.
353
+ */
354
+
355
+ static int allocationNum; /* which allocation is next? */
356
+ static int desiredFailure; /* which allocation should fail? */
357
+
358
+ /**
359
+ * js_BigintTestingReset
360
+ *
361
+ * Call at the beginning of a test run to set the allocation failure position.
362
+ * (Set to 0 to just have the engine count allocations without failing.)
363
+ */
364
+ JS_PUBLIC_API(void)
365
+ js_BigintTestingReset(int newFailure)
366
+ {
367
+ allocationNum = 0;
368
+ desiredFailure = newFailure;
369
+ }
370
+
371
+ /**
372
+ * js_BigintTestingWhere
373
+ *
374
+ * Report the current allocation position. This is really only useful when you
375
+ * want to learn how many allocations a test run has.
376
+ */
377
+ JS_PUBLIC_API(int)
378
+ js_BigintTestingWhere()
379
+ {
380
+ return allocationNum;
381
+ }
382
+
383
+
384
+ /*
385
+ * So here's what you do: Set up a fantastic test case that exercises the
386
+ * elements of the code you wish. Set the failure point at 0 and run the test,
387
+ * then get the allocation position. This number is the number of allocations
388
+ * your test makes. Now loop from 1 to that number, setting the failure point
389
+ * at each loop count, and run the test over and over, causing failures at each
390
+ * step. Any memory failure *should* cause a Out-Of-Memory exception; if it
391
+ * doesn't, then there's still an error here.
392
+ */
393
+ #endif
394
+
395
+ typedef struct Bigint Bigint;
396
+
397
+ static Bigint *freelist[Kmax+1];
398
+
399
+ /*
400
+ * Allocate a Bigint with 2^k words.
401
+ * This is not threadsafe. The caller must use thread locks
402
+ */
403
+ static Bigint *Balloc(int32 k)
404
+ {
405
+ int32 x;
406
+ Bigint *rv;
407
+ #ifndef Omit_Private_Memory
408
+ uint32 len;
409
+ #endif
410
+
411
+ #ifdef ENABLE_OOM_TESTING
412
+ if (++allocationNum == desiredFailure) {
413
+ printf("Forced Failing Allocation number %d\n", allocationNum);
414
+ return NULL;
415
+ }
416
+ #endif
417
+
418
+ if ((rv = freelist[k]) != NULL)
419
+ freelist[k] = rv->next;
420
+ if (rv == NULL) {
421
+ x = 1 << k;
422
+ #ifdef Omit_Private_Memory
423
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
424
+ #else
425
+ len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
426
+ /sizeof(double);
427
+ if (pmem_next - private_mem + len <= PRIVATE_mem) {
428
+ rv = (Bigint*)pmem_next;
429
+ pmem_next += len;
430
+ }
431
+ else
432
+ rv = (Bigint*)MALLOC(len*sizeof(double));
433
+ #endif
434
+ if (!rv)
435
+ return NULL;
436
+ rv->k = k;
437
+ rv->maxwds = x;
438
+ }
439
+ rv->sign = rv->wds = 0;
440
+ return rv;
441
+ }
442
+
443
+ static void Bfree(Bigint *v)
444
+ {
445
+ if (v) {
446
+ v->next = freelist[v->k];
447
+ freelist[v->k] = v;
448
+ }
449
+ }
450
+
451
+ #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
452
+ y->wds*sizeof(Long) + 2*sizeof(int32))
453
+
454
+ /* Return b*m + a. Deallocate the old b. Both a and m must be between 0 and
455
+ * 65535 inclusive. NOTE: old b is deallocated on memory failure.
456
+ */
457
+ static Bigint *multadd(Bigint *b, int32 m, int32 a)
458
+ {
459
+ int32 i, wds;
460
+ #ifdef ULLong
461
+ ULong *x;
462
+ ULLong carry, y;
463
+ #else
464
+ ULong carry, *x, y;
465
+ ULong xi, z;
466
+ #endif
467
+ Bigint *b1;
468
+
469
+ #ifdef ENABLE_OOM_TESTING
470
+ if (++allocationNum == desiredFailure) {
471
+ /* Faux allocation, because I'm not getting all of the failure paths
472
+ * without it.
473
+ */
474
+ printf("Forced Failing Allocation number %d\n", allocationNum);
475
+ Bfree(b);
476
+ return NULL;
477
+ }
478
+ #endif
479
+
480
+ wds = b->wds;
481
+ x = b->x;
482
+ i = 0;
483
+ carry = a;
484
+ do {
485
+ #ifdef ULLong
486
+ y = *x * (ULLong)m + carry;
487
+ carry = y >> 32;
488
+ *x++ = (ULong)(y & 0xffffffffUL);
489
+ #else
490
+ xi = *x;
491
+ y = (xi & 0xffff) * m + carry;
492
+ z = (xi >> 16) * m + (y >> 16);
493
+ carry = z >> 16;
494
+ *x++ = (z << 16) + (y & 0xffff);
495
+ #endif
496
+ }
497
+ while(++i < wds);
498
+ if (carry) {
499
+ if (wds >= b->maxwds) {
500
+ b1 = Balloc(b->k+1);
501
+ if (!b1) {
502
+ Bfree(b);
503
+ return NULL;
504
+ }
505
+ Bcopy(b1, b);
506
+ Bfree(b);
507
+ b = b1;
508
+ }
509
+ b->x[wds++] = (ULong)carry;
510
+ b->wds = wds;
511
+ }
512
+ return b;
513
+ }
514
+
515
+ static Bigint *s2b(CONST char *s, int32 nd0, int32 nd, ULong y9)
516
+ {
517
+ Bigint *b;
518
+ int32 i, k;
519
+ Long x, y;
520
+
521
+ x = (nd + 8) / 9;
522
+ for(k = 0, y = 1; x > y; y <<= 1, k++) ;
523
+ b = Balloc(k);
524
+ if (!b)
525
+ return NULL;
526
+ b->x[0] = y9;
527
+ b->wds = 1;
528
+
529
+ i = 9;
530
+ if (9 < nd0) {
531
+ s += 9;
532
+ do {
533
+ b = multadd(b, 10, *s++ - '0');
534
+ if (!b)
535
+ return NULL;
536
+ } while(++i < nd0);
537
+ s++;
538
+ }
539
+ else
540
+ s += 10;
541
+ for(; i < nd; i++) {
542
+ b = multadd(b, 10, *s++ - '0');
543
+ if (!b)
544
+ return NULL;
545
+ }
546
+ return b;
547
+ }
548
+
549
+
550
+ /* Return the number (0 through 32) of most significant zero bits in x. */
551
+ static int32 hi0bits(register ULong x)
552
+ {
553
+ register int32 k = 0;
554
+
555
+ if (!(x & 0xffff0000)) {
556
+ k = 16;
557
+ x <<= 16;
558
+ }
559
+ if (!(x & 0xff000000)) {
560
+ k += 8;
561
+ x <<= 8;
562
+ }
563
+ if (!(x & 0xf0000000)) {
564
+ k += 4;
565
+ x <<= 4;
566
+ }
567
+ if (!(x & 0xc0000000)) {
568
+ k += 2;
569
+ x <<= 2;
570
+ }
571
+ if (!(x & 0x80000000)) {
572
+ k++;
573
+ if (!(x & 0x40000000))
574
+ return 32;
575
+ }
576
+ return k;
577
+ }
578
+
579
+
580
+ /* Return the number (0 through 32) of least significant zero bits in y.
581
+ * Also shift y to the right past these 0 through 32 zeros so that y's
582
+ * least significant bit will be set unless y was originally zero. */
583
+ static int32 lo0bits(ULong *y)
584
+ {
585
+ register int32 k;
586
+ register ULong x = *y;
587
+
588
+ if (x & 7) {
589
+ if (x & 1)
590
+ return 0;
591
+ if (x & 2) {
592
+ *y = x >> 1;
593
+ return 1;
594
+ }
595
+ *y = x >> 2;
596
+ return 2;
597
+ }
598
+ k = 0;
599
+ if (!(x & 0xffff)) {
600
+ k = 16;
601
+ x >>= 16;
602
+ }
603
+ if (!(x & 0xff)) {
604
+ k += 8;
605
+ x >>= 8;
606
+ }
607
+ if (!(x & 0xf)) {
608
+ k += 4;
609
+ x >>= 4;
610
+ }
611
+ if (!(x & 0x3)) {
612
+ k += 2;
613
+ x >>= 2;
614
+ }
615
+ if (!(x & 1)) {
616
+ k++;
617
+ x >>= 1;
618
+ if (!x & 1)
619
+ return 32;
620
+ }
621
+ *y = x;
622
+ return k;
623
+ }
624
+
625
+ /* Return a new Bigint with the given integer value, which must be nonnegative. */
626
+ static Bigint *i2b(int32 i)
627
+ {
628
+ Bigint *b;
629
+
630
+ b = Balloc(1);
631
+ if (!b)
632
+ return NULL;
633
+ b->x[0] = i;
634
+ b->wds = 1;
635
+ return b;
636
+ }
637
+
638
+ /* Return a newly allocated product of a and b. */
639
+ static Bigint *mult(CONST Bigint *a, CONST Bigint *b)
640
+ {
641
+ CONST Bigint *t;
642
+ Bigint *c;
643
+ int32 k, wa, wb, wc;
644
+ ULong y;
645
+ ULong *xc, *xc0, *xce;
646
+ CONST ULong *x, *xa, *xae, *xb, *xbe;
647
+ #ifdef ULLong
648
+ ULLong carry, z;
649
+ #else
650
+ ULong carry, z;
651
+ ULong z2;
652
+ #endif
653
+
654
+ if (a->wds < b->wds) {
655
+ t = a;
656
+ a = b;
657
+ b = t;
658
+ }
659
+ k = a->k;
660
+ wa = a->wds;
661
+ wb = b->wds;
662
+ wc = wa + wb;
663
+ if (wc > a->maxwds)
664
+ k++;
665
+ c = Balloc(k);
666
+ if (!c)
667
+ return NULL;
668
+ for(xc = c->x, xce = xc + wc; xc < xce; xc++)
669
+ *xc = 0;
670
+ xa = a->x;
671
+ xae = xa + wa;
672
+ xb = b->x;
673
+ xbe = xb + wb;
674
+ xc0 = c->x;
675
+ #ifdef ULLong
676
+ for(; xb < xbe; xc0++) {
677
+ if ((y = *xb++) != 0) {
678
+ x = xa;
679
+ xc = xc0;
680
+ carry = 0;
681
+ do {
682
+ z = *x++ * (ULLong)y + *xc + carry;
683
+ carry = z >> 32;
684
+ *xc++ = (ULong)(z & 0xffffffffUL);
685
+ }
686
+ while(x < xae);
687
+ *xc = (ULong)carry;
688
+ }
689
+ }
690
+ #else
691
+ for(; xb < xbe; xb++, xc0++) {
692
+ if ((y = *xb & 0xffff) != 0) {
693
+ x = xa;
694
+ xc = xc0;
695
+ carry = 0;
696
+ do {
697
+ z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
698
+ carry = z >> 16;
699
+ z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
700
+ carry = z2 >> 16;
701
+ Storeinc(xc, z2, z);
702
+ }
703
+ while(x < xae);
704
+ *xc = carry;
705
+ }
706
+ if ((y = *xb >> 16) != 0) {
707
+ x = xa;
708
+ xc = xc0;
709
+ carry = 0;
710
+ z2 = *xc;
711
+ do {
712
+ z = (*x & 0xffff) * y + (*xc >> 16) + carry;
713
+ carry = z >> 16;
714
+ Storeinc(xc, z, z2);
715
+ z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
716
+ carry = z2 >> 16;
717
+ }
718
+ while(x < xae);
719
+ *xc = z2;
720
+ }
721
+ }
722
+ #endif
723
+ for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
724
+ c->wds = wc;
725
+ return c;
726
+ }
727
+
728
+ /*
729
+ * 'p5s' points to a linked list of Bigints that are powers of 5.
730
+ * This list grows on demand, and it can only grow: it won't change
731
+ * in any other way. So if we read 'p5s' or the 'next' field of
732
+ * some Bigint on the list, and it is not NULL, we know it won't
733
+ * change to NULL or some other value. Only when the value of
734
+ * 'p5s' or 'next' is NULL do we need to acquire the lock and add
735
+ * a new Bigint to the list.
736
+ */
737
+
738
+ static Bigint *p5s;
739
+
740
+ #ifdef JS_THREADSAFE
741
+ static PRLock *p5s_lock;
742
+ #endif
743
+
744
+ /* Return b * 5^k. Deallocate the old b. k must be nonnegative. */
745
+ /* NOTE: old b is deallocated on memory failure. */
746
+ static Bigint *pow5mult(Bigint *b, int32 k)
747
+ {
748
+ Bigint *b1, *p5, *p51;
749
+ int32 i;
750
+ static CONST int32 p05[3] = { 5, 25, 125 };
751
+
752
+ if ((i = k & 3) != 0) {
753
+ b = multadd(b, p05[i-1], 0);
754
+ if (!b)
755
+ return NULL;
756
+ }
757
+
758
+ if (!(k >>= 2))
759
+ return b;
760
+ if (!(p5 = p5s)) {
761
+ #ifdef JS_THREADSAFE
762
+ /*
763
+ * We take great care to not call i2b() and Bfree()
764
+ * while holding the lock.
765
+ */
766
+ Bigint *wasted_effort = NULL;
767
+ p5 = i2b(625);
768
+ if (!p5) {
769
+ Bfree(b);
770
+ return NULL;
771
+ }
772
+ /* lock and check again */
773
+ PR_Lock(p5s_lock);
774
+ if (!p5s) {
775
+ /* first time */
776
+ p5s = p5;
777
+ p5->next = 0;
778
+ } else {
779
+ /* some other thread just beat us */
780
+ wasted_effort = p5;
781
+ p5 = p5s;
782
+ }
783
+ PR_Unlock(p5s_lock);
784
+ if (wasted_effort) {
785
+ Bfree(wasted_effort);
786
+ }
787
+ #else
788
+ /* first time */
789
+ p5 = p5s = i2b(625);
790
+ if (!p5) {
791
+ Bfree(b);
792
+ return NULL;
793
+ }
794
+ p5->next = 0;
795
+ #endif
796
+ }
797
+ for(;;) {
798
+ if (k & 1) {
799
+ b1 = mult(b, p5);
800
+ Bfree(b);
801
+ if (!b1)
802
+ return NULL;
803
+ b = b1;
804
+ }
805
+ if (!(k >>= 1))
806
+ break;
807
+ if (!(p51 = p5->next)) {
808
+ #ifdef JS_THREADSAFE
809
+ Bigint *wasted_effort = NULL;
810
+ p51 = mult(p5, p5);
811
+ if (!p51) {
812
+ Bfree(b);
813
+ return NULL;
814
+ }
815
+ PR_Lock(p5s_lock);
816
+ if (!p5->next) {
817
+ p5->next = p51;
818
+ p51->next = 0;
819
+ } else {
820
+ wasted_effort = p51;
821
+ p51 = p5->next;
822
+ }
823
+ PR_Unlock(p5s_lock);
824
+ if (wasted_effort) {
825
+ Bfree(wasted_effort);
826
+ }
827
+ #else
828
+ p51 = mult(p5,p5);
829
+ if (!p51) {
830
+ Bfree(b);
831
+ return NULL;
832
+ }
833
+ p51->next = 0;
834
+ p5->next = p51;
835
+ #endif
836
+ }
837
+ p5 = p51;
838
+ }
839
+ return b;
840
+ }
841
+
842
+ /* Return b * 2^k. Deallocate the old b. k must be nonnegative.
843
+ * NOTE: on memory failure, old b is deallocated. */
844
+ static Bigint *lshift(Bigint *b, int32 k)
845
+ {
846
+ int32 i, k1, n, n1;
847
+ Bigint *b1;
848
+ ULong *x, *x1, *xe, z;
849
+
850
+ n = k >> 5;
851
+ k1 = b->k;
852
+ n1 = n + b->wds + 1;
853
+ for(i = b->maxwds; n1 > i; i <<= 1)
854
+ k1++;
855
+ b1 = Balloc(k1);
856
+ if (!b1)
857
+ goto done;
858
+ x1 = b1->x;
859
+ for(i = 0; i < n; i++)
860
+ *x1++ = 0;
861
+ x = b->x;
862
+ xe = x + b->wds;
863
+ if (k &= 0x1f) {
864
+ k1 = 32 - k;
865
+ z = 0;
866
+ do {
867
+ *x1++ = *x << k | z;
868
+ z = *x++ >> k1;
869
+ }
870
+ while(x < xe);
871
+ if ((*x1 = z) != 0)
872
+ ++n1;
873
+ }
874
+ else do
875
+ *x1++ = *x++;
876
+ while(x < xe);
877
+ b1->wds = n1 - 1;
878
+ done:
879
+ Bfree(b);
880
+ return b1;
881
+ }
882
+
883
+ /* Return -1, 0, or 1 depending on whether a<b, a==b, or a>b, respectively. */
884
+ static int32 cmp(Bigint *a, Bigint *b)
885
+ {
886
+ ULong *xa, *xa0, *xb, *xb0;
887
+ int32 i, j;
888
+
889
+ i = a->wds;
890
+ j = b->wds;
891
+ #ifdef DEBUG
892
+ if (i > 1 && !a->x[i-1])
893
+ Bug("cmp called with a->x[a->wds-1] == 0");
894
+ if (j > 1 && !b->x[j-1])
895
+ Bug("cmp called with b->x[b->wds-1] == 0");
896
+ #endif
897
+ if (i -= j)
898
+ return i;
899
+ xa0 = a->x;
900
+ xa = xa0 + j;
901
+ xb0 = b->x;
902
+ xb = xb0 + j;
903
+ for(;;) {
904
+ if (*--xa != *--xb)
905
+ return *xa < *xb ? -1 : 1;
906
+ if (xa <= xa0)
907
+ break;
908
+ }
909
+ return 0;
910
+ }
911
+
912
+ static Bigint *diff(Bigint *a, Bigint *b)
913
+ {
914
+ Bigint *c;
915
+ int32 i, wa, wb;
916
+ ULong *xa, *xae, *xb, *xbe, *xc;
917
+ #ifdef ULLong
918
+ ULLong borrow, y;
919
+ #else
920
+ ULong borrow, y;
921
+ ULong z;
922
+ #endif
923
+
924
+ i = cmp(a,b);
925
+ if (!i) {
926
+ c = Balloc(0);
927
+ if (!c)
928
+ return NULL;
929
+ c->wds = 1;
930
+ c->x[0] = 0;
931
+ return c;
932
+ }
933
+ if (i < 0) {
934
+ c = a;
935
+ a = b;
936
+ b = c;
937
+ i = 1;
938
+ }
939
+ else
940
+ i = 0;
941
+ c = Balloc(a->k);
942
+ if (!c)
943
+ return NULL;
944
+ c->sign = i;
945
+ wa = a->wds;
946
+ xa = a->x;
947
+ xae = xa + wa;
948
+ wb = b->wds;
949
+ xb = b->x;
950
+ xbe = xb + wb;
951
+ xc = c->x;
952
+ borrow = 0;
953
+ #ifdef ULLong
954
+ do {
955
+ y = (ULLong)*xa++ - *xb++ - borrow;
956
+ borrow = y >> 32 & 1UL;
957
+ *xc++ = (ULong)(y & 0xffffffffUL);
958
+ }
959
+ while(xb < xbe);
960
+ while(xa < xae) {
961
+ y = *xa++ - borrow;
962
+ borrow = y >> 32 & 1UL;
963
+ *xc++ = (ULong)(y & 0xffffffffUL);
964
+ }
965
+ #else
966
+ do {
967
+ y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
968
+ borrow = (y & 0x10000) >> 16;
969
+ z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
970
+ borrow = (z & 0x10000) >> 16;
971
+ Storeinc(xc, z, y);
972
+ }
973
+ while(xb < xbe);
974
+ while(xa < xae) {
975
+ y = (*xa & 0xffff) - borrow;
976
+ borrow = (y & 0x10000) >> 16;
977
+ z = (*xa++ >> 16) - borrow;
978
+ borrow = (z & 0x10000) >> 16;
979
+ Storeinc(xc, z, y);
980
+ }
981
+ #endif
982
+ while(!*--xc)
983
+ wa--;
984
+ c->wds = wa;
985
+ return c;
986
+ }
987
+
988
+ /* Return the absolute difference between x and the adjacent greater-magnitude double number (ignoring exponent overflows). */
989
+ static double ulp(double x)
990
+ {
991
+ register Long L;
992
+ double a;
993
+
994
+ L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
995
+ #ifndef Sudden_Underflow
996
+ if (L > 0) {
997
+ #endif
998
+ set_word0(a, L);
999
+ set_word1(a, 0);
1000
+ #ifndef Sudden_Underflow
1001
+ }
1002
+ else {
1003
+ L = -L >> Exp_shift;
1004
+ if (L < Exp_shift) {
1005
+ set_word0(a, 0x80000 >> L);
1006
+ set_word1(a, 0);
1007
+ }
1008
+ else {
1009
+ set_word0(a, 0);
1010
+ L -= Exp_shift;
1011
+ set_word1(a, L >= 31 ? 1 : 1 << (31 - L));
1012
+ }
1013
+ }
1014
+ #endif
1015
+ return a;
1016
+ }
1017
+
1018
+
1019
+ static double b2d(Bigint *a, int32 *e)
1020
+ {
1021
+ ULong *xa, *xa0, w, y, z;
1022
+ int32 k;
1023
+ double d;
1024
+ #define d0 word0(d)
1025
+ #define d1 word1(d)
1026
+ #define set_d0(x) set_word0(d, x)
1027
+ #define set_d1(x) set_word1(d, x)
1028
+
1029
+ xa0 = a->x;
1030
+ xa = xa0 + a->wds;
1031
+ y = *--xa;
1032
+ #ifdef DEBUG
1033
+ if (!y) Bug("zero y in b2d");
1034
+ #endif
1035
+ k = hi0bits(y);
1036
+ *e = 32 - k;
1037
+ if (k < Ebits) {
1038
+ set_d0(Exp_1 | y >> (Ebits - k));
1039
+ w = xa > xa0 ? *--xa : 0;
1040
+ set_d1(y << (32-Ebits + k) | w >> (Ebits - k));
1041
+ goto ret_d;
1042
+ }
1043
+ z = xa > xa0 ? *--xa : 0;
1044
+ if (k -= Ebits) {
1045
+ set_d0(Exp_1 | y << k | z >> (32 - k));
1046
+ y = xa > xa0 ? *--xa : 0;
1047
+ set_d1(z << k | y >> (32 - k));
1048
+ }
1049
+ else {
1050
+ set_d0(Exp_1 | y);
1051
+ set_d1(z);
1052
+ }
1053
+ ret_d:
1054
+ #undef d0
1055
+ #undef d1
1056
+ #undef set_d0
1057
+ #undef set_d1
1058
+ return d;
1059
+ }
1060
+
1061
+
1062
+ /* Convert d into the form b*2^e, where b is an odd integer. b is the returned
1063
+ * Bigint and e is the returned binary exponent. Return the number of significant
1064
+ * bits in b in bits. d must be finite and nonzero. */
1065
+ static Bigint *d2b(double d, int32 *e, int32 *bits)
1066
+ {
1067
+ Bigint *b;
1068
+ int32 de, i, k;
1069
+ ULong *x, y, z;
1070
+ #define d0 word0(d)
1071
+ #define d1 word1(d)
1072
+ #define set_d0(x) set_word0(d, x)
1073
+ #define set_d1(x) set_word1(d, x)
1074
+
1075
+ b = Balloc(1);
1076
+ if (!b)
1077
+ return NULL;
1078
+ x = b->x;
1079
+
1080
+ z = d0 & Frac_mask;
1081
+ set_d0(d0 & 0x7fffffff); /* clear sign bit, which we ignore */
1082
+ #ifdef Sudden_Underflow
1083
+ de = (int32)(d0 >> Exp_shift);
1084
+ z |= Exp_msk11;
1085
+ #else
1086
+ if ((de = (int32)(d0 >> Exp_shift)) != 0)
1087
+ z |= Exp_msk1;
1088
+ #endif
1089
+ if ((y = d1) != 0) {
1090
+ if ((k = lo0bits(&y)) != 0) {
1091
+ x[0] = y | z << (32 - k);
1092
+ z >>= k;
1093
+ }
1094
+ else
1095
+ x[0] = y;
1096
+ i = b->wds = (x[1] = z) ? 2 : 1;
1097
+ }
1098
+ else {
1099
+ JS_ASSERT(z);
1100
+ k = lo0bits(&z);
1101
+ x[0] = z;
1102
+ i = b->wds = 1;
1103
+ k += 32;
1104
+ }
1105
+ #ifndef Sudden_Underflow
1106
+ if (de) {
1107
+ #endif
1108
+ *e = de - Bias - (P-1) + k;
1109
+ *bits = P - k;
1110
+ #ifndef Sudden_Underflow
1111
+ }
1112
+ else {
1113
+ *e = de - Bias - (P-1) + 1 + k;
1114
+ *bits = 32*i - hi0bits(x[i-1]);
1115
+ }
1116
+ #endif
1117
+ return b;
1118
+ }
1119
+ #undef d0
1120
+ #undef d1
1121
+ #undef set_d0
1122
+ #undef set_d1
1123
+
1124
+
1125
+ static double ratio(Bigint *a, Bigint *b)
1126
+ {
1127
+ double da, db;
1128
+ int32 k, ka, kb;
1129
+
1130
+ da = b2d(a, &ka);
1131
+ db = b2d(b, &kb);
1132
+ k = ka - kb + 32*(a->wds - b->wds);
1133
+ if (k > 0)
1134
+ set_word0(da, word0(da) + k*Exp_msk1);
1135
+ else {
1136
+ k = -k;
1137
+ set_word0(db, word0(db) + k*Exp_msk1);
1138
+ }
1139
+ return da / db;
1140
+ }
1141
+
1142
+ static CONST double
1143
+ tens[] = {
1144
+ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1145
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1146
+ 1e20, 1e21, 1e22
1147
+ };
1148
+
1149
+ static CONST double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1150
+ static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1151
+ #ifdef Avoid_Underflow
1152
+ 9007199254740992.e-256
1153
+ #else
1154
+ 1e-256
1155
+ #endif
1156
+ };
1157
+ /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1158
+ /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
1159
+ #define Scale_Bit 0x10
1160
+ #define n_bigtens 5
1161
+
1162
+
1163
+ #ifdef INFNAN_CHECK
1164
+
1165
+ #ifndef NAN_WORD0
1166
+ #define NAN_WORD0 0x7ff80000
1167
+ #endif
1168
+
1169
+ #ifndef NAN_WORD1
1170
+ #define NAN_WORD1 0
1171
+ #endif
1172
+
1173
+ static int match(CONST char **sp, char *t)
1174
+ {
1175
+ int c, d;
1176
+ CONST char *s = *sp;
1177
+
1178
+ while(d = *t++) {
1179
+ if ((c = *++s) >= 'A' && c <= 'Z')
1180
+ c += 'a' - 'A';
1181
+ if (c != d)
1182
+ return 0;
1183
+ }
1184
+ *sp = s + 1;
1185
+ return 1;
1186
+ }
1187
+ #endif /* INFNAN_CHECK */
1188
+
1189
+
1190
+ #ifdef JS_THREADSAFE
1191
+ static JSBool initialized = JS_FALSE;
1192
+
1193
+ /* hacked replica of nspr _PR_InitDtoa */
1194
+ static void InitDtoa(void)
1195
+ {
1196
+ freelist_lock = PR_NewLock();
1197
+ p5s_lock = PR_NewLock();
1198
+ initialized = JS_TRUE;
1199
+ }
1200
+ #endif
1201
+
1202
+ void js_FinishDtoa(void)
1203
+ {
1204
+ int count;
1205
+ Bigint *temp;
1206
+
1207
+ #ifdef JS_THREADSAFE
1208
+ if (initialized == JS_TRUE) {
1209
+ PR_DestroyLock(freelist_lock);
1210
+ PR_DestroyLock(p5s_lock);
1211
+ initialized = JS_FALSE;
1212
+ }
1213
+ #endif
1214
+
1215
+ /* clear down the freelist array and p5s */
1216
+
1217
+ /* static Bigint *freelist[Kmax+1]; */
1218
+ for (count = 0; count <= Kmax; count++) {
1219
+ Bigint **listp = &freelist[count];
1220
+ while ((temp = *listp) != NULL) {
1221
+ *listp = temp->next;
1222
+ free(temp);
1223
+ }
1224
+ freelist[count] = NULL;
1225
+ }
1226
+
1227
+ /* static Bigint *p5s; */
1228
+ while (p5s) {
1229
+ temp = p5s;
1230
+ p5s = p5s->next;
1231
+ free(temp);
1232
+ }
1233
+ }
1234
+
1235
+ /* nspr2 watcom bug ifdef omitted */
1236
+
1237
+ JS_FRIEND_API(double)
1238
+ JS_strtod(CONST char *s00, char **se, int *err)
1239
+ {
1240
+ int32 scale;
1241
+ int32 bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1242
+ e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1243
+ CONST char *s, *s0, *s1;
1244
+ double aadj, aadj1, adj, rv, rv0;
1245
+ Long L;
1246
+ ULong y, z;
1247
+ Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1248
+
1249
+ *err = 0;
1250
+
1251
+ bb = bd = bs = delta = NULL;
1252
+ sign = nz0 = nz = 0;
1253
+ rv = 0.;
1254
+
1255
+ /* Locking for Balloc's shared buffers that will be used in this block */
1256
+ ACQUIRE_DTOA_LOCK();
1257
+
1258
+ for(s = s00;;s++) switch(*s) {
1259
+ case '-':
1260
+ sign = 1;
1261
+ /* no break */
1262
+ case '+':
1263
+ if (*++s)
1264
+ goto break2;
1265
+ /* no break */
1266
+ case 0:
1267
+ s = s00;
1268
+ goto ret;
1269
+ case '\t':
1270
+ case '\n':
1271
+ case '\v':
1272
+ case '\f':
1273
+ case '\r':
1274
+ case ' ':
1275
+ continue;
1276
+ default:
1277
+ goto break2;
1278
+ }
1279
+ break2:
1280
+
1281
+ if (*s == '0') {
1282
+ nz0 = 1;
1283
+ while(*++s == '0') ;
1284
+ if (!*s)
1285
+ goto ret;
1286
+ }
1287
+ s0 = s;
1288
+ y = z = 0;
1289
+ for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
1290
+ if (nd < 9)
1291
+ y = 10*y + c - '0';
1292
+ else if (nd < 16)
1293
+ z = 10*z + c - '0';
1294
+ nd0 = nd;
1295
+ if (c == '.') {
1296
+ c = *++s;
1297
+ if (!nd) {
1298
+ for(; c == '0'; c = *++s)
1299
+ nz++;
1300
+ if (c > '0' && c <= '9') {
1301
+ s0 = s;
1302
+ nf += nz;
1303
+ nz = 0;
1304
+ goto have_dig;
1305
+ }
1306
+ goto dig_done;
1307
+ }
1308
+ for(; c >= '0' && c <= '9'; c = *++s) {
1309
+ have_dig:
1310
+ nz++;
1311
+ if (c -= '0') {
1312
+ nf += nz;
1313
+ for(i = 1; i < nz; i++)
1314
+ if (nd++ < 9)
1315
+ y *= 10;
1316
+ else if (nd <= DBL_DIG + 1)
1317
+ z *= 10;
1318
+ if (nd++ < 9)
1319
+ y = 10*y + c;
1320
+ else if (nd <= DBL_DIG + 1)
1321
+ z = 10*z + c;
1322
+ nz = 0;
1323
+ }
1324
+ }
1325
+ }
1326
+ dig_done:
1327
+ e = 0;
1328
+ if (c == 'e' || c == 'E') {
1329
+ if (!nd && !nz && !nz0) {
1330
+ s = s00;
1331
+ goto ret;
1332
+ }
1333
+ s00 = s;
1334
+ esign = 0;
1335
+ switch(c = *++s) {
1336
+ case '-':
1337
+ esign = 1;
1338
+ case '+':
1339
+ c = *++s;
1340
+ }
1341
+ if (c >= '0' && c <= '9') {
1342
+ while(c == '0')
1343
+ c = *++s;
1344
+ if (c > '0' && c <= '9') {
1345
+ L = c - '0';
1346
+ s1 = s;
1347
+ while((c = *++s) >= '0' && c <= '9')
1348
+ L = 10*L + c - '0';
1349
+ if (s - s1 > 8 || L > 19999)
1350
+ /* Avoid confusion from exponents
1351
+ * so large that e might overflow.
1352
+ */
1353
+ e = 19999; /* safe for 16 bit ints */
1354
+ else
1355
+ e = (int32)L;
1356
+ if (esign)
1357
+ e = -e;
1358
+ }
1359
+ else
1360
+ e = 0;
1361
+ }
1362
+ else
1363
+ s = s00;
1364
+ }
1365
+ if (!nd) {
1366
+ if (!nz && !nz0) {
1367
+ #ifdef INFNAN_CHECK
1368
+ /* Check for Nan and Infinity */
1369
+ switch(c) {
1370
+ case 'i':
1371
+ case 'I':
1372
+ if (match(&s,"nfinity")) {
1373
+ word0(rv) = 0x7ff00000;
1374
+ word1(rv) = 0;
1375
+ goto ret;
1376
+ }
1377
+ break;
1378
+ case 'n':
1379
+ case 'N':
1380
+ if (match(&s, "an")) {
1381
+ word0(rv) = NAN_WORD0;
1382
+ word1(rv) = NAN_WORD1;
1383
+ goto ret;
1384
+ }
1385
+ }
1386
+ #endif /* INFNAN_CHECK */
1387
+ s = s00;
1388
+ }
1389
+ goto ret;
1390
+ }
1391
+ e1 = e -= nf;
1392
+
1393
+ /* Now we have nd0 digits, starting at s0, followed by a
1394
+ * decimal point, followed by nd-nd0 digits. The number we're
1395
+ * after is the integer represented by those digits times
1396
+ * 10**e */
1397
+
1398
+ if (!nd0)
1399
+ nd0 = nd;
1400
+ k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1401
+ rv = y;
1402
+ if (k > 9)
1403
+ rv = tens[k - 9] * rv + z;
1404
+ bd0 = 0;
1405
+ if (nd <= DBL_DIG
1406
+ #ifndef RND_PRODQUOT
1407
+ && FLT_ROUNDS == 1
1408
+ #endif
1409
+ ) {
1410
+ if (!e)
1411
+ goto ret;
1412
+ if (e > 0) {
1413
+ if (e <= Ten_pmax) {
1414
+ /* rv = */ rounded_product(rv, tens[e]);
1415
+ goto ret;
1416
+ }
1417
+ i = DBL_DIG - nd;
1418
+ if (e <= Ten_pmax + i) {
1419
+ /* A fancier test would sometimes let us do
1420
+ * this for larger i values.
1421
+ */
1422
+ e -= i;
1423
+ rv *= tens[i];
1424
+ /* rv = */ rounded_product(rv, tens[e]);
1425
+ goto ret;
1426
+ }
1427
+ }
1428
+ #ifndef Inaccurate_Divide
1429
+ else if (e >= -Ten_pmax) {
1430
+ /* rv = */ rounded_quotient(rv, tens[-e]);
1431
+ goto ret;
1432
+ }
1433
+ #endif
1434
+ }
1435
+ e1 += nd - k;
1436
+
1437
+ scale = 0;
1438
+
1439
+ /* Get starting approximation = rv * 10**e1 */
1440
+
1441
+ if (e1 > 0) {
1442
+ if ((i = e1 & 15) != 0)
1443
+ rv *= tens[i];
1444
+ if (e1 &= ~15) {
1445
+ if (e1 > DBL_MAX_10_EXP) {
1446
+ ovfl:
1447
+ *err = JS_DTOA_ERANGE;
1448
+ #ifdef __STDC__
1449
+ rv = HUGE_VAL;
1450
+ #else
1451
+ /* Can't trust HUGE_VAL */
1452
+ word0(rv) = Exp_mask;
1453
+ word1(rv) = 0;
1454
+ #endif
1455
+ if (bd0)
1456
+ goto retfree;
1457
+ goto ret;
1458
+ }
1459
+ e1 >>= 4;
1460
+ for(j = 0; e1 > 1; j++, e1 >>= 1)
1461
+ if (e1 & 1)
1462
+ rv *= bigtens[j];
1463
+ /* The last multiplication could overflow. */
1464
+ set_word0(rv, word0(rv) - P*Exp_msk1);
1465
+ rv *= bigtens[j];
1466
+ if ((z = word0(rv) & Exp_mask) > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1467
+ goto ovfl;
1468
+ if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1469
+ /* set to largest number */
1470
+ /* (Can't trust DBL_MAX) */
1471
+ set_word0(rv, Big0);
1472
+ set_word1(rv, Big1);
1473
+ }
1474
+ else
1475
+ set_word0(rv, word0(rv) + P*Exp_msk1);
1476
+ }
1477
+ }
1478
+ else if (e1 < 0) {
1479
+ e1 = -e1;
1480
+ if ((i = e1 & 15) != 0)
1481
+ rv /= tens[i];
1482
+ if (e1 &= ~15) {
1483
+ e1 >>= 4;
1484
+ if (e1 >= 1 << n_bigtens)
1485
+ goto undfl;
1486
+ #ifdef Avoid_Underflow
1487
+ if (e1 & Scale_Bit)
1488
+ scale = P;
1489
+ for(j = 0; e1 > 0; j++, e1 >>= 1)
1490
+ if (e1 & 1)
1491
+ rv *= tinytens[j];
1492
+ if (scale && (j = P + 1 - ((word0(rv) & Exp_mask)
1493
+ >> Exp_shift)) > 0) {
1494
+ /* scaled rv is denormal; zap j low bits */
1495
+ if (j >= 32) {
1496
+ set_word1(rv, 0);
1497
+ set_word0(rv, word0(rv) & (0xffffffff << (j-32)));
1498
+ if (!word0(rv))
1499
+ set_word0(rv, 1);
1500
+ }
1501
+ else
1502
+ set_word1(rv, word1(rv) & (0xffffffff << j));
1503
+ }
1504
+ #else
1505
+ for(j = 0; e1 > 1; j++, e1 >>= 1)
1506
+ if (e1 & 1)
1507
+ rv *= tinytens[j];
1508
+ /* The last multiplication could underflow. */
1509
+ rv0 = rv;
1510
+ rv *= tinytens[j];
1511
+ if (!rv) {
1512
+ rv = 2.*rv0;
1513
+ rv *= tinytens[j];
1514
+ #endif
1515
+ if (!rv) {
1516
+ undfl:
1517
+ rv = 0.;
1518
+ *err = JS_DTOA_ERANGE;
1519
+ if (bd0)
1520
+ goto retfree;
1521
+ goto ret;
1522
+ }
1523
+ #ifndef Avoid_Underflow
1524
+ set_word0(rv, Tiny0);
1525
+ set_word1(rv, Tiny1);
1526
+ /* The refinement below will clean
1527
+ * this approximation up.
1528
+ */
1529
+ }
1530
+ #endif
1531
+ }
1532
+ }
1533
+
1534
+ /* Now the hard part -- adjusting rv to the correct value.*/
1535
+
1536
+ /* Put digits into bd: true value = bd * 10^e */
1537
+
1538
+ bd0 = s2b(s0, nd0, nd, y);
1539
+ if (!bd0)
1540
+ goto nomem;
1541
+
1542
+ for(;;) {
1543
+ bd = Balloc(bd0->k);
1544
+ if (!bd)
1545
+ goto nomem;
1546
+ Bcopy(bd, bd0);
1547
+ bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
1548
+ if (!bb)
1549
+ goto nomem;
1550
+ bs = i2b(1);
1551
+ if (!bs)
1552
+ goto nomem;
1553
+
1554
+ if (e >= 0) {
1555
+ bb2 = bb5 = 0;
1556
+ bd2 = bd5 = e;
1557
+ }
1558
+ else {
1559
+ bb2 = bb5 = -e;
1560
+ bd2 = bd5 = 0;
1561
+ }
1562
+ if (bbe >= 0)
1563
+ bb2 += bbe;
1564
+ else
1565
+ bd2 -= bbe;
1566
+ bs2 = bb2;
1567
+ #ifdef Sudden_Underflow
1568
+ j = P + 1 - bbbits;
1569
+ #else
1570
+ #ifdef Avoid_Underflow
1571
+ j = bbe - scale;
1572
+ #else
1573
+ j = bbe;
1574
+ #endif
1575
+ i = j + bbbits - 1; /* logb(rv) */
1576
+ if (i < Emin) /* denormal */
1577
+ j += P - Emin;
1578
+ else
1579
+ j = P + 1 - bbbits;
1580
+ #endif
1581
+ bb2 += j;
1582
+ bd2 += j;
1583
+ #ifdef Avoid_Underflow
1584
+ bd2 += scale;
1585
+ #endif
1586
+ i = bb2 < bd2 ? bb2 : bd2;
1587
+ if (i > bs2)
1588
+ i = bs2;
1589
+ if (i > 0) {
1590
+ bb2 -= i;
1591
+ bd2 -= i;
1592
+ bs2 -= i;
1593
+ }
1594
+ if (bb5 > 0) {
1595
+ bs = pow5mult(bs, bb5);
1596
+ if (!bs)
1597
+ goto nomem;
1598
+ bb1 = mult(bs, bb);
1599
+ if (!bb1)
1600
+ goto nomem;
1601
+ Bfree(bb);
1602
+ bb = bb1;
1603
+ }
1604
+ if (bb2 > 0) {
1605
+ bb = lshift(bb, bb2);
1606
+ if (!bb)
1607
+ goto nomem;
1608
+ }
1609
+ if (bd5 > 0) {
1610
+ bd = pow5mult(bd, bd5);
1611
+ if (!bd)
1612
+ goto nomem;
1613
+ }
1614
+ if (bd2 > 0) {
1615
+ bd = lshift(bd, bd2);
1616
+ if (!bd)
1617
+ goto nomem;
1618
+ }
1619
+ if (bs2 > 0) {
1620
+ bs = lshift(bs, bs2);
1621
+ if (!bs)
1622
+ goto nomem;
1623
+ }
1624
+ delta = diff(bb, bd);
1625
+ if (!delta)
1626
+ goto nomem;
1627
+ dsign = delta->sign;
1628
+ delta->sign = 0;
1629
+ i = cmp(delta, bs);
1630
+ if (i < 0) {
1631
+ /* Error is less than half an ulp -- check for
1632
+ * special case of mantissa a power of two.
1633
+ */
1634
+ if (dsign || word1(rv) || word0(rv) & Bndry_mask
1635
+ #ifdef Avoid_Underflow
1636
+ || (word0(rv) & Exp_mask) <= Exp_msk1 + P*Exp_msk1
1637
+ #else
1638
+ || (word0(rv) & Exp_mask) <= Exp_msk1
1639
+ #endif
1640
+ ) {
1641
+ #ifdef Avoid_Underflow
1642
+ if (!delta->x[0] && delta->wds == 1)
1643
+ dsign = 2;
1644
+ #endif
1645
+ break;
1646
+ }
1647
+ delta = lshift(delta,Log2P);
1648
+ if (!delta)
1649
+ goto nomem;
1650
+ if (cmp(delta, bs) > 0)
1651
+ goto drop_down;
1652
+ break;
1653
+ }
1654
+ if (i == 0) {
1655
+ /* exactly half-way between */
1656
+ if (dsign) {
1657
+ if ((word0(rv) & Bndry_mask1) == Bndry_mask1
1658
+ && word1(rv) == 0xffffffff) {
1659
+ /*boundary case -- increment exponent*/
1660
+ set_word0(rv, (word0(rv) & Exp_mask) + Exp_msk1);
1661
+ set_word1(rv, 0);
1662
+ #ifdef Avoid_Underflow
1663
+ dsign = 0;
1664
+ #endif
1665
+ break;
1666
+ }
1667
+ }
1668
+ else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
1669
+ #ifdef Avoid_Underflow
1670
+ dsign = 2;
1671
+ #endif
1672
+ drop_down:
1673
+ /* boundary case -- decrement exponent */
1674
+ #ifdef Sudden_Underflow
1675
+ L = word0(rv) & Exp_mask;
1676
+ if (L <= Exp_msk1)
1677
+ goto undfl;
1678
+ L -= Exp_msk1;
1679
+ #else
1680
+ L = (word0(rv) & Exp_mask) - Exp_msk1;
1681
+ #endif
1682
+ set_word0(rv, L | Bndry_mask1);
1683
+ set_word1(rv, 0xffffffff);
1684
+ break;
1685
+ }
1686
+ #ifndef ROUND_BIASED
1687
+ if (!(word1(rv) & LSB))
1688
+ break;
1689
+ #endif
1690
+ if (dsign)
1691
+ rv += ulp(rv);
1692
+ #ifndef ROUND_BIASED
1693
+ else {
1694
+ rv -= ulp(rv);
1695
+ #ifndef Sudden_Underflow
1696
+ if (!rv)
1697
+ goto undfl;
1698
+ #endif
1699
+ }
1700
+ #ifdef Avoid_Underflow
1701
+ dsign = 1 - dsign;
1702
+ #endif
1703
+ #endif
1704
+ break;
1705
+ }
1706
+ if ((aadj = ratio(delta, bs)) <= 2.) {
1707
+ if (dsign)
1708
+ aadj = aadj1 = 1.;
1709
+ else if (word1(rv) || word0(rv) & Bndry_mask) {
1710
+ #ifndef Sudden_Underflow
1711
+ if (word1(rv) == Tiny1 && !word0(rv))
1712
+ goto undfl;
1713
+ #endif
1714
+ aadj = 1.;
1715
+ aadj1 = -1.;
1716
+ }
1717
+ else {
1718
+ /* special case -- power of FLT_RADIX to be */
1719
+ /* rounded down... */
1720
+
1721
+ if (aadj < 2./FLT_RADIX)
1722
+ aadj = 1./FLT_RADIX;
1723
+ else
1724
+ aadj *= 0.5;
1725
+ aadj1 = -aadj;
1726
+ }
1727
+ }
1728
+ else {
1729
+ aadj *= 0.5;
1730
+ aadj1 = dsign ? aadj : -aadj;
1731
+ #ifdef Check_FLT_ROUNDS
1732
+ switch(FLT_ROUNDS) {
1733
+ case 2: /* towards +infinity */
1734
+ aadj1 -= 0.5;
1735
+ break;
1736
+ case 0: /* towards 0 */
1737
+ case 3: /* towards -infinity */
1738
+ aadj1 += 0.5;
1739
+ }
1740
+ #else
1741
+ if (FLT_ROUNDS == 0)
1742
+ aadj1 += 0.5;
1743
+ #endif
1744
+ }
1745
+ y = word0(rv) & Exp_mask;
1746
+
1747
+ /* Check for overflow */
1748
+
1749
+ if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
1750
+ rv0 = rv;
1751
+ set_word0(rv, word0(rv) - P*Exp_msk1);
1752
+ adj = aadj1 * ulp(rv);
1753
+ rv += adj;
1754
+ if ((word0(rv) & Exp_mask) >=
1755
+ Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
1756
+ if (word0(rv0) == Big0 && word1(rv0) == Big1)
1757
+ goto ovfl;
1758
+ set_word0(rv, Big0);
1759
+ set_word1(rv, Big1);
1760
+ goto cont;
1761
+ }
1762
+ else
1763
+ set_word0(rv, word0(rv) + P*Exp_msk1);
1764
+ }
1765
+ else {
1766
+ #ifdef Sudden_Underflow
1767
+ if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
1768
+ rv0 = rv;
1769
+ set_word0(rv, word0(rv) + P*Exp_msk1);
1770
+ adj = aadj1 * ulp(rv);
1771
+ rv += adj;
1772
+ if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
1773
+ {
1774
+ if (word0(rv0) == Tiny0
1775
+ && word1(rv0) == Tiny1)
1776
+ goto undfl;
1777
+ set_word0(rv, Tiny0);
1778
+ set_word1(rv, Tiny1);
1779
+ goto cont;
1780
+ }
1781
+ else
1782
+ set_word0(rv, word0(rv) - P*Exp_msk1);
1783
+ }
1784
+ else {
1785
+ adj = aadj1 * ulp(rv);
1786
+ rv += adj;
1787
+ }
1788
+ #else
1789
+ /* Compute adj so that the IEEE rounding rules will
1790
+ * correctly round rv + adj in some half-way cases.
1791
+ * If rv * ulp(rv) is denormalized (i.e.,
1792
+ * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
1793
+ * trouble from bits lost to denormalization;
1794
+ * example: 1.2e-307 .
1795
+ */
1796
+ #ifdef Avoid_Underflow
1797
+ if (y <= P*Exp_msk1 && aadj > 1.)
1798
+ #else
1799
+ if (y <= (P-1)*Exp_msk1 && aadj > 1.)
1800
+ #endif
1801
+ {
1802
+ aadj1 = (double)(int32)(aadj + 0.5);
1803
+ if (!dsign)
1804
+ aadj1 = -aadj1;
1805
+ }
1806
+ #ifdef Avoid_Underflow
1807
+ if (scale && y <= P*Exp_msk1)
1808
+ set_word0(aadj1, word0(aadj1) + (P+1)*Exp_msk1 - y);
1809
+ #endif
1810
+ adj = aadj1 * ulp(rv);
1811
+ rv += adj;
1812
+ #endif
1813
+ }
1814
+ z = word0(rv) & Exp_mask;
1815
+ #ifdef Avoid_Underflow
1816
+ if (!scale)
1817
+ #endif
1818
+ if (y == z) {
1819
+ /* Can we stop now? */
1820
+ L = (Long)aadj;
1821
+ aadj -= L;
1822
+ /* The tolerances below are conservative. */
1823
+ if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
1824
+ if (aadj < .4999999 || aadj > .5000001)
1825
+ break;
1826
+ }
1827
+ else if (aadj < .4999999/FLT_RADIX)
1828
+ break;
1829
+ }
1830
+ cont:
1831
+ Bfree(bb);
1832
+ Bfree(bd);
1833
+ Bfree(bs);
1834
+ Bfree(delta);
1835
+ bb = bd = bs = delta = NULL;
1836
+ }
1837
+ #ifdef Avoid_Underflow
1838
+ if (scale) {
1839
+ set_word0(rv0, Exp_1 - P*Exp_msk1);
1840
+ set_word1(rv0, 0);
1841
+ if ((word0(rv) & Exp_mask) <= P*Exp_msk1
1842
+ && word1(rv) & 1
1843
+ && dsign != 2) {
1844
+ if (dsign) {
1845
+ #ifdef Sudden_Underflow
1846
+ /* rv will be 0, but this would give the */
1847
+ /* right result if only rv *= rv0 worked. */
1848
+ set_word0(rv, word0(rv) + P*Exp_msk1);
1849
+ set_word0(rv0, Exp_1 - 2*P*Exp_msk1);
1850
+ #endif
1851
+ rv += ulp(rv);
1852
+ }
1853
+ else
1854
+ set_word1(rv, word1(rv) & ~1);
1855
+ }
1856
+ rv *= rv0;
1857
+ }
1858
+ #endif /* Avoid_Underflow */
1859
+ retfree:
1860
+ Bfree(bb);
1861
+ Bfree(bd);
1862
+ Bfree(bs);
1863
+ Bfree(bd0);
1864
+ Bfree(delta);
1865
+ ret:
1866
+ RELEASE_DTOA_LOCK();
1867
+ if (se)
1868
+ *se = (char *)s;
1869
+ return sign ? -rv : rv;
1870
+
1871
+ nomem:
1872
+ Bfree(bb);
1873
+ Bfree(bd);
1874
+ Bfree(bs);
1875
+ Bfree(bd0);
1876
+ Bfree(delta);
1877
+ *err = JS_DTOA_ENOMEM;
1878
+ return 0;
1879
+ }
1880
+
1881
+
1882
+ /* Return floor(b/2^k) and set b to be the remainder. The returned quotient must be less than 2^32. */
1883
+ static uint32 quorem2(Bigint *b, int32 k)
1884
+ {
1885
+ ULong mask;
1886
+ ULong result;
1887
+ ULong *bx, *bxe;
1888
+ int32 w;
1889
+ int32 n = k >> 5;
1890
+ k &= 0x1F;
1891
+ mask = (1<<k) - 1;
1892
+
1893
+ w = b->wds - n;
1894
+ if (w <= 0)
1895
+ return 0;
1896
+ JS_ASSERT(w <= 2);
1897
+ bx = b->x;
1898
+ bxe = bx + n;
1899
+ result = *bxe >> k;
1900
+ *bxe &= mask;
1901
+ if (w == 2) {
1902
+ JS_ASSERT(!(bxe[1] & ~mask));
1903
+ if (k)
1904
+ result |= bxe[1] << (32 - k);
1905
+ }
1906
+ n++;
1907
+ while (!*bxe && bxe != bx) {
1908
+ n--;
1909
+ bxe--;
1910
+ }
1911
+ b->wds = n;
1912
+ return result;
1913
+ }
1914
+
1915
+ /* Return floor(b/S) and set b to be the remainder. As added restrictions, b must not have
1916
+ * more words than S, the most significant word of S must not start with a 1 bit, and the
1917
+ * returned quotient must be less than 36. */
1918
+ static int32 quorem(Bigint *b, Bigint *S)
1919
+ {
1920
+ int32 n;
1921
+ ULong *bx, *bxe, q, *sx, *sxe;
1922
+ #ifdef ULLong
1923
+ ULLong borrow, carry, y, ys;
1924
+ #else
1925
+ ULong borrow, carry, y, ys;
1926
+ ULong si, z, zs;
1927
+ #endif
1928
+
1929
+ n = S->wds;
1930
+ JS_ASSERT(b->wds <= n);
1931
+ if (b->wds < n)
1932
+ return 0;
1933
+ sx = S->x;
1934
+ sxe = sx + --n;
1935
+ bx = b->x;
1936
+ bxe = bx + n;
1937
+ JS_ASSERT(*sxe <= 0x7FFFFFFF);
1938
+ q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
1939
+ JS_ASSERT(q < 36);
1940
+ if (q) {
1941
+ borrow = 0;
1942
+ carry = 0;
1943
+ do {
1944
+ #ifdef ULLong
1945
+ ys = *sx++ * (ULLong)q + carry;
1946
+ carry = ys >> 32;
1947
+ y = *bx - (ys & 0xffffffffUL) - borrow;
1948
+ borrow = y >> 32 & 1UL;
1949
+ *bx++ = (ULong)(y & 0xffffffffUL);
1950
+ #else
1951
+ si = *sx++;
1952
+ ys = (si & 0xffff) * q + carry;
1953
+ zs = (si >> 16) * q + (ys >> 16);
1954
+ carry = zs >> 16;
1955
+ y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1956
+ borrow = (y & 0x10000) >> 16;
1957
+ z = (*bx >> 16) - (zs & 0xffff) - borrow;
1958
+ borrow = (z & 0x10000) >> 16;
1959
+ Storeinc(bx, z, y);
1960
+ #endif
1961
+ }
1962
+ while(sx <= sxe);
1963
+ if (!*bxe) {
1964
+ bx = b->x;
1965
+ while(--bxe > bx && !*bxe)
1966
+ --n;
1967
+ b->wds = n;
1968
+ }
1969
+ }
1970
+ if (cmp(b, S) >= 0) {
1971
+ q++;
1972
+ borrow = 0;
1973
+ carry = 0;
1974
+ bx = b->x;
1975
+ sx = S->x;
1976
+ do {
1977
+ #ifdef ULLong
1978
+ ys = *sx++ + carry;
1979
+ carry = ys >> 32;
1980
+ y = *bx - (ys & 0xffffffffUL) - borrow;
1981
+ borrow = y >> 32 & 1UL;
1982
+ *bx++ = (ULong)(y & 0xffffffffUL);
1983
+ #else
1984
+ si = *sx++;
1985
+ ys = (si & 0xffff) + carry;
1986
+ zs = (si >> 16) + (ys >> 16);
1987
+ carry = zs >> 16;
1988
+ y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
1989
+ borrow = (y & 0x10000) >> 16;
1990
+ z = (*bx >> 16) - (zs & 0xffff) - borrow;
1991
+ borrow = (z & 0x10000) >> 16;
1992
+ Storeinc(bx, z, y);
1993
+ #endif
1994
+ } while(sx <= sxe);
1995
+ bx = b->x;
1996
+ bxe = bx + n;
1997
+ if (!*bxe) {
1998
+ while(--bxe > bx && !*bxe)
1999
+ --n;
2000
+ b->wds = n;
2001
+ }
2002
+ }
2003
+ return (int32)q;
2004
+ }
2005
+
2006
+ /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2007
+ *
2008
+ * Inspired by "How to Print Floating-Point Numbers Accurately" by
2009
+ * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
2010
+ *
2011
+ * Modifications:
2012
+ * 1. Rather than iterating, we use a simple numeric overestimate
2013
+ * to determine k = floor(log10(d)). We scale relevant
2014
+ * quantities using O(log2(k)) rather than O(k) multiplications.
2015
+ * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2016
+ * try to generate digits strictly left to right. Instead, we
2017
+ * compute with fewer bits and propagate the carry if necessary
2018
+ * when rounding the final digit up. This is often faster.
2019
+ * 3. Under the assumption that input will be rounded nearest,
2020
+ * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2021
+ * That is, we allow equality in stopping tests when the
2022
+ * round-nearest rule will give the same floating-point value
2023
+ * as would satisfaction of the stopping test with strict
2024
+ * inequality.
2025
+ * 4. We remove common factors of powers of 2 from relevant
2026
+ * quantities.
2027
+ * 5. When converting floating-point integers less than 1e16,
2028
+ * we use floating-point arithmetic rather than resorting
2029
+ * to multiple-precision integers.
2030
+ * 6. When asked to produce fewer than 15 digits, we first try
2031
+ * to get by with floating-point arithmetic; we resort to
2032
+ * multiple-precision integer arithmetic only if we cannot
2033
+ * guarantee that the floating-point calculation has given
2034
+ * the correctly rounded result. For k requested digits and
2035
+ * "uniformly" distributed input, the probability is
2036
+ * something like 10^(k-15) that we must resort to the Long
2037
+ * calculation.
2038
+ */
2039
+
2040
+ /* Always emits at least one digit. */
2041
+ /* If biasUp is set, then rounding in modes 2 and 3 will round away from zero
2042
+ * when the number is exactly halfway between two representable values. For example,
2043
+ * rounding 2.5 to zero digits after the decimal point will return 3 and not 2.
2044
+ * 2.49 will still round to 2, and 2.51 will still round to 3. */
2045
+ /* bufsize should be at least 20 for modes 0 and 1. For the other modes,
2046
+ * bufsize should be two greater than the maximum number of output characters expected. */
2047
+ static JSBool
2048
+ js_dtoa(double d, int mode, JSBool biasUp, int ndigits,
2049
+ int *decpt, int *sign, char **rve, char *buf, size_t bufsize)
2050
+ {
2051
+ /* Arguments ndigits, decpt, sign are similar to those
2052
+ of ecvt and fcvt; trailing zeros are suppressed from
2053
+ the returned string. If not null, *rve is set to point
2054
+ to the end of the return value. If d is +-Infinity or NaN,
2055
+ then *decpt is set to 9999.
2056
+
2057
+ mode:
2058
+ 0 ==> shortest string that yields d when read in
2059
+ and rounded to nearest.
2060
+ 1 ==> like 0, but with Steele & White stopping rule;
2061
+ e.g. with IEEE P754 arithmetic , mode 0 gives
2062
+ 1e23 whereas mode 1 gives 9.999999999999999e22.
2063
+ 2 ==> max(1,ndigits) significant digits. This gives a
2064
+ return value similar to that of ecvt, except
2065
+ that trailing zeros are suppressed.
2066
+ 3 ==> through ndigits past the decimal point. This
2067
+ gives a return value similar to that from fcvt,
2068
+ except that trailing zeros are suppressed, and
2069
+ ndigits can be negative.
2070
+ 4-9 should give the same return values as 2-3, i.e.,
2071
+ 4 <= mode <= 9 ==> same return as mode
2072
+ 2 + (mode & 1). These modes are mainly for
2073
+ debugging; often they run slower but sometimes
2074
+ faster than modes 2-3.
2075
+ 4,5,8,9 ==> left-to-right digit generation.
2076
+ 6-9 ==> don't try fast floating-point estimate
2077
+ (if applicable).
2078
+
2079
+ Values of mode other than 0-9 are treated as mode 0.
2080
+
2081
+ Sufficient space is allocated to the return value
2082
+ to hold the suppressed trailing zeros.
2083
+ */
2084
+
2085
+ int32 bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2086
+ j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2087
+ spec_case, try_quick;
2088
+ Long L;
2089
+ #ifndef Sudden_Underflow
2090
+ int32 denorm;
2091
+ ULong x;
2092
+ #endif
2093
+ Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2094
+ double d2, ds, eps;
2095
+ char *s;
2096
+
2097
+ if (word0(d) & Sign_bit) {
2098
+ /* set sign for everything, including 0's and NaNs */
2099
+ *sign = 1;
2100
+ set_word0(d, word0(d) & ~Sign_bit); /* clear sign bit */
2101
+ }
2102
+ else
2103
+ *sign = 0;
2104
+
2105
+ if ((word0(d) & Exp_mask) == Exp_mask) {
2106
+ /* Infinity or NaN */
2107
+ *decpt = 9999;
2108
+ s = !word1(d) && !(word0(d) & Frac_mask) ? "Infinity" : "NaN";
2109
+ if ((s[0] == 'I' && bufsize < 9) || (s[0] == 'N' && bufsize < 4)) {
2110
+ JS_ASSERT(JS_FALSE);
2111
+ /* JS_SetError(JS_BUFFER_OVERFLOW_ERROR, 0); */
2112
+ return JS_FALSE;
2113
+ }
2114
+ strcpy(buf, s);
2115
+ if (rve) {
2116
+ *rve = buf[3] ? buf + 8 : buf + 3;
2117
+ JS_ASSERT(**rve == '\0');
2118
+ }
2119
+ return JS_TRUE;
2120
+ }
2121
+
2122
+ b = NULL; /* initialize for abort protection */
2123
+ S = NULL;
2124
+ mlo = mhi = NULL;
2125
+
2126
+ if (!d) {
2127
+ no_digits:
2128
+ *decpt = 1;
2129
+ if (bufsize < 2) {
2130
+ JS_ASSERT(JS_FALSE);
2131
+ /* JS_SetError(JS_BUFFER_OVERFLOW_ERROR, 0); */
2132
+ return JS_FALSE;
2133
+ }
2134
+ buf[0] = '0'; buf[1] = '\0'; /* copy "0" to buffer */
2135
+ if (rve)
2136
+ *rve = buf + 1;
2137
+ /* We might have jumped to "no_digits" from below, so we need
2138
+ * to be sure to free the potentially allocated Bigints to avoid
2139
+ * memory leaks. */
2140
+ Bfree(b);
2141
+ Bfree(S);
2142
+ if (mlo != mhi)
2143
+ Bfree(mlo);
2144
+ Bfree(mhi);
2145
+ return JS_TRUE;
2146
+ }
2147
+
2148
+ b = d2b(d, &be, &bbits);
2149
+ if (!b)
2150
+ goto nomem;
2151
+ #ifdef Sudden_Underflow
2152
+ i = (int32)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
2153
+ #else
2154
+ if ((i = (int32)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) {
2155
+ #endif
2156
+ d2 = d;
2157
+ set_word0(d2, word0(d2) & Frac_mask1);
2158
+ set_word0(d2, word0(d2) | Exp_11);
2159
+
2160
+ /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
2161
+ * log10(x) = log(x) / log(10)
2162
+ * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2163
+ * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2164
+ *
2165
+ * This suggests computing an approximation k to log10(d) by
2166
+ *
2167
+ * k = (i - Bias)*0.301029995663981
2168
+ * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2169
+ *
2170
+ * We want k to be too large rather than too small.
2171
+ * The error in the first-order Taylor series approximation
2172
+ * is in our favor, so we just round up the constant enough
2173
+ * to compensate for any error in the multiplication of
2174
+ * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2175
+ * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2176
+ * adding 1e-13 to the constant term more than suffices.
2177
+ * Hence we adjust the constant term to 0.1760912590558.
2178
+ * (We could get a more accurate k by invoking log10,
2179
+ * but this is probably not worthwhile.)
2180
+ */
2181
+
2182
+ i -= Bias;
2183
+ #ifndef Sudden_Underflow
2184
+ denorm = 0;
2185
+ }
2186
+ else {
2187
+ /* d is denormalized */
2188
+
2189
+ i = bbits + be + (Bias + (P-1) - 1);
2190
+ x = i > 32 ? word0(d) << (64 - i) | word1(d) >> (i - 32) : word1(d) << (32 - i);
2191
+ d2 = x;
2192
+ set_word0(d2, word0(d2) - 31*Exp_msk1); /* adjust exponent */
2193
+ i -= (Bias + (P-1) - 1) + 1;
2194
+ denorm = 1;
2195
+ }
2196
+ #endif
2197
+ /* At this point d = f*2^i, where 1 <= f < 2. d2 is an approximation of f. */
2198
+ ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
2199
+ k = (int32)ds;
2200
+ if (ds < 0. && ds != k)
2201
+ k--; /* want k = floor(ds) */
2202
+ k_check = 1;
2203
+ if (k >= 0 && k <= Ten_pmax) {
2204
+ if (d < tens[k])
2205
+ k--;
2206
+ k_check = 0;
2207
+ }
2208
+ /* At this point floor(log10(d)) <= k <= floor(log10(d))+1.
2209
+ If k_check is zero, we're guaranteed that k = floor(log10(d)). */
2210
+ j = bbits - i - 1;
2211
+ /* At this point d = b/2^j, where b is an odd integer. */
2212
+ if (j >= 0) {
2213
+ b2 = 0;
2214
+ s2 = j;
2215
+ }
2216
+ else {
2217
+ b2 = -j;
2218
+ s2 = 0;
2219
+ }
2220
+ if (k >= 0) {
2221
+ b5 = 0;
2222
+ s5 = k;
2223
+ s2 += k;
2224
+ }
2225
+ else {
2226
+ b2 -= k;
2227
+ b5 = -k;
2228
+ s5 = 0;
2229
+ }
2230
+ /* At this point d/10^k = (b * 2^b2 * 5^b5) / (2^s2 * 5^s5), where b is an odd integer,
2231
+ b2 >= 0, b5 >= 0, s2 >= 0, and s5 >= 0. */
2232
+ if (mode < 0 || mode > 9)
2233
+ mode = 0;
2234
+ try_quick = 1;
2235
+ if (mode > 5) {
2236
+ mode -= 4;
2237
+ try_quick = 0;
2238
+ }
2239
+ leftright = 1;
2240
+ ilim = ilim1 = 0;
2241
+ switch(mode) {
2242
+ case 0:
2243
+ case 1:
2244
+ ilim = ilim1 = -1;
2245
+ i = 18;
2246
+ ndigits = 0;
2247
+ break;
2248
+ case 2:
2249
+ leftright = 0;
2250
+ /* no break */
2251
+ case 4:
2252
+ if (ndigits <= 0)
2253
+ ndigits = 1;
2254
+ ilim = ilim1 = i = ndigits;
2255
+ break;
2256
+ case 3:
2257
+ leftright = 0;
2258
+ /* no break */
2259
+ case 5:
2260
+ i = ndigits + k + 1;
2261
+ ilim = i;
2262
+ ilim1 = i - 1;
2263
+ if (i <= 0)
2264
+ i = 1;
2265
+ }
2266
+ /* ilim is the maximum number of significant digits we want, based on k and ndigits. */
2267
+ /* ilim1 is the maximum number of significant digits we want, based on k and ndigits,
2268
+ when it turns out that k was computed too high by one. */
2269
+
2270
+ /* Ensure space for at least i+1 characters, including trailing null. */
2271
+ if (bufsize <= (size_t)i) {
2272
+ Bfree(b);
2273
+ JS_ASSERT(JS_FALSE);
2274
+ return JS_FALSE;
2275
+ }
2276
+ s = buf;
2277
+
2278
+ if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2279
+
2280
+ /* Try to get by with floating-point arithmetic. */
2281
+
2282
+ i = 0;
2283
+ d2 = d;
2284
+ k0 = k;
2285
+ ilim0 = ilim;
2286
+ ieps = 2; /* conservative */
2287
+ /* Divide d by 10^k, keeping track of the roundoff error and avoiding overflows. */
2288
+ if (k > 0) {
2289
+ ds = tens[k&0xf];
2290
+ j = k >> 4;
2291
+ if (j & Bletch) {
2292
+ /* prevent overflows */
2293
+ j &= Bletch - 1;
2294
+ d /= bigtens[n_bigtens-1];
2295
+ ieps++;
2296
+ }
2297
+ for(; j; j >>= 1, i++)
2298
+ if (j & 1) {
2299
+ ieps++;
2300
+ ds *= bigtens[i];
2301
+ }
2302
+ d /= ds;
2303
+ }
2304
+ else if ((j1 = -k) != 0) {
2305
+ d *= tens[j1 & 0xf];
2306
+ for(j = j1 >> 4; j; j >>= 1, i++)
2307
+ if (j & 1) {
2308
+ ieps++;
2309
+ d *= bigtens[i];
2310
+ }
2311
+ }
2312
+ /* Check that k was computed correctly. */
2313
+ if (k_check && d < 1. && ilim > 0) {
2314
+ if (ilim1 <= 0)
2315
+ goto fast_failed;
2316
+ ilim = ilim1;
2317
+ k--;
2318
+ d *= 10.;
2319
+ ieps++;
2320
+ }
2321
+ /* eps bounds the cumulative error. */
2322
+ eps = ieps*d + 7.;
2323
+ set_word0(eps, word0(eps) - (P-1)*Exp_msk1);
2324
+ if (ilim == 0) {
2325
+ S = mhi = 0;
2326
+ d -= 5.;
2327
+ if (d > eps)
2328
+ goto one_digit;
2329
+ if (d < -eps)
2330
+ goto no_digits;
2331
+ goto fast_failed;
2332
+ }
2333
+ #ifndef No_leftright
2334
+ if (leftright) {
2335
+ /* Use Steele & White method of only
2336
+ * generating digits needed.
2337
+ */
2338
+ eps = 0.5/tens[ilim-1] - eps;
2339
+ for(i = 0;;) {
2340
+ L = (Long)d;
2341
+ d -= L;
2342
+ *s++ = '0' + (char)L;
2343
+ if (d < eps)
2344
+ goto ret1;
2345
+ if (1. - d < eps)
2346
+ goto bump_up;
2347
+ if (++i >= ilim)
2348
+ break;
2349
+ eps *= 10.;
2350
+ d *= 10.;
2351
+ }
2352
+ }
2353
+ else {
2354
+ #endif
2355
+ /* Generate ilim digits, then fix them up. */
2356
+ eps *= tens[ilim-1];
2357
+ for(i = 1;; i++, d *= 10.) {
2358
+ L = (Long)d;
2359
+ d -= L;
2360
+ *s++ = '0' + (char)L;
2361
+ if (i == ilim) {
2362
+ if (d > 0.5 + eps)
2363
+ goto bump_up;
2364
+ else if (d < 0.5 - eps) {
2365
+ while(*--s == '0') ;
2366
+ s++;
2367
+ goto ret1;
2368
+ }
2369
+ break;
2370
+ }
2371
+ }
2372
+ #ifndef No_leftright
2373
+ }
2374
+ #endif
2375
+ fast_failed:
2376
+ s = buf;
2377
+ d = d2;
2378
+ k = k0;
2379
+ ilim = ilim0;
2380
+ }
2381
+
2382
+ /* Do we have a "small" integer? */
2383
+
2384
+ if (be >= 0 && k <= Int_max) {
2385
+ /* Yes. */
2386
+ ds = tens[k];
2387
+ if (ndigits < 0 && ilim <= 0) {
2388
+ S = mhi = 0;
2389
+ if (ilim < 0 || d < 5*ds || (!biasUp && d == 5*ds))
2390
+ goto no_digits;
2391
+ goto one_digit;
2392
+ }
2393
+ for(i = 1;; i++) {
2394
+ L = (Long) (d / ds);
2395
+ d -= L*ds;
2396
+ #ifdef Check_FLT_ROUNDS
2397
+ /* If FLT_ROUNDS == 2, L will usually be high by 1 */
2398
+ if (d < 0) {
2399
+ L--;
2400
+ d += ds;
2401
+ }
2402
+ #endif
2403
+ *s++ = '0' + (char)L;
2404
+ if (i == ilim) {
2405
+ d += d;
2406
+ if ((d > ds) || (d == ds && (L & 1 || biasUp))) {
2407
+ bump_up:
2408
+ while(*--s == '9')
2409
+ if (s == buf) {
2410
+ k++;
2411
+ *s = '0';
2412
+ break;
2413
+ }
2414
+ ++*s++;
2415
+ }
2416
+ break;
2417
+ }
2418
+ if (!(d *= 10.))
2419
+ break;
2420
+ }
2421
+ goto ret1;
2422
+ }
2423
+
2424
+ m2 = b2;
2425
+ m5 = b5;
2426
+ if (leftright) {
2427
+ if (mode < 2) {
2428
+ i =
2429
+ #ifndef Sudden_Underflow
2430
+ denorm ? be + (Bias + (P-1) - 1 + 1) :
2431
+ #endif
2432
+ 1 + P - bbits;
2433
+ /* i is 1 plus the number of trailing zero bits in d's significand. Thus,
2434
+ (2^m2 * 5^m5) / (2^(s2+i) * 5^s5) = (1/2 lsb of d)/10^k. */
2435
+ }
2436
+ else {
2437
+ j = ilim - 1;
2438
+ if (m5 >= j)
2439
+ m5 -= j;
2440
+ else {
2441
+ s5 += j -= m5;
2442
+ b5 += j;
2443
+ m5 = 0;
2444
+ }
2445
+ if ((i = ilim) < 0) {
2446
+ m2 -= i;
2447
+ i = 0;
2448
+ }
2449
+ /* (2^m2 * 5^m5) / (2^(s2+i) * 5^s5) = (1/2 * 10^(1-ilim))/10^k. */
2450
+ }
2451
+ b2 += i;
2452
+ s2 += i;
2453
+ mhi = i2b(1);
2454
+ if (!mhi)
2455
+ goto nomem;
2456
+ /* (mhi * 2^m2 * 5^m5) / (2^s2 * 5^s5) = one-half of last printed (when mode >= 2) or
2457
+ input (when mode < 2) significant digit, divided by 10^k. */
2458
+ }
2459
+ /* We still have d/10^k = (b * 2^b2 * 5^b5) / (2^s2 * 5^s5). Reduce common factors in
2460
+ b2, m2, and s2 without changing the equalities. */
2461
+ if (m2 > 0 && s2 > 0) {
2462
+ i = m2 < s2 ? m2 : s2;
2463
+ b2 -= i;
2464
+ m2 -= i;
2465
+ s2 -= i;
2466
+ }
2467
+
2468
+ /* Fold b5 into b and m5 into mhi. */
2469
+ if (b5 > 0) {
2470
+ if (leftright) {
2471
+ if (m5 > 0) {
2472
+ mhi = pow5mult(mhi, m5);
2473
+ if (!mhi)
2474
+ goto nomem;
2475
+ b1 = mult(mhi, b);
2476
+ if (!b1)
2477
+ goto nomem;
2478
+ Bfree(b);
2479
+ b = b1;
2480
+ }
2481
+ if ((j = b5 - m5) != 0) {
2482
+ b = pow5mult(b, j);
2483
+ if (!b)
2484
+ goto nomem;
2485
+ }
2486
+ }
2487
+ else {
2488
+ b = pow5mult(b, b5);
2489
+ if (!b)
2490
+ goto nomem;
2491
+ }
2492
+ }
2493
+ /* Now we have d/10^k = (b * 2^b2) / (2^s2 * 5^s5) and
2494
+ (mhi * 2^m2) / (2^s2 * 5^s5) = one-half of last printed or input significant digit, divided by 10^k. */
2495
+
2496
+ S = i2b(1);
2497
+ if (!S)
2498
+ goto nomem;
2499
+ if (s5 > 0) {
2500
+ S = pow5mult(S, s5);
2501
+ if (!S)
2502
+ goto nomem;
2503
+ }
2504
+ /* Now we have d/10^k = (b * 2^b2) / (S * 2^s2) and
2505
+ (mhi * 2^m2) / (S * 2^s2) = one-half of last printed or input significant digit, divided by 10^k. */
2506
+
2507
+ /* Check for special case that d is a normalized power of 2. */
2508
+ spec_case = 0;
2509
+ if (mode < 2) {
2510
+ if (!word1(d) && !(word0(d) & Bndry_mask)
2511
+ #ifndef Sudden_Underflow
2512
+ && word0(d) & (Exp_mask & Exp_mask << 1)
2513
+ #endif
2514
+ ) {
2515
+ /* The special case. Here we want to be within a quarter of the last input
2516
+ significant digit instead of one half of it when the decimal output string's value is less than d. */
2517
+ b2 += Log2P;
2518
+ s2 += Log2P;
2519
+ spec_case = 1;
2520
+ }
2521
+ }
2522
+
2523
+ /* Arrange for convenient computation of quotients:
2524
+ * shift left if necessary so divisor has 4 leading 0 bits.
2525
+ *
2526
+ * Perhaps we should just compute leading 28 bits of S once
2527
+ * and for all and pass them and a shift to quorem, so it
2528
+ * can do shifts and ors to compute the numerator for q.
2529
+ */
2530
+ if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0)
2531
+ i = 32 - i;
2532
+ /* i is the number of leading zero bits in the most significant word of S*2^s2. */
2533
+ if (i > 4) {
2534
+ i -= 4;
2535
+ b2 += i;
2536
+ m2 += i;
2537
+ s2 += i;
2538
+ }
2539
+ else if (i < 4) {
2540
+ i += 28;
2541
+ b2 += i;
2542
+ m2 += i;
2543
+ s2 += i;
2544
+ }
2545
+ /* Now S*2^s2 has exactly four leading zero bits in its most significant word. */
2546
+ if (b2 > 0) {
2547
+ b = lshift(b, b2);
2548
+ if (!b)
2549
+ goto nomem;
2550
+ }
2551
+ if (s2 > 0) {
2552
+ S = lshift(S, s2);
2553
+ if (!S)
2554
+ goto nomem;
2555
+ }
2556
+ /* Now we have d/10^k = b/S and
2557
+ (mhi * 2^m2) / S = maximum acceptable error, divided by 10^k. */
2558
+ if (k_check) {
2559
+ if (cmp(b,S) < 0) {
2560
+ k--;
2561
+ b = multadd(b, 10, 0); /* we botched the k estimate */
2562
+ if (!b)
2563
+ goto nomem;
2564
+ if (leftright) {
2565
+ mhi = multadd(mhi, 10, 0);
2566
+ if (!mhi)
2567
+ goto nomem;
2568
+ }
2569
+ ilim = ilim1;
2570
+ }
2571
+ }
2572
+ /* At this point 1 <= d/10^k = b/S < 10. */
2573
+
2574
+ if (ilim <= 0 && mode > 2) {
2575
+ /* We're doing fixed-mode output and d is less than the minimum nonzero output in this mode.
2576
+ Output either zero or the minimum nonzero output depending on which is closer to d. */
2577
+ if (ilim < 0)
2578
+ goto no_digits;
2579
+ S = multadd(S,5,0);
2580
+ if (!S)
2581
+ goto nomem;
2582
+ i = cmp(b,S);
2583
+ if (i < 0 || (i == 0 && !biasUp)) {
2584
+ /* Always emit at least one digit. If the number appears to be zero
2585
+ using the current mode, then emit one '0' digit and set decpt to 1. */
2586
+ /*no_digits:
2587
+ k = -1 - ndigits;
2588
+ goto ret; */
2589
+ goto no_digits;
2590
+ }
2591
+ one_digit:
2592
+ *s++ = '1';
2593
+ k++;
2594
+ goto ret;
2595
+ }
2596
+ if (leftright) {
2597
+ if (m2 > 0) {
2598
+ mhi = lshift(mhi, m2);
2599
+ if (!mhi)
2600
+ goto nomem;
2601
+ }
2602
+
2603
+ /* Compute mlo -- check for special case
2604
+ * that d is a normalized power of 2.
2605
+ */
2606
+
2607
+ mlo = mhi;
2608
+ if (spec_case) {
2609
+ mhi = Balloc(mhi->k);
2610
+ if (!mhi)
2611
+ goto nomem;
2612
+ Bcopy(mhi, mlo);
2613
+ mhi = lshift(mhi, Log2P);
2614
+ if (!mhi)
2615
+ goto nomem;
2616
+ }
2617
+ /* mlo/S = maximum acceptable error, divided by 10^k, if the output is less than d. */
2618
+ /* mhi/S = maximum acceptable error, divided by 10^k, if the output is greater than d. */
2619
+
2620
+ for(i = 1;;i++) {
2621
+ dig = quorem(b,S) + '0';
2622
+ /* Do we yet have the shortest decimal string
2623
+ * that will round to d?
2624
+ */
2625
+ j = cmp(b, mlo);
2626
+ /* j is b/S compared with mlo/S. */
2627
+ delta = diff(S, mhi);
2628
+ if (!delta)
2629
+ goto nomem;
2630
+ j1 = delta->sign ? 1 : cmp(b, delta);
2631
+ Bfree(delta);
2632
+ /* j1 is b/S compared with 1 - mhi/S. */
2633
+ #ifndef ROUND_BIASED
2634
+ if (j1 == 0 && !mode && !(word1(d) & 1)) {
2635
+ if (dig == '9')
2636
+ goto round_9_up;
2637
+ if (j > 0)
2638
+ dig++;
2639
+ *s++ = (char)dig;
2640
+ goto ret;
2641
+ }
2642
+ #endif
2643
+ if ((j < 0) || (j == 0 && !mode
2644
+ #ifndef ROUND_BIASED
2645
+ && !(word1(d) & 1)
2646
+ #endif
2647
+ )) {
2648
+ if (j1 > 0) {
2649
+ /* Either dig or dig+1 would work here as the least significant decimal digit.
2650
+ Use whichever would produce a decimal value closer to d. */
2651
+ b = lshift(b, 1);
2652
+ if (!b)
2653
+ goto nomem;
2654
+ j1 = cmp(b, S);
2655
+ if (((j1 > 0) || (j1 == 0 && (dig & 1 || biasUp)))
2656
+ && (dig++ == '9'))
2657
+ goto round_9_up;
2658
+ }
2659
+ *s++ = (char)dig;
2660
+ goto ret;
2661
+ }
2662
+ if (j1 > 0) {
2663
+ if (dig == '9') { /* possible if i == 1 */
2664
+ round_9_up:
2665
+ *s++ = '9';
2666
+ goto roundoff;
2667
+ }
2668
+ *s++ = (char)dig + 1;
2669
+ goto ret;
2670
+ }
2671
+ *s++ = (char)dig;
2672
+ if (i == ilim)
2673
+ break;
2674
+ b = multadd(b, 10, 0);
2675
+ if (!b)
2676
+ goto nomem;
2677
+ if (mlo == mhi) {
2678
+ mlo = mhi = multadd(mhi, 10, 0);
2679
+ if (!mhi)
2680
+ goto nomem;
2681
+ }
2682
+ else {
2683
+ mlo = multadd(mlo, 10, 0);
2684
+ if (!mlo)
2685
+ goto nomem;
2686
+ mhi = multadd(mhi, 10, 0);
2687
+ if (!mhi)
2688
+ goto nomem;
2689
+ }
2690
+ }
2691
+ }
2692
+ else
2693
+ for(i = 1;; i++) {
2694
+ *s++ = (char)(dig = quorem(b,S) + '0');
2695
+ if (i >= ilim)
2696
+ break;
2697
+ b = multadd(b, 10, 0);
2698
+ if (!b)
2699
+ goto nomem;
2700
+ }
2701
+
2702
+ /* Round off last digit */
2703
+
2704
+ b = lshift(b, 1);
2705
+ if (!b)
2706
+ goto nomem;
2707
+ j = cmp(b, S);
2708
+ if ((j > 0) || (j == 0 && (dig & 1 || biasUp))) {
2709
+ roundoff:
2710
+ while(*--s == '9')
2711
+ if (s == buf) {
2712
+ k++;
2713
+ *s++ = '1';
2714
+ goto ret;
2715
+ }
2716
+ ++*s++;
2717
+ }
2718
+ else {
2719
+ /* Strip trailing zeros */
2720
+ while(*--s == '0') ;
2721
+ s++;
2722
+ }
2723
+ ret:
2724
+ Bfree(S);
2725
+ if (mhi) {
2726
+ if (mlo && mlo != mhi)
2727
+ Bfree(mlo);
2728
+ Bfree(mhi);
2729
+ }
2730
+ ret1:
2731
+ Bfree(b);
2732
+ JS_ASSERT(s < buf + bufsize);
2733
+ *s = '\0';
2734
+ if (rve)
2735
+ *rve = s;
2736
+ *decpt = k + 1;
2737
+ return JS_TRUE;
2738
+
2739
+ nomem:
2740
+ Bfree(S);
2741
+ if (mhi) {
2742
+ if (mlo && mlo != mhi)
2743
+ Bfree(mlo);
2744
+ Bfree(mhi);
2745
+ }
2746
+ Bfree(b);
2747
+ return JS_FALSE;
2748
+ }
2749
+
2750
+
2751
+ /* Mapping of JSDToStrMode -> js_dtoa mode */
2752
+ static const int dtoaModes[] = {
2753
+ 0, /* DTOSTR_STANDARD */
2754
+ 0, /* DTOSTR_STANDARD_EXPONENTIAL, */
2755
+ 3, /* DTOSTR_FIXED, */
2756
+ 2, /* DTOSTR_EXPONENTIAL, */
2757
+ 2}; /* DTOSTR_PRECISION */
2758
+
2759
+ JS_FRIEND_API(char *)
2760
+ JS_dtostr(char *buffer, size_t bufferSize, JSDToStrMode mode, int precision, double d)
2761
+ {
2762
+ int decPt; /* Position of decimal point relative to first digit returned by js_dtoa */
2763
+ int sign; /* Nonzero if the sign bit was set in d */
2764
+ int nDigits; /* Number of significand digits returned by js_dtoa */
2765
+ char *numBegin = buffer+2; /* Pointer to the digits returned by js_dtoa; the +2 leaves space for */
2766
+ /* the sign and/or decimal point */
2767
+ char *numEnd; /* Pointer past the digits returned by js_dtoa */
2768
+ JSBool dtoaRet;
2769
+
2770
+ JS_ASSERT(bufferSize >= (size_t)(mode <= DTOSTR_STANDARD_EXPONENTIAL ? DTOSTR_STANDARD_BUFFER_SIZE :
2771
+ DTOSTR_VARIABLE_BUFFER_SIZE(precision)));
2772
+
2773
+ if (mode == DTOSTR_FIXED && (d >= 1e21 || d <= -1e21))
2774
+ mode = DTOSTR_STANDARD; /* Change mode here rather than below because the buffer may not be large enough to hold a large integer. */
2775
+
2776
+ /* Locking for Balloc's shared buffers */
2777
+ ACQUIRE_DTOA_LOCK();
2778
+ dtoaRet = js_dtoa(d, dtoaModes[mode], mode >= DTOSTR_FIXED, precision, &decPt, &sign, &numEnd, numBegin, bufferSize-2);
2779
+ RELEASE_DTOA_LOCK();
2780
+ if (!dtoaRet)
2781
+ return 0;
2782
+
2783
+ nDigits = numEnd - numBegin;
2784
+
2785
+ /* If Infinity, -Infinity, or NaN, return the string regardless of the mode. */
2786
+ if (decPt != 9999) {
2787
+ JSBool exponentialNotation = JS_FALSE;
2788
+ int minNDigits = 0; /* Minimum number of significand digits required by mode and precision */
2789
+ char *p;
2790
+ char *q;
2791
+
2792
+ switch (mode) {
2793
+ case DTOSTR_STANDARD:
2794
+ if (decPt < -5 || decPt > 21)
2795
+ exponentialNotation = JS_TRUE;
2796
+ else
2797
+ minNDigits = decPt;
2798
+ break;
2799
+
2800
+ case DTOSTR_FIXED:
2801
+ if (precision >= 0)
2802
+ minNDigits = decPt + precision;
2803
+ else
2804
+ minNDigits = decPt;
2805
+ break;
2806
+
2807
+ case DTOSTR_EXPONENTIAL:
2808
+ JS_ASSERT(precision > 0);
2809
+ minNDigits = precision;
2810
+ /* Fall through */
2811
+ case DTOSTR_STANDARD_EXPONENTIAL:
2812
+ exponentialNotation = JS_TRUE;
2813
+ break;
2814
+
2815
+ case DTOSTR_PRECISION:
2816
+ JS_ASSERT(precision > 0);
2817
+ minNDigits = precision;
2818
+ if (decPt < -5 || decPt > precision)
2819
+ exponentialNotation = JS_TRUE;
2820
+ break;
2821
+ }
2822
+
2823
+ /* If the number has fewer than minNDigits, pad it with zeros at the end */
2824
+ if (nDigits < minNDigits) {
2825
+ p = numBegin + minNDigits;
2826
+ nDigits = minNDigits;
2827
+ do {
2828
+ *numEnd++ = '0';
2829
+ } while (numEnd != p);
2830
+ *numEnd = '\0';
2831
+ }
2832
+
2833
+ if (exponentialNotation) {
2834
+ /* Insert a decimal point if more than one significand digit */
2835
+ if (nDigits != 1) {
2836
+ numBegin--;
2837
+ numBegin[0] = numBegin[1];
2838
+ numBegin[1] = '.';
2839
+ }
2840
+ JS_snprintf(numEnd, bufferSize - (numEnd - buffer), "e%+d", decPt-1);
2841
+ } else if (decPt != nDigits) {
2842
+ /* Some kind of a fraction in fixed notation */
2843
+ JS_ASSERT(decPt <= nDigits);
2844
+ if (decPt > 0) {
2845
+ /* dd...dd . dd...dd */
2846
+ p = --numBegin;
2847
+ do {
2848
+ *p = p[1];
2849
+ p++;
2850
+ } while (--decPt);
2851
+ *p = '.';
2852
+ } else {
2853
+ /* 0 . 00...00dd...dd */
2854
+ p = numEnd;
2855
+ numEnd += 1 - decPt;
2856
+ q = numEnd;
2857
+ JS_ASSERT(numEnd < buffer + bufferSize);
2858
+ *numEnd = '\0';
2859
+ while (p != numBegin)
2860
+ *--q = *--p;
2861
+ for (p = numBegin + 1; p != q; p++)
2862
+ *p = '0';
2863
+ *numBegin = '.';
2864
+ *--numBegin = '0';
2865
+ }
2866
+ }
2867
+ }
2868
+
2869
+ /* If negative and neither -0.0 nor NaN, output a leading '-'. */
2870
+ if (sign &&
2871
+ !(word0(d) == Sign_bit && word1(d) == 0) &&
2872
+ !((word0(d) & Exp_mask) == Exp_mask &&
2873
+ (word1(d) || (word0(d) & Frac_mask)))) {
2874
+ *--numBegin = '-';
2875
+ }
2876
+ return numBegin;
2877
+ }
2878
+
2879
+
2880
+ /* Let b = floor(b / divisor), and return the remainder. b must be nonnegative.
2881
+ * divisor must be between 1 and 65536.
2882
+ * This function cannot run out of memory. */
2883
+ static uint32
2884
+ divrem(Bigint *b, uint32 divisor)
2885
+ {
2886
+ int32 n = b->wds;
2887
+ uint32 remainder = 0;
2888
+ ULong *bx;
2889
+ ULong *bp;
2890
+
2891
+ JS_ASSERT(divisor > 0 && divisor <= 65536);
2892
+
2893
+ if (!n)
2894
+ return 0; /* b is zero */
2895
+ bx = b->x;
2896
+ bp = bx + n;
2897
+ do {
2898
+ ULong a = *--bp;
2899
+ ULong dividend = remainder << 16 | a >> 16;
2900
+ ULong quotientHi = dividend / divisor;
2901
+ ULong quotientLo;
2902
+
2903
+ remainder = dividend - quotientHi*divisor;
2904
+ JS_ASSERT(quotientHi <= 0xFFFF && remainder < divisor);
2905
+ dividend = remainder << 16 | (a & 0xFFFF);
2906
+ quotientLo = dividend / divisor;
2907
+ remainder = dividend - quotientLo*divisor;
2908
+ JS_ASSERT(quotientLo <= 0xFFFF && remainder < divisor);
2909
+ *bp = quotientHi << 16 | quotientLo;
2910
+ } while (bp != bx);
2911
+ /* Decrease the size of the number if its most significant word is now zero. */
2912
+ if (bx[n-1] == 0)
2913
+ b->wds--;
2914
+ return remainder;
2915
+ }
2916
+
2917
+
2918
+ /* "-0.0000...(1073 zeros after decimal point)...0001\0" is the longest string that we could produce,
2919
+ * which occurs when printing -5e-324 in binary. We could compute a better estimate of the size of
2920
+ * the output string and malloc fewer bytes depending on d and base, but why bother? */
2921
+ #define DTOBASESTR_BUFFER_SIZE 1078
2922
+ #define BASEDIGIT(digit) ((char)(((digit) >= 10) ? 'a' - 10 + (digit) : '0' + (digit)))
2923
+
2924
+ JS_FRIEND_API(char *)
2925
+ JS_dtobasestr(int base, double d)
2926
+ {
2927
+ char *buffer; /* The output string */
2928
+ char *p; /* Pointer to current position in the buffer */
2929
+ char *pInt; /* Pointer to the beginning of the integer part of the string */
2930
+ char *q;
2931
+ uint32 digit;
2932
+ double di; /* d truncated to an integer */
2933
+ double df; /* The fractional part of d */
2934
+
2935
+ JS_ASSERT(base >= 2 && base <= 36);
2936
+
2937
+ buffer = (char*) malloc(DTOBASESTR_BUFFER_SIZE);
2938
+ if (buffer) {
2939
+ p = buffer;
2940
+ if (d < 0.0
2941
+ #if defined(XP_WIN) || defined(XP_OS2)
2942
+ && !((word0(d) & Exp_mask) == Exp_mask && ((word0(d) & Frac_mask) || word1(d))) /* Visual C++ doesn't know how to compare against NaN */
2943
+ #endif
2944
+ ) {
2945
+ *p++ = '-';
2946
+ d = -d;
2947
+ }
2948
+
2949
+ /* Check for Infinity and NaN */
2950
+ if ((word0(d) & Exp_mask) == Exp_mask) {
2951
+ strcpy(p, !word1(d) && !(word0(d) & Frac_mask) ? "Infinity" : "NaN");
2952
+ return buffer;
2953
+ }
2954
+
2955
+ /* Locking for Balloc's shared buffers */
2956
+ ACQUIRE_DTOA_LOCK();
2957
+
2958
+ /* Output the integer part of d with the digits in reverse order. */
2959
+ pInt = p;
2960
+ di = fd_floor(d);
2961
+ if (di <= 4294967295.0) {
2962
+ uint32 n = (uint32)di;
2963
+ if (n)
2964
+ do {
2965
+ uint32 m = n / base;
2966
+ digit = n - m*base;
2967
+ n = m;
2968
+ JS_ASSERT(digit < (uint32)base);
2969
+ *p++ = BASEDIGIT(digit);
2970
+ } while (n);
2971
+ else *p++ = '0';
2972
+ } else {
2973
+ int32 e;
2974
+ int32 bits; /* Number of significant bits in di; not used. */
2975
+ Bigint *b = d2b(di, &e, &bits);
2976
+ if (!b)
2977
+ goto nomem1;
2978
+ b = lshift(b, e);
2979
+ if (!b) {
2980
+ nomem1:
2981
+ Bfree(b);
2982
+ return NULL;
2983
+ }
2984
+ do {
2985
+ digit = divrem(b, base);
2986
+ JS_ASSERT(digit < (uint32)base);
2987
+ *p++ = BASEDIGIT(digit);
2988
+ } while (b->wds);
2989
+ Bfree(b);
2990
+ }
2991
+ /* Reverse the digits of the integer part of d. */
2992
+ q = p-1;
2993
+ while (q > pInt) {
2994
+ char ch = *pInt;
2995
+ *pInt++ = *q;
2996
+ *q-- = ch;
2997
+ }
2998
+
2999
+ df = d - di;
3000
+ if (df != 0.0) {
3001
+ /* We have a fraction. */
3002
+ int32 e, bbits, s2, done;
3003
+ Bigint *b, *s, *mlo, *mhi;
3004
+
3005
+ b = s = mlo = mhi = NULL;
3006
+
3007
+ *p++ = '.';
3008
+ b = d2b(df, &e, &bbits);
3009
+ if (!b) {
3010
+ nomem2:
3011
+ Bfree(b);
3012
+ Bfree(s);
3013
+ if (mlo != mhi)
3014
+ Bfree(mlo);
3015
+ Bfree(mhi);
3016
+ return NULL;
3017
+ }
3018
+ JS_ASSERT(e < 0);
3019
+ /* At this point df = b * 2^e. e must be less than zero because 0 < df < 1. */
3020
+
3021
+ s2 = -(int32)(word0(d) >> Exp_shift1 & Exp_mask>>Exp_shift1);
3022
+ #ifndef Sudden_Underflow
3023
+ if (!s2)
3024
+ s2 = -1;
3025
+ #endif
3026
+ s2 += Bias + P;
3027
+ /* 1/2^s2 = (nextDouble(d) - d)/2 */
3028
+ JS_ASSERT(-s2 < e);
3029
+ mlo = i2b(1);
3030
+ if (!mlo)
3031
+ goto nomem2;
3032
+ mhi = mlo;
3033
+ if (!word1(d) && !(word0(d) & Bndry_mask)
3034
+ #ifndef Sudden_Underflow
3035
+ && word0(d) & (Exp_mask & Exp_mask << 1)
3036
+ #endif
3037
+ ) {
3038
+ /* The special case. Here we want to be within a quarter of the last input
3039
+ significant digit instead of one half of it when the output string's value is less than d. */
3040
+ s2 += Log2P;
3041
+ mhi = i2b(1<<Log2P);
3042
+ if (!mhi)
3043
+ goto nomem2;
3044
+ }
3045
+ b = lshift(b, e + s2);
3046
+ if (!b)
3047
+ goto nomem2;
3048
+ s = i2b(1);
3049
+ if (!s)
3050
+ goto nomem2;
3051
+ s = lshift(s, s2);
3052
+ if (!s)
3053
+ goto nomem2;
3054
+ /* At this point we have the following:
3055
+ * s = 2^s2;
3056
+ * 1 > df = b/2^s2 > 0;
3057
+ * (d - prevDouble(d))/2 = mlo/2^s2;
3058
+ * (nextDouble(d) - d)/2 = mhi/2^s2. */
3059
+
3060
+ done = JS_FALSE;
3061
+ do {
3062
+ int32 j, j1;
3063
+ Bigint *delta;
3064
+
3065
+ b = multadd(b, base, 0);
3066
+ if (!b)
3067
+ goto nomem2;
3068
+ digit = quorem2(b, s2);
3069
+ if (mlo == mhi) {
3070
+ mlo = mhi = multadd(mlo, base, 0);
3071
+ if (!mhi)
3072
+ goto nomem2;
3073
+ }
3074
+ else {
3075
+ mlo = multadd(mlo, base, 0);
3076
+ if (!mlo)
3077
+ goto nomem2;
3078
+ mhi = multadd(mhi, base, 0);
3079
+ if (!mhi)
3080
+ goto nomem2;
3081
+ }
3082
+
3083
+ /* Do we yet have the shortest string that will round to d? */
3084
+ j = cmp(b, mlo);
3085
+ /* j is b/2^s2 compared with mlo/2^s2. */
3086
+ delta = diff(s, mhi);
3087
+ if (!delta)
3088
+ goto nomem2;
3089
+ j1 = delta->sign ? 1 : cmp(b, delta);
3090
+ Bfree(delta);
3091
+ /* j1 is b/2^s2 compared with 1 - mhi/2^s2. */
3092
+
3093
+ #ifndef ROUND_BIASED
3094
+ if (j1 == 0 && !(word1(d) & 1)) {
3095
+ if (j > 0)
3096
+ digit++;
3097
+ done = JS_TRUE;
3098
+ } else
3099
+ #endif
3100
+ if (j < 0 || (j == 0
3101
+ #ifndef ROUND_BIASED
3102
+ && !(word1(d) & 1)
3103
+ #endif
3104
+ )) {
3105
+ if (j1 > 0) {
3106
+ /* Either dig or dig+1 would work here as the least significant digit.
3107
+ Use whichever would produce an output value closer to d. */
3108
+ b = lshift(b, 1);
3109
+ if (!b)
3110
+ goto nomem2;
3111
+ j1 = cmp(b, s);
3112
+ if (j1 > 0) /* The even test (|| (j1 == 0 && (digit & 1))) is not here because it messes up odd base output
3113
+ * such as 3.5 in base 3. */
3114
+ digit++;
3115
+ }
3116
+ done = JS_TRUE;
3117
+ } else if (j1 > 0) {
3118
+ digit++;
3119
+ done = JS_TRUE;
3120
+ }
3121
+ JS_ASSERT(digit < (uint32)base);
3122
+ *p++ = BASEDIGIT(digit);
3123
+ } while (!done);
3124
+ Bfree(b);
3125
+ Bfree(s);
3126
+ if (mlo != mhi)
3127
+ Bfree(mlo);
3128
+ Bfree(mhi);
3129
+ }
3130
+ JS_ASSERT(p < buffer + DTOBASESTR_BUFFER_SIZE);
3131
+ *p = '\0';
3132
+ RELEASE_DTOA_LOCK();
3133
+ }
3134
+ return buffer;
3135
+ }