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,122 +0,0 @@
1
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
- * vim: set ts=8 sw=4 et tw=78:
3
- *
4
- * ***** BEGIN LICENSE BLOCK *****
5
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 *
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 jsiter_h___
41
- #define jsiter_h___
42
-
43
- /*
44
- * JavaScript iterators.
45
- */
46
- #include "jsprvtd.h"
47
- #include "jspubtd.h"
48
-
49
- JS_BEGIN_EXTERN_C
50
-
51
- #define JSITER_ENUMERATE 0x1 /* for-in compatible hidden default iterator */
52
- #define JSITER_FOREACH 0x2 /* return [key, value] pair rather than key */
53
- #define JSITER_KEYVALUE 0x4 /* destructuring for-in wants [key, value] */
54
-
55
- /*
56
- * Convert the value stored in *vp to its iteration object. The flags should
57
- * contain JSITER_ENUMERATE if js_ValueToIterator is called when enumerating
58
- * for-in semantics are required, and when the caller can guarantee that the
59
- * iterator will never be exposed to scripts.
60
- */
61
- extern JS_FRIEND_API(JSBool)
62
- js_ValueToIterator(JSContext *cx, uintN flags, jsval *vp);
63
-
64
- extern JS_FRIEND_API(JSBool)
65
- js_CloseIterator(JSContext *cx, jsval v);
66
-
67
- /*
68
- * Given iterobj, call iterobj.next(). If the iterator stopped, set *rval to
69
- * JSVAL_HOLE. Otherwise set it to the result of the next call.
70
- */
71
- extern JS_FRIEND_API(JSBool)
72
- js_CallIteratorNext(JSContext *cx, JSObject *iterobj, jsval *rval);
73
-
74
- /*
75
- * Close iterobj, whose class must be js_IteratorClass.
76
- */
77
- extern void
78
- js_CloseNativeIterator(JSContext *cx, JSObject *iterobj);
79
-
80
- extern JSBool
81
- js_ThrowStopIteration(JSContext *cx);
82
-
83
- #if JS_HAS_GENERATORS
84
-
85
- /*
86
- * Generator state codes.
87
- */
88
- typedef enum JSGeneratorState {
89
- JSGEN_NEWBORN, /* not yet started */
90
- JSGEN_OPEN, /* started by a .next() or .send(undefined) call */
91
- JSGEN_RUNNING, /* currently executing via .next(), etc., call */
92
- JSGEN_CLOSING, /* close method is doing asynchronous return */
93
- JSGEN_CLOSED /* closed, cannot be started or closed again */
94
- } JSGeneratorState;
95
-
96
- struct JSGenerator {
97
- JSObject *obj;
98
- JSGeneratorState state;
99
- JSStackFrame frame;
100
- JSFrameRegs savedRegs;
101
- JSArena arena;
102
- jsval stack[1];
103
- };
104
-
105
- #define FRAME_TO_GENERATOR(fp) \
106
- ((JSGenerator *) ((uint8 *)(fp) - offsetof(JSGenerator, frame)))
107
-
108
- extern JSObject *
109
- js_NewGenerator(JSContext *cx, JSStackFrame *fp);
110
-
111
- #endif
112
-
113
- extern JSClass js_GeneratorClass;
114
- extern JSClass js_IteratorClass;
115
- extern JSClass js_StopIterationClass;
116
-
117
- extern JSObject *
118
- js_InitIteratorClasses(JSContext *cx, JSObject *obj);
119
-
120
- JS_END_EXTERN_C
121
-
122
- #endif /* jsiter_h___ */
@@ -1,124 +0,0 @@
1
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
- * vim: set sw=4 ts=8 et tw=80:
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
- *
27
- * Alternatively, the contents of this file may be used under the terms of
28
- * either of the GNU General Public License Version 2 or later (the "GPL"),
29
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30
- * in which case the provisions of the GPL or the LGPL are applicable instead
31
- * of those above. If you wish to allow use of your version of this file only
32
- * under the terms of either the GPL or the LGPL, and not to allow others to
33
- * use your version of this file under the terms of the MPL, indicate your
34
- * decision by deleting the provisions above and replace them with the notice
35
- * and other provisions required by the GPL or the LGPL. If you do not delete
36
- * the provisions above, a recipient may use your version of this file under
37
- * the terms of any one of the MPL, the GPL or the LGPL.
38
- *
39
- * ***** END LICENSE BLOCK ***** */
40
-
41
- JS_KEYWORD(break, TOK_BREAK, JSOP_NOP, JSVERSION_DEFAULT)
42
- JS_KEYWORD(case, TOK_CASE, JSOP_NOP, JSVERSION_DEFAULT)
43
- JS_KEYWORD(continue, TOK_CONTINUE, JSOP_NOP, JSVERSION_DEFAULT)
44
- JS_KEYWORD(default, TOK_DEFAULT, JSOP_NOP, JSVERSION_DEFAULT)
45
- JS_KEYWORD(delete, TOK_DELETE, JSOP_NOP, JSVERSION_DEFAULT)
46
- JS_KEYWORD(do, TOK_DO, JSOP_NOP, JSVERSION_DEFAULT)
47
- JS_KEYWORD(else, TOK_ELSE, JSOP_NOP, JSVERSION_DEFAULT)
48
- JS_KEYWORD(export, TOK_EXPORT, JSOP_NOP, JSVERSION_DEFAULT)
49
- JS_KEYWORD(false, TOK_PRIMARY, JSOP_FALSE, JSVERSION_DEFAULT)
50
- JS_KEYWORD(for, TOK_FOR, JSOP_NOP, JSVERSION_DEFAULT)
51
- JS_KEYWORD(function, TOK_FUNCTION, JSOP_NOP, JSVERSION_DEFAULT)
52
- JS_KEYWORD(if, TOK_IF, JSOP_NOP, JSVERSION_DEFAULT)
53
- JS_KEYWORD(in, TOK_IN, JSOP_IN, JSVERSION_DEFAULT)
54
- JS_KEYWORD(new, TOK_NEW, JSOP_NEW, JSVERSION_DEFAULT)
55
- JS_KEYWORD(null, TOK_PRIMARY, JSOP_NULL, JSVERSION_DEFAULT)
56
- JS_KEYWORD(return, TOK_RETURN, JSOP_NOP, JSVERSION_DEFAULT)
57
- JS_KEYWORD(switch, TOK_SWITCH, JSOP_NOP, JSVERSION_DEFAULT)
58
- JS_KEYWORD(this, TOK_PRIMARY, JSOP_THIS, JSVERSION_DEFAULT)
59
- JS_KEYWORD(true, TOK_PRIMARY, JSOP_TRUE, JSVERSION_DEFAULT)
60
- JS_KEYWORD(typeof, TOK_UNARYOP, JSOP_TYPEOF, JSVERSION_DEFAULT)
61
- JS_KEYWORD(var, TOK_VAR, JSOP_DEFVAR, JSVERSION_DEFAULT)
62
- JS_KEYWORD(void, TOK_UNARYOP, JSOP_VOID, JSVERSION_DEFAULT)
63
- JS_KEYWORD(while, TOK_WHILE, JSOP_NOP, JSVERSION_DEFAULT)
64
- JS_KEYWORD(with, TOK_WITH, JSOP_NOP, JSVERSION_DEFAULT)
65
- #if JS_HAS_CONST
66
- JS_KEYWORD(const, TOK_VAR, JSOP_DEFCONST, JSVERSION_DEFAULT)
67
- #else
68
- JS_KEYWORD(const, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
69
- #endif
70
-
71
- JS_KEYWORD(try, TOK_TRY, JSOP_NOP, JSVERSION_DEFAULT)
72
- JS_KEYWORD(catch, TOK_CATCH, JSOP_NOP, JSVERSION_DEFAULT)
73
- JS_KEYWORD(finally, TOK_FINALLY, JSOP_NOP, JSVERSION_DEFAULT)
74
- JS_KEYWORD(throw, TOK_THROW, JSOP_NOP, JSVERSION_DEFAULT)
75
-
76
- JS_KEYWORD(instanceof, TOK_INSTANCEOF, JSOP_INSTANCEOF,JSVERSION_DEFAULT)
77
-
78
- #if JS_HAS_RESERVED_JAVA_KEYWORDS
79
- JS_KEYWORD(abstract, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
80
- JS_KEYWORD(boolean, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
81
- JS_KEYWORD(byte, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
82
- JS_KEYWORD(char, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
83
- JS_KEYWORD(class, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
84
- JS_KEYWORD(double, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
85
- JS_KEYWORD(extends, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
86
- JS_KEYWORD(final, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
87
- JS_KEYWORD(float, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
88
- JS_KEYWORD(goto, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
89
- JS_KEYWORD(implements, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
90
- JS_KEYWORD(import, TOK_IMPORT, JSOP_NOP, JSVERSION_DEFAULT)
91
- JS_KEYWORD(int, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
92
- JS_KEYWORD(interface, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
93
- JS_KEYWORD(long, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
94
- JS_KEYWORD(native, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
95
- JS_KEYWORD(package, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
96
- JS_KEYWORD(private, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
97
- JS_KEYWORD(protected, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
98
- JS_KEYWORD(public, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
99
- JS_KEYWORD(short, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
100
- JS_KEYWORD(static, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
101
- JS_KEYWORD(super, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
102
- JS_KEYWORD(synchronized,TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
103
- JS_KEYWORD(throws, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
104
- JS_KEYWORD(transient, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
105
- JS_KEYWORD(volatile, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
106
- #endif
107
-
108
- #if JS_HAS_RESERVED_ECMA_KEYWORDS
109
- JS_KEYWORD(enum, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
110
- #endif
111
-
112
- #if JS_HAS_DEBUGGER_KEYWORD
113
- JS_KEYWORD(debugger, TOK_DEBUGGER, JSOP_NOP, JSVERSION_DEFAULT)
114
- #elif JS_HAS_RESERVED_ECMA_KEYWORDS
115
- JS_KEYWORD(debugger, TOK_RESERVED, JSOP_NOP, JSVERSION_DEFAULT)
116
- #endif
117
-
118
- #if JS_HAS_GENERATORS
119
- JS_KEYWORD(yield, TOK_YIELD, JSOP_NOP, JSVERSION_1_7)
120
- #endif
121
-
122
- #if JS_HAS_BLOCK_SCOPE
123
- JS_KEYWORD(let, TOK_LET, JSOP_NOP, JSVERSION_1_7)
124
- #endif
@@ -1,460 +0,0 @@
1
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
- * vim: set sw=4 ts=8 et tw=80:
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 String Switch Generator for JavaScript Keywords,
18
- * released 2005-12-09.
19
- *
20
- * The Initial Developer of the Original Code is
21
- * Igor Bukanov.
22
- * Portions created by the Initial Developer are Copyright (C) 2005-2006
23
- * the Initial Developer. All Rights Reserved.
24
- *
25
- * Contributor(s):
26
- *
27
- * Alternatively, the contents of this file may be used under the terms of
28
- * either of the GNU General Public License Version 2 or later (the "GPL"),
29
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30
- * in which case the provisions of the GPL or the LGPL are applicable instead
31
- * of those above. If you wish to allow use of your version of this file only
32
- * under the terms of either the GPL or the LGPL, and not to allow others to
33
- * use your version of this file under the terms of the MPL, indicate your
34
- * decision by deleting the provisions above and replace them with the notice
35
- * and other provisions required by the GPL or the LGPL. If you do not delete
36
- * the provisions above, a recipient may use your version of this file under
37
- * the terms of any one of the MPL, the GPL or the LGPL.
38
- *
39
- * ***** END LICENSE BLOCK ***** */
40
-
41
- #include "jsstddef.h"
42
- #include <assert.h>
43
- #include <stdio.h>
44
- #include <stdlib.h>
45
- #include <string.h>
46
- #include <stdarg.h>
47
- #include <ctype.h>
48
-
49
- #include "jsconfig.h"
50
-
51
- const char * const keyword_list[] = {
52
- #define JS_KEYWORD(keyword, type, op, version) #keyword,
53
- #include "jskeyword.tbl"
54
- #undef JS_KEYWORD
55
- };
56
-
57
- struct gen_opt {
58
- FILE *output; /* output file for generated source */
59
- unsigned use_if_threshold; /* max number of choices to generate
60
- "if" selector instead of "switch" */
61
- unsigned char_tail_test_threshold; /* max number of unprocessed columns
62
- to use inlined char compare
63
- for remaining chars and not generic
64
- string compare code */
65
- unsigned indent_level; /* current source identation level */
66
- };
67
-
68
- static unsigned column_to_compare;
69
-
70
- static int
71
- length_comparator(const void *a, const void *b)
72
- {
73
- const char *str1 = keyword_list[*(unsigned *)a];
74
- const char *str2 = keyword_list[*(unsigned *)b];
75
- return (int)strlen(str1) - (int)strlen(str2);
76
- }
77
-
78
- static int
79
- column_comparator(const void *a, const void *b)
80
- {
81
- const char *str1 = keyword_list[*(unsigned *)a];
82
- const char *str2 = keyword_list[*(unsigned *)b];
83
- return (int)str1[column_to_compare] - (int)str2[column_to_compare];
84
- }
85
-
86
- static unsigned
87
- count_different_lengths(unsigned indexes[], unsigned nelem)
88
- {
89
- unsigned nlength, current_length, i, l;
90
-
91
- current_length = 0;
92
- nlength = 0;
93
- for (i = 0; i != nelem; ++i) {
94
- l = (unsigned)strlen(keyword_list[indexes[i]]);
95
- assert(l != 0);
96
- if (current_length != l) {
97
- ++nlength;
98
- current_length = l;
99
- }
100
- }
101
- return nlength;
102
- }
103
-
104
- static void
105
- find_char_span_and_count(unsigned indexes[], unsigned nelem, unsigned column,
106
- unsigned *span_result, unsigned *count_result)
107
- {
108
- unsigned i, count;
109
- unsigned char c, prev, minc, maxc;
110
-
111
- assert(nelem != 0);
112
- minc = maxc = prev = (unsigned char)keyword_list[indexes[0]][column];
113
- count = 1;
114
- for (i = 1; i != nelem; ++i) {
115
- c = (unsigned char)keyword_list[indexes[i]][column];
116
- if (prev != c) {
117
- prev = c;
118
- ++count;
119
- if (minc > c) {
120
- minc = c;
121
- } else if (maxc < c) {
122
- maxc = c;
123
- }
124
- }
125
- }
126
-
127
- *span_result = maxc - minc + 1;
128
- *count_result = count;
129
- }
130
-
131
- static unsigned
132
- find_optimal_switch_column(struct gen_opt *opt,
133
- unsigned indexes[], unsigned nelem,
134
- unsigned columns[], unsigned unprocessed_columns,
135
- int *use_if_result)
136
- {
137
- unsigned i;
138
- unsigned span, min_span, min_span_index;
139
- unsigned nchar, min_nchar, min_nchar_index;
140
-
141
- assert(unprocessed_columns != 0);
142
- i = 0;
143
- min_nchar = min_span = (unsigned)-1;
144
- min_nchar_index = min_span_index = 0;
145
- do {
146
- column_to_compare = columns[i];
147
- qsort(indexes, nelem, sizeof(indexes[0]), column_comparator);
148
- find_char_span_and_count(indexes, nelem, column_to_compare,
149
- &span, &nchar);
150
- assert(span != 0);
151
- if (span == 1) {
152
- assert(nchar == 1);
153
- *use_if_result = 1;
154
- return 1;
155
- }
156
- assert(nchar != 1);
157
- if (min_span > span) {
158
- min_span = span;
159
- min_span_index = i;
160
- }
161
- if (min_nchar > nchar) {
162
- min_nchar = nchar;
163
- min_nchar_index = i;
164
- }
165
- } while (++i != unprocessed_columns);
166
-
167
- if (min_nchar <= opt->use_if_threshold) {
168
- *use_if_result = 1;
169
- i = min_nchar_index;
170
- } else {
171
- *use_if_result = 0;
172
- i = min_span_index;
173
- }
174
-
175
- /*
176
- * Restore order corresponding to i if it was destroyed by
177
- * subsequent sort.
178
- */
179
- if (i != unprocessed_columns - 1) {
180
- column_to_compare = columns[i];
181
- qsort(indexes, nelem, sizeof(indexes[0]), column_comparator);
182
- }
183
-
184
- return i;
185
- }
186
-
187
-
188
- static void
189
- p(struct gen_opt *opt, const char *format, ...)
190
- {
191
- va_list ap;
192
-
193
- va_start(ap, format);
194
- vfprintf(opt->output, format, ap);
195
- va_end(ap);
196
- }
197
-
198
- /* Size for '\xxx' where xxx is octal escape */
199
- #define MIN_QUOTED_CHAR_BUFFER 7
200
-
201
- static char *
202
- qchar(char c, char *quoted_buffer)
203
- {
204
- char *s;
205
-
206
- s = quoted_buffer;
207
- *s++ = '\'';
208
- switch (c) {
209
- case '\n': c = 'n'; goto one_char_escape;
210
- case '\r': c = 'r'; goto one_char_escape;
211
- case '\t': c = 't'; goto one_char_escape;
212
- case '\f': c = 't'; goto one_char_escape;
213
- case '\0': c = '0'; goto one_char_escape;
214
- case '\'': goto one_char_escape;
215
- one_char_escape:
216
- *s++ = '\\';
217
- break;
218
- default:
219
- if (!isprint(c)) {
220
- *s++ = '\\';
221
- *s++ = (char)('0' + (0x3 & (((unsigned char)c) >> 6)));
222
- *s++ = (char)('0' + (0x7 & (((unsigned char)c) >> 3)));
223
- c = (char)('0' + (0x7 & ((unsigned char)c)));
224
- }
225
- }
226
- *s++ = c;
227
- *s++ = '\'';
228
- *s = '\0';
229
- assert(s + 1 <= quoted_buffer + MIN_QUOTED_CHAR_BUFFER);
230
- return quoted_buffer;
231
- }
232
-
233
- static void
234
- nl(struct gen_opt *opt)
235
- {
236
- putc('\n', opt->output);
237
- }
238
-
239
- static void
240
- indent(struct gen_opt *opt)
241
- {
242
- unsigned n = opt->indent_level;
243
- while (n != 0) {
244
- --n;
245
- fputs(" ", opt->output);
246
- }
247
- }
248
-
249
- static void
250
- line(struct gen_opt *opt, const char *format, ...)
251
- {
252
- va_list ap;
253
-
254
- indent(opt);
255
- va_start(ap, format);
256
- vfprintf(opt->output, format, ap);
257
- va_end(ap);
258
- nl(opt);
259
- }
260
-
261
- static void
262
- generate_letter_switch_r(struct gen_opt *opt,
263
- unsigned indexes[], unsigned nelem,
264
- unsigned columns[], unsigned unprocessed_columns)
265
- {
266
- char qbuf[MIN_QUOTED_CHAR_BUFFER];
267
-
268
- assert(nelem != 0);
269
- if (nelem == 1) {
270
- unsigned kw_index = indexes[0];
271
- const char *keyword = keyword_list[kw_index];
272
-
273
- if (unprocessed_columns == 0) {
274
- line(opt, "JSKW_GOT_MATCH(%u) /* %s */", kw_index, keyword);
275
- } else if (unprocessed_columns > opt->char_tail_test_threshold) {
276
- line(opt, "JSKW_TEST_GUESS(%u) /* %s */", kw_index, keyword);
277
- } else {
278
- unsigned i, column;
279
-
280
- indent(opt); p(opt, "if (");
281
- for (i = 0; i != unprocessed_columns; ++i) {
282
- column = columns[i];
283
- qchar(keyword[column], qbuf);
284
- p(opt, "%sJSKW_AT(%u)==%s", (i == 0) ? "" : " && ",
285
- column, qbuf);
286
- }
287
- p(opt, ") {"); nl(opt);
288
- ++opt->indent_level;
289
- line(opt, "JSKW_GOT_MATCH(%u) /* %s */", kw_index, keyword);
290
- --opt->indent_level;
291
- line(opt, "}");
292
- line(opt, "JSKW_NO_MATCH()");
293
- }
294
- } else {
295
- unsigned optimal_column_index, optimal_column;
296
- unsigned i;
297
- int use_if;
298
- char current;
299
-
300
- assert(unprocessed_columns != 0);
301
- optimal_column_index = find_optimal_switch_column(opt, indexes, nelem,
302
- columns,
303
- unprocessed_columns,
304
- &use_if);
305
- optimal_column = columns[optimal_column_index];
306
- columns[optimal_column_index] = columns[unprocessed_columns - 1];
307
-
308
- if (!use_if)
309
- line(opt, "switch (JSKW_AT(%u)) {", optimal_column);
310
-
311
- current = keyword_list[indexes[0]][optimal_column];
312
- for (i = 0; i != nelem;) {
313
- unsigned same_char_begin = i;
314
- char next = current;
315
-
316
- for (++i; i != nelem; ++i) {
317
- next = keyword_list[indexes[i]][optimal_column];
318
- if (next != current)
319
- break;
320
- }
321
- qchar(current, qbuf);
322
- if (use_if) {
323
- line(opt, "if (JSKW_AT(%u) == %s) {", optimal_column, qbuf);
324
- } else {
325
- line(opt, " case %s:", qbuf);
326
- }
327
- ++opt->indent_level;
328
- generate_letter_switch_r(opt, indexes + same_char_begin,
329
- i - same_char_begin,
330
- columns, unprocessed_columns - 1);
331
- --opt->indent_level;
332
- if (use_if) {
333
- line(opt, "}");
334
- }
335
- current = next;
336
- }
337
-
338
- if (!use_if) {
339
- line(opt, "}");
340
- }
341
-
342
- columns[optimal_column_index] = optimal_column;
343
-
344
- line(opt, "JSKW_NO_MATCH()");
345
- }
346
- }
347
-
348
- static void
349
- generate_letter_switch(struct gen_opt *opt,
350
- unsigned indexes[], unsigned nelem,
351
- unsigned current_length)
352
- {
353
- unsigned *columns;
354
- unsigned i;
355
-
356
- columns = (unsigned *) malloc(sizeof(columns[0]) * current_length);
357
- if (!columns) {
358
- perror("malloc");
359
- exit(EXIT_FAILURE);
360
- }
361
- for (i = 0; i != current_length; ++i) {
362
- columns[i] = i;
363
- }
364
- generate_letter_switch_r(opt, indexes, nelem, columns, current_length);
365
- free(columns);
366
- }
367
-
368
-
369
- static void
370
- generate_switch(struct gen_opt *opt)
371
- {
372
- unsigned *indexes;
373
- unsigned nlength;
374
- unsigned i, current;
375
- int use_if;
376
- unsigned nelem;
377
-
378
- nelem = sizeof(keyword_list)/sizeof(keyword_list[0]);
379
-
380
- line(opt, "/*");
381
- line(opt, " * Generating switch for the list of %u entries:", nelem);
382
- for (i = 0; i != nelem; ++i) {
383
- line(opt, " * %s", keyword_list[i]);
384
- }
385
- line(opt, " */");
386
-
387
- indexes = (unsigned *) malloc(sizeof(indexes[0]) * nelem);
388
- if (!indexes) {
389
- perror("malloc");
390
- exit(EXIT_FAILURE);
391
- }
392
- for (i = 0; i != nelem; ++i)
393
- indexes[i] = i;
394
- qsort(indexes, nelem, sizeof(indexes[i]), length_comparator);
395
- nlength = count_different_lengths(indexes, nelem);
396
-
397
- use_if = (nlength <= opt->use_if_threshold);
398
-
399
- if (!use_if)
400
- line(opt, "switch (JSKW_LENGTH()) {");
401
-
402
- current = (unsigned)strlen(keyword_list[indexes[0]]);
403
- for (i = 0; i != nelem;) {
404
- unsigned same_length_begin = i;
405
- unsigned next = current;
406
-
407
- for (++i; i != nelem; ++i) {
408
- next = (unsigned)strlen(keyword_list[indexes[i]]);
409
- if (next != current)
410
- break;
411
- }
412
- if (use_if) {
413
- line(opt, "if (JSKW_LENGTH() == %u) {", current);
414
- } else {
415
- line(opt, " case %u:", current);
416
- }
417
- ++opt->indent_level;
418
- generate_letter_switch(opt, indexes + same_length_begin,
419
- i - same_length_begin,
420
- current);
421
- --opt->indent_level;
422
- if (use_if) {
423
- line(opt, "}");
424
- }
425
- current = next;
426
- }
427
- if (!use_if)
428
- line(opt, "}");
429
- line(opt, "JSKW_NO_MATCH()");
430
- free(indexes);
431
- }
432
-
433
- int main(int argc, char **argv)
434
- {
435
- struct gen_opt opt;
436
-
437
- if (argc < 2) {
438
- opt.output = stdout;
439
- } else {
440
- opt.output = fopen(argv[1], "w");
441
- if (!opt.output) {
442
- perror("fopen");
443
- exit(EXIT_FAILURE);
444
- }
445
- }
446
- opt.indent_level = 1;
447
- opt.use_if_threshold = 3;
448
- opt.char_tail_test_threshold = 4;
449
-
450
- generate_switch(&opt);
451
-
452
- if (opt.output != stdout) {
453
- if (fclose(opt.output)) {
454
- perror("fclose");
455
- exit(EXIT_FAILURE);
456
- }
457
- }
458
-
459
- return EXIT_SUCCESS;
460
- }