jbarnette-johnson 1.0.0.200806240111 → 1.0.0.200807291507

Sign up to get free protection for your applications and to get access to all the features.
Files changed (269) hide show
  1. data/MANIFEST +1 -0
  2. data/Rakefile +3 -10
  3. data/bin/johnson +2 -1
  4. data/ext/spidermonkey/context.c +3 -4
  5. data/ext/spidermonkey/context.h +1 -1
  6. data/ext/spidermonkey/conversions.c +39 -33
  7. data/ext/spidermonkey/debugger.c +5 -5
  8. data/ext/spidermonkey/immutable_node.c.erb +11 -11
  9. data/ext/spidermonkey/jroot.h +4 -4
  10. data/ext/spidermonkey/js_land_proxy.c +9 -8
  11. data/ext/spidermonkey/ruby_land_proxy.c +5 -4
  12. data/ext/spidermonkey/runtime.c +1 -1
  13. data/johnson.gemspec +36 -0
  14. data/lib/hoe.rb +0 -7
  15. data/lib/johnson/cli/options.rb +10 -4
  16. data/lib/johnson/spidermonkey/runtime.rb +2 -2
  17. data/lib/johnson/version.rb +4 -2
  18. data/lib/johnson.rb +1 -0
  19. data/test/johnson/runtime_test.rb +11 -0
  20. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +6 -0
  21. data/vendor/spidermonkey/.cvsignore +9 -0
  22. data/vendor/spidermonkey/Makefile.in +462 -0
  23. data/vendor/spidermonkey/Makefile.ref +364 -0
  24. data/vendor/spidermonkey/README.html +820 -0
  25. data/vendor/spidermonkey/SpiderMonkey.rsp +12 -0
  26. data/vendor/spidermonkey/Y.js +19 -0
  27. data/vendor/spidermonkey/build.mk +43 -0
  28. data/vendor/spidermonkey/config/AIX4.1.mk +65 -0
  29. data/vendor/spidermonkey/config/AIX4.2.mk +64 -0
  30. data/vendor/spidermonkey/config/AIX4.3.mk +65 -0
  31. data/vendor/spidermonkey/config/Darwin.mk +83 -0
  32. data/vendor/spidermonkey/config/Darwin1.3.mk +81 -0
  33. data/vendor/spidermonkey/config/Darwin1.4.mk +41 -0
  34. data/vendor/spidermonkey/config/Darwin5.2.mk +81 -0
  35. data/vendor/spidermonkey/config/Darwin5.3.mk +81 -0
  36. data/vendor/spidermonkey/config/HP-UXB.10.10.mk +77 -0
  37. data/vendor/spidermonkey/config/HP-UXB.10.20.mk +77 -0
  38. data/vendor/spidermonkey/config/HP-UXB.11.00.mk +80 -0
  39. data/vendor/spidermonkey/config/IRIX.mk +87 -0
  40. data/vendor/spidermonkey/config/IRIX5.3.mk +44 -0
  41. data/vendor/spidermonkey/config/IRIX6.1.mk +44 -0
  42. data/vendor/spidermonkey/config/IRIX6.2.mk +44 -0
  43. data/vendor/spidermonkey/config/IRIX6.3.mk +44 -0
  44. data/vendor/spidermonkey/config/IRIX6.5.mk +44 -0
  45. data/vendor/spidermonkey/config/Linux_All.mk +103 -0
  46. data/vendor/spidermonkey/config/Mac_OS10.0.mk +82 -0
  47. data/vendor/spidermonkey/config/OSF1V4.0.mk +72 -0
  48. data/vendor/spidermonkey/config/OSF1V5.0.mk +69 -0
  49. data/vendor/spidermonkey/config/SunOS4.1.4.mk +101 -0
  50. data/vendor/spidermonkey/config/SunOS5.10.mk +50 -0
  51. data/vendor/spidermonkey/config/SunOS5.3.mk +91 -0
  52. data/vendor/spidermonkey/config/SunOS5.4.mk +92 -0
  53. data/vendor/spidermonkey/config/SunOS5.5.1.mk +44 -0
  54. data/vendor/spidermonkey/config/SunOS5.5.mk +87 -0
  55. data/vendor/spidermonkey/config/SunOS5.6.mk +89 -0
  56. data/vendor/spidermonkey/config/SunOS5.7.mk +44 -0
  57. data/vendor/spidermonkey/config/SunOS5.8.mk +44 -0
  58. data/vendor/spidermonkey/config/SunOS5.9.mk +44 -0
  59. data/vendor/spidermonkey/config/WINNT4.0.mk +117 -0
  60. data/vendor/spidermonkey/config/WINNT5.0.mk +117 -0
  61. data/vendor/spidermonkey/config/WINNT5.1.mk +117 -0
  62. data/vendor/spidermonkey/config/WINNT5.2.mk +117 -0
  63. data/vendor/spidermonkey/config/WINNT6.0.mk +117 -0
  64. data/vendor/spidermonkey/config/dgux.mk +64 -0
  65. data/vendor/spidermonkey/config.mk +192 -0
  66. data/vendor/spidermonkey/editline/Makefile.ref +144 -0
  67. data/vendor/spidermonkey/editline/README +83 -0
  68. data/vendor/spidermonkey/editline/editline.3 +175 -0
  69. data/vendor/spidermonkey/editline/editline.c +1369 -0
  70. data/vendor/spidermonkey/editline/editline.h +135 -0
  71. data/vendor/spidermonkey/editline/sysunix.c +182 -0
  72. data/vendor/spidermonkey/editline/unix.h +82 -0
  73. data/vendor/spidermonkey/fdlibm/.cvsignore +7 -0
  74. data/vendor/spidermonkey/fdlibm/Makefile.in +127 -0
  75. data/vendor/spidermonkey/fdlibm/Makefile.ref +192 -0
  76. data/vendor/spidermonkey/fdlibm/e_acos.c +147 -0
  77. data/vendor/spidermonkey/fdlibm/e_acosh.c +105 -0
  78. data/vendor/spidermonkey/fdlibm/e_asin.c +156 -0
  79. data/vendor/spidermonkey/fdlibm/e_atan2.c +165 -0
  80. data/vendor/spidermonkey/fdlibm/e_atanh.c +110 -0
  81. data/vendor/spidermonkey/fdlibm/e_cosh.c +133 -0
  82. data/vendor/spidermonkey/fdlibm/e_exp.c +202 -0
  83. data/vendor/spidermonkey/fdlibm/e_fmod.c +184 -0
  84. data/vendor/spidermonkey/fdlibm/e_gamma.c +71 -0
  85. data/vendor/spidermonkey/fdlibm/e_gamma_r.c +70 -0
  86. data/vendor/spidermonkey/fdlibm/e_hypot.c +173 -0
  87. data/vendor/spidermonkey/fdlibm/e_j0.c +524 -0
  88. data/vendor/spidermonkey/fdlibm/e_j1.c +523 -0
  89. data/vendor/spidermonkey/fdlibm/e_jn.c +315 -0
  90. data/vendor/spidermonkey/fdlibm/e_lgamma.c +71 -0
  91. data/vendor/spidermonkey/fdlibm/e_lgamma_r.c +347 -0
  92. data/vendor/spidermonkey/fdlibm/e_log.c +184 -0
  93. data/vendor/spidermonkey/fdlibm/e_log10.c +134 -0
  94. data/vendor/spidermonkey/fdlibm/e_pow.c +386 -0
  95. data/vendor/spidermonkey/fdlibm/e_rem_pio2.c +222 -0
  96. data/vendor/spidermonkey/fdlibm/e_remainder.c +120 -0
  97. data/vendor/spidermonkey/fdlibm/e_scalb.c +89 -0
  98. data/vendor/spidermonkey/fdlibm/e_sinh.c +122 -0
  99. data/vendor/spidermonkey/fdlibm/e_sqrt.c +497 -0
  100. data/vendor/spidermonkey/fdlibm/fdlibm.h +273 -0
  101. data/vendor/spidermonkey/fdlibm/fdlibm.mak +1453 -0
  102. data/vendor/spidermonkey/fdlibm/fdlibm.mdp +0 -0
  103. data/vendor/spidermonkey/fdlibm/k_cos.c +135 -0
  104. data/vendor/spidermonkey/fdlibm/k_rem_pio2.c +354 -0
  105. data/vendor/spidermonkey/fdlibm/k_sin.c +114 -0
  106. data/vendor/spidermonkey/fdlibm/k_standard.c +785 -0
  107. data/vendor/spidermonkey/fdlibm/k_tan.c +170 -0
  108. data/vendor/spidermonkey/fdlibm/s_asinh.c +101 -0
  109. data/vendor/spidermonkey/fdlibm/s_atan.c +175 -0
  110. data/vendor/spidermonkey/fdlibm/s_cbrt.c +133 -0
  111. data/vendor/spidermonkey/fdlibm/s_ceil.c +120 -0
  112. data/vendor/spidermonkey/fdlibm/s_copysign.c +72 -0
  113. data/vendor/spidermonkey/fdlibm/s_cos.c +118 -0
  114. data/vendor/spidermonkey/fdlibm/s_erf.c +356 -0
  115. data/vendor/spidermonkey/fdlibm/s_expm1.c +267 -0
  116. data/vendor/spidermonkey/fdlibm/s_fabs.c +70 -0
  117. data/vendor/spidermonkey/fdlibm/s_finite.c +71 -0
  118. data/vendor/spidermonkey/fdlibm/s_floor.c +121 -0
  119. data/vendor/spidermonkey/fdlibm/s_frexp.c +99 -0
  120. data/vendor/spidermonkey/fdlibm/s_ilogb.c +85 -0
  121. data/vendor/spidermonkey/fdlibm/s_isnan.c +74 -0
  122. data/vendor/spidermonkey/fdlibm/s_ldexp.c +66 -0
  123. data/vendor/spidermonkey/fdlibm/s_lib_version.c +73 -0
  124. data/vendor/spidermonkey/fdlibm/s_log1p.c +211 -0
  125. data/vendor/spidermonkey/fdlibm/s_logb.c +79 -0
  126. data/vendor/spidermonkey/fdlibm/s_matherr.c +64 -0
  127. data/vendor/spidermonkey/fdlibm/s_modf.c +132 -0
  128. data/vendor/spidermonkey/fdlibm/s_nextafter.c +124 -0
  129. data/vendor/spidermonkey/fdlibm/s_rint.c +131 -0
  130. data/vendor/spidermonkey/fdlibm/s_scalbn.c +107 -0
  131. data/vendor/spidermonkey/fdlibm/s_signgam.c +40 -0
  132. data/vendor/spidermonkey/fdlibm/s_significand.c +68 -0
  133. data/vendor/spidermonkey/fdlibm/s_sin.c +118 -0
  134. data/vendor/spidermonkey/fdlibm/s_tan.c +112 -0
  135. data/vendor/spidermonkey/fdlibm/s_tanh.c +122 -0
  136. data/vendor/spidermonkey/fdlibm/w_acos.c +78 -0
  137. data/vendor/spidermonkey/fdlibm/w_acosh.c +78 -0
  138. data/vendor/spidermonkey/fdlibm/w_asin.c +80 -0
  139. data/vendor/spidermonkey/fdlibm/w_atan2.c +79 -0
  140. data/vendor/spidermonkey/fdlibm/w_atanh.c +81 -0
  141. data/vendor/spidermonkey/fdlibm/w_cosh.c +77 -0
  142. data/vendor/spidermonkey/fdlibm/w_exp.c +88 -0
  143. data/vendor/spidermonkey/fdlibm/w_fmod.c +78 -0
  144. data/vendor/spidermonkey/fdlibm/w_gamma.c +85 -0
  145. data/vendor/spidermonkey/fdlibm/w_gamma_r.c +81 -0
  146. data/vendor/spidermonkey/fdlibm/w_hypot.c +78 -0
  147. data/vendor/spidermonkey/fdlibm/w_j0.c +105 -0
  148. data/vendor/spidermonkey/fdlibm/w_j1.c +106 -0
  149. data/vendor/spidermonkey/fdlibm/w_jn.c +128 -0
  150. data/vendor/spidermonkey/fdlibm/w_lgamma.c +85 -0
  151. data/vendor/spidermonkey/fdlibm/w_lgamma_r.c +81 -0
  152. data/vendor/spidermonkey/fdlibm/w_log.c +78 -0
  153. data/vendor/spidermonkey/fdlibm/w_log10.c +81 -0
  154. data/vendor/spidermonkey/fdlibm/w_pow.c +99 -0
  155. data/vendor/spidermonkey/fdlibm/w_remainder.c +77 -0
  156. data/vendor/spidermonkey/fdlibm/w_scalb.c +95 -0
  157. data/vendor/spidermonkey/fdlibm/w_sinh.c +77 -0
  158. data/vendor/spidermonkey/fdlibm/w_sqrt.c +77 -0
  159. data/vendor/spidermonkey/javascript-trace.d +73 -0
  160. data/vendor/spidermonkey/js.c +3951 -0
  161. data/vendor/spidermonkey/js.mak +4438 -0
  162. data/vendor/spidermonkey/js.mdp +0 -0
  163. data/vendor/spidermonkey/js.msg +307 -0
  164. data/vendor/spidermonkey/js.pkg +2 -0
  165. data/vendor/spidermonkey/js3240.rc +79 -0
  166. data/vendor/spidermonkey/jsOS240.def +654 -0
  167. data/vendor/spidermonkey/jsapi.c +5836 -0
  168. data/vendor/spidermonkey/jsapi.h +2624 -0
  169. data/vendor/spidermonkey/jsarena.c +450 -0
  170. data/vendor/spidermonkey/jsarena.h +318 -0
  171. data/vendor/spidermonkey/jsarray.c +2988 -0
  172. data/vendor/spidermonkey/jsarray.h +124 -0
  173. data/vendor/spidermonkey/jsatom.c +1045 -0
  174. data/vendor/spidermonkey/jsatom.h +442 -0
  175. data/vendor/spidermonkey/jsbit.h +253 -0
  176. data/vendor/spidermonkey/jsbool.c +176 -0
  177. data/vendor/spidermonkey/jsbool.h +73 -0
  178. data/vendor/spidermonkey/jsclist.h +139 -0
  179. data/vendor/spidermonkey/jscntxt.c +1348 -0
  180. data/vendor/spidermonkey/jscntxt.h +1120 -0
  181. data/vendor/spidermonkey/jscompat.h +57 -0
  182. data/vendor/spidermonkey/jsconfig.h +248 -0
  183. data/vendor/spidermonkey/jsconfig.mk +181 -0
  184. data/vendor/spidermonkey/jscpucfg.c +383 -0
  185. data/vendor/spidermonkey/jscpucfg.h +212 -0
  186. data/vendor/spidermonkey/jsdate.c +2398 -0
  187. data/vendor/spidermonkey/jsdate.h +124 -0
  188. data/vendor/spidermonkey/jsdbgapi.c +1799 -0
  189. data/vendor/spidermonkey/jsdbgapi.h +464 -0
  190. data/vendor/spidermonkey/jsdhash.c +868 -0
  191. data/vendor/spidermonkey/jsdhash.h +592 -0
  192. data/vendor/spidermonkey/jsdtoa.c +3167 -0
  193. data/vendor/spidermonkey/jsdtoa.h +130 -0
  194. data/vendor/spidermonkey/jsdtracef.c +317 -0
  195. data/vendor/spidermonkey/jsdtracef.h +77 -0
  196. data/vendor/spidermonkey/jsemit.c +6909 -0
  197. data/vendor/spidermonkey/jsemit.h +741 -0
  198. data/vendor/spidermonkey/jsexn.c +1371 -0
  199. data/vendor/spidermonkey/jsexn.h +96 -0
  200. data/vendor/spidermonkey/jsfile.c +2736 -0
  201. data/vendor/spidermonkey/jsfile.h +56 -0
  202. data/vendor/spidermonkey/jsfile.msg +90 -0
  203. data/vendor/spidermonkey/jsfun.c +2634 -0
  204. data/vendor/spidermonkey/jsfun.h +254 -0
  205. data/vendor/spidermonkey/jsgc.c +3554 -0
  206. data/vendor/spidermonkey/jsgc.h +403 -0
  207. data/vendor/spidermonkey/jshash.c +476 -0
  208. data/vendor/spidermonkey/jshash.h +151 -0
  209. data/vendor/spidermonkey/jsify.pl +485 -0
  210. data/vendor/spidermonkey/jsinterp.c +6981 -0
  211. data/vendor/spidermonkey/jsinterp.h +521 -0
  212. data/vendor/spidermonkey/jsinvoke.c +43 -0
  213. data/vendor/spidermonkey/jsiter.c +1067 -0
  214. data/vendor/spidermonkey/jsiter.h +122 -0
  215. data/vendor/spidermonkey/jskeyword.tbl +124 -0
  216. data/vendor/spidermonkey/jskwgen.c +460 -0
  217. data/vendor/spidermonkey/jslibmath.h +266 -0
  218. data/vendor/spidermonkey/jslock.c +1309 -0
  219. data/vendor/spidermonkey/jslock.h +313 -0
  220. data/vendor/spidermonkey/jslocko.asm +60 -0
  221. data/vendor/spidermonkey/jslog2.c +94 -0
  222. data/vendor/spidermonkey/jslong.c +264 -0
  223. data/vendor/spidermonkey/jslong.h +412 -0
  224. data/vendor/spidermonkey/jsmath.c +568 -0
  225. data/vendor/spidermonkey/jsmath.h +57 -0
  226. data/vendor/spidermonkey/jsnum.c +1228 -0
  227. data/vendor/spidermonkey/jsnum.h +283 -0
  228. data/vendor/spidermonkey/jsobj.c +5266 -0
  229. data/vendor/spidermonkey/jsobj.h +709 -0
  230. data/vendor/spidermonkey/jsopcode.c +5245 -0
  231. data/vendor/spidermonkey/jsopcode.h +394 -0
  232. data/vendor/spidermonkey/jsopcode.tbl +523 -0
  233. data/vendor/spidermonkey/jsotypes.h +202 -0
  234. data/vendor/spidermonkey/jsparse.c +6680 -0
  235. data/vendor/spidermonkey/jsparse.h +511 -0
  236. data/vendor/spidermonkey/jsprf.c +1262 -0
  237. data/vendor/spidermonkey/jsprf.h +150 -0
  238. data/vendor/spidermonkey/jsproto.tbl +128 -0
  239. data/vendor/spidermonkey/jsprvtd.h +267 -0
  240. data/vendor/spidermonkey/jspubtd.h +744 -0
  241. data/vendor/spidermonkey/jsregexp.c +4352 -0
  242. data/vendor/spidermonkey/jsregexp.h +183 -0
  243. data/vendor/spidermonkey/jsreops.tbl +145 -0
  244. data/vendor/spidermonkey/jsscan.c +2003 -0
  245. data/vendor/spidermonkey/jsscan.h +387 -0
  246. data/vendor/spidermonkey/jsscope.c +1948 -0
  247. data/vendor/spidermonkey/jsscope.h +418 -0
  248. data/vendor/spidermonkey/jsscript.c +1832 -0
  249. data/vendor/spidermonkey/jsscript.h +287 -0
  250. data/vendor/spidermonkey/jsshell.msg +50 -0
  251. data/vendor/spidermonkey/jsstddef.h +83 -0
  252. data/vendor/spidermonkey/jsstr.c +5004 -0
  253. data/vendor/spidermonkey/jsstr.h +641 -0
  254. data/vendor/spidermonkey/jstypes.h +475 -0
  255. data/vendor/spidermonkey/jsutil.c +345 -0
  256. data/vendor/spidermonkey/jsutil.h +157 -0
  257. data/vendor/spidermonkey/jsxdrapi.c +800 -0
  258. data/vendor/spidermonkey/jsxdrapi.h +218 -0
  259. data/vendor/spidermonkey/jsxml.c +8471 -0
  260. data/vendor/spidermonkey/jsxml.h +349 -0
  261. data/vendor/spidermonkey/lock_SunOS.s +119 -0
  262. data/vendor/spidermonkey/perfect.js +39 -0
  263. data/vendor/spidermonkey/plify_jsdhash.sed +36 -0
  264. data/vendor/spidermonkey/prmjtime.c +846 -0
  265. data/vendor/spidermonkey/prmjtime.h +103 -0
  266. data/vendor/spidermonkey/resource.h +15 -0
  267. data/vendor/spidermonkey/rules.mk +197 -0
  268. data/vendor/spidermonkey/win32.order +384 -0
  269. metadata +4 -3
@@ -0,0 +1,442 @@
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___ */
@@ -0,0 +1,253 @@
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___ */