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,365 +0,0 @@
1
- # -*- Mode: makefile -*-
2
- # vim: ft=make
3
- #
4
- # ***** BEGIN LICENSE BLOCK *****
5
- # Version: MPL 1.1/GPL 2.0/LGPL 2.1
6
- #
7
- # The contents of this file are subject to the Mozilla Public License Version
8
- # 1.1 (the "License"); you may not use this file except in compliance with
9
- # the License. You may obtain a copy of the License at
10
- # http://www.mozilla.org/MPL/
11
- #
12
- # Software distributed under the License is distributed on an "AS IS" basis,
13
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14
- # for the specific language governing rights and limitations under the
15
- # License.
16
- #
17
- # The Original Code is Mozilla Communicator client code, released
18
- # March 31, 1998.
19
- #
20
- # The Initial Developer of the Original Code is
21
- # Netscape Communications Corporation.
22
- # Portions created by the Initial Developer are Copyright (C) 1998
23
- # the Initial Developer. All Rights Reserved.
24
- #
25
- # Contributor(s):
26
- # Michael Ang <mang@subcarrier.org>
27
- # Kevin Buhr <buhr@stat.wisc.edu>
28
- #
29
- # Alternatively, the contents of this file may be used under the terms of
30
- # either of the GNU General Public License Version 2 or later (the "GPL"),
31
- # or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
32
- # in which case the provisions of the GPL or the LGPL are applicable instead
33
- # of those above. If you wish to allow use of your version of this file only
34
- # under the terms of either the GPL or the LGPL, and not to allow others to
35
- # use your version of this file under the terms of the MPL, indicate your
36
- # decision by deleting the provisions above and replace them with the notice
37
- # and other provisions required by the GPL or the LGPL. If you do not delete
38
- # the provisions above, a recipient may use your version of this file under
39
- # the terms of any one of the MPL, the GPL or the LGPL.
40
- #
41
- # ***** END LICENSE BLOCK *****
42
-
43
- #
44
- # JSRef GNUmake makefile.
45
- #
46
- # Note: dependency rules are missing for some files (some
47
- # .h, all .msg, etc.) Re-make clean if in doubt.
48
- #
49
-
50
-
51
- DEPTH = .
52
-
53
- include config.mk
54
-
55
- #NS_USE_NATIVE = 1
56
-
57
- ifdef NARCISSUS
58
- DEFINES += -DNARCISSUS
59
- endif
60
-
61
- # Look in OBJDIR to find jsautocfg.h and jsautokw.h
62
- INCLUDES += -I$(OBJDIR)
63
-
64
- ifdef JS_THREADSAFE
65
- DEFINES += -DJS_THREADSAFE
66
- INCLUDES += -I$(DIST)/include/nspr
67
- ifdef USE_MSVC
68
- OTHER_LIBS += $(DIST)/lib/libnspr$(NSPR_LIBSUFFIX).lib
69
- else
70
- OTHER_LIBS += -L$(DIST)/lib -lnspr$(NSPR_LIBSUFFIX)
71
- endif
72
- endif
73
-
74
- ifdef JS_NO_THIN_LOCKS
75
- DEFINES += -DJS_USE_ONLY_NSPR_LOCKS
76
- endif
77
-
78
- ifdef JS_HAS_FILE_OBJECT
79
- DEFINES += -DJS_HAS_FILE_OBJECT
80
- endif
81
-
82
- #
83
- # XCFLAGS may be set in the environment or on the gmake command line
84
- #
85
- #CFLAGS += -DDEBUG -DDEBUG_brendan -DJS_ARENAMETER -DJS_HASHMETER -DJS_DUMP_PROPTREE_STATS -DJS_DUMP_SCOPE_METERS -DJS_SCOPE_DEPTH_METER -DJS_BASIC_STATS
86
- CFLAGS += $(OPTIMIZER) $(OS_CFLAGS) $(DEFINES) $(INCLUDES) $(XCFLAGS)
87
- INTERP_CFLAGS += $(INTERP_OPTIMIZER) $(OS_CFLAGS) $(DEFINES) $(INCLUDES) $(XCFLAGS) $(INTERP_XCFLAGS)
88
-
89
- LDFLAGS = $(XLDFLAGS)
90
-
91
- ifdef MOZ_SHARK
92
- DEFINES += -DMOZ_SHARK
93
- CFLAGS += -F/System/Library/PrivateFrameworks
94
- LDFLAGS += -F/System/Library/PrivateFrameworks -framework CHUD
95
- endif
96
-
97
- ifndef NO_LIBM
98
- LDFLAGS += -lm
99
- endif
100
-
101
- # Prevent floating point errors caused by VC++ optimizations
102
- ifeq ($(OS_ARCH),WINNT)
103
- _MSC_VER = $(shell $(CC) 2>&1 | sed -n 's/.*Compiler Version \([0-9]*\)\.\([0-9]*\).*/\1\2/p')
104
- ifeq (,$(filter-out 1200 1300 1310,$(_MSC_VER)))
105
- CFLAGS += -Op
106
- else
107
- CFLAGS += -fp:precise
108
- endif
109
- endif # WINNT
110
-
111
- #
112
- # Server-related changes :
113
- #
114
- ifdef NES40
115
- DEFINES += -DNES40
116
- endif
117
-
118
- #
119
- # Line editing support.
120
- # Define JS_READLINE or JS_EDITLINE to enable line editing in the
121
- # js command-line interpreter.
122
- #
123
- ifdef JS_READLINE
124
- # For those platforms with the readline library installed.
125
- DEFINES += -DEDITLINE
126
- PROG_LIBS += -lreadline -ltermcap
127
- else
128
- ifdef JS_EDITLINE
129
- # Use the editline library, built locally.
130
- PREDIRS += editline
131
- DEFINES += -DEDITLINE
132
- PROG_LIBS += editline/$(OBJDIR)/libedit.a
133
- endif
134
- endif
135
-
136
- # For purify
137
- PURE_CFLAGS = -DXP_UNIX $(OPTIMIZER) $(PURE_OS_CFLAGS) $(DEFINES) \
138
- $(INCLUDES) $(XCFLAGS)
139
-
140
- #
141
- # JS file lists
142
- #
143
- JS_HFILES = \
144
- jsarray.h \
145
- jsatom.h \
146
- jsbool.h \
147
- jsconfig.h \
148
- jscntxt.h \
149
- jsdate.h \
150
- jsemit.h \
151
- jsexn.h \
152
- jsfun.h \
153
- jsgc.h \
154
- jsinterp.h \
155
- jsiter.h \
156
- jslibmath.h \
157
- jslock.h \
158
- jsmath.h \
159
- jsnum.h \
160
- jsobj.h \
161
- jsopcode.h \
162
- jsparse.h \
163
- jsarena.h \
164
- jsclist.h \
165
- jsdhash.h \
166
- jsdtoa.h \
167
- jshash.h \
168
- jslong.h \
169
- jstypes.h \
170
- jsprvtd.h \
171
- jspubtd.h \
172
- jsregexp.h \
173
- jsscan.h \
174
- jsscope.h \
175
- jsscript.h \
176
- jsstr.h \
177
- jsutil.h \
178
- jsxdrapi.h \
179
- jsxml.h \
180
- $(NULL)
181
-
182
- API_HFILES = \
183
- jsapi.h \
184
- jsdbgapi.h \
185
- $(NULL)
186
-
187
- OTHER_HFILES = \
188
- jsbit.h \
189
- jscompat.h \
190
- jscpucfg.h \
191
- jsotypes.h \
192
- jsstddef.h \
193
- prmjtime.h \
194
- resource.h \
195
- jsopcode.tbl \
196
- jsproto.tbl \
197
- js.msg \
198
- jsshell.msg \
199
- jskeyword.tbl \
200
- $(NULL)
201
-
202
- ifndef PREBUILT_CPUCFG
203
- OTHER_HFILES += $(OBJDIR)/jsautocfg.h
204
- endif
205
- OTHER_HFILES += $(OBJDIR)/jsautokw.h
206
-
207
- HFILES = $(JS_HFILES) $(API_HFILES) $(OTHER_HFILES)
208
-
209
- JS_CFILES = \
210
- jsapi.c \
211
- jsarena.c \
212
- jsarray.c \
213
- jsatom.c \
214
- jsbool.c \
215
- jscntxt.c \
216
- jsdate.c \
217
- jsdbgapi.c \
218
- jsdhash.c \
219
- jsdtoa.c \
220
- jsemit.c \
221
- jsexn.c \
222
- jsfun.c \
223
- jsgc.c \
224
- jshash.c \
225
- jsinterp.c \
226
- jsinvoke.c \
227
- jsiter.c \
228
- jslock.c \
229
- jslog2.c \
230
- jslong.c \
231
- jsmath.c \
232
- jsnum.c \
233
- jsobj.c \
234
- jsopcode.c \
235
- jsparse.c \
236
- jsprf.c \
237
- jsregexp.c \
238
- jsscan.c \
239
- jsscope.c \
240
- jsscript.c \
241
- jsstr.c \
242
- jsutil.c \
243
- jsxdrapi.c \
244
- jsxml.c \
245
- prmjtime.c \
246
- $(NULL)
247
-
248
- ifdef JS_LIVECONNECT
249
- DIRS += liveconnect
250
- endif
251
-
252
- ifdef JS_HAS_FILE_OBJECT
253
- JS_CFILES += jsfile.c
254
- JS_HFILES += jsfile.h
255
- endif
256
-
257
- LIB_CFILES = $(JS_CFILES)
258
- LIB_ASFILES := $(wildcard *_$(OS_ARCH).s)
259
- PROG_CFILES = js.c
260
-
261
- ifdef USE_MSVC
262
- LIBRARY = $(OBJDIR)/js32.lib
263
- SHARED_LIBRARY = $(OBJDIR)/js32.dll
264
- PROGRAM = $(OBJDIR)/js.exe
265
- else
266
- LIBRARY = $(OBJDIR)/libjs.a
267
- SHARED_LIBRARY = $(OBJDIR)/libjs.$(SO_SUFFIX)
268
- PROGRAM = $(OBJDIR)/js
269
- endif
270
-
271
- include rules.mk
272
-
273
- MOZ_DEPTH = ../..
274
- include jsconfig.mk
275
-
276
- nsinstall-target:
277
- cd ../../config; $(MAKE) OBJDIR=$(OBJDIR) OBJDIR_NAME=$(OBJDIR)
278
-
279
- #
280
- # Rules for keyword switch generation
281
- #
282
-
283
- GARBAGE += $(OBJDIR)/jsautokw.h $(OBJDIR)/jskwgen$(HOST_BIN_SUFFIX)
284
- GARBAGE += $(OBJDIR)/jskwgen.$(OBJ_SUFFIX)
285
-
286
- $(OBJDIR)/jsscan.$(OBJ_SUFFIX): $(OBJDIR)/jsautokw.h jskeyword.tbl
287
-
288
- $(OBJDIR)/jskwgen.$(OBJ_SUFFIX): jskwgen.c jskeyword.tbl
289
-
290
- $(OBJDIR)/jsautokw.h: $(OBJDIR)/jskwgen$(HOST_BIN_SUFFIX) jskeyword.tbl
291
- $(OBJDIR)/jskwgen$(HOST_BIN_SUFFIX) $@
292
-
293
- ifdef USE_MSVC
294
-
295
- $(OBJDIR)/jskwgen.obj: jskwgen.c jskeyword.tbl
296
- @$(MAKE_OBJDIR)
297
- $(CC) -Fo$(OBJDIR)/ -c $(CFLAGS) $<
298
-
299
- $(OBJDIR)/jskwgen$(HOST_BIN_SUFFIX): $(OBJDIR)/jskwgen.$(OBJ_SUFFIX)
300
- link.exe -out:"$@" $(EXE_LINK_FLAGS) $^
301
-
302
- else
303
-
304
- $(OBJDIR)/jskwgen.o: jskwgen.c jskeyword.tbl
305
- @$(MAKE_OBJDIR)
306
- $(CC) -o $@ -c $(CFLAGS) $<
307
-
308
- $(OBJDIR)/jskwgen$(HOST_BIN_SUFFIX): $(OBJDIR)/jskwgen.$(OBJ_SUFFIX)
309
- $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $^
310
-
311
- endif
312
-
313
- #
314
- # JS shell executable
315
- #
316
-
317
- ifdef USE_MSVC
318
- $(PROGRAM): $(PROG_OBJS) $(LIBRARY)
319
- link.exe -out:"$@" $(EXE_LINK_FLAGS) $^
320
- else
321
- $(PROGRAM): $(PROG_OBJS) $(LIBRARY)
322
- $(CC) -o $@ $(CFLAGS) $(PROG_OBJS) $(LIBRARY) $(LDFLAGS) $(OTHER_LIBS) \
323
- $(PROG_LIBS)
324
- endif
325
-
326
- $(PROGRAM).pure: $(PROG_OBJS) $(LIBRARY)
327
- purify $(PUREFLAGS) \
328
- $(CC) -o $@ $(PURE_OS_CFLAGS) $(PROG_OBJS) $(LIBRARY) $(LDFLAGS) \
329
- $(OTHER_LIBS) $(PROG_LIBS)
330
-
331
- ifndef PREBUILT_CPUCFG
332
- $(HFILES) $(CFILES): $(OBJDIR)/jsautocfg.h
333
-
334
- $(OBJDIR)/jsautocfg.h: $(OBJDIR)/jscpucfg
335
- rm -f $@
336
- $(OBJDIR)/jscpucfg > $@
337
-
338
- $(OBJDIR)/jscpucfg: $(OBJDIR)/jscpucfg.o
339
- $(CC) -o $@ $(OBJDIR)/jscpucfg.o
340
-
341
- # Add to TARGETS for clobber rule
342
- TARGETS += $(OBJDIR)/jsautocfg.h $(OBJDIR)/jscpucfg \
343
- $(OBJDIR)/jscpucfg.o
344
- endif
345
-
346
- # Automatic make dependencies files
347
- DEPENDENCIES = $(CFILES:%.c=$(OBJDIR)/%.d)
348
-
349
- #
350
- # Hardwire dependencies for jsinvoke.c
351
- #
352
- ifdef USE_MSVC
353
- $(OBJDIR)/jsinvoke.obj : jsinterp.h jsinterp.c
354
- else
355
- $(OBJDIR)/jsinvoke.o : jsinterp.h jsinterp.c
356
- endif
357
-
358
- -include $(DEPENDENCIES)
359
-
360
- TARNAME = jsref.tar
361
- TARFILES = files `cat files`
362
-
363
- SUFFIXES: .i
364
- %.i: %.c
365
- $(CC) -C -E $(CFLAGS) $< > $*.i
@@ -1,820 +0,0 @@
1
- <!-- ***** BEGIN LICENSE BLOCK *****
2
- - Version: MPL 1.1/GPL 2.0/LGPL 2.1
3
- -
4
- - The contents of this file are subject to the Mozilla Public License Version
5
- - 1.1 (the "License"); you may not use this file except in compliance with
6
- - the License. You may obtain a copy of the License at
7
- - http://www.mozilla.org/MPL/
8
- -
9
- - Software distributed under the License is distributed on an "AS IS" basis,
10
- - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
- - for the specific language governing rights and limitations under the
12
- - License.
13
- -
14
- - The Original Code is Mozilla Communicator client code, released
15
- - March 31, 1998.
16
- -
17
- - The Initial Developer of the Original Code is
18
- - Netscape Communications Corporation.
19
- - Portions created by the Initial Developer are Copyright (C) 1998-1999
20
- - the Initial Developer. All Rights Reserved.
21
- -
22
- - Contributor(s):
23
- -
24
- - Alternatively, the contents of this file may be used under the terms of
25
- - either of the GNU General Public License Version 2 or later (the "GPL"),
26
- - or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27
- - in which case the provisions of the GPL or the LGPL are applicable instead
28
- - of those above. If you wish to allow use of your version of this file only
29
- - under the terms of either the GPL or the LGPL, and not to allow others to
30
- - use your version of this file under the terms of the MPL, indicate your
31
- - decision by deleting the provisions above and replace them with the notice
32
- - and other provisions required by the GPL or the LGPL. If you do not delete
33
- - the provisions above, a recipient may use your version of this file under
34
- - the terms of any one of the MPL, the GPL or the LGPL.
35
- -
36
- - ***** END LICENSE BLOCK ***** -->
37
- <!doctype html public "-//w3c//dtd html 4.0 transitional//en">
38
- <html>
39
- <head>
40
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
41
- <meta name="GENERATOR" content="Mozilla/4.5 [en] (WinNT; I) [Netscape]">
42
- <title>JavaScript Reference Implementation (JSRef) README</title>
43
- </head>
44
- <body>
45
-
46
- <h2>
47
- Table of Contents</h2>
48
-
49
- <ul>
50
- <li>
51
- <a href="#Introduction">Introduction</a></li>
52
-
53
- <li>
54
- <a href="#Build">Build conventions (standalone JS engine and shell)</a></li>
55
-
56
- <li>
57
- <a href="#Debugging">Debugging notes</a></li>
58
-
59
- <li>
60
- <a href="#Conventions">Naming and coding conventions</a></li>
61
-
62
- <li>
63
- <a href="#JSAPI">Using the JS API</a></li>
64
-
65
- <li>
66
- <a href="#Design">Design walk-through</a></li>
67
-
68
- <li>
69
- <a href="#Resources">Additional Resources (links, API docs, and newsgroups)</a></li>
70
-
71
- </ul>
72
-
73
- <h2>
74
- <a NAME="Introduction"></a>Introduction</h2>
75
- This is the README file for the&nbsp;<span CLASS=LXRSHORTDESC>JavaScript
76
- Reference (JSRef, now better known as SpiderMonkey) implementation.</span>
77
- It consists of build conventions
78
- and instructions, source code conventions, a design walk-through, and a
79
- brief file-by-file description of the source.
80
- <p><span CLASS=LXRLONGDESC>JSRef builds a library or DLL containing the
81
- JavaScript runtime (compiler, interpreter, decompiler, garbage collector,
82
- atom manager, standard classes). It then compiles a small "shell" program
83
- and links that with the library to make an interpreter that can be used
84
- interactively and with test .js files to run scripts.&nbsp; The code has
85
- no dependencies on the rest of the Mozilla codebase.</span>
86
- <p><i>Quick start tip</i>: skip to "Using the JS API" below, build the
87
- js shell, and play with the object named "it" (start by setting 'it.noisy
88
- = true').
89
- <h2>
90
- <a NAME="Build"></a>Build conventions (standalone JS engine and shell)
91
- (OUT OF DATE!)</h2>
92
- These build directions refer only to building the standalone JavaScript
93
- engine and shell.&nbsp; To build within the browser, refer to the <a
94
- href="http://www.mozilla.org/build/">build
95
- directions</a> on the mozilla.org website.
96
- <p>By default, all platforms build a version of the JS engine that is <i>not</i>
97
- threadsafe.&nbsp; If you require thread-safety, you must also populate
98
- the <tt>mozilla/dist</tt> directory with <a href="http://www.mozilla.org/projects/nspr/reference/html/"
99
- >NSPR</a>
100
- headers and libraries.&nbsp; (NSPR implements a portable threading library,
101
- among other things.&nbsp; The source is downloadable via <a href="http://www.mozilla.org/cvs.html">CVS</a>
102
- from <tt><a href="http://lxr.mozilla.org/mozilla/source/nsprpub">mozilla/nsprpub</a></tt>.)&nbsp;
103
- Next, you must define <tt>JS_THREADSAFE</tt> when building the JS engine,
104
- either on the command-line (gmake/nmake) or in a universal header file.
105
- <h3>
106
- Windows</h3>
107
-
108
- <ul>
109
- <li>
110
- Use MSVC 4.2 or 5.0.</li>
111
-
112
- <li>
113
- For building from the IDE use <tt>js/src/js.mdp</tt>.&nbsp; (<tt>js.mdp</tt>
114
- is an MSVC4.2 project file, but if you load it into MSVC5, it will be converted
115
- to the newer project file format.)&nbsp; <font color="#CC0000">NOTE: makefile.win
116
- is an nmake file used only for building the JS-engine in the Mozilla browser.&nbsp;
117
- Don't attempt to use it to build the standalone JS-engine.</font></li>
118
-
119
- <li>
120
- If you prefer to build from the command-line, use '<tt>nmake -f js.mak</tt>'</li>
121
-
122
- <li>
123
- Executable shell <tt>js.exe</tt> and runtime library <tt>js32.dll</tt>
124
- are created in either <tt>js/src/Debug</tt> or <tt>js/src/Release</tt>.</li>
125
- </ul>
126
-
127
- <h3>
128
- Macintosh</h3>
129
-
130
- <ul>
131
- <li>
132
- Use CodeWarrior 3.x</li>
133
-
134
- <li>
135
- Load the project file <tt>js:src:macbuild:JSRef.mcp </tt>and select "Make"
136
- from the menu.</li>
137
- </ul>
138
-
139
- <h3>
140
- Unix</h3>
141
-
142
- <ul>
143
- <li>
144
- Use '<tt>gmake -f Makefile.ref</tt>' to build. To compile optimized code,
145
- pass <tt>BUILD_OPT=1</tt> on the gmake command line or preset it in the
146
- environment or <tt>Makefile.ref</tt>.&nbsp; <font color="#CC0000">NOTE:
147
- Do not attempt to use Makefile to build the standalone JavaScript engine.&nbsp;
148
- This file is used only for building the JS-engine in the Mozilla browser.</font></li>
149
-
150
- <li>
151
- <font color="#000000">Each platform on which JS is built must have a <tt>*.mk</tt>
152
- configuration file in the <tt>js/src/config</tt> directory.&nbsp; The configuration
153
- file specifies the compiler/linker to be used and allows for customization
154
- of command-line options.&nbsp; To date, the build system has been tested
155
- on Solaris, AIX, HP/UX, OSF, IRIX, x86 Linux and Windows NT.</font></li>
156
-
157
- <li>
158
- <font color="#000000">Most platforms will work with either the vendor compiler
159
- </font>or
160
- <a href="ftp://prep.ai.mit.edu/pub/gnu">gcc</a>.&nbsp;
161
- (Except that HP builds only work using the native compiler.&nbsp; gcc won't
162
- link correctly with shared libraries on that platform.&nbsp; If someone
163
- knows a way to fix this, <a href="mailto:wynholds@netscape.com">let us
164
- know</a>.)</li>
165
-
166
- <li>
167
- <font color="#000000">If you define <tt>JS_LIVECONNECT</tt>, gmake will
168
- descend into the liveconnect directory and build
169
- <a href="http://lxr.mozilla.org/mozilla/source/js/src/liveconnect/README.html">LiveConnect</a>
170
- after building the JS engine.</font></li>
171
-
172
- <li>
173
- To build a binary drop (a zip'ed up file of headers, libraries, binaries),
174
- check out <tt>mozilla/config</tt> and <tt>mozilla/nsprpub/config</tt>.&nbsp;
175
- Use '<tt>gmake -f Makefile.ref nsinstall-target all export ship</tt>'</li>
176
- </ul>
177
-
178
- <h2>
179
- <a NAME="Debugging"></a>Debugging notes</h2>
180
-
181
- <ul>
182
- <li>
183
- To turn on GC instrumentation, define <tt>JS_GCMETER</tt>.</li>
184
-
185
- <ul>
186
- <li>
187
- To dump JS heap use JS_DumpHeap API, available in DEBUG builds. For an example
188
- how to call it see DumpHeap implementation in js.c.</li>
189
-
190
- <li>
191
- To turn on the arena package's instrumentation, define <tt>JS_ARENAMETER</tt>.</li>
192
-
193
- <li>
194
- To turn on the hash table package's metering, define <tt>JS_HASHMETER</tt>.</li>
195
- </ul>
196
-
197
- <h2>
198
- <a NAME="Conventions"></a>Naming and coding conventions</h2>
199
-
200
- <ul>
201
- <li>
202
- Public function names begin with <tt>JS_</tt> followed by capitalized "intercaps",
203
- e.g. <tt>JS_NewObject</tt>.</li>
204
-
205
- <li>
206
- Extern but library-private function names use a <tt>js_</tt> prefix and
207
- mixed case, e.g. <tt>js_SearchScope</tt>.</li>
208
-
209
- <li>
210
- Most static function names have unprefixed, mixed-case names: <tt>GetChar</tt>.</li>
211
-
212
- <li>
213
- But static native methods of JS objects have lowercase, underscore-separated
214
- or intercaps names, e.g., <tt>str_indexOf</tt>.</li>
215
-
216
- <li>
217
- And library-private and static data use underscores, not intercaps (but
218
- library-private data do use a <tt>js_</tt> prefix).</li>
219
-
220
- <li>
221
- Scalar type names are lowercase and js-prefixed: <tt>jsdouble</tt>.</li>
222
-
223
- <li>
224
- Aggregate type names are JS-prefixed and mixed-case: <tt>JSObject.</tt></li>
225
-
226
- <li>
227
- Macros are generally <tt>ALL_CAPS </tt>and underscored, to call out potential
228
- side effects, multiple uses of a formal argument, etc.</li>
229
-
230
- <li>
231
- Four spaces of indentation per statement nesting level.</li>
232
-
233
- <li>
234
- Tabs are taken to be eight spaces, and an Emacs magic comment at the top
235
- of each file tries to help. If you're using MSVC or similar, you'll want
236
- to set tab width to 8, and help convert these files to be space-filled.
237
- <font color="#CC0000">Do not add hard tabs to source files; do remove them
238
- whenever possible.</font></li>
239
-
240
- <li>
241
- DLL entry points have their return type expanded within a <tt>JS_PUBLIC_API()</tt>
242
- macro call, to get the right Windows secret type qualifiers in the right
243
- places for all build variants.</li>
244
-
245
- <li>
246
- Callback functions that might be called from a DLL are similarly macroized
247
- with <tt>JS_STATIC_DLL_CALLBACK</tt> (if the function otherwise would be
248
- static to hide its name) or <tt>JS_DLL_CALLBACK</tt> (this macro takes
249
- no type argument; it should be used after the return type and before the
250
- function name).</li>
251
- </ul>
252
-
253
- <h2>
254
- <a NAME="JSAPI"></a>Using the JS API</h2>
255
-
256
- <h4>
257
- Starting up</h4>
258
-
259
- <pre><tt>&nbsp;&nbsp;&nbsp; /*
260
- &nbsp;&nbsp;&nbsp;&nbsp; * Tune this to avoid wasting space for shallow stacks, while saving on
261
- &nbsp;&nbsp;&nbsp;&nbsp; * malloc overhead/fragmentation for deep or highly-variable stacks.
262
- &nbsp;&nbsp;&nbsp;&nbsp; */
263
- &nbsp;&nbsp;&nbsp; #define STACK_CHUNK_SIZE&nbsp;&nbsp;&nbsp; 8192
264
-
265
- &nbsp;&nbsp;&nbsp; JSRuntime *rt;
266
- &nbsp;&nbsp;&nbsp; JSContext *cx;
267
-
268
- &nbsp;&nbsp;&nbsp; /* You need a runtime and one or more contexts to do anything with JS. */
269
- &nbsp;&nbsp;&nbsp; rt = JS_NewRuntime(0x400000L);
270
- &nbsp;&nbsp;&nbsp; if (!rt)
271
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fail("can't create JavaScript runtime");
272
- &nbsp;&nbsp;&nbsp; cx = JS_NewContext(rt, STACK_CHUNK_SIZE);
273
- &nbsp;&nbsp;&nbsp; if (!cx)
274
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fail("can't create JavaScript context");
275
-
276
- &nbsp;&nbsp;&nbsp; /*
277
- &nbsp;&nbsp;&nbsp;&nbsp; * The context definitely wants a global object, in order to have standard
278
- &nbsp;&nbsp;&nbsp;&nbsp; * classes and functions like Date and parseInt.&nbsp; See below for details on
279
- &nbsp;&nbsp;&nbsp;&nbsp; * JS_NewObject.
280
- &nbsp;&nbsp;&nbsp;&nbsp; */
281
- &nbsp;&nbsp;&nbsp; JSObject *globalObj;
282
-
283
- &nbsp;&nbsp;&nbsp; globalObj = JS_NewObject(cx, &amp;my_global_class, 0, 0);
284
- &nbsp;&nbsp;&nbsp; JS_InitStandardClasses(cx, globalObj);</tt></pre>
285
-
286
- <h4>
287
- Defining objects and properties</h4>
288
-
289
- <pre><tt>&nbsp;&nbsp;&nbsp; /* Statically initialize a class to make "one-off" objects. */
290
- &nbsp;&nbsp;&nbsp; JSClass my_class = {
291
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MyClass",
292
-
293
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* All of these can be replaced with the corresponding JS_*Stub
294
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function pointers. */
295
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_addProperty, my_delProperty, my_getProperty, my_setProperty,
296
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_enumerate,&nbsp;&nbsp; my_resolve,&nbsp;&nbsp;&nbsp;&nbsp; my_convert,&nbsp;&nbsp;&nbsp;&nbsp; my_finalize
297
- &nbsp;&nbsp;&nbsp; };
298
-
299
- &nbsp;&nbsp;&nbsp; JSObject *obj;
300
-
301
- &nbsp;&nbsp;&nbsp; /*
302
- &nbsp;&nbsp;&nbsp;&nbsp; * Define an object named in the global scope that can be enumerated by
303
- &nbsp;&nbsp;&nbsp;&nbsp; * for/in loops.&nbsp; The parent object is passed as the second argument, as
304
- &nbsp;&nbsp;&nbsp;&nbsp; * with all other API calls that take an object/name pair.&nbsp; The prototype
305
- &nbsp;&nbsp;&nbsp;&nbsp; * passed in is null, so the default object prototype will be used.
306
- &nbsp;&nbsp;&nbsp;&nbsp; */
307
- &nbsp;&nbsp;&nbsp; obj = JS_DefineObject(cx, globalObj, "myObject", &amp;my_class, NULL,
308
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_ENUMERATE);
309
-
310
- &nbsp;&nbsp;&nbsp; /*
311
- &nbsp;&nbsp;&nbsp;&nbsp; * Define a bunch of properties with a JSPropertySpec array statically
312
- &nbsp;&nbsp;&nbsp;&nbsp; * initialized and terminated with a null-name entry.&nbsp; Besides its name,
313
- &nbsp;&nbsp;&nbsp;&nbsp; * each property has a "tiny" identifier (MY_COLOR, e.g.) that can be used
314
- &nbsp;&nbsp;&nbsp;&nbsp; * in switch statements (in a common my_getProperty function, for example).
315
- &nbsp;&nbsp;&nbsp;&nbsp; */
316
- &nbsp;&nbsp;&nbsp; enum my_tinyid {
317
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_COLOR, MY_HEIGHT, MY_WIDTH, MY_FUNNY, MY_ARRAY, MY_RDONLY
318
- &nbsp;&nbsp;&nbsp; };
319
-
320
- &nbsp;&nbsp;&nbsp; static JSPropertySpec my_props[] = {
321
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"color",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_COLOR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_ENUMERATE},
322
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"height",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_HEIGHT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_ENUMERATE},
323
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"width",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_WIDTH,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_ENUMERATE},
324
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"funny",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_FUNNY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_ENUMERATE},
325
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"array",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_ARRAY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_ENUMERATE},
326
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"rdonly",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MY_RDONLY,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSPROP_READONLY},
327
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0}
328
- &nbsp;&nbsp;&nbsp; };
329
-
330
- &nbsp;&nbsp;&nbsp; JS_DefineProperties(cx, obj, my_props);
331
-
332
- &nbsp;&nbsp;&nbsp; /*
333
- &nbsp;&nbsp;&nbsp;&nbsp; * Given the above definitions and call to JS_DefineProperties, obj will
334
- &nbsp;&nbsp;&nbsp;&nbsp; * need this sort of "getter" method in its class (my_class, above).&nbsp; See
335
- &nbsp;&nbsp;&nbsp;&nbsp; * the example for the "It" class in js.c.
336
- &nbsp;&nbsp;&nbsp;&nbsp; */
337
- &nbsp;&nbsp;&nbsp; static JSBool
338
- &nbsp;&nbsp;&nbsp; my_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
339
- &nbsp;&nbsp;&nbsp; {
340
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (JSVAL_IS_INT(id)) {
341
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (JSVAL_TO_INT(id)) {
342
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MY_COLOR:&nbsp; *vp = . . .; break;
343
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MY_HEIGHT: *vp = . . .; break;
344
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MY_WIDTH:&nbsp; *vp = . . .; break;
345
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MY_FUNNY:&nbsp; *vp = . . .; break;
346
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MY_ARRAY:&nbsp; *vp = . . .; break;
347
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MY_RDONLY: *vp = . . .; break;
348
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
349
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
350
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return JS_TRUE;
351
- &nbsp;&nbsp;&nbsp; }</tt></pre>
352
-
353
- <h4>
354
- Defining functions</h4>
355
-
356
- <pre><tt>&nbsp;&nbsp;&nbsp; /* Define a bunch of native functions first: */
357
- &nbsp;&nbsp;&nbsp; static JSBool
358
- &nbsp;&nbsp;&nbsp; my_abs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
359
- &nbsp;&nbsp;&nbsp; {
360
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsdouble x, z;
361
-
362
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!JS_ValueToNumber(cx, argv[0], &amp;x))
363
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return JS_FALSE;
364
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; z = (x &lt; 0) ? -x : x;
365
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return JS_NewDoubleValue(cx, z, rval);
366
- &nbsp;&nbsp;&nbsp; }
367
-
368
- &nbsp;&nbsp;&nbsp; . . .
369
-
370
- &nbsp;&nbsp;&nbsp; /*
371
- &nbsp;&nbsp;&nbsp;&nbsp; * Use a JSFunctionSpec array terminated with a null name to define a
372
- &nbsp;&nbsp;&nbsp;&nbsp; * bunch of native functions.
373
- &nbsp;&nbsp;&nbsp;&nbsp; */
374
- &nbsp;&nbsp;&nbsp; static JSFunctionSpec my_functions[] = {
375
- &nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; native&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nargs&nbsp;&nbsp;&nbsp; */
376
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"abs",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_abs,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1},
377
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"acos",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_acos,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1},
378
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"asin",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_asin,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1},
379
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .
380
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0}
381
- &nbsp;&nbsp;&nbsp; };
382
-
383
- &nbsp;&nbsp;&nbsp; /*
384
- &nbsp;&nbsp;&nbsp;&nbsp; * Pass a particular object to define methods for it alone.&nbsp; If you pass
385
- &nbsp;&nbsp;&nbsp;&nbsp; * a prototype object, the methods will apply to all instances past and
386
- &nbsp;&nbsp;&nbsp;&nbsp; * future of the prototype's class (see below for classes).
387
- &nbsp;&nbsp;&nbsp;&nbsp; */
388
- &nbsp;&nbsp;&nbsp; JS_DefineFunctions(cx, globalObj, my_functions);</tt></pre>
389
-
390
- <h4>
391
- Defining classes</h4>
392
-
393
- <pre><tt>&nbsp;&nbsp;&nbsp; /*
394
- &nbsp;&nbsp;&nbsp;&nbsp; * This pulls together the above API elements by defining a constructor
395
- &nbsp;&nbsp;&nbsp;&nbsp; * function, a prototype object, and properties of the prototype and of
396
- &nbsp;&nbsp;&nbsp;&nbsp; * the constructor, all with one API call.
397
- &nbsp;&nbsp;&nbsp;&nbsp; *
398
- &nbsp;&nbsp;&nbsp;&nbsp; * Initialize a class by defining its constructor function, prototype, and
399
- &nbsp;&nbsp;&nbsp;&nbsp; * per-instance and per-class properties.&nbsp; The latter are called "static"
400
- &nbsp;&nbsp;&nbsp;&nbsp; * below by analogy to Java.&nbsp; They are defined in the constructor object's
401
- &nbsp;&nbsp;&nbsp;&nbsp; * scope, so that 'MyClass.myStaticProp' works along with 'new MyClass()'.
402
- &nbsp;&nbsp;&nbsp;&nbsp; *
403
- &nbsp;&nbsp;&nbsp;&nbsp; * JS_InitClass takes a lot of arguments, but you can pass null for any of
404
- &nbsp;&nbsp;&nbsp;&nbsp; * the last four if there are no such properties or methods.
405
- &nbsp;&nbsp;&nbsp;&nbsp; *
406
- &nbsp;&nbsp;&nbsp;&nbsp; * Note that you do not need to call JS_InitClass to make a new instance of
407
- &nbsp;&nbsp;&nbsp;&nbsp; * that class -- otherwise there would be a chicken-and-egg problem making
408
- &nbsp;&nbsp;&nbsp;&nbsp; * the global object -- but you should call JS_InitClass if you require a
409
- &nbsp;&nbsp;&nbsp;&nbsp; * constructor function for script authors to call via new, and/or a class
410
- &nbsp;&nbsp;&nbsp;&nbsp; * prototype object ('MyClass.prototype') for authors to extend with new
411
- &nbsp;&nbsp;&nbsp;&nbsp; * properties at run-time. In general, if you want to support multiple
412
- &nbsp;&nbsp;&nbsp;&nbsp; * instances that share behavior, use JS_InitClass.
413
- &nbsp;&nbsp;&nbsp;&nbsp; */
414
- &nbsp;&nbsp;&nbsp; protoObj = JS_InitClass(cx, globalObj, NULL, &amp;my_class,
415
-
416
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* native constructor function and min arg count */
417
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyClass, 0,
418
-
419
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* prototype object properties and methods -- these
420
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will be "inherited" by all instances through
421
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delegation up the instance's prototype link. */
422
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_props, my_methods,
423
-
424
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* class constructor properties and methods */
425
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_static_props, my_static_methods);</tt></pre>
426
-
427
- <h4>
428
- Running scripts</h4>
429
-
430
- <pre><tt>&nbsp;&nbsp;&nbsp; /* These should indicate source location for diagnostics. */
431
- &nbsp;&nbsp;&nbsp; char *filename;
432
- &nbsp;&nbsp;&nbsp; uintN lineno;
433
-
434
- &nbsp;&nbsp;&nbsp; /*
435
- &nbsp;&nbsp;&nbsp;&nbsp; * The return value comes back here -- if it could be a GC thing, you must
436
- &nbsp;&nbsp;&nbsp;&nbsp; * add it to the GC's "root set" with JS_AddRoot(cx, &amp;thing) where thing
437
- &nbsp;&nbsp;&nbsp;&nbsp; * is a JSString *, JSObject *, or jsdouble *, and remove the root before
438
- &nbsp;&nbsp;&nbsp;&nbsp; * rval goes out of scope, or when rval is no longer needed.
439
- &nbsp;&nbsp;&nbsp;&nbsp; */
440
- &nbsp;&nbsp;&nbsp; jsval rval;
441
- &nbsp;&nbsp;&nbsp; JSBool ok;
442
-
443
- &nbsp;&nbsp;&nbsp; /*
444
- &nbsp;&nbsp;&nbsp;&nbsp; * Some example source in a C string.&nbsp; Larger, non-null-terminated buffers
445
- &nbsp;&nbsp;&nbsp;&nbsp; * can be used, if you pass the buffer length to JS_EvaluateScript.
446
- &nbsp;&nbsp;&nbsp;&nbsp; */
447
- &nbsp;&nbsp;&nbsp; char *source = "x * f(y)";
448
-
449
- &nbsp;&nbsp;&nbsp; ok = JS_EvaluateScript(cx, globalObj, source, strlen(source),
450
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename, lineno, &amp;rval);
451
-
452
- &nbsp;&nbsp;&nbsp; if (ok) {
453
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Should get a number back from the example source. */
454
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsdouble d;
455
-
456
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = JS_ValueToNumber(cx, rval, &amp;d);
457
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .
458
- &nbsp;&nbsp;&nbsp; }</tt></pre>
459
-
460
- <h4>
461
- Calling functions</h4>
462
-
463
- <pre><tt>&nbsp;&nbsp;&nbsp; /* Call a global function named "foo" that takes no arguments. */
464
- &nbsp;&nbsp;&nbsp; ok = JS_CallFunctionName(cx, globalObj, "foo", 0, 0, &amp;rval);
465
-
466
- &nbsp;&nbsp;&nbsp; jsval argv[2];
467
-
468
- &nbsp;&nbsp;&nbsp; /* Call a function in obj's scope named "method", passing two arguments. */
469
- &nbsp;&nbsp;&nbsp; argv[0] = . . .;
470
- &nbsp;&nbsp;&nbsp; argv[1] = . . .;
471
- &nbsp;&nbsp;&nbsp; ok = JS_CallFunctionName(cx, obj, "method", 2, argv, &amp;rval);</tt></pre>
472
-
473
- <h4>
474
- Shutting down</h4>
475
-
476
- <pre><tt>&nbsp;&nbsp;&nbsp; /* For each context you've created: */
477
- &nbsp;&nbsp;&nbsp; JS_DestroyContext(cx);
478
-
479
- &nbsp;&nbsp;&nbsp; /* For each runtime: */
480
- &nbsp;&nbsp;&nbsp; JS_DestroyRuntime(rt);
481
-
482
- &nbsp;&nbsp;&nbsp; /* And finally: */
483
- &nbsp;&nbsp;&nbsp; JS_ShutDown();</tt></pre>
484
-
485
- <h4>
486
- Debugging API</h4>
487
- See the<tt> trap, untrap, watch, unwatch, line2pc</tt>, and <tt>pc2line</tt>
488
- commands in <tt>js.c</tt>. Also the (scant) comments in <i>jsdbgapi.h</i>.
489
- <h2>
490
- <a NAME="Design"></a>Design walk-through</h2>
491
- This section must be brief for now -- it could easily turn into a book.
492
- <h4>
493
- JS "JavaScript Proper"</h4>
494
- JS modules declare and implement the JavaScript compiler, interpreter,
495
- decompiler, GC and atom manager, and standard classes.
496
- <p>JavaScript uses untyped bytecode and runtime type tagging of data values.
497
- The <tt>jsval</tt> type is a signed machine word that contains either a
498
- signed integer value (if the low bit is set), or a type-tagged pointer
499
- or boolean value (if the low bit is clear). Tagged pointers all refer to
500
- 8-byte-aligned things in the GC heap.
501
- <p>Objects consist of a possibly shared structural description, called
502
- the map or scope; and unshared property values in a vector, called the
503
- slots. Object properties are associated with nonnegative integers stored
504
- in <tt>jsval</tt>'s, or with atoms (unique string descriptors) if named
505
- by an identifier or a non-integral index expression.
506
- <p>Scripts contain bytecode, source annotations, and a pool of string,
507
- number, and identifier literals. Functions are objects that extend scripts
508
- or native functions with formal parameters, a literal syntax, and a distinct
509
- primitive type ("function").
510
- <p>The compiler consists of a recursive-descent parser and a random-logic
511
- rather than table-driven lexical scanner. Semantic and lexical feedback
512
- are used to disambiguate hard cases such as missing semicolons, assignable
513
- expressions ("lvalues" in C parlance), etc. The parser generates bytecode
514
- as it parses, using fixup lists for downward branches and code buffering
515
- and rewriting for exceptional cases such as for loops. It attempts no error
516
- recovery. The interpreter executes the bytecode of top-level scripts, and
517
- calls itself indirectly to interpret function bodies (which are also scripts).
518
- All state associated with an interpreter instance is passed through formal
519
- parameters to the interpreter entry point; most implicit state is collected
520
- in a type named JSContext. Therefore, all API and almost all other functions
521
- in JSRef take a JSContext pointer as their first argument.
522
- <p>The decompiler translates postfix bytecode into infix source by consulting
523
- a separate byte-sized code, called source notes, to disambiguate bytecodes
524
- that result from more than one grammatical production.
525
- <p>The GC is a mark-and-sweep, non-conservative (exact) collector. It
526
- can allocate only fixed-sized things -- the current size is two machine
527
- words. It is used to hold JS object and string descriptors (but not property
528
- lists or string bytes), and double-precision floating point numbers. It
529
- runs automatically only when maxbytes (as passed to <tt>JS_NewRuntime()</tt>)
530
- bytes of GC things have been allocated and another thing-allocation request
531
- is made. JS API users should call <tt>JS_GC()</tt> or <tt>JS_MaybeGC()</tt>
532
- between script executions or from the branch callback, as often as necessary.
533
- <p>An important point about the GC's "exactness": you must add roots for
534
- new objects created by your native methods if you store references to them
535
- into a non-JS structure in the malloc heap or in static data. Also, if
536
- you make a new object in a native method, but do not store it through the
537
- <tt>rval</tt>
538
- result parameter (see math_abs in the "Using the JS API" section above)
539
- so that it is in a known root, the object is guaranteed to survive only
540
- until another new object is created. Either lock the first new object when
541
- making two in a row, or store it in a root you've added, or store it via
542
- rval.
543
- See the <a href="http://www.mozilla.org/js/spidermonkey/gctips.html">GC tips</a>
544
- document for more.
545
- <p>The atom manager consists of a hash table associating strings uniquely
546
- with scanner/parser information such as keyword type, index in script or
547
- function literal pool, etc. Atoms play three roles in JSRef: as literals
548
- referred to by unaligned 16-bit immediate bytecode operands, as unique
549
- string descriptors for efficient property name hashing, and as members
550
- of the root GC set for exact GC.
551
- <p>Native objects and methods for arrays, booleans, dates, functions, numbers,
552
- and strings are implemented using the JS API and certain internal interfaces
553
- used as "fast paths".
554
- <p>In general, errors are signaled by false or unoverloaded-null return
555
- values, and are reported using <tt>JS_ReportError()</tt> or one of its
556
- variants by the lowest level in order to provide the most detail. Client
557
- code can substitute its own error reporting function and suppress errors,
558
- or reflect them into Java or some other runtime system as exceptions, GUI
559
- dialogs, etc..
560
- <h2>
561
- File walk-through (OUT OF DATE!)</h2>
562
-
563
- <h4>
564
- jsapi.c, jsapi.h</h4>
565
- The public API to be used by almost all client code.&nbsp; If your client
566
- code can't make do with <tt>jsapi.h</tt>, and must reach into a friend
567
- or private js* file, please let us know so we can extend <tt>jsapi.h</tt>
568
- to include what you need in a fashion that we can support over the long
569
- run.
570
- <h4>
571
- jspubtd.h, jsprvtd.h</h4>
572
- These files exist to group struct and scalar typedefs so they can be used
573
- everywhere without dragging in struct definitions from N different files.
574
- The <tt>jspubtd.h</tt> file contains public typedefs, and is included by
575
- <tt>jsapi.h</tt>.
576
- The <tt>jsprvtd.h</tt> file contains private typedefs and is included by
577
- various .h files that need type names, but not type sizes or declarations.
578
- <h4>
579
- jsdbgapi.c, jsdbgapi.h</h4>
580
- The Debugging API, still very much under development. Provided so far:
581
- <ul>
582
- <li>
583
- Traps, with which breakpoints, single-stepping, step over, step out, and
584
- so on can be implemented. The debugger will have to consult jsopcode.def
585
- on its own to figure out where to plant trap instructions to implement
586
- functions like step out, but a future jsdbgapi.h will provide convenience
587
- interfaces to do these things. At most one trap per bytecode can be set.
588
- When a script (<tt>JSScript</tt>) is destroyed, all traps set in its bytecode
589
- are cleared.</li>
590
-
591
- <li>
592
- Watchpoints, for intercepting set operations on properties and running
593
- a debugger-supplied function that receives the old value and a pointer
594
- to the new one, which it can use to modify the new value being set.</li>
595
-
596
- <li>
597
- Line number to PC and back mapping functions. The line-to-PC direction
598
- "rounds" toward the next bytecode generated from a line greater than or
599
- equal to the input line, and may return the PC of a for-loop update part,
600
- if given the line number of the loop body's closing brace. Any line after
601
- the last one in a script or function maps to a PC one byte beyond the last
602
- bytecode in the script. An example, from perfect.js:</li>
603
-
604
- <pre><tt>14&nbsp;&nbsp; function perfect(n)
605
- 15&nbsp;&nbsp; {
606
- 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print("The perfect numbers up to " +&nbsp; n + " are:");
607
- 17
608
- 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We build sumOfDivisors[i] to hold a string expression for
609
- 19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the sum of the divisors of i, excluding i itself.
610
- 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var sumOfDivisors = new ExprArray(n+1,1);
611
- 21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var divisor = 2; divisor &lt;= n; divisor++) {
612
- 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var j = divisor + divisor; j &lt;= n; j += divisor) {
613
- 23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sumOfDivisors[j] += " + " + divisor;
614
- 24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
615
- 25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // At this point everything up to 'divisor' has its sumOfDivisors
616
- 26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // expression calculated, so we can determine whether it's perfect
617
- 27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // already by evaluating.
618
- 28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (eval(sumOfDivisors[divisor]) == divisor) {
619
- 29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print("" + divisor + " = " + sumOfDivisors[divisor]);
620
- 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
621
- 31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
622
- 32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete sumOfDivisors;
623
- 33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print("That's all.");
624
- 34&nbsp;&nbsp; }</tt></pre>
625
- The line number to PC and back mappings can be tested using the js program
626
- with the following script:
627
- <pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load("perfect.js")
628
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(perfect)
629
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis(perfect)
630
-
631
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print()
632
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var ln = 0; ln &lt;= 40; ln++) {
633
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var pc = line2pc(perfect,ln)
634
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ln2 = pc2line(perfect,pc)
635
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print("\tline " + ln + " => pc " + pc + " => line " + ln2)
636
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</tt></pre>
637
- The result of the for loop over lines 0 to 40 inclusive is:
638
- <pre><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 0 => pc 0 => line 16
639
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 1 => pc 0 => line 16
640
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 2 => pc 0 => line 16
641
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 3 => pc 0 => line 16
642
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 4 => pc 0 => line 16
643
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 5 => pc 0 => line 16
644
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 6 => pc 0 => line 16
645
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 7 => pc 0 => line 16
646
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 8 => pc 0 => line 16
647
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 9 => pc 0 => line 16
648
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 10 => pc 0 => line 16
649
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 11 => pc 0 => line 16
650
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 12 => pc 0 => line 16
651
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 13 => pc 0 => line 16
652
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 14 => pc 0 => line 16
653
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 15 => pc 0 => line 16
654
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 16 => pc 0 => line 16
655
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 17 => pc 19 => line 20
656
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 18 => pc 19 => line 20
657
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 19 => pc 19 => line 20
658
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 20 => pc 19 => line 20
659
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 21 => pc 36 => line 21
660
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 22 => pc 53 => line 22
661
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 23 => pc 74 => line 23
662
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 24 => pc 92 => line 22
663
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 25 => pc 106 => line 28
664
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 26 => pc 106 => line 28
665
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 27 => pc 106 => line 28
666
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 28 => pc 106 => line 28
667
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 29 => pc 127 => line 29
668
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 30 => pc 154 => line 21
669
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 31 => pc 154 => line 21
670
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 32 => pc 161 => line 32
671
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 33 => pc 172 => line 33
672
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 34 => pc 172 => line 33
673
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 35 => pc 172 => line 33
674
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 36 => pc 172 => line 33
675
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 37 => pc 172 => line 33
676
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 38 => pc 172 => line 33
677
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 39 => pc 172 => line 33
678
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line 40 => pc 172 => line 33</tt></pre>
679
- </ul>
680
-
681
- <h4>
682
- jsconfig.h</h4>
683
- Various configuration macros defined as 0 or 1 depending on how <tt>JS_VERSION</tt>
684
- is defined (as 10 for JavaScript 1.0, 11 for JavaScript 1.1, etc.). Not
685
- all macros are tested around related code yet. In particular, JS 1.0 support
686
- is missing from JSRef. JS 1.2 support will appear in a future JSRef release.
687
- <br>&nbsp;
688
- <h4>
689
- js.c</h4>
690
- The "JS shell", a simple interpreter program that uses the JS API and more
691
- than a few internal interfaces (some of these internal interfaces could
692
- be replaced by <tt>jsapi.h</tt> calls). The js program built from this
693
- source provides a test vehicle for evaluating scripts and calling functions,
694
- trying out new debugger primitives, etc.
695
- <h4>
696
- jsarray.*, jsbool.*, jdsdate.*, jsfun.*, jsmath.*, jsnum.*, jsstr.*</h4>
697
- These file pairs implement the standard classes and (where they exist)
698
- their underlying primitive types. They have similar structure, generally
699
- starting with class definitions and continuing with internal constructors,
700
- finalizers, and helper functions.
701
- <h4>
702
- jsobj.*, jsscope.*</h4>
703
- These two pairs declare and implement the JS object system. All of the
704
- following happen here:
705
- <ul>
706
- <li>
707
- creating objects by class and prototype, and finalizing objects;</li>
708
-
709
- <li>
710
- defining, looking up, getting, setting, and deleting properties;</li>
711
-
712
- <li>
713
- creating and destroying properties and binding names to them.</li>
714
- </ul>
715
- The details of a native object's map (scope) are mostly hidden in
716
- <tt>jsscope.[ch]</tt>.
717
- <h4>
718
- jsatom.c, jsatom.h</h4>
719
- The atom manager. Contains well-known string constants, their atoms, the
720
- global atom hash table and related state, the js_Atomize() function that
721
- turns a counted string of bytes into an atom, and literal pool (<tt>JSAtomMap</tt>)
722
- methods.
723
- <h4>
724
- jsgc.c, jsgc.h</h4>
725
- [TBD]
726
- <h4>
727
- jsinterp.*, jscntxt.*</h4>
728
- The bytecode interpreter, and related functions such as Call and AllocStack,
729
- live in <i>jsinterp.c</i>. The JSContext constructor and destructor are
730
- factored out into <i>jscntxt.c</i> for minimal linking when the compiler
731
- part of JS is split from the interpreter part into a separate program.
732
- <h4>
733
- jsemit.*, jsopcode.tbl, jsopcode.*, jsparse.*, jsscan.*, jsscript.*</h4>
734
- Compiler and decompiler modules. The <i>jsopcode.tbl</i> file is a C preprocessor
735
- source that defines almost everything there is to know about JS bytecodes.
736
- See its major comment for how to use it. For now, a debugger will use it
737
- and its dependents such as <i>jsopcode.h</i> directly, but over time we
738
- intend to extend <i>jsdbgapi.h</i> to hide uninteresting details and provide
739
- conveniences. The code generator is split across paragraphs of code in
740
- <i>jsparse.c</i>,
741
- and the utility methods called on <tt>JSCodeGenerator</tt> appear in <i>jsemit.c</i>.
742
- Source notes generated by <i>jsparse.c</i> and
743
- <i>jsemit.c</i> are used
744
- in <i>jsscript.c</i> to map line number to program counter and back.
745
- <h4>
746
- jstypes.h, jslog2.c</h4>
747
- Fundamental representation types and utility macros. This file alone among
748
- all .h files in JSRef must be included first by .c files. It is not nested
749
- in .h files, as other prerequisite .h files generally are, since it is
750
- also a direct dependency of most .c files and would be over-included if
751
- nested in addition to being directly included. The one "not-quite-a-macro
752
- macro" is the <tt>JS_CeilingLog2()</tt> function in <i>jslog2.c</i>.
753
- <h4>
754
- jsarena.c, jsarena.h</h4>
755
- Last-In-First-Out allocation macros that amortize malloc costs and allow
756
- for en-masse freeing. See the paper mentioned in prarena.h's major comment.
757
- <h4>
758
- jsutil.c, jsutil.h</h4>
759
- The <tt>JS_ASSERT</tt> macro is used throughout JSRef source as a proof
760
- device to make invariants and preconditions clear to the reader, and to
761
- hold the line during maintenance and evolution against regressions or violations
762
- of assumptions that it would be too expensive to test unconditionally at
763
- run-time. Certain assertions are followed by run-time tests that cope with
764
- assertion failure, but only where I'm too smart or paranoid to believe
765
- the assertion will never fail...
766
- <h4>
767
- jsclist.h</h4>
768
- Doubly-linked circular list struct and macros.
769
- <h4>
770
- jscpucfg.c</h4>
771
- This standalone program generates <i>jscpucfg.h</i>, a header file containing
772
- bytes per word and other constants that depend on CPU architecture and
773
- C compiler type model. It tries to discover most of these constants by
774
- running its own experiments on the build host, so if you are cross-compiling,
775
- beware.
776
- <h4>
777
- prdtoa.c, prdtoa.h</h4>
778
- David Gay's portable double-precision floating point to string conversion
779
- code, with Permission To Use notice included.
780
- <h4>
781
- prhash.c, prhash.h</h4>
782
- Portable, extensible hash tables. These use multiplicative hash for strength
783
- reduction over division hash, yet with very good key distribution over
784
- power of two table sizes. Collisions resolve via chaining, so each entry
785
- burns a malloc and can fragment the heap.
786
- <h4>
787
- prlong.c, prlong.h</h4>
788
- 64-bit integer emulation, and compatible macros that use C's long long
789
- type where it exists (my last company mapped long long to a 128-bit type,
790
- but no real architecture does 128-bit ints yet).
791
- <h4>
792
- jsprf.*</h4>
793
- Portable, buffer-overrun-resistant sprintf and friends. For no good reason
794
- save lack of time, the %e, %f, and %g formats cause your system's native
795
- sprintf, rather than <tt>JS_dtoa()</tt>, to be used. This bug doesn't affect
796
- JSRef, because it uses its own <tt>JS_dtoa()</tt> call in <i>jsnum.c</i>
797
- to convert from double to string, but it's a bug that we'll fix later,
798
- and one you should be aware of if you intend to use a <tt>JS_*printf()</tt>&nbsp;
799
- function with your own floating type arguments - various vendor sprintf's
800
- mishandle NaN, +/-Inf, and some even print normal floating values inaccurately.
801
- <h4>
802
- prmjtime.c, prmjtime.h</h4>
803
- Time functions. These interfaces are named in a way that makes local vs.
804
- universal time confusion likely. Caveat emptor, and we're working on it.
805
- To make matters worse, Java (and therefore JavaScript) uses "local" time
806
- numbers (offsets from the epoch) in its Date class.
807
-
808
-
809
- <h2>
810
- <a NAME="Resources"></a>Additional Resources (links, API docs, and newsgroups)</h2>
811
- <ul>
812
- <li><a href ="http://www.mozilla.org/js/">http://www.mozilla.org/js/</a>
813
- <li><a href ="http://www.mozilla.org/js/spidermonkey/">http://www.mozilla.org/js/spidermonkey/</a>
814
- <li><a href ="news://news.mozilla.org/netscape.public.mozilla.jseng">news://news.mozilla.org/netscape.public.mozilla.jseng</a>
815
- </ul>
816
-
817
-
818
-
819
- </body>
820
- </html>