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,741 +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
- *
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
- #ifndef jsemit_h___
42
- #define jsemit_h___
43
- /*
44
- * JS bytecode generation.
45
- */
46
-
47
- #include "jsstddef.h"
48
- #include "jstypes.h"
49
- #include "jsatom.h"
50
- #include "jsopcode.h"
51
- #include "jsscript.h"
52
- #include "jsprvtd.h"
53
- #include "jspubtd.h"
54
-
55
- JS_BEGIN_EXTERN_C
56
-
57
- /*
58
- * NB: If you add enumerators for scope statements, add them between STMT_WITH
59
- * and STMT_CATCH, or you will break the STMT_TYPE_IS_SCOPE macro. If you add
60
- * non-looping statement enumerators, add them before STMT_DO_LOOP or you will
61
- * break the STMT_TYPE_IS_LOOP macro.
62
- *
63
- * Also remember to keep the statementName array in jsemit.c in sync.
64
- */
65
- typedef enum JSStmtType {
66
- STMT_LABEL, /* labeled statement: L: s */
67
- STMT_IF, /* if (then) statement */
68
- STMT_ELSE, /* else clause of if statement */
69
- STMT_BODY, /* synthetic body of function with
70
- destructuring formal parameters */
71
- STMT_BLOCK, /* compound statement: { s1[;... sN] } */
72
- STMT_SWITCH, /* switch statement */
73
- STMT_WITH, /* with statement */
74
- STMT_CATCH, /* catch block */
75
- STMT_TRY, /* try block */
76
- STMT_FINALLY, /* finally block */
77
- STMT_SUBROUTINE, /* gosub-target subroutine body */
78
- STMT_DO_LOOP, /* do/while loop statement */
79
- STMT_FOR_LOOP, /* for loop statement */
80
- STMT_FOR_IN_LOOP, /* for/in loop statement */
81
- STMT_WHILE_LOOP, /* while loop statement */
82
- STMT_LIMIT
83
- } JSStmtType;
84
-
85
- #define STMT_TYPE_IN_RANGE(t,b,e) ((uint)((t) - (b)) <= (uintN)((e) - (b)))
86
-
87
- /*
88
- * A comment on the encoding of the JSStmtType enum and type-testing macros:
89
- *
90
- * STMT_TYPE_MAYBE_SCOPE tells whether a statement type is always, or may
91
- * become, a lexical scope. It therefore includes block and switch (the two
92
- * low-numbered "maybe" scope types) and excludes with (with has dynamic scope
93
- * pending the "reformed with" in ES4/JS2). It includes all try-catch-finally
94
- * types, which are high-numbered maybe-scope types.
95
- *
96
- * STMT_TYPE_LINKS_SCOPE tells whether a JSStmtInfo of the given type eagerly
97
- * links to other scoping statement info records. It excludes the two early
98
- * "maybe" types, block and switch, as well as the try and both finally types,
99
- * since try and the other trailing maybe-scope types don't need block scope
100
- * unless they contain let declarations.
101
- *
102
- * We treat WITH as a static scope because it prevents lexical binding from
103
- * continuing further up the static scope chain. With the "reformed with"
104
- * proposal for JS2, we'll be able to model it statically, too.
105
- */
106
- #define STMT_TYPE_MAYBE_SCOPE(type) \
107
- (type != STMT_WITH && \
108
- STMT_TYPE_IN_RANGE(type, STMT_BLOCK, STMT_SUBROUTINE))
109
-
110
- #define STMT_TYPE_LINKS_SCOPE(type) \
111
- STMT_TYPE_IN_RANGE(type, STMT_WITH, STMT_CATCH)
112
-
113
- #define STMT_TYPE_IS_TRYING(type) \
114
- STMT_TYPE_IN_RANGE(type, STMT_TRY, STMT_SUBROUTINE)
115
-
116
- #define STMT_TYPE_IS_LOOP(type) ((type) >= STMT_DO_LOOP)
117
-
118
- #define STMT_MAYBE_SCOPE(stmt) STMT_TYPE_MAYBE_SCOPE((stmt)->type)
119
- #define STMT_LINKS_SCOPE(stmt) (STMT_TYPE_LINKS_SCOPE((stmt)->type) || \
120
- ((stmt)->flags & SIF_SCOPE))
121
- #define STMT_IS_TRYING(stmt) STMT_TYPE_IS_TRYING((stmt)->type)
122
- #define STMT_IS_LOOP(stmt) STMT_TYPE_IS_LOOP((stmt)->type)
123
-
124
- typedef struct JSStmtInfo JSStmtInfo;
125
-
126
- struct JSStmtInfo {
127
- uint16 type; /* statement type */
128
- uint16 flags; /* flags, see below */
129
- ptrdiff_t update; /* loop update offset (top if none) */
130
- ptrdiff_t breaks; /* offset of last break in loop */
131
- ptrdiff_t continues; /* offset of last continue in loop */
132
- union {
133
- JSAtom *label; /* name of LABEL */
134
- JSObject *blockObj; /* block scope object */
135
- } u;
136
- JSStmtInfo *down; /* info for enclosing statement */
137
- JSStmtInfo *downScope; /* next enclosing lexical scope */
138
- };
139
-
140
- #define SIF_SCOPE 0x0001 /* statement has its own lexical scope */
141
- #define SIF_BODY_BLOCK 0x0002 /* STMT_BLOCK type is a function body */
142
- #define SIF_FOR_BLOCK 0x0004 /* for (let ...) induced block scope */
143
-
144
- /*
145
- * To reuse space in JSStmtInfo, rename breaks and continues for use during
146
- * try/catch/finally code generation and backpatching. To match most common
147
- * use cases, the macro argument is a struct, not a struct pointer. Only a
148
- * loop, switch, or label statement info record can have breaks and continues,
149
- * and only a for loop has an update backpatch chain, so it's safe to overlay
150
- * these for the "trying" JSStmtTypes.
151
- */
152
- #define CATCHNOTE(stmt) ((stmt).update)
153
- #define GOSUBS(stmt) ((stmt).breaks)
154
- #define GUARDJUMP(stmt) ((stmt).continues)
155
-
156
- #define AT_TOP_LEVEL(tc) \
157
- (!(tc)->topStmt || ((tc)->topStmt->flags & SIF_BODY_BLOCK))
158
-
159
- #define SET_STATEMENT_TOP(stmt, top) \
160
- ((stmt)->update = (top), (stmt)->breaks = (stmt)->continues = (-1))
161
-
162
- struct JSTreeContext { /* tree context for semantic checks */
163
- uint16 flags; /* statement state flags, see below */
164
- uint16 ngvars; /* max. no. of global variables/regexps */
165
- uint32 globalUses; /* optimizable global var uses in total */
166
- uint32 loopyGlobalUses;/* optimizable global var uses in loops */
167
- uint16 scopeDepth; /* current lexical scope chain depth */
168
- uint16 maxScopeDepth; /* maximum lexical scope chain depth */
169
- JSStmtInfo *topStmt; /* top of statement info stack */
170
- JSStmtInfo *topScopeStmt; /* top lexical scope statement */
171
- JSObject *blockChain; /* compile time block scope chain (NB: one
172
- deeper than the topScopeStmt/downScope
173
- chain when in head of let block/expr) */
174
- JSParseNode *blockNode; /* parse node for a lexical scope.
175
- XXX combine with blockChain? */
176
- JSAtomList decls; /* function, const, and var declarations */
177
- JSParseContext *parseContext;
178
- JSFunction *fun; /* function to store argument and variable
179
- names when flags & TCF_IN_FUNCTION */
180
- };
181
-
182
- #define TCF_IN_FUNCTION 0x01 /* parsing inside function body */
183
- #define TCF_RETURN_EXPR 0x02 /* function has 'return expr;' */
184
- #define TCF_RETURN_VOID 0x04 /* function has 'return;' */
185
- #define TCF_IN_FOR_INIT 0x08 /* parsing init expr of for; exclude 'in' */
186
- #define TCF_FUN_CLOSURE_VS_VAR 0x10 /* function and var with same name */
187
- #define TCF_FUN_USES_NONLOCALS 0x20 /* function refers to non-local names */
188
- #define TCF_FUN_HEAVYWEIGHT 0x40 /* function needs Call object per call */
189
- #define TCF_FUN_IS_GENERATOR 0x80 /* parsed yield statement in function */
190
- #define TCF_HAS_DEFXMLNS 0x100 /* default xml namespace = ...; parsed */
191
- #define TCF_HAS_FUNCTION_STMT 0x200 /* block contains a function statement */
192
- #define TCF_GENEXP_LAMBDA 0x400 /* flag lambda from generator expression */
193
- #define TCF_COMPILE_N_GO 0x800 /* compiler-and-go mode of script, can
194
- optimize name references based on scope
195
- chain */
196
-
197
- /*
198
- * Flags to propagate out of the blocks.
199
- */
200
- #define TCF_RETURN_FLAGS (TCF_RETURN_EXPR | TCF_RETURN_VOID)
201
-
202
- /*
203
- * Flags to propagate from FunctionBody.
204
- */
205
- #define TCF_FUN_FLAGS (TCF_FUN_IS_GENERATOR | \
206
- TCF_FUN_HEAVYWEIGHT | \
207
- TCF_FUN_USES_NONLOCALS | \
208
- TCF_FUN_CLOSURE_VS_VAR)
209
-
210
- #define TREE_CONTEXT_INIT(tc, pc) \
211
- ((tc)->flags = (tc)->ngvars = 0, \
212
- (tc)->globalUses = (tc)->loopyGlobalUses = 0, \
213
- (tc)->scopeDepth = (tc)->maxScopeDepth = 0, \
214
- (tc)->topStmt = (tc)->topScopeStmt = NULL, \
215
- (tc)->blockChain = NULL, \
216
- ATOM_LIST_INIT(&(tc)->decls), \
217
- (tc)->blockNode = NULL, \
218
- (tc)->parseContext = (pc), \
219
- (tc)->fun = NULL)
220
-
221
- #define TREE_CONTEXT_FINISH(tc) \
222
- ((void)0)
223
-
224
- /*
225
- * Span-dependent instructions are jumps whose span (from the jump bytecode to
226
- * the jump target) may require 2 or 4 bytes of immediate operand.
227
- */
228
- typedef struct JSSpanDep JSSpanDep;
229
- typedef struct JSJumpTarget JSJumpTarget;
230
-
231
- struct JSSpanDep {
232
- ptrdiff_t top; /* offset of first bytecode in an opcode */
233
- ptrdiff_t offset; /* offset - 1 within opcode of jump operand */
234
- ptrdiff_t before; /* original offset - 1 of jump operand */
235
- JSJumpTarget *target; /* tagged target pointer or backpatch delta */
236
- };
237
-
238
- /*
239
- * Jump targets are stored in an AVL tree, for O(log(n)) lookup with targets
240
- * sorted by offset from left to right, so that targets after a span-dependent
241
- * instruction whose jump offset operand must be extended can be found quickly
242
- * and adjusted upward (toward higher offsets).
243
- */
244
- struct JSJumpTarget {
245
- ptrdiff_t offset; /* offset of span-dependent jump target */
246
- int balance; /* AVL tree balance number */
247
- JSJumpTarget *kids[2]; /* left and right AVL tree child pointers */
248
- };
249
-
250
- #define JT_LEFT 0
251
- #define JT_RIGHT 1
252
- #define JT_OTHER_DIR(dir) (1 - (dir))
253
- #define JT_IMBALANCE(dir) (((dir) << 1) - 1)
254
- #define JT_DIR(imbalance) (((imbalance) + 1) >> 1)
255
-
256
- /*
257
- * Backpatch deltas are encoded in JSSpanDep.target if JT_TAG_BIT is clear,
258
- * so we can maintain backpatch chains when using span dependency records to
259
- * hold jump offsets that overflow 16 bits.
260
- */
261
- #define JT_TAG_BIT ((jsword) 1)
262
- #define JT_UNTAG_SHIFT 1
263
- #define JT_SET_TAG(jt) ((JSJumpTarget *)((jsword)(jt) | JT_TAG_BIT))
264
- #define JT_CLR_TAG(jt) ((JSJumpTarget *)((jsword)(jt) & ~JT_TAG_BIT))
265
- #define JT_HAS_TAG(jt) ((jsword)(jt) & JT_TAG_BIT)
266
-
267
- #define BITS_PER_PTRDIFF (sizeof(ptrdiff_t) * JS_BITS_PER_BYTE)
268
- #define BITS_PER_BPDELTA (BITS_PER_PTRDIFF - 1 - JT_UNTAG_SHIFT)
269
- #define BPDELTA_MAX (((ptrdiff_t)1 << BITS_PER_BPDELTA) - 1)
270
- #define BPDELTA_TO_JT(bp) ((JSJumpTarget *)((bp) << JT_UNTAG_SHIFT))
271
- #define JT_TO_BPDELTA(jt) ((ptrdiff_t)((jsword)(jt) >> JT_UNTAG_SHIFT))
272
-
273
- #define SD_SET_TARGET(sd,jt) ((sd)->target = JT_SET_TAG(jt))
274
- #define SD_GET_TARGET(sd) (JS_ASSERT(JT_HAS_TAG((sd)->target)), \
275
- JT_CLR_TAG((sd)->target))
276
- #define SD_SET_BPDELTA(sd,bp) ((sd)->target = BPDELTA_TO_JT(bp))
277
- #define SD_GET_BPDELTA(sd) (JS_ASSERT(!JT_HAS_TAG((sd)->target)), \
278
- JT_TO_BPDELTA((sd)->target))
279
-
280
- /* Avoid asserting twice by expanding SD_GET_TARGET in the "then" clause. */
281
- #define SD_SPAN(sd,pivot) (SD_GET_TARGET(sd) \
282
- ? JT_CLR_TAG((sd)->target)->offset - (pivot) \
283
- : 0)
284
-
285
- typedef struct JSTryNode JSTryNode;
286
-
287
- struct JSTryNode {
288
- JSTryNote note;
289
- JSTryNode *prev;
290
- };
291
-
292
- typedef struct JSEmittedObjectList {
293
- uint32 length; /* number of emitted so far objects */
294
- JSParsedObjectBox *lastPob; /* last emitted object */
295
- } JSEmittedObjectList;
296
-
297
- extern void
298
- FinishParsedObjects(JSEmittedObjectList *emittedList, JSObjectArray *objectMap);
299
-
300
- struct JSCodeGenerator {
301
- JSTreeContext treeContext; /* base state: statement info stack, etc. */
302
-
303
- JSArenaPool *codePool; /* pointer to thread code arena pool */
304
- JSArenaPool *notePool; /* pointer to thread srcnote arena pool */
305
- void *codeMark; /* low watermark in cg->codePool */
306
- void *noteMark; /* low watermark in cg->notePool */
307
-
308
- struct {
309
- jsbytecode *base; /* base of JS bytecode vector */
310
- jsbytecode *limit; /* one byte beyond end of bytecode */
311
- jsbytecode *next; /* pointer to next free bytecode */
312
- jssrcnote *notes; /* source notes, see below */
313
- uintN noteCount; /* number of source notes so far */
314
- uintN noteMask; /* growth increment for notes */
315
- ptrdiff_t lastNoteOffset; /* code offset for last source note */
316
- uintN currentLine; /* line number for tree-based srcnote gen */
317
- } prolog, main, *current;
318
-
319
- uintN firstLine; /* first line, for js_NewScriptFromCG */
320
- JSAtomList atomList; /* literals indexed for mapping */
321
-
322
- intN stackDepth; /* current stack depth in script frame */
323
- uintN maxStackDepth; /* maximum stack depth so far */
324
-
325
- uintN ntrynotes; /* number of allocated so far try notes */
326
- JSTryNode *lastTryNode; /* the last allocated try node */
327
-
328
- JSSpanDep *spanDeps; /* span dependent instruction records */
329
- JSJumpTarget *jumpTargets; /* AVL tree of jump target offsets */
330
- JSJumpTarget *jtFreeList; /* JT_LEFT-linked list of free structs */
331
- uintN numSpanDeps; /* number of span dependencies */
332
- uintN numJumpTargets; /* number of jump targets */
333
- ptrdiff_t spanDepTodo; /* offset from main.base of potentially
334
- unoptimized spandeps */
335
-
336
- uintN arrayCompSlot; /* stack slot of array in comprehension */
337
-
338
- uintN emitLevel; /* js_EmitTree recursion level */
339
- JSAtomList constList; /* compile time constants */
340
-
341
- JSEmittedObjectList objectList; /* list of emitted so far objects */
342
- JSEmittedObjectList regexpList; /* list of emitted so far regexp
343
- that will be cloned during execution */
344
-
345
- JSCodeGenerator *parent; /* enclosing function or global context */
346
- };
347
-
348
- #define CG_BASE(cg) ((cg)->current->base)
349
- #define CG_LIMIT(cg) ((cg)->current->limit)
350
- #define CG_NEXT(cg) ((cg)->current->next)
351
- #define CG_CODE(cg,offset) (CG_BASE(cg) + (offset))
352
- #define CG_OFFSET(cg) PTRDIFF(CG_NEXT(cg), CG_BASE(cg), jsbytecode)
353
-
354
- #define CG_NOTES(cg) ((cg)->current->notes)
355
- #define CG_NOTE_COUNT(cg) ((cg)->current->noteCount)
356
- #define CG_NOTE_MASK(cg) ((cg)->current->noteMask)
357
- #define CG_LAST_NOTE_OFFSET(cg) ((cg)->current->lastNoteOffset)
358
- #define CG_CURRENT_LINE(cg) ((cg)->current->currentLine)
359
-
360
- #define CG_PROLOG_BASE(cg) ((cg)->prolog.base)
361
- #define CG_PROLOG_LIMIT(cg) ((cg)->prolog.limit)
362
- #define CG_PROLOG_NEXT(cg) ((cg)->prolog.next)
363
- #define CG_PROLOG_CODE(cg,poff) (CG_PROLOG_BASE(cg) + (poff))
364
- #define CG_PROLOG_OFFSET(cg) PTRDIFF(CG_PROLOG_NEXT(cg), CG_PROLOG_BASE(cg),\
365
- jsbytecode)
366
-
367
- #define CG_SWITCH_TO_MAIN(cg) ((cg)->current = &(cg)->main)
368
- #define CG_SWITCH_TO_PROLOG(cg) ((cg)->current = &(cg)->prolog)
369
-
370
- /*
371
- * Initialize cg to allocate bytecode space from codePool, source note space
372
- * from notePool, and all other arena-allocated temporaries from cx->tempPool.
373
- */
374
- extern JS_FRIEND_API(void)
375
- js_InitCodeGenerator(JSContext *cx, JSCodeGenerator *cg, JSParseContext *pc,
376
- JSArenaPool *codePool, JSArenaPool *notePool,
377
- uintN lineno);
378
-
379
- /*
380
- * Release cg->codePool, cg->notePool, and cx->tempPool to marks set by
381
- * js_InitCodeGenerator. Note that cgs are magic: they own the arena pool
382
- * "tops-of-stack" space above their codeMark, noteMark, and tempMark points.
383
- * This means you cannot alloc from tempPool and save the pointer beyond the
384
- * next JS_FinishCodeGenerator.
385
- */
386
- extern JS_FRIEND_API(void)
387
- js_FinishCodeGenerator(JSContext *cx, JSCodeGenerator *cg);
388
-
389
- /*
390
- * Emit one bytecode.
391
- */
392
- extern ptrdiff_t
393
- js_Emit1(JSContext *cx, JSCodeGenerator *cg, JSOp op);
394
-
395
- /*
396
- * Emit two bytecodes, an opcode (op) with a byte of immediate operand (op1).
397
- */
398
- extern ptrdiff_t
399
- js_Emit2(JSContext *cx, JSCodeGenerator *cg, JSOp op, jsbytecode op1);
400
-
401
- /*
402
- * Emit three bytecodes, an opcode with two bytes of immediate operands.
403
- */
404
- extern ptrdiff_t
405
- js_Emit3(JSContext *cx, JSCodeGenerator *cg, JSOp op, jsbytecode op1,
406
- jsbytecode op2);
407
-
408
- /*
409
- * Emit (1 + extra) bytecodes, for N bytes of op and its immediate operand.
410
- */
411
- extern ptrdiff_t
412
- js_EmitN(JSContext *cx, JSCodeGenerator *cg, JSOp op, size_t extra);
413
-
414
- /*
415
- * Unsafe macro to call js_SetJumpOffset and return false if it does.
416
- */
417
- #define CHECK_AND_SET_JUMP_OFFSET(cx,cg,pc,off) \
418
- JS_BEGIN_MACRO \
419
- if (!js_SetJumpOffset(cx, cg, pc, off)) \
420
- return JS_FALSE; \
421
- JS_END_MACRO
422
-
423
- #define CHECK_AND_SET_JUMP_OFFSET_AT(cx,cg,off) \
424
- CHECK_AND_SET_JUMP_OFFSET(cx, cg, CG_CODE(cg,off), CG_OFFSET(cg) - (off))
425
-
426
- extern JSBool
427
- js_SetJumpOffset(JSContext *cx, JSCodeGenerator *cg, jsbytecode *pc,
428
- ptrdiff_t off);
429
-
430
- /* Test whether we're in a statement of given type. */
431
- extern JSBool
432
- js_InStatement(JSTreeContext *tc, JSStmtType type);
433
-
434
- /* Test whether we're in a with statement. */
435
- #define js_InWithStatement(tc) js_InStatement(tc, STMT_WITH)
436
-
437
- /*
438
- * Test whether atom refers to a global variable (or is a reference error).
439
- * Return true in *loopyp if any loops enclose the lexical reference, false
440
- * otherwise.
441
- */
442
- extern JSBool
443
- js_IsGlobalReference(JSTreeContext *tc, JSAtom *atom, JSBool *loopyp);
444
-
445
- /*
446
- * Push the C-stack-allocated struct at stmt onto the stmtInfo stack.
447
- */
448
- extern void
449
- js_PushStatement(JSTreeContext *tc, JSStmtInfo *stmt, JSStmtType type,
450
- ptrdiff_t top);
451
-
452
- /*
453
- * Push a block scope statement and link blockObj into tc->blockChain. To pop
454
- * this statement info record, use js_PopStatement as usual, or if appropriate
455
- * (if generating code), js_PopStatementCG.
456
- */
457
- extern void
458
- js_PushBlockScope(JSTreeContext *tc, JSStmtInfo *stmt, JSObject *blockObj,
459
- ptrdiff_t top);
460
-
461
- /*
462
- * Pop tc->topStmt. If the top JSStmtInfo struct is not stack-allocated, it
463
- * is up to the caller to free it.
464
- */
465
- extern void
466
- js_PopStatement(JSTreeContext *tc);
467
-
468
- /*
469
- * Like js_PopStatement(&cg->treeContext), also patch breaks and continues
470
- * unless the top statement info record represents a try-catch-finally suite.
471
- * May fail if a jump offset overflows.
472
- */
473
- extern JSBool
474
- js_PopStatementCG(JSContext *cx, JSCodeGenerator *cg);
475
-
476
- /*
477
- * Define and lookup a primitive jsval associated with the const named by atom.
478
- * js_DefineCompileTimeConstant analyzes the constant-folded initializer at pn
479
- * and saves the const's value in cg->constList, if it can be used at compile
480
- * time. It returns true unless an error occurred.
481
- *
482
- * If the initializer's value could not be saved, js_DefineCompileTimeConstant
483
- * calls will return the undefined value. js_DefineCompileTimeConstant tries
484
- * to find a const value memorized for atom, returning true with *vp set to a
485
- * value other than undefined if the constant was found, true with *vp set to
486
- * JSVAL_VOID if not found, and false on error.
487
- */
488
- extern JSBool
489
- js_DefineCompileTimeConstant(JSContext *cx, JSCodeGenerator *cg, JSAtom *atom,
490
- JSParseNode *pn);
491
-
492
- /*
493
- * Find a lexically scoped variable (one declared by let, catch, or an array
494
- * comprehension) named by atom, looking in tc's compile-time scopes.
495
- *
496
- * If a WITH statement is reached along the scope stack, return its statement
497
- * info record, so callers can tell that atom is ambiguous. If slotp is not
498
- * null, then if atom is found, set *slotp to its stack slot, otherwise to -1.
499
- * This means that if slotp is not null, all the block objects on the lexical
500
- * scope chain must have had their depth slots computed by the code generator,
501
- * so the caller must be under js_EmitTree.
502
- *
503
- * In any event, directly return the statement info record in which atom was
504
- * found. Otherwise return null.
505
- */
506
- extern JSStmtInfo *
507
- js_LexicalLookup(JSTreeContext *tc, JSAtom *atom, jsint *slotp,
508
- uintN decltype);
509
-
510
- /*
511
- * Emit code into cg for the tree rooted at pn.
512
- */
513
- extern JSBool
514
- js_EmitTree(JSContext *cx, JSCodeGenerator *cg, JSParseNode *pn);
515
-
516
- /*
517
- * Emit function code using cg for the tree rooted at body.
518
- */
519
- extern JSBool
520
- js_EmitFunctionScript(JSContext *cx, JSCodeGenerator *cg, JSParseNode *body);
521
-
522
- /*
523
- * Source notes generated along with bytecode for decompiling and debugging.
524
- * A source note is a uint8 with 5 bits of type and 3 of offset from the pc of
525
- * the previous note. If 3 bits of offset aren't enough, extended delta notes
526
- * (SRC_XDELTA) consisting of 2 set high order bits followed by 6 offset bits
527
- * are emitted before the next note. Some notes have operand offsets encoded
528
- * immediately after them, in note bytes or byte-triples.
529
- *
530
- * Source Note Extended Delta
531
- * +7-6-5-4-3+2-1-0+ +7-6-5+4-3-2-1-0+
532
- * |note-type|delta| |1 1| ext-delta |
533
- * +---------+-----+ +---+-----------+
534
- *
535
- * At most one "gettable" note (i.e., a note of type other than SRC_NEWLINE,
536
- * SRC_SETLINE, and SRC_XDELTA) applies to a given bytecode.
537
- *
538
- * NB: the js_SrcNoteSpec array in jsemit.c is indexed by this enum, so its
539
- * initializers need to match the order here.
540
- *
541
- * Note on adding new source notes: every pair of bytecodes (A, B) where A and
542
- * B have disjoint sets of source notes that could apply to each bytecode may
543
- * reuse the same note type value for two notes (snA, snB) that have the same
544
- * arity, offsetBias, and isSpanDep initializers in js_SrcNoteSpec. This is
545
- * why SRC_IF and SRC_INITPROP have the same value below. For bad historical
546
- * reasons, some bytecodes below that could be overlayed have not been, but
547
- * before using SRC_EXTENDED, consider compressing the existing note types.
548
- *
549
- * Don't forget to update JSXDR_BYTECODE_VERSION in jsxdrapi.h for all such
550
- * incompatible source note or other bytecode changes.
551
- */
552
- typedef enum JSSrcNoteType {
553
- SRC_NULL = 0, /* terminates a note vector */
554
- SRC_IF = 1, /* JSOP_IFEQ bytecode is from an if-then */
555
- SRC_INITPROP = 1, /* disjoint meaning applied to JSOP_INITELEM or
556
- to an index label in a regular (structuring)
557
- or a destructuring object initialiser */
558
- SRC_GENEXP = 1, /* JSOP_ANONFUNOBJ from generator expression */
559
- SRC_IF_ELSE = 2, /* JSOP_IFEQ bytecode is from an if-then-else */
560
- SRC_WHILE = 3, /* JSOP_IFEQ is from a while loop */
561
- SRC_FOR = 4, /* JSOP_NOP or JSOP_POP in for loop head */
562
- SRC_CONTINUE = 5, /* JSOP_GOTO is a continue, not a break;
563
- also used on JSOP_ENDINIT if extra comma
564
- at end of array literal: [1,2,,] */
565
- SRC_DECL = 6, /* type of a declaration (var, const, let*) */
566
- SRC_DESTRUCT = 6, /* JSOP_DUP starting a destructuring assignment
567
- operation, with SRC_DECL_* offset operand */
568
- SRC_PCDELTA = 7, /* distance forward from comma-operator to
569
- next POP, or from CONDSWITCH to first CASE
570
- opcode, etc. -- always a forward delta */
571
- SRC_GROUPASSIGN = 7, /* SRC_DESTRUCT variant for [a, b] = [c, d] */
572
- SRC_ASSIGNOP = 8, /* += or another assign-op follows */
573
- SRC_COND = 9, /* JSOP_IFEQ is from conditional ?: operator */
574
- SRC_BRACE = 10, /* mandatory brace, for scope or to avoid
575
- dangling else */
576
- SRC_HIDDEN = 11, /* opcode shouldn't be decompiled */
577
- SRC_PCBASE = 12, /* distance back from annotated getprop or
578
- setprop op to left-most obj.prop.subprop
579
- bytecode -- always a backward delta */
580
- SRC_LABEL = 13, /* JSOP_NOP for label: with atomid immediate */
581
- SRC_LABELBRACE = 14, /* JSOP_NOP for label: {...} begin brace */
582
- SRC_ENDBRACE = 15, /* JSOP_NOP for label: {...} end brace */
583
- SRC_BREAK2LABEL = 16, /* JSOP_GOTO for 'break label' with atomid */
584
- SRC_CONT2LABEL = 17, /* JSOP_GOTO for 'continue label' with atomid */
585
- SRC_SWITCH = 18, /* JSOP_*SWITCH with offset to end of switch,
586
- 2nd off to first JSOP_CASE if condswitch */
587
- SRC_FUNCDEF = 19, /* JSOP_NOP for function f() with atomid */
588
- SRC_CATCH = 20, /* catch block has guard */
589
- SRC_EXTENDED = 21, /* extended source note, 32-159, in next byte */
590
- SRC_NEWLINE = 22, /* bytecode follows a source newline */
591
- SRC_SETLINE = 23, /* a file-absolute source line number note */
592
- SRC_XDELTA = 24 /* 24-31 are for extended delta notes */
593
- } JSSrcNoteType;
594
-
595
- /*
596
- * Constants for the SRC_DECL source note. Note that span-dependent bytecode
597
- * selection means that any SRC_DECL offset greater than SRC_DECL_LET may need
598
- * to be adjusted, but these "offsets" are too small to span a span-dependent
599
- * instruction, so can be used to denote distinct declaration syntaxes to the
600
- * decompiler.
601
- *
602
- * NB: the var_prefix array in jsopcode.c depends on these dense indexes from
603
- * SRC_DECL_VAR through SRC_DECL_LET.
604
- */
605
- #define SRC_DECL_VAR 0
606
- #define SRC_DECL_CONST 1
607
- #define SRC_DECL_LET 2
608
- #define SRC_DECL_NONE 3
609
-
610
- #define SN_TYPE_BITS 5
611
- #define SN_DELTA_BITS 3
612
- #define SN_XDELTA_BITS 6
613
- #define SN_TYPE_MASK (JS_BITMASK(SN_TYPE_BITS) << SN_DELTA_BITS)
614
- #define SN_DELTA_MASK ((ptrdiff_t)JS_BITMASK(SN_DELTA_BITS))
615
- #define SN_XDELTA_MASK ((ptrdiff_t)JS_BITMASK(SN_XDELTA_BITS))
616
-
617
- #define SN_MAKE_NOTE(sn,t,d) (*(sn) = (jssrcnote) \
618
- (((t) << SN_DELTA_BITS) \
619
- | ((d) & SN_DELTA_MASK)))
620
- #define SN_MAKE_XDELTA(sn,d) (*(sn) = (jssrcnote) \
621
- ((SRC_XDELTA << SN_DELTA_BITS) \
622
- | ((d) & SN_XDELTA_MASK)))
623
-
624
- #define SN_IS_XDELTA(sn) ((*(sn) >> SN_DELTA_BITS) >= SRC_XDELTA)
625
- #define SN_TYPE(sn) ((JSSrcNoteType)(SN_IS_XDELTA(sn) \
626
- ? SRC_XDELTA \
627
- : *(sn) >> SN_DELTA_BITS))
628
- #define SN_SET_TYPE(sn,type) SN_MAKE_NOTE(sn, type, SN_DELTA(sn))
629
- #define SN_IS_GETTABLE(sn) (SN_TYPE(sn) < SRC_NEWLINE)
630
-
631
- #define SN_DELTA(sn) ((ptrdiff_t)(SN_IS_XDELTA(sn) \
632
- ? *(sn) & SN_XDELTA_MASK \
633
- : *(sn) & SN_DELTA_MASK))
634
- #define SN_SET_DELTA(sn,delta) (SN_IS_XDELTA(sn) \
635
- ? SN_MAKE_XDELTA(sn, delta) \
636
- : SN_MAKE_NOTE(sn, SN_TYPE(sn), delta))
637
-
638
- #define SN_DELTA_LIMIT ((ptrdiff_t)JS_BIT(SN_DELTA_BITS))
639
- #define SN_XDELTA_LIMIT ((ptrdiff_t)JS_BIT(SN_XDELTA_BITS))
640
-
641
- /*
642
- * Offset fields follow certain notes and are frequency-encoded: an offset in
643
- * [0,0x7f] consumes one byte, an offset in [0x80,0x7fffff] takes three, and
644
- * the high bit of the first byte is set.
645
- */
646
- #define SN_3BYTE_OFFSET_FLAG 0x80
647
- #define SN_3BYTE_OFFSET_MASK 0x7f
648
-
649
- typedef struct JSSrcNoteSpec {
650
- const char *name; /* name for disassembly/debugging output */
651
- uint8 arity; /* number of offset operands */
652
- uint8 offsetBias; /* bias of offset(s) from annotated pc */
653
- int8 isSpanDep; /* 1 or -1 if offsets could span extended ops,
654
- 0 otherwise; sign tells span direction */
655
- } JSSrcNoteSpec;
656
-
657
- extern JS_FRIEND_DATA(JSSrcNoteSpec) js_SrcNoteSpec[];
658
- extern JS_FRIEND_API(uintN) js_SrcNoteLength(jssrcnote *sn);
659
-
660
- #define SN_LENGTH(sn) ((js_SrcNoteSpec[SN_TYPE(sn)].arity == 0) ? 1 \
661
- : js_SrcNoteLength(sn))
662
- #define SN_NEXT(sn) ((sn) + SN_LENGTH(sn))
663
-
664
- /* A source note array is terminated by an all-zero element. */
665
- #define SN_MAKE_TERMINATOR(sn) (*(sn) = SRC_NULL)
666
- #define SN_IS_TERMINATOR(sn) (*(sn) == SRC_NULL)
667
-
668
- /*
669
- * Append a new source note of the given type (and therefore size) to cg's
670
- * notes dynamic array, updating cg->noteCount. Return the new note's index
671
- * within the array pointed at by cg->current->notes. Return -1 if out of
672
- * memory.
673
- */
674
- extern intN
675
- js_NewSrcNote(JSContext *cx, JSCodeGenerator *cg, JSSrcNoteType type);
676
-
677
- extern intN
678
- js_NewSrcNote2(JSContext *cx, JSCodeGenerator *cg, JSSrcNoteType type,
679
- ptrdiff_t offset);
680
-
681
- extern intN
682
- js_NewSrcNote3(JSContext *cx, JSCodeGenerator *cg, JSSrcNoteType type,
683
- ptrdiff_t offset1, ptrdiff_t offset2);
684
-
685
- /*
686
- * NB: this function can add at most one extra extended delta note.
687
- */
688
- extern jssrcnote *
689
- js_AddToSrcNoteDelta(JSContext *cx, JSCodeGenerator *cg, jssrcnote *sn,
690
- ptrdiff_t delta);
691
-
692
- /*
693
- * Get and set the offset operand identified by which (0 for the first, etc.).
694
- */
695
- extern JS_FRIEND_API(ptrdiff_t)
696
- js_GetSrcNoteOffset(jssrcnote *sn, uintN which);
697
-
698
- extern JSBool
699
- js_SetSrcNoteOffset(JSContext *cx, JSCodeGenerator *cg, uintN index,
700
- uintN which, ptrdiff_t offset);
701
-
702
- /*
703
- * Finish taking source notes in cx's notePool, copying final notes to the new
704
- * stable store allocated by the caller and passed in via notes. Return false
705
- * on malloc failure, which means this function reported an error.
706
- *
707
- * To compute the number of jssrcnotes to allocate and pass in via notes, use
708
- * the CG_COUNT_FINAL_SRCNOTES macro. This macro knows a lot about details of
709
- * js_FinishTakingSrcNotes, SO DON'T CHANGE jsemit.c's js_FinishTakingSrcNotes
710
- * FUNCTION WITHOUT CHECKING WHETHER THIS MACRO NEEDS CORRESPONDING CHANGES!
711
- */
712
- #define CG_COUNT_FINAL_SRCNOTES(cg, cnt) \
713
- JS_BEGIN_MACRO \
714
- ptrdiff_t diff_ = CG_PROLOG_OFFSET(cg) - (cg)->prolog.lastNoteOffset; \
715
- cnt = (cg)->prolog.noteCount + (cg)->main.noteCount + 1; \
716
- if ((cg)->prolog.noteCount && \
717
- (cg)->prolog.currentLine != (cg)->firstLine) { \
718
- if (diff_ > SN_DELTA_MASK) \
719
- cnt += JS_HOWMANY(diff_ - SN_DELTA_MASK, SN_XDELTA_MASK); \
720
- cnt += 2 + (((cg)->firstLine > SN_3BYTE_OFFSET_MASK) << 1); \
721
- } else if (diff_ > 0) { \
722
- if (cg->main.noteCount) { \
723
- jssrcnote *sn_ = (cg)->main.notes; \
724
- diff_ -= SN_IS_XDELTA(sn_) \
725
- ? SN_XDELTA_MASK - (*sn_ & SN_XDELTA_MASK) \
726
- : SN_DELTA_MASK - (*sn_ & SN_DELTA_MASK); \
727
- } \
728
- if (diff_ > 0) \
729
- cnt += JS_HOWMANY(diff_, SN_XDELTA_MASK); \
730
- } \
731
- JS_END_MACRO
732
-
733
- extern JSBool
734
- js_FinishTakingSrcNotes(JSContext *cx, JSCodeGenerator *cg, jssrcnote *notes);
735
-
736
- extern void
737
- js_FinishTakingTryNotes(JSCodeGenerator *cg, JSTryNoteArray *array);
738
-
739
- JS_END_EXTERN_C
740
-
741
- #endif /* jsemit_h___ */