distil 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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,1639 @@
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
+ * JS symbol tables.
42
+ */
43
+ #include "jsstddef.h"
44
+ #include <stdlib.h>
45
+ #include <string.h>
46
+ #include "jstypes.h"
47
+ #include "jsarena.h"
48
+ #include "jsbit.h"
49
+ #include "jsclist.h"
50
+ #include "jsdhash.h"
51
+ #include "jsutil.h" /* Added by JSIFY */
52
+ #include "jsapi.h"
53
+ #include "jsatom.h"
54
+ #include "jscntxt.h"
55
+ #include "jsdbgapi.h"
56
+ #include "jslock.h"
57
+ #include "jsnum.h"
58
+ #include "jsscope.h"
59
+ #include "jsstr.h"
60
+
61
+ JSScope *
62
+ js_GetMutableScope(JSContext *cx, JSObject *obj)
63
+ {
64
+ JSScope *scope, *newscope;
65
+
66
+ scope = OBJ_SCOPE(obj);
67
+ JS_ASSERT(JS_IS_SCOPE_LOCKED(cx, scope));
68
+ if (scope->object == obj)
69
+ return scope;
70
+ newscope = js_NewScope(cx, 0, scope->map.ops, LOCKED_OBJ_GET_CLASS(obj),
71
+ obj);
72
+ if (!newscope)
73
+ return NULL;
74
+ JS_LOCK_SCOPE(cx, newscope);
75
+ obj->map = js_HoldObjectMap(cx, &newscope->map);
76
+ scope = (JSScope *) js_DropObjectMap(cx, &scope->map, obj);
77
+ JS_TRANSFER_SCOPE_LOCK(cx, scope, newscope);
78
+ return newscope;
79
+ }
80
+
81
+ /*
82
+ * JSScope uses multiplicative hashing, _a la_ jsdhash.[ch], but specialized
83
+ * to minimize footprint. But if a scope has fewer than SCOPE_HASH_THRESHOLD
84
+ * entries, we use linear search and avoid allocating scope->table.
85
+ */
86
+ #define SCOPE_HASH_THRESHOLD 6
87
+ #define MIN_SCOPE_SIZE_LOG2 4
88
+ #define MIN_SCOPE_SIZE JS_BIT(MIN_SCOPE_SIZE_LOG2)
89
+ #define SCOPE_TABLE_NBYTES(n) ((n) * sizeof(JSScopeProperty *))
90
+
91
+ static void
92
+ InitMinimalScope(JSScope *scope)
93
+ {
94
+ scope->hashShift = JS_DHASH_BITS - MIN_SCOPE_SIZE_LOG2;
95
+ scope->entryCount = scope->removedCount = 0;
96
+ scope->table = NULL;
97
+ scope->lastProp = NULL;
98
+ }
99
+
100
+ static JSBool
101
+ CreateScopeTable(JSScope *scope)
102
+ {
103
+ int sizeLog2;
104
+ JSScopeProperty *sprop, **spp;
105
+
106
+ JS_ASSERT(!scope->table);
107
+ JS_ASSERT(scope->lastProp);
108
+
109
+ if (scope->entryCount > SCOPE_HASH_THRESHOLD) {
110
+ /*
111
+ * Ouch: calloc failed at least once already -- let's try again,
112
+ * overallocating to hold at least twice the current population.
113
+ */
114
+ sizeLog2 = JS_CeilingLog2(2 * scope->entryCount);
115
+ scope->hashShift = JS_DHASH_BITS - sizeLog2;
116
+ } else {
117
+ JS_ASSERT(scope->hashShift == JS_DHASH_BITS - MIN_SCOPE_SIZE_LOG2);
118
+ sizeLog2 = MIN_SCOPE_SIZE_LOG2;
119
+ }
120
+
121
+ scope->table = (JSScopeProperty **)
122
+ calloc(JS_BIT(sizeLog2), sizeof(JSScopeProperty *));
123
+ if (!scope->table)
124
+ return JS_FALSE;
125
+
126
+ scope->hashShift = JS_DHASH_BITS - sizeLog2;
127
+ for (sprop = scope->lastProp; sprop; sprop = sprop->parent) {
128
+ spp = js_SearchScope(scope, sprop->id, JS_TRUE);
129
+ SPROP_STORE_PRESERVING_COLLISION(spp, sprop);
130
+ }
131
+ return JS_TRUE;
132
+ }
133
+
134
+ JSScope *
135
+ js_NewScope(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops, JSClass *clasp,
136
+ JSObject *obj)
137
+ {
138
+ JSScope *scope;
139
+
140
+ scope = (JSScope *) JS_malloc(cx, sizeof(JSScope));
141
+ if (!scope)
142
+ return NULL;
143
+
144
+ js_InitObjectMap(&scope->map, nrefs, ops, clasp);
145
+ scope->object = obj;
146
+ scope->flags = 0;
147
+ InitMinimalScope(scope);
148
+
149
+ #ifdef JS_THREADSAFE
150
+ scope->ownercx = cx;
151
+ memset(&scope->lock, 0, sizeof scope->lock);
152
+
153
+ /*
154
+ * Set u.link = NULL, not u.count = 0, in case the target architecture's
155
+ * null pointer has a non-zero integer representation.
156
+ */
157
+ scope->u.link = NULL;
158
+
159
+ #ifdef DEBUG
160
+ scope->file[0] = scope->file[1] = scope->file[2] = scope->file[3] = NULL;
161
+ scope->line[0] = scope->line[1] = scope->line[2] = scope->line[3] = 0;
162
+ #endif
163
+ #endif
164
+
165
+ JS_RUNTIME_METER(cx->runtime, liveScopes);
166
+ JS_RUNTIME_METER(cx->runtime, totalScopes);
167
+ return scope;
168
+ }
169
+
170
+ #ifdef DEBUG_SCOPE_COUNT
171
+ extern void
172
+ js_unlog_scope(JSScope *scope);
173
+ #endif
174
+
175
+ void
176
+ js_DestroyScope(JSContext *cx, JSScope *scope)
177
+ {
178
+ #ifdef DEBUG_SCOPE_COUNT
179
+ js_unlog_scope(scope);
180
+ #endif
181
+
182
+ #ifdef JS_THREADSAFE
183
+ /* Scope must be single-threaded at this point, so set scope->ownercx. */
184
+ JS_ASSERT(scope->u.count == 0);
185
+ scope->ownercx = cx;
186
+ js_FinishLock(&scope->lock);
187
+ #endif
188
+ if (scope->table)
189
+ JS_free(cx, scope->table);
190
+
191
+ #ifdef DEBUG
192
+ JS_LOCK_RUNTIME_VOID(cx->runtime,
193
+ cx->runtime->liveScopeProps -= scope->entryCount);
194
+ #endif
195
+ JS_RUNTIME_UNMETER(cx->runtime, liveScopes);
196
+ JS_free(cx, scope);
197
+ }
198
+
199
+ #ifdef DUMP_SCOPE_STATS
200
+ typedef struct JSScopeStats {
201
+ jsrefcount searches;
202
+ jsrefcount steps;
203
+ jsrefcount hits;
204
+ jsrefcount misses;
205
+ jsrefcount stepHits;
206
+ jsrefcount stepMisses;
207
+ jsrefcount adds;
208
+ jsrefcount redundantAdds;
209
+ jsrefcount addFailures;
210
+ jsrefcount changeFailures;
211
+ jsrefcount compresses;
212
+ jsrefcount grows;
213
+ jsrefcount removes;
214
+ jsrefcount removeFrees;
215
+ jsrefcount uselessRemoves;
216
+ jsrefcount shrinks;
217
+ } JSScopeStats;
218
+
219
+ JS_FRIEND_DATA(JSScopeStats) js_scope_stats;
220
+
221
+ # define METER(x) JS_ATOMIC_INCREMENT(&js_scope_stats.x)
222
+ #else
223
+ # define METER(x) /* nothing */
224
+ #endif
225
+
226
+ /*
227
+ * Double hashing needs the second hash code to be relatively prime to table
228
+ * size, so we simply make hash2 odd. The inputs to multiplicative hash are
229
+ * the golden ratio, expressed as a fixed-point 32 bit fraction, and the int
230
+ * property index or named property's atom number (observe that most objects
231
+ * have either no indexed properties, or almost all indexed and a few names,
232
+ * so collisions between index and atom number are unlikely).
233
+ */
234
+ #define SCOPE_HASH0(id) (HASH_ID(id) * JS_GOLDEN_RATIO)
235
+ #define SCOPE_HASH1(hash0,shift) ((hash0) >> (shift))
236
+ #define SCOPE_HASH2(hash0,log2,shift) ((((hash0) << (log2)) >> (shift)) | 1)
237
+
238
+ JS_FRIEND_API(JSScopeProperty **)
239
+ js_SearchScope(JSScope *scope, jsid id, JSBool adding)
240
+ {
241
+ JSHashNumber hash0, hash1, hash2;
242
+ int hashShift, sizeLog2;
243
+ JSScopeProperty *stored, *sprop, **spp, **firstRemoved;
244
+ uint32 sizeMask;
245
+
246
+ METER(searches);
247
+ if (!scope->table) {
248
+ /* Not enough properties to justify hashing: search from lastProp. */
249
+ JS_ASSERT(!SCOPE_HAD_MIDDLE_DELETE(scope));
250
+ for (spp = &scope->lastProp; (sprop = *spp); spp = &sprop->parent) {
251
+ if (sprop->id == id) {
252
+ METER(hits);
253
+ return spp;
254
+ }
255
+ }
256
+ METER(misses);
257
+ return spp;
258
+ }
259
+
260
+ /* Compute the primary hash address. */
261
+ hash0 = SCOPE_HASH0(id);
262
+ hashShift = scope->hashShift;
263
+ hash1 = SCOPE_HASH1(hash0, hashShift);
264
+ spp = scope->table + hash1;
265
+
266
+ /* Miss: return space for a new entry. */
267
+ stored = *spp;
268
+ if (SPROP_IS_FREE(stored)) {
269
+ METER(misses);
270
+ return spp;
271
+ }
272
+
273
+ /* Hit: return entry. */
274
+ sprop = SPROP_CLEAR_COLLISION(stored);
275
+ if (sprop && sprop->id == id) {
276
+ METER(hits);
277
+ return spp;
278
+ }
279
+
280
+ /* Collision: double hash. */
281
+ sizeLog2 = JS_DHASH_BITS - hashShift;
282
+ hash2 = SCOPE_HASH2(hash0, sizeLog2, hashShift);
283
+ sizeMask = JS_BITMASK(sizeLog2);
284
+
285
+ /* Save the first removed entry pointer so we can recycle it if adding. */
286
+ if (SPROP_IS_REMOVED(stored)) {
287
+ firstRemoved = spp;
288
+ } else {
289
+ firstRemoved = NULL;
290
+ if (adding && !SPROP_HAD_COLLISION(stored))
291
+ SPROP_FLAG_COLLISION(spp, sprop);
292
+ }
293
+
294
+ for (;;) {
295
+ METER(steps);
296
+ hash1 -= hash2;
297
+ hash1 &= sizeMask;
298
+ spp = scope->table + hash1;
299
+
300
+ stored = *spp;
301
+ if (SPROP_IS_FREE(stored)) {
302
+ METER(stepMisses);
303
+ return (adding && firstRemoved) ? firstRemoved : spp;
304
+ }
305
+
306
+ sprop = SPROP_CLEAR_COLLISION(stored);
307
+ if (sprop && sprop->id == id) {
308
+ METER(stepHits);
309
+ return spp;
310
+ }
311
+
312
+ if (SPROP_IS_REMOVED(stored)) {
313
+ if (!firstRemoved)
314
+ firstRemoved = spp;
315
+ } else {
316
+ if (adding && !SPROP_HAD_COLLISION(stored))
317
+ SPROP_FLAG_COLLISION(spp, sprop);
318
+ }
319
+ }
320
+
321
+ /* NOTREACHED */
322
+ return NULL;
323
+ }
324
+
325
+ static JSBool
326
+ ChangeScope(JSContext *cx, JSScope *scope, int change)
327
+ {
328
+ int oldlog2, newlog2;
329
+ uint32 oldsize, newsize, nbytes;
330
+ JSScopeProperty **table, **oldtable, **spp, **oldspp, *sprop;
331
+
332
+ /* Grow, shrink, or compress by changing scope->table. */
333
+ oldlog2 = JS_DHASH_BITS - scope->hashShift;
334
+ newlog2 = oldlog2 + change;
335
+ oldsize = JS_BIT(oldlog2);
336
+ newsize = JS_BIT(newlog2);
337
+ nbytes = SCOPE_TABLE_NBYTES(newsize);
338
+ table = (JSScopeProperty **) calloc(nbytes, 1);
339
+ if (!table) {
340
+ JS_ReportOutOfMemory(cx);
341
+ return JS_FALSE;
342
+ }
343
+
344
+ /* Now that we have a new table allocated, update scope members. */
345
+ scope->hashShift = JS_DHASH_BITS - newlog2;
346
+ scope->removedCount = 0;
347
+ oldtable = scope->table;
348
+ scope->table = table;
349
+
350
+ /* Copy only live entries, leaving removed and free ones behind. */
351
+ for (oldspp = oldtable; oldsize != 0; oldspp++) {
352
+ sprop = SPROP_FETCH(oldspp);
353
+ if (sprop) {
354
+ spp = js_SearchScope(scope, sprop->id, JS_TRUE);
355
+ JS_ASSERT(SPROP_IS_FREE(*spp));
356
+ *spp = sprop;
357
+ }
358
+ oldsize--;
359
+ }
360
+
361
+ /* Finally, free the old table storage. */
362
+ JS_free(cx, oldtable);
363
+ return JS_TRUE;
364
+ }
365
+
366
+ /*
367
+ * Take care to exclude the mark and duplicate bits, in case we're called from
368
+ * the GC, or we are searching for a property that has not yet been flagged as
369
+ * a duplicate when making a duplicate formal parameter.
370
+ */
371
+ #define SPROP_FLAGS_NOT_MATCHED (SPROP_MARK | SPROP_IS_DUPLICATE)
372
+
373
+ JS_STATIC_DLL_CALLBACK(JSDHashNumber)
374
+ js_HashScopeProperty(JSDHashTable *table, const void *key)
375
+ {
376
+ const JSScopeProperty *sprop = (const JSScopeProperty *)key;
377
+ JSDHashNumber hash;
378
+ JSPropertyOp gsop;
379
+
380
+ /* Accumulate from least to most random so the low bits are most random. */
381
+ hash = 0;
382
+ gsop = sprop->getter;
383
+ if (gsop)
384
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4) ^ (jsword)gsop;
385
+ gsop = sprop->setter;
386
+ if (gsop)
387
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4) ^ (jsword)gsop;
388
+
389
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4)
390
+ ^ (sprop->flags & ~SPROP_FLAGS_NOT_MATCHED);
391
+
392
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4) ^ sprop->attrs;
393
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4) ^ sprop->shortid;
394
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4) ^ sprop->slot;
395
+ hash = (hash >> (JS_DHASH_BITS - 4)) ^ (hash << 4) ^ sprop->id;
396
+ return hash;
397
+ }
398
+
399
+ #define SPROP_MATCH(sprop, child) \
400
+ SPROP_MATCH_PARAMS(sprop, (child)->id, (child)->getter, (child)->setter, \
401
+ (child)->slot, (child)->attrs, (child)->flags, \
402
+ (child)->shortid)
403
+
404
+ #define SPROP_MATCH_PARAMS(sprop, aid, agetter, asetter, aslot, aattrs, \
405
+ aflags, ashortid) \
406
+ ((sprop)->id == (aid) && \
407
+ SPROP_MATCH_PARAMS_AFTER_ID(sprop, agetter, asetter, aslot, aattrs, \
408
+ aflags, ashortid))
409
+
410
+ #define SPROP_MATCH_PARAMS_AFTER_ID(sprop, agetter, asetter, aslot, aattrs, \
411
+ aflags, ashortid) \
412
+ ((sprop)->getter == (agetter) && \
413
+ (sprop)->setter == (asetter) && \
414
+ (sprop)->slot == (aslot) && \
415
+ (sprop)->attrs == (aattrs) && \
416
+ (((sprop)->flags ^ (aflags)) & ~SPROP_FLAGS_NOT_MATCHED) == 0 && \
417
+ (sprop)->shortid == (ashortid))
418
+
419
+ JS_STATIC_DLL_CALLBACK(JSBool)
420
+ js_MatchScopeProperty(JSDHashTable *table,
421
+ const JSDHashEntryHdr *hdr,
422
+ const void *key)
423
+ {
424
+ const JSPropertyTreeEntry *entry = (const JSPropertyTreeEntry *)hdr;
425
+ const JSScopeProperty *sprop = entry->child;
426
+ const JSScopeProperty *kprop = (const JSScopeProperty *)key;
427
+
428
+ return SPROP_MATCH(sprop, kprop);
429
+ }
430
+
431
+ static const JSDHashTableOps PropertyTreeHashOps = {
432
+ JS_DHashAllocTable,
433
+ JS_DHashFreeTable,
434
+ JS_DHashGetKeyStub,
435
+ js_HashScopeProperty,
436
+ js_MatchScopeProperty,
437
+ JS_DHashMoveEntryStub,
438
+ JS_DHashClearEntryStub,
439
+ JS_DHashFinalizeStub,
440
+ NULL
441
+ };
442
+
443
+ /*
444
+ * A property tree node on rt->propertyFreeList overlays the following prefix
445
+ * struct on JSScopeProperty.
446
+ */
447
+ typedef struct FreeNode {
448
+ jsid id;
449
+ JSScopeProperty *next;
450
+ JSScopeProperty **prevp;
451
+ } FreeNode;
452
+
453
+ #define FREENODE(sprop) ((FreeNode *) (sprop))
454
+
455
+ #define FREENODE_INSERT(list, sprop) \
456
+ JS_BEGIN_MACRO \
457
+ FREENODE(sprop)->next = (list); \
458
+ FREENODE(sprop)->prevp = &(list); \
459
+ if (list) \
460
+ FREENODE(list)->prevp = &FREENODE(sprop)->next; \
461
+ (list) = (sprop); \
462
+ JS_END_MACRO
463
+
464
+ #define FREENODE_REMOVE(sprop) \
465
+ JS_BEGIN_MACRO \
466
+ *FREENODE(sprop)->prevp = FREENODE(sprop)->next; \
467
+ if (FREENODE(sprop)->next) \
468
+ FREENODE(FREENODE(sprop)->next)->prevp = FREENODE(sprop)->prevp; \
469
+ JS_END_MACRO
470
+
471
+ /* NB: Called with the runtime lock held. */
472
+ static JSScopeProperty *
473
+ NewScopeProperty(JSRuntime *rt)
474
+ {
475
+ JSScopeProperty *sprop;
476
+
477
+ sprop = rt->propertyFreeList;
478
+ if (sprop) {
479
+ FREENODE_REMOVE(sprop);
480
+ } else {
481
+ JS_ARENA_ALLOCATE_CAST(sprop, JSScopeProperty *,
482
+ &rt->propertyArenaPool,
483
+ sizeof(JSScopeProperty));
484
+ if (!sprop)
485
+ return NULL;
486
+ }
487
+
488
+ JS_RUNTIME_METER(rt, livePropTreeNodes);
489
+ JS_RUNTIME_METER(rt, totalPropTreeNodes);
490
+ return sprop;
491
+ }
492
+
493
+ #define CHUNKY_KIDS_TAG ((jsuword)1)
494
+ #define KIDS_IS_CHUNKY(kids) ((jsuword)(kids) & CHUNKY_KIDS_TAG)
495
+ #define KIDS_TO_CHUNK(kids) ((PropTreeKidsChunk *) \
496
+ ((jsuword)(kids) & ~CHUNKY_KIDS_TAG))
497
+ #define CHUNK_TO_KIDS(chunk) ((JSScopeProperty *) \
498
+ ((jsuword)(chunk) | CHUNKY_KIDS_TAG))
499
+ #define MAX_KIDS_PER_CHUNK 10
500
+
501
+ typedef struct PropTreeKidsChunk PropTreeKidsChunk;
502
+
503
+ struct PropTreeKidsChunk {
504
+ JSScopeProperty *kids[MAX_KIDS_PER_CHUNK];
505
+ PropTreeKidsChunk *next;
506
+ };
507
+
508
+ static PropTreeKidsChunk *
509
+ NewPropTreeKidsChunk(JSRuntime *rt)
510
+ {
511
+ PropTreeKidsChunk *chunk;
512
+
513
+ chunk = calloc(1, sizeof *chunk);
514
+ if (!chunk)
515
+ return NULL;
516
+ JS_ASSERT(((jsuword)chunk & CHUNKY_KIDS_TAG) == 0);
517
+ JS_RUNTIME_METER(rt, propTreeKidsChunks);
518
+ return chunk;
519
+ }
520
+
521
+ static void
522
+ DestroyPropTreeKidsChunk(JSRuntime *rt, PropTreeKidsChunk *chunk)
523
+ {
524
+ JS_RUNTIME_UNMETER(rt, propTreeKidsChunks);
525
+ free(chunk);
526
+ }
527
+
528
+ /* NB: Called with the runtime lock held. */
529
+ static JSBool
530
+ InsertPropertyTreeChild(JSRuntime *rt, JSScopeProperty *parent,
531
+ JSScopeProperty *child)
532
+ {
533
+ JSPropertyTreeEntry *entry;
534
+ JSScopeProperty **childp, *kids, *sprop;
535
+ PropTreeKidsChunk *chunk, **chunkp;
536
+ uintN i;
537
+
538
+ JS_ASSERT(!parent || child->parent != parent);
539
+
540
+ if (!parent) {
541
+ entry = (JSPropertyTreeEntry *)
542
+ JS_DHashTableOperate(&rt->propertyTreeHash, child, JS_DHASH_ADD);
543
+ if (!entry)
544
+ return JS_FALSE;
545
+ childp = &entry->child;
546
+ sprop = *childp;
547
+ if (!sprop) {
548
+ *childp = child;
549
+ } else {
550
+ /*
551
+ * A "Duplicate child" case.
552
+ *
553
+ * We can't do away with child, as at least one live scope entry
554
+ * still points at it. What's more, that scope's lastProp chains
555
+ * through an ancestor line to reach child, and js_Enumerate and
556
+ * others count on this linkage. We must leave child out of the
557
+ * hash table, and not require it to be there when we eventually
558
+ * GC it (see RemovePropertyTreeChild, below).
559
+ *
560
+ * It is necessary to leave the duplicate child out of the hash
561
+ * table to preserve entry uniqueness. It is safe to leave the
562
+ * child out of the hash table (unlike the duplicate child cases
563
+ * below), because the child's parent link will be null, which
564
+ * can't dangle.
565
+ */
566
+ JS_ASSERT(sprop != child && SPROP_MATCH(sprop, child));
567
+ JS_RUNTIME_METER(rt, duplicatePropTreeNodes);
568
+ }
569
+ } else {
570
+ childp = &parent->kids;
571
+ kids = *childp;
572
+ if (kids) {
573
+ if (KIDS_IS_CHUNKY(kids)) {
574
+ chunk = KIDS_TO_CHUNK(kids);
575
+ do {
576
+ for (i = 0; i < MAX_KIDS_PER_CHUNK; i++) {
577
+ childp = &chunk->kids[i];
578
+ sprop = *childp;
579
+ if (!sprop)
580
+ goto insert;
581
+
582
+ JS_ASSERT(sprop != child);
583
+ if (SPROP_MATCH(sprop, child)) {
584
+ /*
585
+ * Duplicate child, see comment above. In this
586
+ * case, we must let the duplicate be inserted at
587
+ * this level in the tree, so we keep iterating,
588
+ * looking for an empty slot in which to insert.
589
+ */
590
+ JS_ASSERT(sprop != child);
591
+ JS_RUNTIME_METER(rt, duplicatePropTreeNodes);
592
+ }
593
+ }
594
+ chunkp = &chunk->next;
595
+ } while ((chunk = *chunkp) != NULL);
596
+
597
+ chunk = NewPropTreeKidsChunk(rt);
598
+ if (!chunk)
599
+ return JS_FALSE;
600
+ *chunkp = chunk;
601
+ childp = &chunk->kids[0];
602
+ } else {
603
+ sprop = kids;
604
+ JS_ASSERT(sprop != child);
605
+ if (SPROP_MATCH(sprop, child)) {
606
+ /*
607
+ * Duplicate child, see comment above. Once again, we
608
+ * must let duplicates created by deletion pile up in a
609
+ * kids-chunk-list, in order to find them when sweeping
610
+ * and thereby avoid dangling parent pointers.
611
+ */
612
+ JS_RUNTIME_METER(rt, duplicatePropTreeNodes);
613
+ }
614
+
615
+ chunk = NewPropTreeKidsChunk(rt);
616
+ if (!chunk)
617
+ return JS_FALSE;
618
+ parent->kids = CHUNK_TO_KIDS(chunk);
619
+ chunk->kids[0] = sprop;
620
+ childp = &chunk->kids[1];
621
+ }
622
+ }
623
+ insert:
624
+ *childp = child;
625
+ }
626
+
627
+ child->parent = parent;
628
+ return JS_TRUE;
629
+ }
630
+
631
+ /* NB: Called with the runtime lock held. */
632
+ static void
633
+ RemovePropertyTreeChild(JSRuntime *rt, JSScopeProperty *child)
634
+ {
635
+ JSPropertyTreeEntry *entry;
636
+ JSScopeProperty *parent, *kids, *kid;
637
+ PropTreeKidsChunk *list, *chunk, **chunkp, *lastChunk;
638
+ uintN i, j;
639
+
640
+ parent = child->parent;
641
+ if (!parent) {
642
+ /*
643
+ * Don't remove child if it is not in rt->propertyTreeHash, but only
644
+ * matches a root child in the table that has compatible members. See
645
+ * the "Duplicate child" comments in InsertPropertyTreeChild, above.
646
+ */
647
+ entry = (JSPropertyTreeEntry *)
648
+ JS_DHashTableOperate(&rt->propertyTreeHash, child, JS_DHASH_LOOKUP);
649
+
650
+ if (entry->child == child)
651
+ JS_DHashTableRawRemove(&rt->propertyTreeHash, &entry->hdr);
652
+ } else {
653
+ kids = parent->kids;
654
+ if (KIDS_IS_CHUNKY(kids)) {
655
+ list = chunk = KIDS_TO_CHUNK(kids);
656
+ chunkp = &list;
657
+
658
+ do {
659
+ for (i = 0; i < MAX_KIDS_PER_CHUNK; i++) {
660
+ if (chunk->kids[i] == child) {
661
+ lastChunk = chunk;
662
+ if (!lastChunk->next) {
663
+ j = i + 1;
664
+ } else {
665
+ j = 0;
666
+ do {
667
+ chunkp = &lastChunk->next;
668
+ lastChunk = *chunkp;
669
+ } while (lastChunk->next);
670
+ }
671
+ for (; j < MAX_KIDS_PER_CHUNK; j++) {
672
+ if (!lastChunk->kids[j])
673
+ break;
674
+ }
675
+ --j;
676
+ if (chunk != lastChunk || j > i)
677
+ chunk->kids[i] = lastChunk->kids[j];
678
+ lastChunk->kids[j] = NULL;
679
+ if (j == 0) {
680
+ *chunkp = NULL;
681
+ if (!list)
682
+ parent->kids = NULL;
683
+ DestroyPropTreeKidsChunk(rt, lastChunk);
684
+ }
685
+ return;
686
+ }
687
+ }
688
+
689
+ chunkp = &chunk->next;
690
+ } while ((chunk = *chunkp) != NULL);
691
+ } else {
692
+ kid = kids;
693
+ if (kid == child)
694
+ parent->kids = NULL;
695
+ }
696
+ }
697
+ }
698
+
699
+ /*
700
+ * Called *without* the runtime lock held, this function acquires that lock
701
+ * only when inserting a new child. Thus there may be races to find or add
702
+ * a node that result in duplicates. We expect such races to be rare!
703
+ */
704
+ static JSScopeProperty *
705
+ GetPropertyTreeChild(JSContext *cx, JSScopeProperty *parent,
706
+ JSScopeProperty *child)
707
+ {
708
+ JSRuntime *rt;
709
+ JSPropertyTreeEntry *entry;
710
+ JSScopeProperty *sprop;
711
+ PropTreeKidsChunk *chunk;
712
+ uintN i;
713
+
714
+ rt = cx->runtime;
715
+ if (!parent) {
716
+ JS_LOCK_RUNTIME(rt);
717
+
718
+ entry = (JSPropertyTreeEntry *)
719
+ JS_DHashTableOperate(&rt->propertyTreeHash, child, JS_DHASH_ADD);
720
+ if (!entry)
721
+ goto out_of_memory;
722
+
723
+ sprop = entry->child;
724
+ if (sprop)
725
+ goto out;
726
+ } else {
727
+ /*
728
+ * Because chunks are appended at the end and never deleted except by
729
+ * the GC, we can search without taking the runtime lock. We may miss
730
+ * a matching sprop added by another thread, and make a duplicate one,
731
+ * but that is an unlikely, therefore small, cost. The property tree
732
+ * has extremely low fan-out below its root in popular embeddings with
733
+ * real-world workloads.
734
+ *
735
+ * If workload changes so as to increase fan-out significantly below
736
+ * the property tree root, we'll want to add another tag bit stored in
737
+ * parent->kids that indicates a JSDHashTable pointer.
738
+ */
739
+ entry = NULL;
740
+ sprop = parent->kids;
741
+ if (sprop) {
742
+ if (KIDS_IS_CHUNKY(sprop)) {
743
+ chunk = KIDS_TO_CHUNK(sprop);
744
+ do {
745
+ for (i = 0; i < MAX_KIDS_PER_CHUNK; i++) {
746
+ sprop = chunk->kids[i];
747
+ if (!sprop)
748
+ goto not_found;
749
+
750
+ if (SPROP_MATCH(sprop, child))
751
+ return sprop;
752
+ }
753
+ } while ((chunk = chunk->next) != NULL);
754
+ } else {
755
+ if (SPROP_MATCH(sprop, child))
756
+ return sprop;
757
+ }
758
+ }
759
+
760
+ not_found:
761
+ JS_LOCK_RUNTIME(rt);
762
+ }
763
+
764
+ sprop = NewScopeProperty(rt);
765
+ if (!sprop)
766
+ goto out_of_memory;
767
+
768
+ sprop->id = child->id;
769
+ sprop->getter = child->getter;
770
+ sprop->setter = child->setter;
771
+ sprop->slot = child->slot;
772
+ sprop->attrs = child->attrs;
773
+ sprop->flags = child->flags;
774
+ sprop->shortid = child->shortid;
775
+ sprop->parent = sprop->kids = NULL;
776
+ if (!parent) {
777
+ entry->child = sprop;
778
+ } else {
779
+ if (!InsertPropertyTreeChild(rt, parent, sprop))
780
+ goto out_of_memory;
781
+ }
782
+
783
+ out:
784
+ JS_UNLOCK_RUNTIME(rt);
785
+ return sprop;
786
+
787
+ out_of_memory:
788
+ JS_UNLOCK_RUNTIME(rt);
789
+ JS_ReportOutOfMemory(cx);
790
+ return NULL;
791
+ }
792
+
793
+ #ifdef DEBUG_notbrendan
794
+ #define CHECK_ANCESTOR_LINE(scope, sparse) \
795
+ JS_BEGIN_MACRO \
796
+ if ((scope)->table) CheckAncestorLine(scope, sparse); \
797
+ JS_END_MACRO
798
+
799
+ static void
800
+ CheckAncestorLine(JSScope *scope, JSBool sparse)
801
+ {
802
+ uint32 size;
803
+ JSScopeProperty **spp, **start, **end, *ancestorLine, *sprop, *aprop;
804
+ uint32 entryCount, ancestorCount;
805
+
806
+ ancestorLine = SCOPE_LAST_PROP(scope);
807
+ if (ancestorLine)
808
+ JS_ASSERT(SCOPE_HAS_PROPERTY(scope, ancestorLine));
809
+
810
+ entryCount = 0;
811
+ size = SCOPE_CAPACITY(scope);
812
+ start = scope->table;
813
+ for (spp = start, end = start + size; spp < end; spp++) {
814
+ sprop = SPROP_FETCH(spp);
815
+ if (sprop) {
816
+ entryCount++;
817
+ for (aprop = ancestorLine; aprop; aprop = aprop->parent) {
818
+ if (aprop == sprop)
819
+ break;
820
+ }
821
+ JS_ASSERT(aprop);
822
+ }
823
+ }
824
+ JS_ASSERT(entryCount == scope->entryCount);
825
+
826
+ ancestorCount = 0;
827
+ for (sprop = ancestorLine; sprop; sprop = sprop->parent) {
828
+ if (SCOPE_HAD_MIDDLE_DELETE(scope) &&
829
+ !SCOPE_HAS_PROPERTY(scope, sprop)) {
830
+ JS_ASSERT(sparse || (sprop->flags & SPROP_IS_DUPLICATE));
831
+ continue;
832
+ }
833
+ ancestorCount++;
834
+ }
835
+ JS_ASSERT(ancestorCount == scope->entryCount);
836
+ }
837
+ #else
838
+ #define CHECK_ANCESTOR_LINE(scope, sparse) /* nothing */
839
+ #endif
840
+
841
+ static void
842
+ ReportReadOnlyScope(JSContext *cx, JSScope *scope)
843
+ {
844
+ JSString *str;
845
+
846
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(scope->object));
847
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_READ_ONLY,
848
+ str
849
+ ? JS_GetStringBytes(str)
850
+ : LOCKED_OBJ_GET_CLASS(scope->object)->name);
851
+ }
852
+
853
+ JSScopeProperty *
854
+ js_AddScopeProperty(JSContext *cx, JSScope *scope, jsid id,
855
+ JSPropertyOp getter, JSPropertyOp setter, uint32 slot,
856
+ uintN attrs, uintN flags, intN shortid)
857
+ {
858
+ JSScopeProperty **spp, *sprop, *overwriting, **spvec, **spp2, child;
859
+ uint32 size, splen, i;
860
+ int change;
861
+
862
+ JS_ASSERT(JS_IS_SCOPE_LOCKED(cx, scope));
863
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
864
+
865
+ /*
866
+ * You can't add properties to a sealed scope. But note well that you can
867
+ * change property attributes in a sealed scope, even though that replaces
868
+ * a JSScopeProperty * in the scope's hash table -- but no id is added, so
869
+ * the scope remains sealed.
870
+ */
871
+ if (SCOPE_IS_SEALED(scope)) {
872
+ ReportReadOnlyScope(cx, scope);
873
+ return NULL;
874
+ }
875
+
876
+ /*
877
+ * Normalize stub getter and setter values for faster is-stub testing in
878
+ * the SPROP_CALL_[GS]ETTER macros.
879
+ */
880
+ if (getter == JS_PropertyStub)
881
+ getter = NULL;
882
+ if (setter == JS_PropertyStub)
883
+ setter = NULL;
884
+
885
+ /*
886
+ * Search for id in order to claim its entry, allocating a property tree
887
+ * node if one doesn't already exist for our parameters.
888
+ */
889
+ spp = js_SearchScope(scope, id, JS_TRUE);
890
+ sprop = overwriting = SPROP_FETCH(spp);
891
+ if (!sprop) {
892
+ /* Check whether we need to grow, if the load factor is >= .75. */
893
+ size = SCOPE_CAPACITY(scope);
894
+ if (scope->entryCount + scope->removedCount >= size - (size >> 2)) {
895
+ if (scope->removedCount >= size >> 2) {
896
+ METER(compresses);
897
+ change = 0;
898
+ } else {
899
+ METER(grows);
900
+ change = 1;
901
+ }
902
+ if (!ChangeScope(cx, scope, change) &&
903
+ scope->entryCount + scope->removedCount == size - 1) {
904
+ METER(addFailures);
905
+ return NULL;
906
+ }
907
+ spp = js_SearchScope(scope, id, JS_TRUE);
908
+ JS_ASSERT(!SPROP_FETCH(spp));
909
+ }
910
+ } else {
911
+ /* Property exists: js_SearchScope must have returned a valid entry. */
912
+ JS_ASSERT(!SPROP_IS_REMOVED(*spp));
913
+
914
+ /*
915
+ * If all property members match, this is a redundant add and we can
916
+ * return early. If the caller wants to allocate a slot, but doesn't
917
+ * care which slot, copy sprop->slot into slot so we can match sprop,
918
+ * if all other members match.
919
+ */
920
+ if (!(attrs & JSPROP_SHARED) &&
921
+ slot == SPROP_INVALID_SLOT &&
922
+ SPROP_HAS_VALID_SLOT(sprop, scope)) {
923
+ slot = sprop->slot;
924
+ }
925
+ if (SPROP_MATCH_PARAMS_AFTER_ID(sprop, getter, setter, slot, attrs,
926
+ flags, shortid)) {
927
+ METER(redundantAdds);
928
+ return sprop;
929
+ }
930
+
931
+ /*
932
+ * Duplicate formal parameters require us to leave the old property
933
+ * on the ancestor line, so the decompiler can find it, even though
934
+ * its entry in scope->table is overwritten to point at a new property
935
+ * descending from the old one. The SPROP_IS_DUPLICATE flag helps us
936
+ * cope with the consequent disparity between ancestor line height and
937
+ * scope->entryCount.
938
+ */
939
+ if (flags & SPROP_IS_DUPLICATE) {
940
+ sprop->flags |= SPROP_IS_DUPLICATE;
941
+ } else {
942
+ /*
943
+ * If we are clearing sprop to force an existing property to be
944
+ * overwritten (apart from a duplicate formal parameter), we must
945
+ * unlink it from the ancestor line at scope->lastProp, lazily if
946
+ * sprop is not lastProp. And we must remove the entry at *spp,
947
+ * precisely so the lazy "middle delete" fixup code further below
948
+ * won't find sprop in scope->table, in spite of sprop being on
949
+ * the ancestor line.
950
+ *
951
+ * When we finally succeed in finding or creating a new sprop
952
+ * and storing its pointer at *spp, we'll use the |overwriting|
953
+ * local saved when we first looked up id to decide whether we're
954
+ * indeed creating a new entry, or merely overwriting an existing
955
+ * property.
956
+ */
957
+ if (sprop == SCOPE_LAST_PROP(scope)) {
958
+ do {
959
+ SCOPE_REMOVE_LAST_PROP(scope);
960
+ if (!SCOPE_HAD_MIDDLE_DELETE(scope))
961
+ break;
962
+ sprop = SCOPE_LAST_PROP(scope);
963
+ } while (sprop && !SCOPE_HAS_PROPERTY(scope, sprop));
964
+ } else if (!SCOPE_HAD_MIDDLE_DELETE(scope)) {
965
+ /*
966
+ * If we have no hash table yet, we need one now. The middle
967
+ * delete code is simple-minded that way!
968
+ */
969
+ if (!scope->table) {
970
+ if (!CreateScopeTable(scope)) {
971
+ JS_ReportOutOfMemory(cx);
972
+ return NULL;
973
+ }
974
+ spp = js_SearchScope(scope, id, JS_TRUE);
975
+ sprop = overwriting = SPROP_FETCH(spp);
976
+ }
977
+ SCOPE_SET_MIDDLE_DELETE(scope);
978
+ }
979
+ }
980
+
981
+ /*
982
+ * If we fail later on trying to find or create a new sprop, we will
983
+ * goto fail_overwrite and restore *spp from |overwriting|. Note that
984
+ * we don't bother to keep scope->removedCount in sync, because we'll
985
+ * fix up *spp and scope->entryCount shortly, no matter how control
986
+ * flow returns from this function.
987
+ */
988
+ if (scope->table)
989
+ SPROP_STORE_PRESERVING_COLLISION(spp, NULL);
990
+ scope->entryCount--;
991
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
992
+ sprop = NULL;
993
+ }
994
+
995
+ if (!sprop) {
996
+ /*
997
+ * If properties were deleted from the middle of the list starting at
998
+ * scope->lastProp, we may need to fork the property tree and squeeze
999
+ * all deleted properties out of scope's ancestor line. Otherwise we
1000
+ * risk adding a node with the same id as a "middle" node, violating
1001
+ * the rule that properties along an ancestor line have distinct ids
1002
+ * (unless flagged SPROP_IS_DUPLICATE).
1003
+ */
1004
+ if (SCOPE_HAD_MIDDLE_DELETE(scope)) {
1005
+ JS_ASSERT(scope->table);
1006
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1007
+
1008
+ splen = scope->entryCount;
1009
+ if (splen == 0) {
1010
+ JS_ASSERT(scope->lastProp == NULL);
1011
+ } else {
1012
+ /*
1013
+ * Enumerate live entries in scope->table using a temporary
1014
+ * vector, by walking the (possibly sparse, due to deletions)
1015
+ * ancestor line from scope->lastProp.
1016
+ */
1017
+ spvec = (JSScopeProperty **)
1018
+ JS_malloc(cx, SCOPE_TABLE_NBYTES(splen));
1019
+ if (!spvec)
1020
+ goto fail_overwrite;
1021
+ i = splen;
1022
+ sprop = SCOPE_LAST_PROP(scope);
1023
+ JS_ASSERT(sprop);
1024
+ do {
1025
+ /*
1026
+ * NB: test SCOPE_GET_PROPERTY, not SCOPE_HAS_PROPERTY --
1027
+ * the latter insists that sprop->id maps to sprop, while
1028
+ * the former simply tests whether sprop->id is bound in
1029
+ * scope. We must allow for duplicate formal parameters
1030
+ * along the ancestor line, and fork them as needed.
1031
+ */
1032
+ if (!SCOPE_GET_PROPERTY(scope, sprop->id))
1033
+ continue;
1034
+
1035
+ JS_ASSERT(sprop != overwriting);
1036
+ if (i == 0) {
1037
+ /*
1038
+ * If our original splen estimate, scope->entryCount,
1039
+ * is less than the ancestor line height, there must
1040
+ * be duplicate formal parameters in this (function
1041
+ * object) scope. Count remaining ancestors in order
1042
+ * to realloc spvec.
1043
+ */
1044
+ JSScopeProperty *tmp = sprop;
1045
+ do {
1046
+ if (SCOPE_GET_PROPERTY(scope, tmp->id))
1047
+ i++;
1048
+ } while ((tmp = tmp->parent) != NULL);
1049
+ spp2 = (JSScopeProperty **)
1050
+ JS_realloc(cx, spvec, SCOPE_TABLE_NBYTES(splen+i));
1051
+ if (!spp2) {
1052
+ JS_free(cx, spvec);
1053
+ goto fail_overwrite;
1054
+ }
1055
+
1056
+ spvec = spp2;
1057
+ memmove(spvec + i, spvec, SCOPE_TABLE_NBYTES(splen));
1058
+ splen += i;
1059
+ }
1060
+
1061
+ spvec[--i] = sprop;
1062
+ } while ((sprop = sprop->parent) != NULL);
1063
+ JS_ASSERT(i == 0);
1064
+
1065
+ /*
1066
+ * Now loop forward through spvec, forking the property tree
1067
+ * whenever we see a "parent gap" due to deletions from scope.
1068
+ * NB: sprop is null on first entry to the loop body.
1069
+ */
1070
+ do {
1071
+ if (spvec[i]->parent == sprop) {
1072
+ sprop = spvec[i];
1073
+ } else {
1074
+ sprop = GetPropertyTreeChild(cx, sprop, spvec[i]);
1075
+ if (!sprop) {
1076
+ JS_free(cx, spvec);
1077
+ goto fail_overwrite;
1078
+ }
1079
+
1080
+ spp2 = js_SearchScope(scope, sprop->id, JS_FALSE);
1081
+ JS_ASSERT(SPROP_FETCH(spp2) == spvec[i]);
1082
+ SPROP_STORE_PRESERVING_COLLISION(spp2, sprop);
1083
+ }
1084
+ } while (++i < splen);
1085
+ JS_free(cx, spvec);
1086
+
1087
+ /*
1088
+ * Now sprop points to the last property in scope, where the
1089
+ * ancestor line from sprop to the root is dense w.r.t. scope:
1090
+ * it contains no nodes not mapped by scope->table, apart from
1091
+ * any stinking ECMA-mandated duplicate formal parameters.
1092
+ */
1093
+ scope->lastProp = sprop;
1094
+ CHECK_ANCESTOR_LINE(scope, JS_FALSE);
1095
+ JS_RUNTIME_METER(cx->runtime, middleDeleteFixups);
1096
+ }
1097
+
1098
+ SCOPE_CLR_MIDDLE_DELETE(scope);
1099
+ }
1100
+
1101
+ /*
1102
+ * Aliases share another property's slot, passed in the |slot| param.
1103
+ * Shared properties have no slot. Unshared properties that do not
1104
+ * alias another property's slot get one here, but may lose it due to
1105
+ * a JS_ClearScope call.
1106
+ */
1107
+ if (!(flags & SPROP_IS_ALIAS)) {
1108
+ if (attrs & JSPROP_SHARED) {
1109
+ slot = SPROP_INVALID_SLOT;
1110
+ } else {
1111
+ /*
1112
+ * We may have set slot from a nearly-matching sprop, above.
1113
+ * If so, we're overwriting that nearly-matching sprop, so we
1114
+ * can reuse its slot -- we don't need to allocate a new one.
1115
+ * Callers should therefore pass SPROP_INVALID_SLOT for all
1116
+ * non-alias, unshared property adds.
1117
+ */
1118
+ if (slot != SPROP_INVALID_SLOT)
1119
+ JS_ASSERT(overwriting);
1120
+ else if (!js_AllocSlot(cx, scope->object, &slot))
1121
+ goto fail_overwrite;
1122
+ }
1123
+ }
1124
+
1125
+ /*
1126
+ * Check for a watchpoint on a deleted property; if one exists, change
1127
+ * setter to js_watch_set.
1128
+ * XXXbe this could get expensive with lots of watchpoints...
1129
+ */
1130
+ if (!JS_CLIST_IS_EMPTY(&cx->runtime->watchPointList) &&
1131
+ js_FindWatchPoint(cx->runtime, scope, id)) {
1132
+ setter = js_WrapWatchedSetter(cx, id, attrs, setter);
1133
+ if (!setter)
1134
+ goto fail_overwrite;
1135
+ }
1136
+
1137
+ /* Find or create a property tree node labeled by our arguments. */
1138
+ child.id = id;
1139
+ child.getter = getter;
1140
+ child.setter = setter;
1141
+ child.slot = slot;
1142
+ child.attrs = attrs;
1143
+ child.flags = flags;
1144
+ child.shortid = shortid;
1145
+ sprop = GetPropertyTreeChild(cx, scope->lastProp, &child);
1146
+ if (!sprop)
1147
+ goto fail_overwrite;
1148
+
1149
+ /* Store the tree node pointer in the table entry for id. */
1150
+ if (scope->table)
1151
+ SPROP_STORE_PRESERVING_COLLISION(spp, sprop);
1152
+ scope->entryCount++;
1153
+ scope->lastProp = sprop;
1154
+ CHECK_ANCESTOR_LINE(scope, JS_FALSE);
1155
+ if (!overwriting) {
1156
+ JS_RUNTIME_METER(cx->runtime, liveScopeProps);
1157
+ JS_RUNTIME_METER(cx->runtime, totalScopeProps);
1158
+ }
1159
+
1160
+ /*
1161
+ * If we reach the hashing threshold, try to allocate scope->table.
1162
+ * If we can't (a rare event, preceded by swapping to death on most
1163
+ * modern OSes), stick with linear search rather than whining about
1164
+ * this little set-back. Therefore we must test !scope->table and
1165
+ * scope->entryCount >= SCOPE_HASH_THRESHOLD, not merely whether the
1166
+ * entry count just reached the threshold.
1167
+ */
1168
+ if (!scope->table && scope->entryCount >= SCOPE_HASH_THRESHOLD)
1169
+ (void) CreateScopeTable(scope);
1170
+ }
1171
+
1172
+ METER(adds);
1173
+ return sprop;
1174
+
1175
+ fail_overwrite:
1176
+ if (overwriting) {
1177
+ /*
1178
+ * We may or may not have forked overwriting out of scope's ancestor
1179
+ * line, so we must check (the alternative is to set a flag above, but
1180
+ * that hurts the common, non-error case). If we did fork overwriting
1181
+ * out, we'll add it back at scope->lastProp. This means enumeration
1182
+ * order can change due to a failure to overwrite an id.
1183
+ * XXXbe very minor incompatibility
1184
+ */
1185
+ for (sprop = SCOPE_LAST_PROP(scope); ; sprop = sprop->parent) {
1186
+ if (!sprop) {
1187
+ sprop = SCOPE_LAST_PROP(scope);
1188
+ if (overwriting->parent == sprop) {
1189
+ scope->lastProp = overwriting;
1190
+ } else {
1191
+ sprop = GetPropertyTreeChild(cx, sprop, overwriting);
1192
+ if (sprop) {
1193
+ JS_ASSERT(sprop != overwriting);
1194
+ scope->lastProp = sprop;
1195
+ }
1196
+ overwriting = sprop;
1197
+ }
1198
+ break;
1199
+ }
1200
+ if (sprop == overwriting)
1201
+ break;
1202
+ }
1203
+ if (overwriting) {
1204
+ if (scope->table)
1205
+ SPROP_STORE_PRESERVING_COLLISION(spp, overwriting);
1206
+ scope->entryCount++;
1207
+ }
1208
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1209
+ }
1210
+ METER(addFailures);
1211
+ return NULL;
1212
+ }
1213
+
1214
+ JSScopeProperty *
1215
+ js_ChangeScopePropertyAttrs(JSContext *cx, JSScope *scope,
1216
+ JSScopeProperty *sprop, uintN attrs, uintN mask,
1217
+ JSPropertyOp getter, JSPropertyOp setter)
1218
+ {
1219
+ JSScopeProperty child, *newsprop, **spp;
1220
+
1221
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1222
+
1223
+ /* Allow only shared (slot-less) => unshared (slot-full) transition. */
1224
+ attrs |= sprop->attrs & mask;
1225
+ JS_ASSERT(!((attrs ^ sprop->attrs) & JSPROP_SHARED) ||
1226
+ !(attrs & JSPROP_SHARED));
1227
+ if (getter == JS_PropertyStub)
1228
+ getter = NULL;
1229
+ if (setter == JS_PropertyStub)
1230
+ setter = NULL;
1231
+ if (sprop->attrs == attrs &&
1232
+ sprop->getter == getter &&
1233
+ sprop->setter == setter) {
1234
+ return sprop;
1235
+ }
1236
+
1237
+ child.id = sprop->id;
1238
+ child.getter = getter;
1239
+ child.setter = setter;
1240
+ child.slot = sprop->slot;
1241
+ child.attrs = attrs;
1242
+ child.flags = sprop->flags;
1243
+ child.shortid = sprop->shortid;
1244
+
1245
+ if (SCOPE_LAST_PROP(scope) == sprop) {
1246
+ /*
1247
+ * Optimize the case where the last property added to scope is changed
1248
+ * to have a different attrs, getter, or setter. In the last property
1249
+ * case, we need not fork the property tree. But since we do not call
1250
+ * js_AddScopeProperty, we may need to allocate a new slot directly.
1251
+ */
1252
+ if ((sprop->attrs & JSPROP_SHARED) && !(attrs & JSPROP_SHARED)) {
1253
+ JS_ASSERT(child.slot == SPROP_INVALID_SLOT);
1254
+ if (!js_AllocSlot(cx, scope->object, &child.slot))
1255
+ return NULL;
1256
+ }
1257
+
1258
+ newsprop = GetPropertyTreeChild(cx, sprop->parent, &child);
1259
+ if (newsprop) {
1260
+ spp = js_SearchScope(scope, sprop->id, JS_FALSE);
1261
+ JS_ASSERT(SPROP_FETCH(spp) == sprop);
1262
+
1263
+ if (scope->table)
1264
+ SPROP_STORE_PRESERVING_COLLISION(spp, newsprop);
1265
+ scope->lastProp = newsprop;
1266
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1267
+ }
1268
+ } else {
1269
+ /*
1270
+ * Let js_AddScopeProperty handle this |overwriting| case, including
1271
+ * the conservation of sprop->slot (if it's valid). We must not call
1272
+ * js_RemoveScopeProperty here, it will free a valid sprop->slot and
1273
+ * js_AddScopeProperty won't re-allocate it.
1274
+ */
1275
+ newsprop = js_AddScopeProperty(cx, scope, child.id,
1276
+ child.getter, child.setter, child.slot,
1277
+ child.attrs, child.flags, child.shortid);
1278
+ }
1279
+
1280
+ #ifdef DUMP_SCOPE_STATS
1281
+ if (!newsprop)
1282
+ METER(changeFailures);
1283
+ #endif
1284
+ return newsprop;
1285
+ }
1286
+
1287
+ JSBool
1288
+ js_RemoveScopeProperty(JSContext *cx, JSScope *scope, jsid id)
1289
+ {
1290
+ JSScopeProperty **spp, *stored, *sprop;
1291
+ uint32 size;
1292
+
1293
+ JS_ASSERT(JS_IS_SCOPE_LOCKED(cx, scope));
1294
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1295
+ if (SCOPE_IS_SEALED(scope)) {
1296
+ ReportReadOnlyScope(cx, scope);
1297
+ return JS_FALSE;
1298
+ }
1299
+ METER(removes);
1300
+
1301
+ spp = js_SearchScope(scope, id, JS_FALSE);
1302
+ stored = *spp;
1303
+ sprop = SPROP_CLEAR_COLLISION(stored);
1304
+ if (!sprop) {
1305
+ METER(uselessRemoves);
1306
+ return JS_TRUE;
1307
+ }
1308
+
1309
+ /* Convert from a list to a hash so we can handle "middle deletes". */
1310
+ if (!scope->table && sprop != scope->lastProp) {
1311
+ if (!CreateScopeTable(scope)) {
1312
+ JS_ReportOutOfMemory(cx);
1313
+ return JS_FALSE;
1314
+ }
1315
+ spp = js_SearchScope(scope, id, JS_FALSE);
1316
+ stored = *spp;
1317
+ sprop = SPROP_CLEAR_COLLISION(stored);
1318
+ }
1319
+
1320
+ /* First, if sprop is unshared and not cleared, free its slot number. */
1321
+ if (SPROP_HAS_VALID_SLOT(sprop, scope))
1322
+ js_FreeSlot(cx, scope->object, sprop->slot);
1323
+
1324
+ /* Next, remove id by setting its entry to a removed or free sentinel. */
1325
+ if (SPROP_HAD_COLLISION(stored)) {
1326
+ JS_ASSERT(scope->table);
1327
+ *spp = SPROP_REMOVED;
1328
+ scope->removedCount++;
1329
+ } else {
1330
+ METER(removeFrees);
1331
+ if (scope->table)
1332
+ *spp = NULL;
1333
+ }
1334
+ scope->entryCount--;
1335
+ JS_RUNTIME_UNMETER(cx->runtime, liveScopeProps);
1336
+
1337
+ /* Update scope->lastProp directly, or set its deferred update flag. */
1338
+ if (sprop == SCOPE_LAST_PROP(scope)) {
1339
+ do {
1340
+ SCOPE_REMOVE_LAST_PROP(scope);
1341
+ if (!SCOPE_HAD_MIDDLE_DELETE(scope))
1342
+ break;
1343
+ sprop = SCOPE_LAST_PROP(scope);
1344
+ } while (sprop && !SCOPE_HAS_PROPERTY(scope, sprop));
1345
+ } else if (!SCOPE_HAD_MIDDLE_DELETE(scope)) {
1346
+ SCOPE_SET_MIDDLE_DELETE(scope);
1347
+ }
1348
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1349
+
1350
+ /* Last, consider shrinking scope's table if its load factor is <= .25. */
1351
+ size = SCOPE_CAPACITY(scope);
1352
+ if (size > MIN_SCOPE_SIZE && scope->entryCount <= size >> 2) {
1353
+ METER(shrinks);
1354
+ (void) ChangeScope(cx, scope, -1);
1355
+ }
1356
+
1357
+ return JS_TRUE;
1358
+ }
1359
+
1360
+ void
1361
+ js_ClearScope(JSContext *cx, JSScope *scope)
1362
+ {
1363
+ CHECK_ANCESTOR_LINE(scope, JS_TRUE);
1364
+ #ifdef DEBUG
1365
+ JS_LOCK_RUNTIME_VOID(cx->runtime,
1366
+ cx->runtime->liveScopeProps -= scope->entryCount);
1367
+ #endif
1368
+
1369
+ if (scope->table)
1370
+ free(scope->table);
1371
+ SCOPE_CLR_MIDDLE_DELETE(scope);
1372
+ InitMinimalScope(scope);
1373
+ }
1374
+
1375
+ #ifdef DUMP_SCOPE_STATS
1376
+
1377
+ #include <stdio.h>
1378
+ #include <math.h>
1379
+
1380
+ uint32 js_nkids_max;
1381
+ uint32 js_nkids_sum;
1382
+ double js_nkids_sqsum;
1383
+ uint32 js_nkids_hist[11];
1384
+
1385
+ static void
1386
+ MeterKidCount(uintN nkids)
1387
+ {
1388
+ if (nkids) {
1389
+ js_nkids_sum += nkids;
1390
+ js_nkids_sqsum += (double)nkids * nkids;
1391
+ if (nkids > js_nkids_max)
1392
+ js_nkids_max = nkids;
1393
+ }
1394
+ js_nkids_hist[JS_MIN(nkids, 10)]++;
1395
+ }
1396
+
1397
+ static void
1398
+ MeterPropertyTree(JSScopeProperty *node)
1399
+ {
1400
+ uintN i, nkids;
1401
+ JSScopeProperty *kids, *kid;
1402
+ PropTreeKidsChunk *chunk;
1403
+
1404
+ nkids = 0;
1405
+ kids = node->kids;
1406
+ if (kids) {
1407
+ if (KIDS_IS_CHUNKY(kids)) {
1408
+ for (chunk = KIDS_TO_CHUNK(kids); chunk; chunk = chunk->next) {
1409
+ for (i = 0; i < MAX_KIDS_PER_CHUNK; i++) {
1410
+ kid = chunk->kids[i];
1411
+ if (!kid)
1412
+ break;
1413
+ MeterPropertyTree(kid);
1414
+ nkids++;
1415
+ }
1416
+ }
1417
+ } else {
1418
+ MeterPropertyTree(kids);
1419
+ nkids = 1;
1420
+ }
1421
+ }
1422
+
1423
+ MeterKidCount(nkids);
1424
+ }
1425
+
1426
+ JS_STATIC_DLL_CALLBACK(JSDHashOperator)
1427
+ js_MeterPropertyTree(JSDHashTable *table, JSDHashEntryHdr *hdr, uint32 number,
1428
+ void *arg)
1429
+ {
1430
+ JSPropertyTreeEntry *entry = (JSPropertyTreeEntry *)hdr;
1431
+
1432
+ MeterPropertyTree(entry->child);
1433
+ return JS_DHASH_NEXT;
1434
+ }
1435
+
1436
+ #include "jsprf.h"
1437
+
1438
+ static void
1439
+ DumpSubtree(JSScopeProperty *sprop, int level, FILE *fp)
1440
+ {
1441
+ char buf[10];
1442
+ JSScopeProperty *kids, *kid;
1443
+ PropTreeKidsChunk *chunk;
1444
+ uintN i;
1445
+
1446
+ fprintf(fp, "%*sid %s g/s %p/%p slot %lu attrs %x flags %x shortid %d\n",
1447
+ level, "",
1448
+ JSVAL_IS_INT(sprop->id)
1449
+ ? (JS_snprintf(buf, sizeof buf, "%ld", JSVAL_TO_INT(sprop->id)),
1450
+ buf)
1451
+ : JS_GetStringBytes(ATOM_TO_STRING((JSAtom *) sprop->id)),
1452
+ (void *) sprop->getter, (void *) sprop->setter,
1453
+ (unsigned long) sprop->slot, sprop->attrs, sprop->flags,
1454
+ sprop->shortid);
1455
+ kids = sprop->kids;
1456
+ if (kids) {
1457
+ ++level;
1458
+ if (KIDS_IS_CHUNKY(kids)) {
1459
+ chunk = KIDS_TO_CHUNK(kids);
1460
+ do {
1461
+ for (i = 0; i < MAX_KIDS_PER_CHUNK; i++) {
1462
+ kid = chunk->kids[i];
1463
+ if (!kid)
1464
+ break;
1465
+ JS_ASSERT(kid->parent == sprop);
1466
+ DumpSubtree(kid, level, fp);
1467
+ }
1468
+ } while ((chunk = chunk->next) != NULL);
1469
+ } else {
1470
+ kid = kids;
1471
+ DumpSubtree(kid, level, fp);
1472
+ }
1473
+ }
1474
+ }
1475
+
1476
+ #endif /* DUMP_SCOPE_STATS */
1477
+
1478
+ void
1479
+ js_SweepScopeProperties(JSRuntime *rt)
1480
+ {
1481
+ JSArena **ap, *a;
1482
+ JSScopeProperty *limit, *sprop, *parent, *kids, *kid;
1483
+ uintN liveCount;
1484
+ PropTreeKidsChunk *chunk, *nextChunk;
1485
+ uintN i;
1486
+
1487
+ #ifdef DUMP_SCOPE_STATS
1488
+ uint32 livePropCapacity = 0, totalLiveCount = 0;
1489
+ static FILE *logfp;
1490
+ if (!logfp)
1491
+ logfp = fopen("/tmp/proptree.stats", "a");
1492
+
1493
+ MeterKidCount(rt->propertyTreeHash.entryCount);
1494
+ JS_DHashTableEnumerate(&rt->propertyTreeHash, js_MeterPropertyTree, NULL);
1495
+
1496
+ {
1497
+ double mean = 0.0, var = 0.0, sigma = 0.0;
1498
+ double nodesum = rt->livePropTreeNodes;
1499
+ double kidsum = js_nkids_sum;
1500
+ if (nodesum > 0 && kidsum >= 0) {
1501
+ mean = kidsum / nodesum;
1502
+ var = nodesum * js_nkids_sqsum - kidsum * kidsum;
1503
+ if (var < 0.0 || nodesum <= 1)
1504
+ var = 0.0;
1505
+ else
1506
+ var /= nodesum * (nodesum - 1);
1507
+
1508
+ /* Windows says sqrt(0.0) is "-1.#J" (?!) so we must test. */
1509
+ sigma = (var != 0.0) ? sqrt(var) : 0.0;
1510
+ }
1511
+
1512
+ fprintf(logfp,
1513
+ "props %u nodes %g beta %g meankids %g sigma %g max %u",
1514
+ rt->liveScopeProps, nodesum, nodesum / rt->liveScopeProps,
1515
+ mean, sigma, js_nkids_max);
1516
+ }
1517
+
1518
+ fprintf(logfp, " histogram %u %u %u %u %u %u %u %u %u %u %u",
1519
+ js_nkids_hist[0], js_nkids_hist[1],
1520
+ js_nkids_hist[2], js_nkids_hist[3],
1521
+ js_nkids_hist[4], js_nkids_hist[5],
1522
+ js_nkids_hist[6], js_nkids_hist[7],
1523
+ js_nkids_hist[8], js_nkids_hist[9],
1524
+ js_nkids_hist[10]);
1525
+ js_nkids_sum = js_nkids_max = 0;
1526
+ js_nkids_sqsum = 0;
1527
+ memset(js_nkids_hist, 0, sizeof js_nkids_hist);
1528
+ #endif
1529
+
1530
+ ap = &rt->propertyArenaPool.first.next;
1531
+ while ((a = *ap) != NULL) {
1532
+ limit = (JSScopeProperty *) a->avail;
1533
+ liveCount = 0;
1534
+ for (sprop = (JSScopeProperty *) a->base; sprop < limit; sprop++) {
1535
+ /* If the id is null, sprop is already on the freelist. */
1536
+ if (sprop->id == JSVAL_NULL)
1537
+ continue;
1538
+
1539
+ /* If the mark bit is set, sprop is alive, so we skip it. */
1540
+ if (sprop->flags & SPROP_MARK) {
1541
+ sprop->flags &= ~SPROP_MARK;
1542
+ liveCount++;
1543
+ continue;
1544
+ }
1545
+
1546
+ /* Ok, sprop is garbage to collect: unlink it from its parent. */
1547
+ RemovePropertyTreeChild(rt, sprop);
1548
+
1549
+ /* Take care to reparent all sprop's kids to their grandparent. */
1550
+ kids = sprop->kids;
1551
+ if (kids) {
1552
+ sprop->kids = NULL;
1553
+ parent = sprop->parent;
1554
+ if (KIDS_IS_CHUNKY(kids)) {
1555
+ chunk = KIDS_TO_CHUNK(kids);
1556
+ do {
1557
+ for (i = 0; i < MAX_KIDS_PER_CHUNK; i++) {
1558
+ kid = chunk->kids[i];
1559
+ if (!kid)
1560
+ break;
1561
+ JS_ASSERT(kid->parent == sprop);
1562
+ InsertPropertyTreeChild(rt, parent, kid);
1563
+ }
1564
+ nextChunk = chunk->next;
1565
+ DestroyPropTreeKidsChunk(rt, chunk);
1566
+ } while ((chunk = nextChunk) != NULL);
1567
+ } else {
1568
+ kid = kids;
1569
+ InsertPropertyTreeChild(rt, parent, kid);
1570
+ }
1571
+ }
1572
+
1573
+ /* Clear id so we know (above) that sprop is on the freelist. */
1574
+ sprop->id = JSVAL_NULL;
1575
+ FREENODE_INSERT(rt->propertyFreeList, sprop);
1576
+ JS_RUNTIME_UNMETER(rt, livePropTreeNodes);
1577
+ }
1578
+
1579
+ /* If a contains no live properties, return it to the malloc heap. */
1580
+ if (liveCount == 0) {
1581
+ for (sprop = (JSScopeProperty *) a->base; sprop < limit; sprop++)
1582
+ FREENODE_REMOVE(sprop);
1583
+ JS_ARENA_DESTROY(&rt->propertyArenaPool, a, ap);
1584
+ } else {
1585
+ #ifdef DUMP_SCOPE_STATS
1586
+ livePropCapacity += limit - (JSScopeProperty *) a->base;
1587
+ totalLiveCount += liveCount;
1588
+ #endif
1589
+ ap = &a->next;
1590
+ }
1591
+ }
1592
+
1593
+ #ifdef DUMP_SCOPE_STATS
1594
+ fprintf(logfp, " arenautil %g%%\n",
1595
+ (totalLiveCount * 100.0) / livePropCapacity);
1596
+ fflush(logfp);
1597
+ #endif
1598
+
1599
+ #ifdef DUMP_PROPERTY_TREE
1600
+ {
1601
+ FILE *dumpfp = fopen("/tmp/proptree.dump", "w");
1602
+ if (dumpfp) {
1603
+ JSPropertyTreeEntry *pte, *end;
1604
+
1605
+ pte = (JSPropertyTreeEntry *) rt->propertyTreeHash.entryStore;
1606
+ end = pte + JS_DHASH_TABLE_SIZE(&rt->propertyTreeHash);
1607
+ while (pte < end) {
1608
+ if (pte->child)
1609
+ DumpSubtree(pte->child, 0, dumpfp);
1610
+ pte++;
1611
+ }
1612
+ fclose(dumpfp);
1613
+ }
1614
+ }
1615
+ #endif
1616
+ }
1617
+
1618
+ JSBool
1619
+ js_InitPropertyTree(JSRuntime *rt)
1620
+ {
1621
+ if (!JS_DHashTableInit(&rt->propertyTreeHash, &PropertyTreeHashOps, NULL,
1622
+ sizeof(JSPropertyTreeEntry), JS_DHASH_MIN_SIZE)) {
1623
+ rt->propertyTreeHash.ops = NULL;
1624
+ return JS_FALSE;
1625
+ }
1626
+ JS_InitArenaPool(&rt->propertyArenaPool, "properties",
1627
+ 256 * sizeof(JSScopeProperty), sizeof(void *));
1628
+ return JS_TRUE;
1629
+ }
1630
+
1631
+ void
1632
+ js_FinishPropertyTree(JSRuntime *rt)
1633
+ {
1634
+ if (rt->propertyTreeHash.ops) {
1635
+ JS_DHashTableFinish(&rt->propertyTreeHash);
1636
+ rt->propertyTreeHash.ops = NULL;
1637
+ }
1638
+ JS_FinishArenaPool(&rt->propertyArenaPool);
1639
+ }