johnson 2.0.0.pre1 → 2.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/Manifest.txt +4 -285
  3. data/Rakefile +13 -20
  4. data/ext/tracemonkey/global.cc +4 -1
  5. data/ext/tracemonkey/js.cc +30 -33
  6. data/ext/tracemonkey/runtime.cc +96 -6
  7. data/ext/tracemonkey/split_global.cc +0 -5
  8. data/ext/tracemonkey/tracemonkey.h +2 -2
  9. data/lib/johnson.rb +2 -2
  10. data/lib/johnson/runtime.rb +25 -15
  11. data/lib/johnson/tracemonkey/runtime.rb +6 -3
  12. data/vendor/tracemonkey/config/system-headers +1 -3
  13. data/vendor/tracemonkey/jscntxt.h +5 -2
  14. data/vendor/tracemonkey/jsdbgapi.cpp +9 -1
  15. data/vendor/tracemonkey/jsdbgapi.h +4 -0
  16. data/vendor/tracemonkey/tests/ecma/NativeObjects/browser.js +0 -0
  17. data/vendor/tracemonkey/tests/ecma/NativeObjects/jstests.list +0 -0
  18. data/vendor/tracemonkey/tests/ecma_3_1/Object/jstests.list +1 -1
  19. data/vendor/tracemonkey/tests/js1_3/misc/browser.js +0 -0
  20. data/vendor/tracemonkey/tests/js1_3/misc/jstests.list +0 -0
  21. data/vendor/tracemonkey/tests/js1_5/Regress/jstests.list +4 -4
  22. data/vendor/tracemonkey/tests/js1_5/Scope/jstests.list +1 -1
  23. data/vendor/tracemonkey/tests/js1_5/decompilation/jstests.list +2 -2
  24. data/vendor/tracemonkey/tests/js1_7/decompilation/jstests.list +1 -1
  25. data/vendor/tracemonkey/tests/shell.js +2 -1
  26. metadata +51 -309
  27. data/ext/spidermonkey/context.c +0 -116
  28. data/ext/spidermonkey/context.h +0 -19
  29. data/ext/spidermonkey/conversions.c +0 -361
  30. data/ext/spidermonkey/conversions.h +0 -31
  31. data/ext/spidermonkey/debugger.c +0 -234
  32. data/ext/spidermonkey/debugger.h +0 -10
  33. data/ext/spidermonkey/extconf.rb +0 -32
  34. data/ext/spidermonkey/extensions.c +0 -37
  35. data/ext/spidermonkey/extensions.h +0 -12
  36. data/ext/spidermonkey/global.c +0 -40
  37. data/ext/spidermonkey/global.h +0 -11
  38. data/ext/spidermonkey/idhash.c +0 -16
  39. data/ext/spidermonkey/idhash.h +0 -8
  40. data/ext/spidermonkey/immutable_node.c +0 -1153
  41. data/ext/spidermonkey/immutable_node.c.erb +0 -523
  42. data/ext/spidermonkey/immutable_node.h +0 -22
  43. data/ext/spidermonkey/jroot.h +0 -197
  44. data/ext/spidermonkey/js_land_proxy.c +0 -620
  45. data/ext/spidermonkey/js_land_proxy.h +0 -20
  46. data/ext/spidermonkey/ruby_land_proxy.c +0 -618
  47. data/ext/spidermonkey/ruby_land_proxy.h +0 -38
  48. data/ext/spidermonkey/runtime.c +0 -396
  49. data/ext/spidermonkey/runtime.h +0 -27
  50. data/ext/spidermonkey/spidermonkey.c +0 -22
  51. data/ext/spidermonkey/spidermonkey.h +0 -29
  52. data/lib/johnson/spidermonkey.rb +0 -12
  53. data/lib/johnson/spidermonkey/context.rb +0 -10
  54. data/lib/johnson/spidermonkey/debugger.rb +0 -67
  55. data/lib/johnson/spidermonkey/immutable_node.rb +0 -282
  56. data/lib/johnson/spidermonkey/js_land_proxy.rb +0 -64
  57. data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +0 -242
  58. data/lib/johnson/spidermonkey/ruby_land_proxy.rb +0 -17
  59. data/lib/johnson/spidermonkey/runtime.rb +0 -74
  60. data/test/johnson/spidermonkey/context_test.rb +0 -21
  61. data/test/johnson/spidermonkey/immutable_node_test.rb +0 -34
  62. data/test/johnson/spidermonkey/js_land_proxy_test.rb +0 -273
  63. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +0 -274
  64. data/test/johnson/spidermonkey/runtime_test.rb +0 -41
  65. data/vendor/spidermonkey/.cvsignore +0 -9
  66. data/vendor/spidermonkey/Makefile.in +0 -449
  67. data/vendor/spidermonkey/Makefile.ref +0 -365
  68. data/vendor/spidermonkey/README.html +0 -820
  69. data/vendor/spidermonkey/SpiderMonkey.rsp +0 -12
  70. data/vendor/spidermonkey/Y.js +0 -19
  71. data/vendor/spidermonkey/build.mk +0 -43
  72. data/vendor/spidermonkey/config.mk +0 -192
  73. data/vendor/spidermonkey/config/AIX4.1.mk +0 -65
  74. data/vendor/spidermonkey/config/AIX4.2.mk +0 -64
  75. data/vendor/spidermonkey/config/AIX4.3.mk +0 -65
  76. data/vendor/spidermonkey/config/Darwin.mk +0 -83
  77. data/vendor/spidermonkey/config/Darwin1.3.mk +0 -81
  78. data/vendor/spidermonkey/config/Darwin1.4.mk +0 -41
  79. data/vendor/spidermonkey/config/Darwin5.2.mk +0 -81
  80. data/vendor/spidermonkey/config/Darwin5.3.mk +0 -81
  81. data/vendor/spidermonkey/config/HP-UXB.10.10.mk +0 -77
  82. data/vendor/spidermonkey/config/HP-UXB.10.20.mk +0 -77
  83. data/vendor/spidermonkey/config/HP-UXB.11.00.mk +0 -80
  84. data/vendor/spidermonkey/config/IRIX.mk +0 -87
  85. data/vendor/spidermonkey/config/IRIX5.3.mk +0 -44
  86. data/vendor/spidermonkey/config/IRIX6.1.mk +0 -44
  87. data/vendor/spidermonkey/config/IRIX6.2.mk +0 -44
  88. data/vendor/spidermonkey/config/IRIX6.3.mk +0 -44
  89. data/vendor/spidermonkey/config/IRIX6.5.mk +0 -44
  90. data/vendor/spidermonkey/config/Linux_All.mk +0 -103
  91. data/vendor/spidermonkey/config/Mac_OS10.0.mk +0 -82
  92. data/vendor/spidermonkey/config/OSF1V4.0.mk +0 -72
  93. data/vendor/spidermonkey/config/OSF1V5.0.mk +0 -69
  94. data/vendor/spidermonkey/config/SunOS4.1.4.mk +0 -101
  95. data/vendor/spidermonkey/config/SunOS5.10.mk +0 -50
  96. data/vendor/spidermonkey/config/SunOS5.3.mk +0 -91
  97. data/vendor/spidermonkey/config/SunOS5.4.mk +0 -92
  98. data/vendor/spidermonkey/config/SunOS5.5.1.mk +0 -44
  99. data/vendor/spidermonkey/config/SunOS5.5.mk +0 -87
  100. data/vendor/spidermonkey/config/SunOS5.6.mk +0 -89
  101. data/vendor/spidermonkey/config/SunOS5.7.mk +0 -44
  102. data/vendor/spidermonkey/config/SunOS5.8.mk +0 -44
  103. data/vendor/spidermonkey/config/SunOS5.9.mk +0 -44
  104. data/vendor/spidermonkey/config/WINNT4.0.mk +0 -117
  105. data/vendor/spidermonkey/config/WINNT5.0.mk +0 -117
  106. data/vendor/spidermonkey/config/WINNT5.1.mk +0 -117
  107. data/vendor/spidermonkey/config/WINNT5.2.mk +0 -117
  108. data/vendor/spidermonkey/config/WINNT6.0.mk +0 -117
  109. data/vendor/spidermonkey/config/dgux.mk +0 -64
  110. data/vendor/spidermonkey/editline/Makefile.ref +0 -144
  111. data/vendor/spidermonkey/editline/README +0 -83
  112. data/vendor/spidermonkey/editline/editline.3 +0 -175
  113. data/vendor/spidermonkey/editline/editline.c +0 -1369
  114. data/vendor/spidermonkey/editline/editline.h +0 -135
  115. data/vendor/spidermonkey/editline/sysunix.c +0 -182
  116. data/vendor/spidermonkey/editline/unix.h +0 -82
  117. data/vendor/spidermonkey/fdlibm/.cvsignore +0 -7
  118. data/vendor/spidermonkey/fdlibm/Makefile.in +0 -127
  119. data/vendor/spidermonkey/fdlibm/Makefile.ref +0 -192
  120. data/vendor/spidermonkey/fdlibm/e_acos.c +0 -147
  121. data/vendor/spidermonkey/fdlibm/e_acosh.c +0 -105
  122. data/vendor/spidermonkey/fdlibm/e_asin.c +0 -156
  123. data/vendor/spidermonkey/fdlibm/e_atan2.c +0 -165
  124. data/vendor/spidermonkey/fdlibm/e_atanh.c +0 -110
  125. data/vendor/spidermonkey/fdlibm/e_cosh.c +0 -133
  126. data/vendor/spidermonkey/fdlibm/e_exp.c +0 -202
  127. data/vendor/spidermonkey/fdlibm/e_fmod.c +0 -184
  128. data/vendor/spidermonkey/fdlibm/e_gamma.c +0 -71
  129. data/vendor/spidermonkey/fdlibm/e_gamma_r.c +0 -70
  130. data/vendor/spidermonkey/fdlibm/e_hypot.c +0 -173
  131. data/vendor/spidermonkey/fdlibm/e_j0.c +0 -524
  132. data/vendor/spidermonkey/fdlibm/e_j1.c +0 -523
  133. data/vendor/spidermonkey/fdlibm/e_jn.c +0 -315
  134. data/vendor/spidermonkey/fdlibm/e_lgamma.c +0 -71
  135. data/vendor/spidermonkey/fdlibm/e_lgamma_r.c +0 -347
  136. data/vendor/spidermonkey/fdlibm/e_log.c +0 -184
  137. data/vendor/spidermonkey/fdlibm/e_log10.c +0 -134
  138. data/vendor/spidermonkey/fdlibm/e_pow.c +0 -386
  139. data/vendor/spidermonkey/fdlibm/e_rem_pio2.c +0 -222
  140. data/vendor/spidermonkey/fdlibm/e_remainder.c +0 -120
  141. data/vendor/spidermonkey/fdlibm/e_scalb.c +0 -89
  142. data/vendor/spidermonkey/fdlibm/e_sinh.c +0 -122
  143. data/vendor/spidermonkey/fdlibm/e_sqrt.c +0 -497
  144. data/vendor/spidermonkey/fdlibm/fdlibm.h +0 -273
  145. data/vendor/spidermonkey/fdlibm/fdlibm.mak +0 -1453
  146. data/vendor/spidermonkey/fdlibm/fdlibm.mdp +0 -0
  147. data/vendor/spidermonkey/fdlibm/k_cos.c +0 -135
  148. data/vendor/spidermonkey/fdlibm/k_rem_pio2.c +0 -354
  149. data/vendor/spidermonkey/fdlibm/k_sin.c +0 -114
  150. data/vendor/spidermonkey/fdlibm/k_standard.c +0 -785
  151. data/vendor/spidermonkey/fdlibm/k_tan.c +0 -170
  152. data/vendor/spidermonkey/fdlibm/s_asinh.c +0 -101
  153. data/vendor/spidermonkey/fdlibm/s_atan.c +0 -175
  154. data/vendor/spidermonkey/fdlibm/s_cbrt.c +0 -133
  155. data/vendor/spidermonkey/fdlibm/s_ceil.c +0 -120
  156. data/vendor/spidermonkey/fdlibm/s_copysign.c +0 -72
  157. data/vendor/spidermonkey/fdlibm/s_cos.c +0 -118
  158. data/vendor/spidermonkey/fdlibm/s_erf.c +0 -356
  159. data/vendor/spidermonkey/fdlibm/s_expm1.c +0 -267
  160. data/vendor/spidermonkey/fdlibm/s_fabs.c +0 -70
  161. data/vendor/spidermonkey/fdlibm/s_finite.c +0 -71
  162. data/vendor/spidermonkey/fdlibm/s_floor.c +0 -121
  163. data/vendor/spidermonkey/fdlibm/s_frexp.c +0 -99
  164. data/vendor/spidermonkey/fdlibm/s_ilogb.c +0 -85
  165. data/vendor/spidermonkey/fdlibm/s_isnan.c +0 -74
  166. data/vendor/spidermonkey/fdlibm/s_ldexp.c +0 -66
  167. data/vendor/spidermonkey/fdlibm/s_lib_version.c +0 -73
  168. data/vendor/spidermonkey/fdlibm/s_log1p.c +0 -211
  169. data/vendor/spidermonkey/fdlibm/s_logb.c +0 -79
  170. data/vendor/spidermonkey/fdlibm/s_matherr.c +0 -64
  171. data/vendor/spidermonkey/fdlibm/s_modf.c +0 -132
  172. data/vendor/spidermonkey/fdlibm/s_nextafter.c +0 -124
  173. data/vendor/spidermonkey/fdlibm/s_rint.c +0 -131
  174. data/vendor/spidermonkey/fdlibm/s_scalbn.c +0 -107
  175. data/vendor/spidermonkey/fdlibm/s_signgam.c +0 -40
  176. data/vendor/spidermonkey/fdlibm/s_significand.c +0 -68
  177. data/vendor/spidermonkey/fdlibm/s_sin.c +0 -118
  178. data/vendor/spidermonkey/fdlibm/s_tan.c +0 -112
  179. data/vendor/spidermonkey/fdlibm/s_tanh.c +0 -122
  180. data/vendor/spidermonkey/fdlibm/w_acos.c +0 -78
  181. data/vendor/spidermonkey/fdlibm/w_acosh.c +0 -78
  182. data/vendor/spidermonkey/fdlibm/w_asin.c +0 -80
  183. data/vendor/spidermonkey/fdlibm/w_atan2.c +0 -79
  184. data/vendor/spidermonkey/fdlibm/w_atanh.c +0 -81
  185. data/vendor/spidermonkey/fdlibm/w_cosh.c +0 -77
  186. data/vendor/spidermonkey/fdlibm/w_exp.c +0 -88
  187. data/vendor/spidermonkey/fdlibm/w_fmod.c +0 -78
  188. data/vendor/spidermonkey/fdlibm/w_gamma.c +0 -85
  189. data/vendor/spidermonkey/fdlibm/w_gamma_r.c +0 -81
  190. data/vendor/spidermonkey/fdlibm/w_hypot.c +0 -78
  191. data/vendor/spidermonkey/fdlibm/w_j0.c +0 -105
  192. data/vendor/spidermonkey/fdlibm/w_j1.c +0 -106
  193. data/vendor/spidermonkey/fdlibm/w_jn.c +0 -128
  194. data/vendor/spidermonkey/fdlibm/w_lgamma.c +0 -85
  195. data/vendor/spidermonkey/fdlibm/w_lgamma_r.c +0 -81
  196. data/vendor/spidermonkey/fdlibm/w_log.c +0 -78
  197. data/vendor/spidermonkey/fdlibm/w_log10.c +0 -81
  198. data/vendor/spidermonkey/fdlibm/w_pow.c +0 -99
  199. data/vendor/spidermonkey/fdlibm/w_remainder.c +0 -77
  200. data/vendor/spidermonkey/fdlibm/w_scalb.c +0 -95
  201. data/vendor/spidermonkey/fdlibm/w_sinh.c +0 -77
  202. data/vendor/spidermonkey/fdlibm/w_sqrt.c +0 -77
  203. data/vendor/spidermonkey/javascript-trace.d +0 -73
  204. data/vendor/spidermonkey/js.c +0 -3951
  205. data/vendor/spidermonkey/js.mdp +0 -0
  206. data/vendor/spidermonkey/js.msg +0 -308
  207. data/vendor/spidermonkey/js.pkg +0 -2
  208. data/vendor/spidermonkey/js3240.rc +0 -79
  209. data/vendor/spidermonkey/jsOS240.def +0 -654
  210. data/vendor/spidermonkey/jsapi.c +0 -5836
  211. data/vendor/spidermonkey/jsapi.h +0 -2624
  212. data/vendor/spidermonkey/jsarena.c +0 -450
  213. data/vendor/spidermonkey/jsarena.h +0 -318
  214. data/vendor/spidermonkey/jsarray.c +0 -2996
  215. data/vendor/spidermonkey/jsarray.h +0 -127
  216. data/vendor/spidermonkey/jsatom.c +0 -1045
  217. data/vendor/spidermonkey/jsatom.h +0 -442
  218. data/vendor/spidermonkey/jsbit.h +0 -253
  219. data/vendor/spidermonkey/jsbool.c +0 -176
  220. data/vendor/spidermonkey/jsbool.h +0 -73
  221. data/vendor/spidermonkey/jsclist.h +0 -139
  222. data/vendor/spidermonkey/jscntxt.c +0 -1348
  223. data/vendor/spidermonkey/jscntxt.h +0 -1120
  224. data/vendor/spidermonkey/jscompat.h +0 -57
  225. data/vendor/spidermonkey/jsconfig.h +0 -248
  226. data/vendor/spidermonkey/jsconfig.mk +0 -181
  227. data/vendor/spidermonkey/jscpucfg.c +0 -396
  228. data/vendor/spidermonkey/jscpucfg.h +0 -212
  229. data/vendor/spidermonkey/jsdate.c +0 -2390
  230. data/vendor/spidermonkey/jsdate.h +0 -124
  231. data/vendor/spidermonkey/jsdbgapi.c +0 -1802
  232. data/vendor/spidermonkey/jsdbgapi.h +0 -464
  233. data/vendor/spidermonkey/jsdhash.c +0 -868
  234. data/vendor/spidermonkey/jsdhash.h +0 -592
  235. data/vendor/spidermonkey/jsdtoa.c +0 -3167
  236. data/vendor/spidermonkey/jsdtoa.h +0 -130
  237. data/vendor/spidermonkey/jsdtracef.c +0 -317
  238. data/vendor/spidermonkey/jsdtracef.h +0 -77
  239. data/vendor/spidermonkey/jsemit.c +0 -6909
  240. data/vendor/spidermonkey/jsemit.h +0 -741
  241. data/vendor/spidermonkey/jsexn.c +0 -1371
  242. data/vendor/spidermonkey/jsexn.h +0 -96
  243. data/vendor/spidermonkey/jsfile.c +0 -2736
  244. data/vendor/spidermonkey/jsfile.h +0 -56
  245. data/vendor/spidermonkey/jsfile.msg +0 -90
  246. data/vendor/spidermonkey/jsfun.c +0 -2634
  247. data/vendor/spidermonkey/jsfun.h +0 -254
  248. data/vendor/spidermonkey/jsgc.c +0 -3562
  249. data/vendor/spidermonkey/jsgc.h +0 -403
  250. data/vendor/spidermonkey/jshash.c +0 -476
  251. data/vendor/spidermonkey/jshash.h +0 -151
  252. data/vendor/spidermonkey/jsify.pl +0 -485
  253. data/vendor/spidermonkey/jsinterp.c +0 -7007
  254. data/vendor/spidermonkey/jsinterp.h +0 -525
  255. data/vendor/spidermonkey/jsinvoke.c +0 -43
  256. data/vendor/spidermonkey/jsiter.c +0 -1067
  257. data/vendor/spidermonkey/jsiter.h +0 -122
  258. data/vendor/spidermonkey/jskeyword.tbl +0 -124
  259. data/vendor/spidermonkey/jskwgen.c +0 -460
  260. data/vendor/spidermonkey/jslibmath.h +0 -266
  261. data/vendor/spidermonkey/jslock.c +0 -1309
  262. data/vendor/spidermonkey/jslock.h +0 -313
  263. data/vendor/spidermonkey/jslocko.asm +0 -60
  264. data/vendor/spidermonkey/jslog2.c +0 -94
  265. data/vendor/spidermonkey/jslong.c +0 -264
  266. data/vendor/spidermonkey/jslong.h +0 -412
  267. data/vendor/spidermonkey/jsmath.c +0 -567
  268. data/vendor/spidermonkey/jsmath.h +0 -57
  269. data/vendor/spidermonkey/jsnum.c +0 -1239
  270. data/vendor/spidermonkey/jsnum.h +0 -283
  271. data/vendor/spidermonkey/jsobj.c +0 -5282
  272. data/vendor/spidermonkey/jsobj.h +0 -709
  273. data/vendor/spidermonkey/jsopcode.c +0 -5245
  274. data/vendor/spidermonkey/jsopcode.h +0 -394
  275. data/vendor/spidermonkey/jsopcode.tbl +0 -523
  276. data/vendor/spidermonkey/jsotypes.h +0 -202
  277. data/vendor/spidermonkey/jsparse.c +0 -6704
  278. data/vendor/spidermonkey/jsparse.h +0 -511
  279. data/vendor/spidermonkey/jsprf.c +0 -1264
  280. data/vendor/spidermonkey/jsprf.h +0 -150
  281. data/vendor/spidermonkey/jsproto.tbl +0 -128
  282. data/vendor/spidermonkey/jsprvtd.h +0 -267
  283. data/vendor/spidermonkey/jspubtd.h +0 -744
  284. data/vendor/spidermonkey/jsregexp.c +0 -4364
  285. data/vendor/spidermonkey/jsregexp.h +0 -183
  286. data/vendor/spidermonkey/jsreops.tbl +0 -145
  287. data/vendor/spidermonkey/jsscan.c +0 -2012
  288. data/vendor/spidermonkey/jsscan.h +0 -387
  289. data/vendor/spidermonkey/jsscope.c +0 -1957
  290. data/vendor/spidermonkey/jsscope.h +0 -418
  291. data/vendor/spidermonkey/jsscript.c +0 -1832
  292. data/vendor/spidermonkey/jsscript.h +0 -287
  293. data/vendor/spidermonkey/jsshell.msg +0 -50
  294. data/vendor/spidermonkey/jsstddef.h +0 -83
  295. data/vendor/spidermonkey/jsstr.c +0 -5005
  296. data/vendor/spidermonkey/jsstr.h +0 -641
  297. data/vendor/spidermonkey/jstypes.h +0 -475
  298. data/vendor/spidermonkey/jsutil.c +0 -345
  299. data/vendor/spidermonkey/jsutil.h +0 -157
  300. data/vendor/spidermonkey/jsxdrapi.c +0 -800
  301. data/vendor/spidermonkey/jsxdrapi.h +0 -218
  302. data/vendor/spidermonkey/jsxml.c +0 -8476
  303. data/vendor/spidermonkey/jsxml.h +0 -349
  304. data/vendor/spidermonkey/lock_SunOS.s +0 -119
  305. data/vendor/spidermonkey/perfect.js +0 -39
  306. data/vendor/spidermonkey/plify_jsdhash.sed +0 -36
  307. data/vendor/spidermonkey/prmjtime.c +0 -846
  308. data/vendor/spidermonkey/prmjtime.h +0 -103
  309. data/vendor/spidermonkey/resource.h +0 -15
  310. data/vendor/spidermonkey/rules.mk +0 -197
  311. data/vendor/spidermonkey/win32.order +0 -384
@@ -1,442 +0,0 @@
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
- #ifndef jsatom_h___
41
- #define jsatom_h___
42
- /*
43
- * JS atom table.
44
- */
45
- #include <stddef.h>
46
- #include "jsconfig.h"
47
- #include "jstypes.h"
48
- #include "jshash.h" /* Added by JSIFY */
49
- #include "jsdhash.h"
50
- #include "jsapi.h"
51
- #include "jsprvtd.h"
52
- #include "jspubtd.h"
53
- #include "jslock.h"
54
-
55
- JS_BEGIN_EXTERN_C
56
-
57
- #define ATOM_PINNED 0x1 /* atom is pinned against GC */
58
- #define ATOM_INTERNED 0x2 /* pinned variant for JS_Intern* API */
59
- #define ATOM_NOCOPY 0x4 /* don't copy atom string bytes */
60
- #define ATOM_TMPSTR 0x8 /* internal, to avoid extra string */
61
-
62
- #define ATOM_KEY(atom) ((jsval)(atom))
63
- #define ATOM_IS_DOUBLE(atom) JSVAL_IS_DOUBLE(ATOM_KEY(atom))
64
- #define ATOM_TO_DOUBLE(atom) JSVAL_TO_DOUBLE(ATOM_KEY(atom))
65
- #define ATOM_IS_STRING(atom) JSVAL_IS_STRING(ATOM_KEY(atom))
66
- #define ATOM_TO_STRING(atom) JSVAL_TO_STRING(ATOM_KEY(atom))
67
-
68
- JS_STATIC_ASSERT(sizeof(JSHashNumber) == 4);
69
- JS_STATIC_ASSERT(sizeof(JSAtom *) == JS_BYTES_PER_WORD);
70
-
71
- #if JS_BYTES_PER_WORD == 4
72
- # define ATOM_HASH(atom) ((JSHashNumber)(atom) >> 2)
73
- #elif JS_BYTES_PER_WORD == 8
74
- # define ATOM_HASH(atom) (((JSHashNumber)(jsuword)(atom) >> 3) ^ \
75
- (JSHashNumber)((jsuword)(atom) >> 32))
76
- #else
77
- # error "Unsupported configuration"
78
- #endif
79
-
80
- /*
81
- * Return a printable, lossless char[] representation of a string-type atom.
82
- * The lifetime of the result extends at least until the next GC activation,
83
- * longer if cx's string newborn root is not overwritten.
84
- */
85
- extern const char *
86
- js_AtomToPrintableString(JSContext *cx, JSAtom *atom);
87
-
88
- struct JSAtomListElement {
89
- JSHashEntry entry;
90
- };
91
-
92
- #define ALE_ATOM(ale) ((JSAtom *) (ale)->entry.key)
93
- #define ALE_INDEX(ale) ((jsatomid) JS_PTR_TO_UINT32((ale)->entry.value))
94
- #define ALE_JSOP(ale) ((JSOp) JS_PTR_TO_UINT32((ale)->entry.value))
95
- #define ALE_VALUE(ale) ((jsval) (ale)->entry.value)
96
- #define ALE_NEXT(ale) ((JSAtomListElement *) (ale)->entry.next)
97
-
98
- #define ALE_SET_ATOM(ale,atom) ((ale)->entry.key = (const void *)(atom))
99
- #define ALE_SET_INDEX(ale,index)((ale)->entry.value = JS_UINT32_TO_PTR(index))
100
- #define ALE_SET_JSOP(ale,op) ((ale)->entry.value = JS_UINT32_TO_PTR(op))
101
-
102
- struct JSAtomList {
103
- JSHashEntry *list; /* literals indexed for mapping */
104
- JSHashTable *table; /* hash table if list gets too long */
105
- jsuint count; /* count of indexed literals */
106
- };
107
-
108
- #define ATOM_LIST_INIT(al) ((al)->list = NULL, (al)->table = NULL, \
109
- (al)->count = 0)
110
-
111
- #define ATOM_LIST_SEARCH(_ale,_al,_atom) \
112
- JS_BEGIN_MACRO \
113
- JSHashEntry **_hep; \
114
- ATOM_LIST_LOOKUP(_ale, _hep, _al, _atom); \
115
- JS_END_MACRO
116
-
117
- #define ATOM_LIST_LOOKUP(_ale,_hep,_al,_atom) \
118
- JS_BEGIN_MACRO \
119
- if ((_al)->table) { \
120
- _hep = JS_HashTableRawLookup((_al)->table, ATOM_HASH(_atom), \
121
- _atom); \
122
- _ale = *_hep ? (JSAtomListElement *) *_hep : NULL; \
123
- } else { \
124
- JSHashEntry **_alep = &(_al)->list; \
125
- _hep = NULL; \
126
- while ((_ale = (JSAtomListElement *)*_alep) != NULL) { \
127
- if (ALE_ATOM(_ale) == (_atom)) { \
128
- /* Hit, move atom's element to the front of the list. */ \
129
- *_alep = (_ale)->entry.next; \
130
- (_ale)->entry.next = (_al)->list; \
131
- (_al)->list = &_ale->entry; \
132
- break; \
133
- } \
134
- _alep = &_ale->entry.next; \
135
- } \
136
- } \
137
- JS_END_MACRO
138
-
139
- struct JSAtomMap {
140
- JSAtom **vector; /* array of ptrs to indexed atoms */
141
- jsatomid length; /* count of (to-be-)indexed atoms */
142
- };
143
-
144
- struct JSAtomState {
145
- JSDHashTable stringAtoms; /* hash table with shared strings */
146
- JSDHashTable doubleAtoms; /* hash table with shared doubles */
147
- #ifdef JS_THREADSAFE
148
- JSThinLock lock;
149
- #endif
150
-
151
- /*
152
- * From this point until the end of struct definition the struct must
153
- * contain only JSAtom fields. We use this to access the storage occupied
154
- * by the common atoms in js_FinishCommonAtoms.
155
- *
156
- * js_common_atom_names defined in jsatom.c contains C strings for atoms
157
- * in the order of atom fields here. Therefore you must update that array
158
- * if you change member order here.
159
- */
160
-
161
- /* The rt->emptyString atom, see jsstr.c's js_InitRuntimeStringState. */
162
- JSAtom *emptyAtom;
163
-
164
- /* Type names and value literals. */
165
- JSAtom *typeAtoms[JSTYPE_LIMIT];
166
- JSAtom *booleanAtoms[2];
167
- JSAtom *nullAtom;
168
-
169
- /* Standard class constructor or prototype names. */
170
- JSAtom *classAtoms[JSProto_LIMIT];
171
-
172
- /* Various built-in or commonly-used atoms, pinned on first context. */
173
- JSAtom *anonymousAtom;
174
- JSAtom *argumentsAtom;
175
- JSAtom *arityAtom;
176
- JSAtom *calleeAtom;
177
- JSAtom *callerAtom;
178
- JSAtom *classPrototypeAtom;
179
- JSAtom *constructorAtom;
180
- JSAtom *countAtom;
181
- JSAtom *eachAtom;
182
- JSAtom *evalAtom;
183
- JSAtom *fileNameAtom;
184
- JSAtom *getAtom;
185
- JSAtom *getterAtom;
186
- JSAtom *indexAtom;
187
- JSAtom *inputAtom;
188
- JSAtom *iteratorAtom;
189
- JSAtom *lengthAtom;
190
- JSAtom *lineNumberAtom;
191
- JSAtom *messageAtom;
192
- JSAtom *nameAtom;
193
- JSAtom *nextAtom;
194
- JSAtom *noSuchMethodAtom;
195
- JSAtom *parentAtom;
196
- JSAtom *protoAtom;
197
- JSAtom *setAtom;
198
- JSAtom *setterAtom;
199
- JSAtom *stackAtom;
200
- JSAtom *toLocaleStringAtom;
201
- JSAtom *toSourceAtom;
202
- JSAtom *toStringAtom;
203
- JSAtom *valueOfAtom;
204
- JSAtom *void0Atom;
205
-
206
- #if JS_HAS_XML_SUPPORT
207
- JSAtom *etagoAtom;
208
- JSAtom *namespaceAtom;
209
- JSAtom *ptagcAtom;
210
- JSAtom *qualifierAtom;
211
- JSAtom *spaceAtom;
212
- JSAtom *stagoAtom;
213
- JSAtom *starAtom;
214
- JSAtom *starQualifierAtom;
215
- JSAtom *tagcAtom;
216
- JSAtom *xmlAtom;
217
- #endif
218
-
219
- #ifdef NARCISSUS
220
- JSAtom *callAtom;
221
- JSAtom *constructAtom;
222
- JSAtom *hasInstanceAtom;
223
- JSAtom *ExecutionContextAtom;
224
- JSAtom *currentAtom;
225
- #endif
226
-
227
- /* Less frequently used atoms, pinned lazily by JS_ResolveStandardClass. */
228
- struct {
229
- JSAtom *InfinityAtom;
230
- JSAtom *NaNAtom;
231
- JSAtom *XMLListAtom;
232
- JSAtom *decodeURIAtom;
233
- JSAtom *decodeURIComponentAtom;
234
- JSAtom *defineGetterAtom;
235
- JSAtom *defineSetterAtom;
236
- JSAtom *encodeURIAtom;
237
- JSAtom *encodeURIComponentAtom;
238
- JSAtom *escapeAtom;
239
- JSAtom *functionNamespaceURIAtom;
240
- JSAtom *hasOwnPropertyAtom;
241
- JSAtom *isFiniteAtom;
242
- JSAtom *isNaNAtom;
243
- JSAtom *isPrototypeOfAtom;
244
- JSAtom *isXMLNameAtom;
245
- JSAtom *lookupGetterAtom;
246
- JSAtom *lookupSetterAtom;
247
- JSAtom *parseFloatAtom;
248
- JSAtom *parseIntAtom;
249
- JSAtom *propertyIsEnumerableAtom;
250
- JSAtom *unescapeAtom;
251
- JSAtom *unevalAtom;
252
- JSAtom *unwatchAtom;
253
- JSAtom *watchAtom;
254
- } lazy;
255
- };
256
-
257
- #define ATOM_OFFSET_START offsetof(JSAtomState, emptyAtom)
258
- #define LAZY_ATOM_OFFSET_START offsetof(JSAtomState, lazy)
259
- #define ATOM_OFFSET_LIMIT (sizeof(JSAtomState))
260
-
261
- #define COMMON_ATOMS_START(state) \
262
- (JSAtom **)((uint8 *)(state) + ATOM_OFFSET_START)
263
-
264
- /* Start and limit offsets should correspond to atoms. */
265
- JS_STATIC_ASSERT(ATOM_OFFSET_START % sizeof(JSAtom *) == 0);
266
- JS_STATIC_ASSERT(ATOM_OFFSET_LIMIT % sizeof(JSAtom *) == 0);
267
-
268
- #define ATOM_OFFSET(name) offsetof(JSAtomState, name##Atom)
269
- #define OFFSET_TO_ATOM(rt,off) (*(JSAtom **)((char*)&(rt)->atomState + (off)))
270
- #define CLASS_ATOM_OFFSET(name) offsetof(JSAtomState,classAtoms[JSProto_##name])
271
-
272
- #define CLASS_ATOM(cx,name) \
273
- ((cx)->runtime->atomState.classAtoms[JSProto_##name])
274
-
275
- extern const char *const js_common_atom_names[];
276
-
277
- /*
278
- * Macros to access C strings for JSType and boolean literals together with
279
- * checks that type names and booleans starts from index 1 and 1+JSTYPE_LIMIT
280
- * correspondingly.
281
- */
282
- #define JS_TYPE_STR(type) (js_common_atom_names[1 + (type)])
283
- #define JS_BOOLEAN_STR(type) (js_common_atom_names[1 + JSTYPE_LIMIT + (type)])
284
-
285
- JS_STATIC_ASSERT(1 * sizeof(JSAtom *) ==
286
- offsetof(JSAtomState, typeAtoms) - ATOM_OFFSET_START);
287
- JS_STATIC_ASSERT((1 + JSTYPE_LIMIT) * sizeof(JSAtom *) ==
288
- offsetof(JSAtomState, booleanAtoms) - ATOM_OFFSET_START);
289
-
290
- /* Well-known predefined C strings. */
291
- #define JS_PROTO(name,code,init) extern const char js_##name##_str[];
292
- #include "jsproto.tbl"
293
- #undef JS_PROTO
294
-
295
- extern const char js_anonymous_str[];
296
- extern const char js_arguments_str[];
297
- extern const char js_arity_str[];
298
- extern const char js_callee_str[];
299
- extern const char js_caller_str[];
300
- extern const char js_class_prototype_str[];
301
- extern const char js_close_str[];
302
- extern const char js_constructor_str[];
303
- extern const char js_count_str[];
304
- extern const char js_etago_str[];
305
- extern const char js_each_str[];
306
- extern const char js_eval_str[];
307
- extern const char js_fileName_str[];
308
- extern const char js_get_str[];
309
- extern const char js_getter_str[];
310
- extern const char js_index_str[];
311
- extern const char js_input_str[];
312
- extern const char js_iterator_str[];
313
- extern const char js_length_str[];
314
- extern const char js_lineNumber_str[];
315
- extern const char js_message_str[];
316
- extern const char js_name_str[];
317
- extern const char js_namespace_str[];
318
- extern const char js_next_str[];
319
- extern const char js_noSuchMethod_str[];
320
- extern const char js_object_str[];
321
- extern const char js_parent_str[];
322
- extern const char js_proto_str[];
323
- extern const char js_ptagc_str[];
324
- extern const char js_qualifier_str[];
325
- extern const char js_send_str[];
326
- extern const char js_setter_str[];
327
- extern const char js_set_str[];
328
- extern const char js_space_str[];
329
- extern const char js_stack_str[];
330
- extern const char js_stago_str[];
331
- extern const char js_star_str[];
332
- extern const char js_starQualifier_str[];
333
- extern const char js_tagc_str[];
334
- extern const char js_toSource_str[];
335
- extern const char js_toString_str[];
336
- extern const char js_toLocaleString_str[];
337
- extern const char js_undefined_str[];
338
- extern const char js_valueOf_str[];
339
- extern const char js_xml_str[];
340
-
341
- #ifdef NARCISSUS
342
- extern const char js_call_str[];
343
- extern const char js_construct_str[];
344
- extern const char js_hasInstance_str[];
345
- extern const char js_ExecutionContext_str[];
346
- extern const char js_current_str[];
347
- #endif
348
-
349
- /*
350
- * Initialize atom state. Return true on success, false on failure to allocate
351
- * memory. The caller must zero rt->atomState before calling this function and
352
- * only call it after js_InitGC successfully returns.
353
- */
354
- extern JSBool
355
- js_InitAtomState(JSRuntime *rt);
356
-
357
- /*
358
- * Free and clear atom state including any interned string atoms. This
359
- * function must be called before js_FinishGC.
360
- */
361
- extern void
362
- js_FinishAtomState(JSRuntime *rt);
363
-
364
- /*
365
- * Atom tracing and garbage collection hooks.
366
- */
367
-
368
- extern void
369
- js_TraceAtomState(JSTracer *trc, JSBool allAtoms);
370
-
371
- extern void
372
- js_SweepAtomState(JSContext *cx);
373
-
374
- extern JSBool
375
- js_InitCommonAtoms(JSContext *cx);
376
-
377
- extern void
378
- js_FinishCommonAtoms(JSContext *cx);
379
-
380
- /*
381
- * Find or create the atom for a double value. Return null on failure to
382
- * allocate memory.
383
- */
384
- extern JSAtom *
385
- js_AtomizeDouble(JSContext *cx, jsdouble d);
386
-
387
- /*
388
- * Find or create the atom for a string. Return null on failure to allocate
389
- * memory.
390
- */
391
- extern JSAtom *
392
- js_AtomizeString(JSContext *cx, JSString *str, uintN flags);
393
-
394
- extern JSAtom *
395
- js_Atomize(JSContext *cx, const char *bytes, size_t length, uintN flags);
396
-
397
- extern JSAtom *
398
- js_AtomizeChars(JSContext *cx, const jschar *chars, size_t length, uintN flags);
399
-
400
- /*
401
- * Return an existing atom for the given char array or null if the char
402
- * sequence is currently not atomized.
403
- */
404
- extern JSAtom *
405
- js_GetExistingStringAtom(JSContext *cx, const jschar *chars, size_t length);
406
-
407
- /*
408
- * This variant handles all primitive values.
409
- */
410
- JSBool
411
- js_AtomizePrimitiveValue(JSContext *cx, jsval v, JSAtom **atomp);
412
-
413
- /*
414
- * Convert v to an atomized string and wrap it as an id.
415
- */
416
- extern JSBool
417
- js_ValueToStringId(JSContext *cx, jsval v, jsid *idp);
418
-
419
- #ifdef DEBUG
420
-
421
- extern JS_FRIEND_API(void)
422
- js_DumpAtoms(JSContext *cx, FILE *fp);
423
-
424
- #endif
425
-
426
- /*
427
- * Assign atom an index and insert it on al.
428
- */
429
- extern JSAtomListElement *
430
- js_IndexAtom(JSContext *cx, JSAtom *atom, JSAtomList *al);
431
-
432
- /*
433
- * For all unmapped atoms recorded in al, add a mapping from the atom's index
434
- * to its address. map->length must already be set to the number of atoms in
435
- * the list and map->vector must point to pre-allocated memory.
436
- */
437
- extern void
438
- js_InitAtomMap(JSContext *cx, JSAtomMap *map, JSAtomList *al);
439
-
440
- JS_END_EXTERN_C
441
-
442
- #endif /* jsatom_h___ */
@@ -1,253 +0,0 @@
1
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
- /* ***** BEGIN LICENSE BLOCK *****
3
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
- *
5
- * The contents of this file are subject to the Mozilla Public License Version
6
- * 1.1 (the "License"); you may not use this file except in compliance with
7
- * the License. You may obtain a copy of the License at
8
- * http://www.mozilla.org/MPL/
9
- *
10
- * Software distributed under the License is distributed on an "AS IS" basis,
11
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
- * for the specific language governing rights and limitations under the
13
- * License.
14
- *
15
- * The Original Code is Mozilla Communicator client code, released
16
- * March 31, 1998.
17
- *
18
- * The Initial Developer of the Original Code is
19
- * Netscape Communications Corporation.
20
- * Portions created by the Initial Developer are Copyright (C) 1998
21
- * the Initial Developer. All Rights Reserved.
22
- *
23
- * Contributor(s):
24
- *
25
- * Alternatively, the contents of this file may be used under the terms of
26
- * either of the GNU General Public License Version 2 or later (the "GPL"),
27
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28
- * in which case the provisions of the GPL or the LGPL are applicable instead
29
- * of those above. If you wish to allow use of your version of this file only
30
- * under the terms of either the GPL or the LGPL, and not to allow others to
31
- * use your version of this file under the terms of the MPL, indicate your
32
- * decision by deleting the provisions above and replace them with the notice
33
- * and other provisions required by the GPL or the LGPL. If you do not delete
34
- * the provisions above, a recipient may use your version of this file under
35
- * the terms of any one of the MPL, the GPL or the LGPL.
36
- *
37
- * ***** END LICENSE BLOCK ***** */
38
-
39
- #ifndef jsbit_h___
40
- #define jsbit_h___
41
-
42
- #include "jstypes.h"
43
- #include "jsutil.h"
44
-
45
- JS_BEGIN_EXTERN_C
46
-
47
- /*
48
- ** A jsbitmap_t is a long integer that can be used for bitmaps
49
- */
50
- typedef JSUword jsbitmap_t; /* NSPR name, a la Unix system types */
51
- typedef jsbitmap_t jsbitmap; /* JS-style scalar typedef name */
52
-
53
- #define JS_BITMAP_SIZE(bits) (JS_HOWMANY(bits, JS_BITS_PER_WORD) * \
54
- sizeof(jsbitmap))
55
-
56
- #define JS_TEST_BIT(_map,_bit) ((_map)[(_bit)>>JS_BITS_PER_WORD_LOG2] & \
57
- ((jsbitmap)1<<((_bit)&(JS_BITS_PER_WORD-1))))
58
- #define JS_SET_BIT(_map,_bit) ((_map)[(_bit)>>JS_BITS_PER_WORD_LOG2] |= \
59
- ((jsbitmap)1<<((_bit)&(JS_BITS_PER_WORD-1))))
60
- #define JS_CLEAR_BIT(_map,_bit) ((_map)[(_bit)>>JS_BITS_PER_WORD_LOG2] &= \
61
- ~((jsbitmap)1<<((_bit)&(JS_BITS_PER_WORD-1))))
62
-
63
- /*
64
- ** Compute the log of the least power of 2 greater than or equal to n
65
- */
66
- extern JS_PUBLIC_API(JSIntn) JS_CeilingLog2(JSUint32 i);
67
-
68
- /*
69
- ** Compute the log of the greatest power of 2 less than or equal to n
70
- */
71
- extern JS_PUBLIC_API(JSIntn) JS_FloorLog2(JSUint32 i);
72
-
73
- /*
74
- * Replace bit-scanning code sequences with CPU-specific instructions to
75
- * speedup calculations of ceiling/floor log2.
76
- *
77
- * With GCC 3.4 or later we can use __builtin_clz for that, see bug 327129.
78
- *
79
- * SWS: Added MSVC intrinsic bitscan support. See bugs 349364 and 356856.
80
- */
81
- #if defined(_WIN32) && (_MSC_VER >= 1300) && defined(_M_IX86)
82
-
83
- unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask);
84
- unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask);
85
- # pragma intrinsic(_BitScanForward,_BitScanReverse)
86
-
87
- __forceinline static int
88
- __BitScanForward32(unsigned int val)
89
- {
90
- unsigned long idx;
91
-
92
- _BitScanForward(&idx, (unsigned long)val);
93
- return (int)idx;
94
- }
95
- __forceinline static int
96
- __BitScanReverse32(unsigned int val)
97
- {
98
- unsigned long idx;
99
-
100
- _BitScanReverse(&idx, (unsigned long)val);
101
- return (int)(31-idx);
102
- }
103
- # define js_bitscan_ctz32(val) __BitScanForward32(val)
104
- # define js_bitscan_clz32(val) __BitScanReverse32(val)
105
- # define JS_HAS_BUILTIN_BITSCAN32
106
-
107
- #elif (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
108
-
109
- # define js_bitscan_ctz32(val) __builtin_ctz(val)
110
- # define js_bitscan_clz32(val) __builtin_clz(val)
111
- # define JS_HAS_BUILTIN_BITSCAN32
112
- # if (JS_BYTES_PER_WORD == 8)
113
- # define js_bitscan_ctz64(val) __builtin_ctzll(val)
114
- # define js_bitscan_clz64(val) __builtin_clzll(val)
115
- # define JS_HAS_BUILTIN_BITSCAN64
116
- # endif
117
-
118
- #endif
119
-
120
- /*
121
- ** Macro version of JS_CeilingLog2: Compute the log of the least power of
122
- ** 2 greater than or equal to _n. The result is returned in _log2.
123
- */
124
- #ifdef JS_HAS_BUILTIN_BITSCAN32
125
- /*
126
- * Use intrinsic function or count-leading-zeros to calculate ceil(log2(_n)).
127
- * The macro checks for "n <= 1" and not "n != 0" as js_bitscan_clz32(0) is
128
- * undefined.
129
- */
130
- # define JS_CEILING_LOG2(_log2,_n) \
131
- JS_BEGIN_MACRO \
132
- JS_STATIC_ASSERT(sizeof(unsigned int) == sizeof(JSUint32)); \
133
- unsigned int j_ = (unsigned int)(_n); \
134
- (_log2) = (j_ <= 1 ? 0 : 32 - js_bitscan_clz32(j_ - 1)); \
135
- JS_END_MACRO
136
- #else
137
- # define JS_CEILING_LOG2(_log2,_n) \
138
- JS_BEGIN_MACRO \
139
- JSUint32 j_ = (JSUint32)(_n); \
140
- (_log2) = 0; \
141
- if ((j_) & ((j_)-1)) \
142
- (_log2) += 1; \
143
- if ((j_) >> 16) \
144
- (_log2) += 16, (j_) >>= 16; \
145
- if ((j_) >> 8) \
146
- (_log2) += 8, (j_) >>= 8; \
147
- if ((j_) >> 4) \
148
- (_log2) += 4, (j_) >>= 4; \
149
- if ((j_) >> 2) \
150
- (_log2) += 2, (j_) >>= 2; \
151
- if ((j_) >> 1) \
152
- (_log2) += 1; \
153
- JS_END_MACRO
154
- #endif
155
-
156
- /*
157
- ** Macro version of JS_FloorLog2: Compute the log of the greatest power of
158
- ** 2 less than or equal to _n. The result is returned in _log2.
159
- **
160
- ** This is equivalent to finding the highest set bit in the word.
161
- */
162
- #ifdef JS_HAS_BUILTIN_BITSCAN32
163
- /*
164
- * Use js_bitscan_clz32 or count-leading-zeros to calculate floor(log2(_n)).
165
- * Since js_bitscan_clz32(0) is undefined, the macro set the loweset bit to 1
166
- * to ensure 0 result when _n == 0.
167
- */
168
- # define JS_FLOOR_LOG2(_log2,_n) \
169
- JS_BEGIN_MACRO \
170
- JS_STATIC_ASSERT(sizeof(unsigned int) == sizeof(JSUint32)); \
171
- (_log2) = 31 - js_bitscan_clz32(((unsigned int)(_n)) | 1); \
172
- JS_END_MACRO
173
- #else
174
- # define JS_FLOOR_LOG2(_log2,_n) \
175
- JS_BEGIN_MACRO \
176
- JSUint32 j_ = (JSUint32)(_n); \
177
- (_log2) = 0; \
178
- if ((j_) >> 16) \
179
- (_log2) += 16, (j_) >>= 16; \
180
- if ((j_) >> 8) \
181
- (_log2) += 8, (j_) >>= 8; \
182
- if ((j_) >> 4) \
183
- (_log2) += 4, (j_) >>= 4; \
184
- if ((j_) >> 2) \
185
- (_log2) += 2, (j_) >>= 2; \
186
- if ((j_) >> 1) \
187
- (_log2) += 1; \
188
- JS_END_MACRO
189
- #endif
190
-
191
- /*
192
- * Internal function.
193
- * Compute the log of the least power of 2 greater than or equal to n.
194
- * This is a version of JS_CeilingLog2 that operates on jsuword with
195
- * CPU-dependant size.
196
- */
197
- #define JS_CEILING_LOG2W(n) ((n) <= 1 ? 0 : 1 + JS_FLOOR_LOG2W((n) - 1))
198
-
199
- /*
200
- * Internal function.
201
- * Compute the log of the greatest power of 2 less than or equal to n.
202
- * This is a version of JS_FloorLog2 that operates on jsuword with
203
- * CPU-dependant size and requires that n != 0.
204
- */
205
- #define JS_FLOOR_LOG2W(n) (JS_ASSERT((n) != 0), js_FloorLog2wImpl(n))
206
-
207
- #if JS_BYTES_PER_WORD == 4
208
-
209
- # ifdef JS_HAS_BUILTIN_BITSCAN32
210
- JS_STATIC_ASSERT(sizeof(unsigned) == sizeof(JSUword));
211
- # define js_FloorLog2wImpl(n) \
212
- ((JSUword)(JS_BITS_PER_WORD - 1 - js_bitscan_clz32(n)))
213
- # else
214
- # define js_FloorLog2wImpl(n) ((JSUword)JS_FloorLog2(n))
215
- #endif
216
-
217
- #elif JS_BYTES_PER_WORD == 8
218
-
219
- # ifdef JS_HAS_BUILTIN_BITSCAN64
220
- JS_STATIC_ASSERT(sizeof(unsigned long long) == sizeof(JSUword));
221
- # define js_FloorLog2wImpl(n) \
222
- ((JSUword)(JS_BITS_PER_WORD - 1 - js_bitscan_clz64(n)))
223
- # else
224
- extern JSUword js_FloorLog2wImpl(JSUword n);
225
- # endif
226
-
227
- #else
228
-
229
- # error "NOT SUPPORTED"
230
-
231
- #endif
232
-
233
- /*
234
- * Macros for rotate left. There is no rotate operation in the C Language so
235
- * the construct (a << 4) | (a >> 28) is used instead. Most compilers convert
236
- * this to a rotate instruction but some versions of MSVC don't without a
237
- * little help. To get MSVC to generate a rotate instruction, we have to use
238
- * the _rotl intrinsic and use a pragma to make _rotl inline.
239
- *
240
- * MSVC in VS2005 will do an inline rotate instruction on the above construct.
241
- */
242
-
243
- #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || \
244
- defined(_M_X64))
245
- #include <stdlib.h>
246
- #pragma intrinsic(_rotl)
247
- #define JS_ROTATE_LEFT32(a, bits) _rotl(a, bits)
248
- #else
249
- #define JS_ROTATE_LEFT32(a, bits) (((a) << (bits)) | ((a) >> (32 - (bits))))
250
- #endif
251
-
252
- JS_END_EXTERN_C
253
- #endif /* jsbit_h___ */