johnson 2.0.0.pre1 → 2.0.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,124 +0,0 @@
1
- /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
- *
3
- * ***** BEGIN LICENSE BLOCK *****
4
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
- *
6
- * The contents of this file are subject to the Mozilla Public License Version
7
- * 1.1 (the "License"); you may not use this file except in compliance with
8
- * the License. You may obtain a copy of the License at
9
- * http://www.mozilla.org/MPL/
10
- *
11
- * Software distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
- * for the specific language governing rights and limitations under the
14
- * License.
15
- *
16
- * The Original Code is Mozilla Communicator client code, released
17
- * March 31, 1998.
18
- *
19
- * The Initial Developer of the Original Code is
20
- * Netscape Communications Corporation.
21
- * Portions created by the Initial Developer are Copyright (C) 1998
22
- * the Initial Developer. All Rights Reserved.
23
- *
24
- * Contributor(s):
25
- *
26
- * Alternatively, the contents of this file may be used under the terms of
27
- * either of the GNU General Public License Version 2 or later (the "GPL"),
28
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
- * in which case the provisions of the GPL or the LGPL are applicable instead
30
- * of those above. If you wish to allow use of your version of this file only
31
- * under the terms of either the GPL or the LGPL, and not to allow others to
32
- * use your version of this file under the terms of the MPL, indicate your
33
- * decision by deleting the provisions above and replace them with the notice
34
- * and other provisions required by the GPL or the LGPL. If you do not delete
35
- * the provisions above, a recipient may use your version of this file under
36
- * the terms of any one of the MPL, the GPL or the LGPL.
37
- *
38
- * ***** END LICENSE BLOCK ***** */
39
-
40
- /*
41
- * JS Date class interface.
42
- */
43
-
44
- #ifndef jsdate_h___
45
- #define jsdate_h___
46
-
47
- JS_BEGIN_EXTERN_C
48
-
49
- extern JSClass js_DateClass;
50
-
51
- extern JSObject *
52
- js_InitDateClass(JSContext *cx, JSObject *obj);
53
-
54
- /*
55
- * These functions provide a C interface to the date/time object
56
- */
57
-
58
- /*
59
- * Construct a new Date Object from a time value given in milliseconds UTC
60
- * since the epoch.
61
- */
62
- extern JS_FRIEND_API(JSObject*)
63
- js_NewDateObjectMsec(JSContext* cx, jsdouble msec_time);
64
-
65
- /*
66
- * Construct a new Date Object from an exploded local time value.
67
- *
68
- * Assert that mon < 12 to help catch off-by-one user errors, which are common
69
- * due to the 0-based month numbering copied into JS from Java (java.util.Date
70
- * in 1995). js_DateSetMonth (below) likewise asserts month < 12.
71
- */
72
- extern JS_FRIEND_API(JSObject*)
73
- js_NewDateObject(JSContext* cx, int year, int mon, int mday,
74
- int hour, int min, int sec);
75
-
76
- /*
77
- * Detect whether the internal date value is NaN. (Because failure is
78
- * out-of-band for js_DateGet*)
79
- */
80
- extern JS_FRIEND_API(JSBool)
81
- js_DateIsValid(JSContext *cx, JSObject* obj);
82
-
83
- extern JS_FRIEND_API(int)
84
- js_DateGetYear(JSContext *cx, JSObject* obj);
85
-
86
- extern JS_FRIEND_API(int)
87
- js_DateGetMonth(JSContext *cx, JSObject* obj);
88
-
89
- extern JS_FRIEND_API(int)
90
- js_DateGetDate(JSContext *cx, JSObject* obj);
91
-
92
- extern JS_FRIEND_API(int)
93
- js_DateGetHours(JSContext *cx, JSObject* obj);
94
-
95
- extern JS_FRIEND_API(int)
96
- js_DateGetMinutes(JSContext *cx, JSObject* obj);
97
-
98
- extern JS_FRIEND_API(int)
99
- js_DateGetSeconds(JSContext *cx, JSObject* obj);
100
-
101
- extern JS_FRIEND_API(void)
102
- js_DateSetYear(JSContext *cx, JSObject *obj, int year);
103
-
104
- extern JS_FRIEND_API(void)
105
- js_DateSetMonth(JSContext *cx, JSObject *obj, int month);
106
-
107
- extern JS_FRIEND_API(void)
108
- js_DateSetDate(JSContext *cx, JSObject *obj, int date);
109
-
110
- extern JS_FRIEND_API(void)
111
- js_DateSetHours(JSContext *cx, JSObject *obj, int hours);
112
-
113
- extern JS_FRIEND_API(void)
114
- js_DateSetMinutes(JSContext *cx, JSObject *obj, int minutes);
115
-
116
- extern JS_FRIEND_API(void)
117
- js_DateSetSeconds(JSContext *cx, JSObject *obj, int seconds);
118
-
119
- extern JS_FRIEND_API(jsdouble)
120
- js_DateGetMsecSinceEpoch(JSContext *cx, JSObject *obj);
121
-
122
- JS_END_EXTERN_C
123
-
124
- #endif /* jsdate_h___ */
@@ -1,1802 +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
- /*
42
- * JS debugging API.
43
- */
44
- #include "jsstddef.h"
45
- #include <string.h>
46
- #include "jstypes.h"
47
- #include "jsutil.h" /* Added by JSIFY */
48
- #include "jsclist.h"
49
- #include "jsapi.h"
50
- #include "jscntxt.h"
51
- #include "jsconfig.h"
52
- #include "jsdbgapi.h"
53
- #include "jsemit.h"
54
- #include "jsfun.h"
55
- #include "jsgc.h"
56
- #include "jsinterp.h"
57
- #include "jslock.h"
58
- #include "jsobj.h"
59
- #include "jsopcode.h"
60
- #include "jsparse.h"
61
- #include "jsscope.h"
62
- #include "jsscript.h"
63
- #include "jsstr.h"
64
-
65
- typedef struct JSTrap {
66
- JSCList links;
67
- JSScript *script;
68
- jsbytecode *pc;
69
- JSOp op;
70
- JSTrapHandler handler;
71
- void *closure;
72
- } JSTrap;
73
-
74
- #define DBG_LOCK(rt) JS_ACQUIRE_LOCK((rt)->debuggerLock)
75
- #define DBG_UNLOCK(rt) JS_RELEASE_LOCK((rt)->debuggerLock)
76
- #define DBG_LOCK_EVAL(rt,expr) (DBG_LOCK(rt), (expr), DBG_UNLOCK(rt))
77
-
78
- /*
79
- * NB: FindTrap must be called with rt->debuggerLock acquired.
80
- */
81
- static JSTrap *
82
- FindTrap(JSRuntime *rt, JSScript *script, jsbytecode *pc)
83
- {
84
- JSTrap *trap;
85
-
86
- for (trap = (JSTrap *)rt->trapList.next;
87
- trap != (JSTrap *)&rt->trapList;
88
- trap = (JSTrap *)trap->links.next) {
89
- if (trap->script == script && trap->pc == pc)
90
- return trap;
91
- }
92
- return NULL;
93
- }
94
-
95
- jsbytecode *
96
- js_UntrapScriptCode(JSContext *cx, JSScript *script)
97
- {
98
- jsbytecode *code;
99
- JSRuntime *rt;
100
- JSTrap *trap;
101
-
102
- code = script->code;
103
- rt = cx->runtime;
104
- DBG_LOCK(rt);
105
- for (trap = (JSTrap *)rt->trapList.next;
106
- trap != (JSTrap *)&rt->trapList;
107
- trap = (JSTrap *)trap->links.next) {
108
- if (trap->script == script &&
109
- (size_t)(trap->pc - script->code) < script->length) {
110
- if (code == script->code) {
111
- jssrcnote *sn, *notes;
112
- size_t nbytes;
113
-
114
- nbytes = script->length * sizeof(jsbytecode);
115
- notes = SCRIPT_NOTES(script);
116
- for (sn = notes; !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn))
117
- continue;
118
- nbytes += (sn - notes + 1) * sizeof *sn;
119
-
120
- code = (jsbytecode *) JS_malloc(cx, nbytes);
121
- if (!code)
122
- break;
123
- memcpy(code, script->code, nbytes);
124
- JS_CLEAR_GSN_CACHE(cx);
125
- }
126
- code[trap->pc - script->code] = trap->op;
127
- }
128
- }
129
- DBG_UNLOCK(rt);
130
- return code;
131
- }
132
-
133
- JS_PUBLIC_API(JSBool)
134
- JS_SetTrap(JSContext *cx, JSScript *script, jsbytecode *pc,
135
- JSTrapHandler handler, void *closure)
136
- {
137
- JSTrap *junk, *trap, *twin;
138
- JSRuntime *rt;
139
- uint32 sample;
140
-
141
- JS_ASSERT((JSOp) *pc != JSOP_TRAP);
142
- junk = NULL;
143
- rt = cx->runtime;
144
- DBG_LOCK(rt);
145
- trap = FindTrap(rt, script, pc);
146
- if (trap) {
147
- JS_ASSERT(trap->script == script && trap->pc == pc);
148
- JS_ASSERT(*pc == JSOP_TRAP);
149
- } else {
150
- sample = rt->debuggerMutations;
151
- DBG_UNLOCK(rt);
152
- trap = (JSTrap *) JS_malloc(cx, sizeof *trap);
153
- if (!trap)
154
- return JS_FALSE;
155
- trap->closure = NULL;
156
- if(!js_AddRoot(cx, &trap->closure, "trap->closure")) {
157
- JS_free(cx, trap);
158
- return JS_FALSE;
159
- }
160
- DBG_LOCK(rt);
161
- twin = (rt->debuggerMutations != sample)
162
- ? FindTrap(rt, script, pc)
163
- : NULL;
164
- if (twin) {
165
- junk = trap;
166
- trap = twin;
167
- } else {
168
- JS_APPEND_LINK(&trap->links, &rt->trapList);
169
- ++rt->debuggerMutations;
170
- trap->script = script;
171
- trap->pc = pc;
172
- trap->op = (JSOp)*pc;
173
- *pc = JSOP_TRAP;
174
- }
175
- }
176
- trap->handler = handler;
177
- trap->closure = closure;
178
- DBG_UNLOCK(rt);
179
- if (junk) {
180
- js_RemoveRoot(rt, &junk->closure);
181
- JS_free(cx, junk);
182
- }
183
- return JS_TRUE;
184
- }
185
-
186
- JS_PUBLIC_API(JSOp)
187
- JS_GetTrapOpcode(JSContext *cx, JSScript *script, jsbytecode *pc)
188
- {
189
- JSRuntime *rt;
190
- JSTrap *trap;
191
- JSOp op;
192
-
193
- rt = cx->runtime;
194
- DBG_LOCK(rt);
195
- trap = FindTrap(rt, script, pc);
196
- op = trap ? trap->op : (JSOp) *pc;
197
- DBG_UNLOCK(rt);
198
- return op;
199
- }
200
-
201
- static void
202
- DestroyTrapAndUnlock(JSContext *cx, JSTrap *trap)
203
- {
204
- ++cx->runtime->debuggerMutations;
205
- JS_REMOVE_LINK(&trap->links);
206
- *trap->pc = (jsbytecode)trap->op;
207
- DBG_UNLOCK(cx->runtime);
208
-
209
- js_RemoveRoot(cx->runtime, &trap->closure);
210
- JS_free(cx, trap);
211
- }
212
-
213
- JS_PUBLIC_API(void)
214
- JS_ClearTrap(JSContext *cx, JSScript *script, jsbytecode *pc,
215
- JSTrapHandler *handlerp, void **closurep)
216
- {
217
- JSTrap *trap;
218
-
219
- DBG_LOCK(cx->runtime);
220
- trap = FindTrap(cx->runtime, script, pc);
221
- if (handlerp)
222
- *handlerp = trap ? trap->handler : NULL;
223
- if (closurep)
224
- *closurep = trap ? trap->closure : NULL;
225
- if (trap)
226
- DestroyTrapAndUnlock(cx, trap);
227
- else
228
- DBG_UNLOCK(cx->runtime);
229
- }
230
-
231
- JS_PUBLIC_API(void)
232
- JS_ClearScriptTraps(JSContext *cx, JSScript *script)
233
- {
234
- JSRuntime *rt;
235
- JSTrap *trap, *next;
236
- uint32 sample;
237
-
238
- rt = cx->runtime;
239
- DBG_LOCK(rt);
240
- for (trap = (JSTrap *)rt->trapList.next;
241
- trap != (JSTrap *)&rt->trapList;
242
- trap = next) {
243
- next = (JSTrap *)trap->links.next;
244
- if (trap->script == script) {
245
- sample = rt->debuggerMutations;
246
- DestroyTrapAndUnlock(cx, trap);
247
- DBG_LOCK(rt);
248
- if (rt->debuggerMutations != sample + 1)
249
- next = (JSTrap *)rt->trapList.next;
250
- }
251
- }
252
- DBG_UNLOCK(rt);
253
- }
254
-
255
- JS_PUBLIC_API(void)
256
- JS_ClearAllTraps(JSContext *cx)
257
- {
258
- JSRuntime *rt;
259
- JSTrap *trap, *next;
260
- uint32 sample;
261
-
262
- rt = cx->runtime;
263
- DBG_LOCK(rt);
264
- for (trap = (JSTrap *)rt->trapList.next;
265
- trap != (JSTrap *)&rt->trapList;
266
- trap = next) {
267
- next = (JSTrap *)trap->links.next;
268
- sample = rt->debuggerMutations;
269
- DestroyTrapAndUnlock(cx, trap);
270
- DBG_LOCK(rt);
271
- if (rt->debuggerMutations != sample + 1)
272
- next = (JSTrap *)rt->trapList.next;
273
- }
274
- DBG_UNLOCK(rt);
275
- }
276
-
277
- JS_PUBLIC_API(JSTrapStatus)
278
- JS_HandleTrap(JSContext *cx, JSScript *script, jsbytecode *pc, jsval *rval)
279
- {
280
- JSTrap *trap;
281
- jsint op;
282
- JSTrapStatus status;
283
-
284
- DBG_LOCK(cx->runtime);
285
- trap = FindTrap(cx->runtime, script, pc);
286
- JS_ASSERT(!trap || trap->handler);
287
- if (!trap) {
288
- op = (JSOp) *pc;
289
- DBG_UNLOCK(cx->runtime);
290
-
291
- /* Defend against "pc for wrong script" API usage error. */
292
- JS_ASSERT(op != JSOP_TRAP);
293
-
294
- #ifdef JS_THREADSAFE
295
- /* If the API was abused, we must fail for want of the real op. */
296
- if (op == JSOP_TRAP)
297
- return JSTRAP_ERROR;
298
-
299
- /* Assume a race with a debugger thread and try to carry on. */
300
- *rval = INT_TO_JSVAL(op);
301
- return JSTRAP_CONTINUE;
302
- #else
303
- /* Always fail if single-threaded (must be an API usage error). */
304
- return JSTRAP_ERROR;
305
- #endif
306
- }
307
- DBG_UNLOCK(cx->runtime);
308
-
309
- /*
310
- * It's important that we not use 'trap->' after calling the callback --
311
- * the callback might remove the trap!
312
- */
313
- op = (jsint)trap->op;
314
- status = trap->handler(cx, script, pc, rval, trap->closure);
315
- if (status == JSTRAP_CONTINUE) {
316
- /* By convention, return the true op to the interpreter in rval. */
317
- *rval = INT_TO_JSVAL(op);
318
- }
319
- return status;
320
- }
321
-
322
- JS_PUBLIC_API(JSBool)
323
- JS_SetInterrupt(JSRuntime *rt, JSTrapHandler handler, void *closure)
324
- {
325
- rt->globalDebugHooks.interruptHandler = handler;
326
- rt->globalDebugHooks.interruptHandlerData = closure;
327
- return JS_TRUE;
328
- }
329
-
330
- JS_PUBLIC_API(JSBool)
331
- JS_ClearInterrupt(JSRuntime *rt, JSTrapHandler *handlerp, void **closurep)
332
- {
333
- if (handlerp)
334
- *handlerp = (JSTrapHandler)rt->globalDebugHooks.interruptHandler;
335
- if (closurep)
336
- *closurep = rt->globalDebugHooks.interruptHandlerData;
337
- rt->globalDebugHooks.interruptHandler = 0;
338
- rt->globalDebugHooks.interruptHandlerData = 0;
339
- return JS_TRUE;
340
- }
341
-
342
- /************************************************************************/
343
-
344
- typedef struct JSWatchPoint {
345
- JSCList links;
346
- JSObject *object; /* weak link, see js_FinalizeObject */
347
- JSScopeProperty *sprop;
348
- JSPropertyOp setter;
349
- JSWatchPointHandler handler;
350
- void *closure;
351
- uintN flags;
352
- } JSWatchPoint;
353
-
354
- #define JSWP_LIVE 0x1 /* live because set and not cleared */
355
- #define JSWP_HELD 0x2 /* held while running handler/setter */
356
-
357
- /*
358
- * NB: DropWatchPointAndUnlock releases cx->runtime->debuggerLock in all cases.
359
- */
360
- static JSBool
361
- DropWatchPointAndUnlock(JSContext *cx, JSWatchPoint *wp, uintN flag)
362
- {
363
- JSBool ok, found;
364
- JSScopeProperty *sprop;
365
- JSScope *scope;
366
- JSPropertyOp setter;
367
-
368
- ok = JS_TRUE;
369
- wp->flags &= ~flag;
370
- if (wp->flags != 0) {
371
- DBG_UNLOCK(cx->runtime);
372
- return ok;
373
- }
374
-
375
- /*
376
- * Remove wp from the list, then if there are no other watchpoints for
377
- * wp->sprop in any scope, restore wp->sprop->setter from wp.
378
- */
379
- ++cx->runtime->debuggerMutations;
380
- JS_REMOVE_LINK(&wp->links);
381
- sprop = wp->sprop;
382
-
383
- /*
384
- * Passing null for the scope parameter tells js_GetWatchedSetter to find
385
- * any watch point for sprop, and not to lock or unlock rt->debuggerLock.
386
- * If js_ChangeNativePropertyAttrs fails, propagate failure after removing
387
- * wp->closure's root and freeing wp.
388
- */
389
- setter = js_GetWatchedSetter(cx->runtime, NULL, sprop);
390
- DBG_UNLOCK(cx->runtime);
391
- if (!setter) {
392
- JS_LOCK_OBJ(cx, wp->object);
393
- scope = OBJ_SCOPE(wp->object);
394
- found = (scope->object == wp->object &&
395
- SCOPE_GET_PROPERTY(scope, sprop->id));
396
- JS_UNLOCK_SCOPE(cx, scope);
397
-
398
- /*
399
- * If the property wasn't found on wp->object or didn't exist, then
400
- * someone else has dealt with this sprop, and we don't need to change
401
- * the property attributes.
402
- */
403
- if (found) {
404
- sprop = js_ChangeScopePropertyAttrs(cx, scope, sprop,
405
- 0, sprop->attrs,
406
- sprop->getter,
407
- wp->setter);
408
- if (!sprop)
409
- ok = JS_FALSE;
410
- }
411
- }
412
-
413
- JS_free(cx, wp);
414
- return ok;
415
- }
416
-
417
- /*
418
- * NB: js_TraceWatchPoints does not acquire cx->runtime->debuggerLock, since
419
- * the debugger should never be racing with the GC (i.e., the debugger must
420
- * respect the request model).
421
- */
422
- void
423
- js_TraceWatchPoints(JSTracer *trc, JSObject *obj)
424
- {
425
- JSRuntime *rt;
426
- JSWatchPoint *wp;
427
-
428
- rt = trc->context->runtime;
429
-
430
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
431
- wp != (JSWatchPoint *)&rt->watchPointList;
432
- wp = (JSWatchPoint *)wp->links.next) {
433
- if (wp->object == obj) {
434
- TRACE_SCOPE_PROPERTY(trc, wp->sprop);
435
- if ((wp->sprop->attrs & JSPROP_SETTER) && wp->setter) {
436
- JS_CALL_OBJECT_TRACER(trc, (JSObject *)wp->setter,
437
- "wp->setter");
438
- }
439
- JS_SET_TRACING_NAME(trc, "wp->closure");
440
- js_CallValueTracerIfGCThing(trc, (jsval) wp->closure);
441
- }
442
- }
443
- }
444
-
445
- void
446
- js_SweepWatchPoints(JSContext *cx)
447
- {
448
- JSRuntime *rt;
449
- JSWatchPoint *wp, *next;
450
- uint32 sample;
451
-
452
- rt = cx->runtime;
453
- DBG_LOCK(rt);
454
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
455
- wp != (JSWatchPoint *)&rt->watchPointList;
456
- wp = next) {
457
- next = (JSWatchPoint *)wp->links.next;
458
- if (js_IsAboutToBeFinalized(cx, wp->object)) {
459
- sample = rt->debuggerMutations;
460
-
461
- /* Ignore failures. */
462
- DropWatchPointAndUnlock(cx, wp, JSWP_LIVE);
463
- DBG_LOCK(rt);
464
- if (rt->debuggerMutations != sample + 1)
465
- next = (JSWatchPoint *)rt->watchPointList.next;
466
- }
467
- }
468
- DBG_UNLOCK(rt);
469
- }
470
-
471
-
472
-
473
- /*
474
- * NB: FindWatchPoint must be called with rt->debuggerLock acquired.
475
- */
476
- static JSWatchPoint *
477
- FindWatchPoint(JSRuntime *rt, JSScope *scope, jsid id)
478
- {
479
- JSWatchPoint *wp;
480
-
481
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
482
- wp != (JSWatchPoint *)&rt->watchPointList;
483
- wp = (JSWatchPoint *)wp->links.next) {
484
- if (wp->object == scope->object && wp->sprop->id == id)
485
- return wp;
486
- }
487
- return NULL;
488
- }
489
-
490
- JSScopeProperty *
491
- js_FindWatchPoint(JSRuntime *rt, JSScope *scope, jsid id)
492
- {
493
- JSWatchPoint *wp;
494
- JSScopeProperty *sprop;
495
-
496
- DBG_LOCK(rt);
497
- wp = FindWatchPoint(rt, scope, id);
498
- sprop = wp ? wp->sprop : NULL;
499
- DBG_UNLOCK(rt);
500
- return sprop;
501
- }
502
-
503
- /*
504
- * Secret handshake with DropWatchPointAndUnlock: if (!scope), we know our
505
- * caller has acquired rt->debuggerLock, so we don't have to.
506
- */
507
- JSPropertyOp
508
- js_GetWatchedSetter(JSRuntime *rt, JSScope *scope,
509
- const JSScopeProperty *sprop)
510
- {
511
- JSPropertyOp setter;
512
- JSWatchPoint *wp;
513
-
514
- setter = NULL;
515
- if (scope)
516
- DBG_LOCK(rt);
517
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
518
- wp != (JSWatchPoint *)&rt->watchPointList;
519
- wp = (JSWatchPoint *)wp->links.next) {
520
- if ((!scope || wp->object == scope->object) && wp->sprop == sprop) {
521
- setter = wp->setter;
522
- break;
523
- }
524
- }
525
- if (scope)
526
- DBG_UNLOCK(rt);
527
- return setter;
528
- }
529
-
530
- JSBool JS_DLL_CALLBACK
531
- js_watch_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
532
- {
533
- JSRuntime *rt;
534
- JSWatchPoint *wp;
535
- JSScopeProperty *sprop;
536
- jsval propid, userid;
537
- JSScope *scope;
538
- JSBool ok;
539
-
540
- rt = cx->runtime;
541
- DBG_LOCK(rt);
542
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
543
- wp != (JSWatchPoint *)&rt->watchPointList;
544
- wp = (JSWatchPoint *)wp->links.next) {
545
- sprop = wp->sprop;
546
- if (wp->object == obj && SPROP_USERID(sprop) == id &&
547
- !(wp->flags & JSWP_HELD)) {
548
- wp->flags |= JSWP_HELD;
549
- DBG_UNLOCK(rt);
550
-
551
- JS_LOCK_OBJ(cx, obj);
552
- propid = ID_TO_VALUE(sprop->id);
553
- userid = (sprop->flags & SPROP_HAS_SHORTID)
554
- ? INT_TO_JSVAL(sprop->shortid)
555
- : propid;
556
- scope = OBJ_SCOPE(obj);
557
- JS_UNLOCK_OBJ(cx, obj);
558
-
559
- /* NB: wp is held, so we can safely dereference it still. */
560
- ok = wp->handler(cx, obj, propid,
561
- SPROP_HAS_VALID_SLOT(sprop, scope)
562
- ? OBJ_GET_SLOT(cx, obj, sprop->slot)
563
- : JSVAL_VOID,
564
- vp, wp->closure);
565
- if (ok) {
566
- /*
567
- * Create a pseudo-frame for the setter invocation so that any
568
- * stack-walking security code under the setter will correctly
569
- * identify the guilty party. So that the watcher appears to
570
- * be active to obj_eval and other such code, point frame.pc
571
- * at the JSOP_STOP at the end of the script.
572
- *
573
- * The pseudo-frame is not created for fast natives as they
574
- * are treated as interpreter frame extensions and always
575
- * trusted.
576
- */
577
- JSObject *closure;
578
- JSClass *clasp;
579
- JSFunction *fun;
580
- JSScript *script;
581
- JSBool injectFrame;
582
- uintN nslots;
583
- jsval smallv[5];
584
- jsval *argv;
585
- JSStackFrame frame;
586
- JSFrameRegs regs;
587
-
588
- closure = (JSObject *) wp->closure;
589
- clasp = OBJ_GET_CLASS(cx, closure);
590
- if (clasp == &js_FunctionClass) {
591
- fun = GET_FUNCTION_PRIVATE(cx, closure);
592
- script = FUN_SCRIPT(fun);
593
- } else if (clasp == &js_ScriptClass) {
594
- fun = NULL;
595
- script = (JSScript *) JS_GetPrivate(cx, closure);
596
- } else {
597
- fun = NULL;
598
- script = NULL;
599
- }
600
-
601
- nslots = 2;
602
- injectFrame = JS_TRUE;
603
- if (fun) {
604
- nslots += FUN_MINARGS(fun);
605
- if (!FUN_INTERPRETED(fun)) {
606
- nslots += fun->u.n.extra;
607
- injectFrame = !(fun->flags & JSFUN_FAST_NATIVE);
608
- }
609
- }
610
-
611
- if (injectFrame) {
612
- if (nslots <= JS_ARRAY_LENGTH(smallv)) {
613
- argv = smallv;
614
- } else {
615
- argv = (jsval *) JS_malloc(cx, nslots * sizeof(jsval));
616
- if (!argv) {
617
- DBG_LOCK(rt);
618
- DropWatchPointAndUnlock(cx, wp, JSWP_HELD);
619
- return JS_FALSE;
620
- }
621
- }
622
-
623
- argv[0] = OBJECT_TO_JSVAL(closure);
624
- argv[1] = JSVAL_NULL;
625
- memset(argv + 2, 0, (nslots - 2) * sizeof(jsval));
626
-
627
- memset(&frame, 0, sizeof(frame));
628
- frame.script = script;
629
- frame.regs = NULL;
630
- if (script) {
631
- JS_ASSERT(script->length >= JSOP_STOP_LENGTH);
632
- regs.pc = script->code + script->length
633
- - JSOP_STOP_LENGTH;
634
- regs.sp = NULL;
635
- frame.regs = &regs;
636
- }
637
- frame.callee = closure;
638
- frame.fun = fun;
639
- frame.argv = argv + 2;
640
- frame.down = cx->fp;
641
- frame.scopeChain = OBJ_GET_PARENT(cx, closure);
642
-
643
- cx->fp = &frame;
644
- }
645
- #ifdef __GNUC__
646
- else
647
- argv = NULL; /* suppress bogus gcc warnings */
648
- #endif
649
- ok = !wp->setter ||
650
- ((sprop->attrs & JSPROP_SETTER)
651
- ? js_InternalCall(cx, obj, OBJECT_TO_JSVAL(wp->setter),
652
- 1, vp, vp)
653
- : wp->setter(cx, OBJ_THIS_OBJECT(cx, obj), userid, vp));
654
- if (injectFrame) {
655
- /* Evil code can cause us to have an arguments object. */
656
- if (frame.callobj)
657
- ok &= js_PutCallObject(cx, &frame);
658
- if (frame.argsobj)
659
- ok &= js_PutArgsObject(cx, &frame);
660
-
661
- cx->fp = frame.down;
662
- if (argv != smallv)
663
- JS_free(cx, argv);
664
- }
665
- }
666
- DBG_LOCK(rt);
667
- return DropWatchPointAndUnlock(cx, wp, JSWP_HELD) && ok;
668
- }
669
- }
670
- DBG_UNLOCK(rt);
671
- return JS_TRUE;
672
- }
673
-
674
- JSBool JS_DLL_CALLBACK
675
- js_watch_set_wrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
676
- jsval *rval)
677
- {
678
- JSObject *funobj;
679
- JSFunction *wrapper;
680
- jsval userid;
681
-
682
- funobj = JSVAL_TO_OBJECT(argv[-2]);
683
- JS_ASSERT(OBJ_GET_CLASS(cx, funobj) == &js_FunctionClass);
684
- wrapper = GET_FUNCTION_PRIVATE(cx, funobj);
685
- userid = ATOM_KEY(wrapper->atom);
686
- *rval = argv[0];
687
- return js_watch_set(cx, obj, userid, rval);
688
- }
689
-
690
- JSPropertyOp
691
- js_WrapWatchedSetter(JSContext *cx, jsid id, uintN attrs, JSPropertyOp setter)
692
- {
693
- JSAtom *atom;
694
- JSFunction *wrapper;
695
-
696
- if (!(attrs & JSPROP_SETTER))
697
- return &js_watch_set; /* & to silence schoolmarmish MSVC */
698
-
699
- if (JSID_IS_ATOM(id)) {
700
- atom = JSID_TO_ATOM(id);
701
- } else if (JSID_IS_INT(id)) {
702
- if (!js_ValueToStringId(cx, INT_JSID_TO_JSVAL(id), &id))
703
- return NULL;
704
- atom = JSID_TO_ATOM(id);
705
- } else {
706
- atom = NULL;
707
- }
708
- wrapper = js_NewFunction(cx, NULL, js_watch_set_wrapper, 1, 0,
709
- OBJ_GET_PARENT(cx, (JSObject *)setter),
710
- atom);
711
- if (!wrapper)
712
- return NULL;
713
- return (JSPropertyOp) FUN_OBJECT(wrapper);
714
- }
715
-
716
- JS_PUBLIC_API(JSBool)
717
- JS_SetWatchPoint(JSContext *cx, JSObject *obj, jsval idval,
718
- JSWatchPointHandler handler, void *closure)
719
- {
720
- jsid propid;
721
- JSObject *pobj;
722
- JSProperty *prop;
723
- JSScopeProperty *sprop;
724
- JSRuntime *rt;
725
- JSBool ok;
726
- JSWatchPoint *wp;
727
- JSPropertyOp watcher;
728
-
729
- if (!OBJ_IS_NATIVE(obj)) {
730
- JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_WATCH,
731
- OBJ_GET_CLASS(cx, obj)->name);
732
- return JS_FALSE;
733
- }
734
-
735
- if (JSVAL_IS_INT(idval)) {
736
- propid = INT_JSVAL_TO_JSID(idval);
737
- } else {
738
- if (!js_ValueToStringId(cx, idval, &propid))
739
- return JS_FALSE;
740
- CHECK_FOR_STRING_INDEX(propid);
741
- }
742
-
743
- if (!js_LookupProperty(cx, obj, propid, &pobj, &prop))
744
- return JS_FALSE;
745
- sprop = (JSScopeProperty *) prop;
746
- rt = cx->runtime;
747
- if (!sprop) {
748
- /* Check for a deleted symbol watchpoint, which holds its property. */
749
- sprop = js_FindWatchPoint(rt, OBJ_SCOPE(obj), propid);
750
- if (!sprop) {
751
- /* Make a new property in obj so we can watch for the first set. */
752
- if (!js_DefineProperty(cx, obj, propid, JSVAL_VOID,
753
- NULL, NULL, JSPROP_ENUMERATE,
754
- &prop)) {
755
- return JS_FALSE;
756
- }
757
- sprop = (JSScopeProperty *) prop;
758
- }
759
- } else if (pobj != obj) {
760
- /* Clone the prototype property so we can watch the right object. */
761
- jsval value;
762
- JSPropertyOp getter, setter;
763
- uintN attrs, flags;
764
- intN shortid;
765
-
766
- if (OBJ_IS_NATIVE(pobj)) {
767
- value = SPROP_HAS_VALID_SLOT(sprop, OBJ_SCOPE(pobj))
768
- ? LOCKED_OBJ_GET_SLOT(pobj, sprop->slot)
769
- : JSVAL_VOID;
770
- getter = sprop->getter;
771
- setter = sprop->setter;
772
- attrs = sprop->attrs;
773
- flags = sprop->flags;
774
- shortid = sprop->shortid;
775
- } else {
776
- if (!OBJ_GET_PROPERTY(cx, pobj, propid, &value) ||
777
- !OBJ_GET_ATTRIBUTES(cx, pobj, propid, prop, &attrs)) {
778
- OBJ_DROP_PROPERTY(cx, pobj, prop);
779
- return JS_FALSE;
780
- }
781
- getter = setter = NULL;
782
- flags = 0;
783
- shortid = 0;
784
- }
785
- OBJ_DROP_PROPERTY(cx, pobj, prop);
786
-
787
- /* Recall that obj is native, whether or not pobj is native. */
788
- if (!js_DefineNativeProperty(cx, obj, propid, value, getter, setter,
789
- attrs, flags, shortid, &prop)) {
790
- return JS_FALSE;
791
- }
792
- sprop = (JSScopeProperty *) prop;
793
- }
794
-
795
- /*
796
- * At this point, prop/sprop exists in obj, obj is locked, and we must
797
- * OBJ_DROP_PROPERTY(cx, obj, prop) before returning.
798
- */
799
- ok = JS_TRUE;
800
- DBG_LOCK(rt);
801
- wp = FindWatchPoint(rt, OBJ_SCOPE(obj), propid);
802
- if (!wp) {
803
- DBG_UNLOCK(rt);
804
- watcher = js_WrapWatchedSetter(cx, propid, sprop->attrs, sprop->setter);
805
- if (!watcher) {
806
- ok = JS_FALSE;
807
- goto out;
808
- }
809
-
810
- wp = (JSWatchPoint *) JS_malloc(cx, sizeof *wp);
811
- if (!wp) {
812
- ok = JS_FALSE;
813
- goto out;
814
- }
815
- wp->handler = NULL;
816
- wp->closure = NULL;
817
- wp->object = obj;
818
- JS_ASSERT(sprop->setter != js_watch_set || pobj != obj);
819
- wp->setter = sprop->setter;
820
- wp->flags = JSWP_LIVE;
821
-
822
- /* XXXbe nest in obj lock here */
823
- sprop = js_ChangeNativePropertyAttrs(cx, obj, sprop, 0, sprop->attrs,
824
- sprop->getter, watcher);
825
- if (!sprop) {
826
- /* Self-link so DropWatchPointAndUnlock can JS_REMOVE_LINK it. */
827
- JS_INIT_CLIST(&wp->links);
828
- DBG_LOCK(rt);
829
- DropWatchPointAndUnlock(cx, wp, JSWP_LIVE);
830
- ok = JS_FALSE;
831
- goto out;
832
- }
833
- wp->sprop = sprop;
834
-
835
- /*
836
- * Now that wp is fully initialized, append it to rt's wp list.
837
- * Because obj is locked we know that no other thread could have added
838
- * a watchpoint for (obj, propid).
839
- */
840
- DBG_LOCK(rt);
841
- JS_ASSERT(!FindWatchPoint(rt, OBJ_SCOPE(obj), propid));
842
- JS_APPEND_LINK(&wp->links, &rt->watchPointList);
843
- ++rt->debuggerMutations;
844
- }
845
- wp->handler = handler;
846
- wp->closure = closure;
847
- DBG_UNLOCK(rt);
848
-
849
- out:
850
- OBJ_DROP_PROPERTY(cx, obj, prop);
851
- return ok;
852
- }
853
-
854
- JS_PUBLIC_API(JSBool)
855
- JS_ClearWatchPoint(JSContext *cx, JSObject *obj, jsval id,
856
- JSWatchPointHandler *handlerp, void **closurep)
857
- {
858
- JSRuntime *rt;
859
- JSWatchPoint *wp;
860
-
861
- rt = cx->runtime;
862
- DBG_LOCK(rt);
863
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
864
- wp != (JSWatchPoint *)&rt->watchPointList;
865
- wp = (JSWatchPoint *)wp->links.next) {
866
- if (wp->object == obj && SPROP_USERID(wp->sprop) == id) {
867
- if (handlerp)
868
- *handlerp = wp->handler;
869
- if (closurep)
870
- *closurep = wp->closure;
871
- return DropWatchPointAndUnlock(cx, wp, JSWP_LIVE);
872
- }
873
- }
874
- DBG_UNLOCK(rt);
875
- if (handlerp)
876
- *handlerp = NULL;
877
- if (closurep)
878
- *closurep = NULL;
879
- return JS_TRUE;
880
- }
881
-
882
- JS_PUBLIC_API(JSBool)
883
- JS_ClearWatchPointsForObject(JSContext *cx, JSObject *obj)
884
- {
885
- JSRuntime *rt;
886
- JSWatchPoint *wp, *next;
887
- uint32 sample;
888
-
889
- rt = cx->runtime;
890
- DBG_LOCK(rt);
891
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
892
- wp != (JSWatchPoint *)&rt->watchPointList;
893
- wp = next) {
894
- next = (JSWatchPoint *)wp->links.next;
895
- if (wp->object == obj) {
896
- sample = rt->debuggerMutations;
897
- if (!DropWatchPointAndUnlock(cx, wp, JSWP_LIVE))
898
- return JS_FALSE;
899
- DBG_LOCK(rt);
900
- if (rt->debuggerMutations != sample + 1)
901
- next = (JSWatchPoint *)rt->watchPointList.next;
902
- }
903
- }
904
- DBG_UNLOCK(rt);
905
- return JS_TRUE;
906
- }
907
-
908
- JS_PUBLIC_API(JSBool)
909
- JS_ClearAllWatchPoints(JSContext *cx)
910
- {
911
- JSRuntime *rt;
912
- JSWatchPoint *wp, *next;
913
- uint32 sample;
914
-
915
- rt = cx->runtime;
916
- DBG_LOCK(rt);
917
- for (wp = (JSWatchPoint *)rt->watchPointList.next;
918
- wp != (JSWatchPoint *)&rt->watchPointList;
919
- wp = next) {
920
- next = (JSWatchPoint *)wp->links.next;
921
- sample = rt->debuggerMutations;
922
- if (!DropWatchPointAndUnlock(cx, wp, JSWP_LIVE))
923
- return JS_FALSE;
924
- DBG_LOCK(rt);
925
- if (rt->debuggerMutations != sample + 1)
926
- next = (JSWatchPoint *)rt->watchPointList.next;
927
- }
928
- DBG_UNLOCK(rt);
929
- return JS_TRUE;
930
- }
931
-
932
- /************************************************************************/
933
-
934
- JS_PUBLIC_API(uintN)
935
- JS_PCToLineNumber(JSContext *cx, JSScript *script, jsbytecode *pc)
936
- {
937
- return js_PCToLineNumber(cx, script, pc);
938
- }
939
-
940
- JS_PUBLIC_API(jsbytecode *)
941
- JS_LineNumberToPC(JSContext *cx, JSScript *script, uintN lineno)
942
- {
943
- return js_LineNumberToPC(script, lineno);
944
- }
945
-
946
- JS_PUBLIC_API(JSScript *)
947
- JS_GetFunctionScript(JSContext *cx, JSFunction *fun)
948
- {
949
- return FUN_SCRIPT(fun);
950
- }
951
-
952
- JS_PUBLIC_API(JSNative)
953
- JS_GetFunctionNative(JSContext *cx, JSFunction *fun)
954
- {
955
- return FUN_NATIVE(fun);
956
- }
957
-
958
- JS_PUBLIC_API(JSFastNative)
959
- JS_GetFunctionFastNative(JSContext *cx, JSFunction *fun)
960
- {
961
- return FUN_FAST_NATIVE(fun);
962
- }
963
-
964
- JS_PUBLIC_API(JSPrincipals *)
965
- JS_GetScriptPrincipals(JSContext *cx, JSScript *script)
966
- {
967
- return script->principals;
968
- }
969
-
970
- /************************************************************************/
971
-
972
- /*
973
- * Stack Frame Iterator
974
- */
975
- JS_PUBLIC_API(JSStackFrame *)
976
- JS_FrameIterator(JSContext *cx, JSStackFrame **iteratorp)
977
- {
978
- *iteratorp = (*iteratorp == NULL) ? cx->fp : (*iteratorp)->down;
979
- return *iteratorp;
980
- }
981
-
982
- JS_PUBLIC_API(JSScript *)
983
- JS_GetFrameScript(JSContext *cx, JSStackFrame *fp)
984
- {
985
- return fp->script;
986
- }
987
-
988
- JS_PUBLIC_API(jsbytecode *)
989
- JS_GetFramePC(JSContext *cx, JSStackFrame *fp)
990
- {
991
- return fp->regs ? fp->regs->pc : NULL;
992
- }
993
-
994
- JS_PUBLIC_API(JSStackFrame *)
995
- JS_GetScriptedCaller(JSContext *cx, JSStackFrame *fp)
996
- {
997
- if (!fp)
998
- fp = cx->fp;
999
- while (fp) {
1000
- if (fp->script)
1001
- return fp;
1002
- fp = fp->down;
1003
- }
1004
- return NULL;
1005
- }
1006
-
1007
- JS_PUBLIC_API(JSPrincipals *)
1008
- JS_StackFramePrincipals(JSContext *cx, JSStackFrame *fp)
1009
- {
1010
- if (fp->fun) {
1011
- JSRuntime *rt = cx->runtime;
1012
-
1013
- if (rt->findObjectPrincipals) {
1014
- if (FUN_OBJECT(fp->fun) != fp->callee)
1015
- return rt->findObjectPrincipals(cx, fp->callee);
1016
- /* FALL THROUGH */
1017
- }
1018
- }
1019
- if (fp->script)
1020
- return fp->script->principals;
1021
- return NULL;
1022
- }
1023
-
1024
- JS_PUBLIC_API(JSPrincipals *)
1025
- JS_EvalFramePrincipals(JSContext *cx, JSStackFrame *fp, JSStackFrame *caller)
1026
- {
1027
- JSRuntime *rt;
1028
- JSPrincipals *principals, *callerPrincipals;
1029
-
1030
- rt = cx->runtime;
1031
- if (rt->findObjectPrincipals) {
1032
- principals = rt->findObjectPrincipals(cx, fp->callee);
1033
- } else {
1034
- principals = NULL;
1035
- }
1036
- if (!caller)
1037
- return principals;
1038
- callerPrincipals = JS_StackFramePrincipals(cx, caller);
1039
- return (callerPrincipals && principals &&
1040
- callerPrincipals->subsume(callerPrincipals, principals))
1041
- ? principals
1042
- : callerPrincipals;
1043
- }
1044
-
1045
- JS_PUBLIC_API(void *)
1046
- JS_GetFrameAnnotation(JSContext *cx, JSStackFrame *fp)
1047
- {
1048
- if (fp->annotation && fp->script) {
1049
- JSPrincipals *principals = JS_StackFramePrincipals(cx, fp);
1050
-
1051
- if (principals && principals->globalPrivilegesEnabled(cx, principals)) {
1052
- /*
1053
- * Give out an annotation only if privileges have not been revoked
1054
- * or disabled globally.
1055
- */
1056
- return fp->annotation;
1057
- }
1058
- }
1059
-
1060
- return NULL;
1061
- }
1062
-
1063
- JS_PUBLIC_API(void)
1064
- JS_SetFrameAnnotation(JSContext *cx, JSStackFrame *fp, void *annotation)
1065
- {
1066
- fp->annotation = annotation;
1067
- }
1068
-
1069
- JS_PUBLIC_API(void *)
1070
- JS_GetFramePrincipalArray(JSContext *cx, JSStackFrame *fp)
1071
- {
1072
- JSPrincipals *principals;
1073
-
1074
- principals = JS_StackFramePrincipals(cx, fp);
1075
- if (!principals)
1076
- return NULL;
1077
- return principals->getPrincipalArray(cx, principals);
1078
- }
1079
-
1080
- JS_PUBLIC_API(JSBool)
1081
- JS_IsNativeFrame(JSContext *cx, JSStackFrame *fp)
1082
- {
1083
- return !fp->script;
1084
- }
1085
-
1086
- /* this is deprecated, use JS_GetFrameScopeChain instead */
1087
- JS_PUBLIC_API(JSObject *)
1088
- JS_GetFrameObject(JSContext *cx, JSStackFrame *fp)
1089
- {
1090
- return fp->scopeChain;
1091
- }
1092
-
1093
- JS_PUBLIC_API(JSObject *)
1094
- JS_GetFrameScopeChain(JSContext *cx, JSStackFrame *fp)
1095
- {
1096
- /* Force creation of argument and call objects if not yet created */
1097
- (void) JS_GetFrameCallObject(cx, fp);
1098
- return js_GetScopeChain(cx, fp);
1099
- }
1100
-
1101
- JS_PUBLIC_API(JSObject *)
1102
- JS_GetFrameCallObject(JSContext *cx, JSStackFrame *fp)
1103
- {
1104
- if (! fp->fun)
1105
- return NULL;
1106
-
1107
- /* Force creation of argument object if not yet created */
1108
- (void) js_GetArgsObject(cx, fp);
1109
-
1110
- /*
1111
- * XXX ill-defined: null return here means error was reported, unlike a
1112
- * null returned above or in the #else
1113
- */
1114
- return js_GetCallObject(cx, fp, NULL);
1115
- }
1116
-
1117
- JS_PUBLIC_API(JSObject *)
1118
- JS_GetFrameThis(JSContext *cx, JSStackFrame *fp)
1119
- {
1120
- JSStackFrame *afp;
1121
-
1122
- if (fp->flags & JSFRAME_COMPUTED_THIS)
1123
- return fp->thisp;
1124
-
1125
- /* js_ComputeThis gets confused if fp != cx->fp, so set it aside. */
1126
- if (cx->fp != fp) {
1127
- afp = cx->fp;
1128
- if (afp) {
1129
- afp->dormantNext = cx->dormantFrameChain;
1130
- cx->dormantFrameChain = afp;
1131
- cx->fp = fp;
1132
- }
1133
- } else {
1134
- afp = NULL;
1135
- }
1136
-
1137
- if (!fp->thisp && fp->argv)
1138
- fp->thisp = js_ComputeThis(cx, JS_TRUE, fp->argv);
1139
-
1140
- if (afp) {
1141
- cx->fp = afp;
1142
- cx->dormantFrameChain = afp->dormantNext;
1143
- afp->dormantNext = NULL;
1144
- }
1145
-
1146
- return fp->thisp;
1147
- }
1148
-
1149
- JS_PUBLIC_API(JSFunction *)
1150
- JS_GetFrameFunction(JSContext *cx, JSStackFrame *fp)
1151
- {
1152
- return fp->fun;
1153
- }
1154
-
1155
- JS_PUBLIC_API(JSObject *)
1156
- JS_GetFrameFunctionObject(JSContext *cx, JSStackFrame *fp)
1157
- {
1158
- /*
1159
- * Test both fp->fun and fp->argv to defend against any control flow from
1160
- * the compiler reaching this API entry point, where fp is a frame pushed
1161
- * by the compiler that has non-null fun but null argv.
1162
- */
1163
- if (fp->fun && fp->argv) {
1164
- JSObject *obj = fp->callee;
1165
-
1166
- JS_ASSERT(OBJ_GET_CLASS(cx, obj) == &js_FunctionClass);
1167
- JS_ASSERT(OBJ_GET_PRIVATE(cx, obj) == fp->fun);
1168
- return obj;
1169
- }
1170
- return NULL;
1171
- }
1172
-
1173
- JS_PUBLIC_API(JSBool)
1174
- JS_IsConstructorFrame(JSContext *cx, JSStackFrame *fp)
1175
- {
1176
- return (fp->flags & JSFRAME_CONSTRUCTING) != 0;
1177
- }
1178
-
1179
- JS_PUBLIC_API(JSObject *)
1180
- JS_GetFrameCalleeObject(JSContext *cx, JSStackFrame *fp)
1181
- {
1182
- return fp->callee;
1183
- }
1184
-
1185
- JS_PUBLIC_API(JSBool)
1186
- JS_IsDebuggerFrame(JSContext *cx, JSStackFrame *fp)
1187
- {
1188
- return (fp->flags & JSFRAME_DEBUGGER) != 0;
1189
- }
1190
-
1191
- JS_PUBLIC_API(jsval)
1192
- JS_GetFrameReturnValue(JSContext *cx, JSStackFrame *fp)
1193
- {
1194
- return fp->rval;
1195
- }
1196
-
1197
- JS_PUBLIC_API(void)
1198
- JS_SetFrameReturnValue(JSContext *cx, JSStackFrame *fp, jsval rval)
1199
- {
1200
- fp->rval = rval;
1201
- }
1202
-
1203
- /************************************************************************/
1204
-
1205
- JS_PUBLIC_API(const char *)
1206
- JS_GetScriptFilename(JSContext *cx, JSScript *script)
1207
- {
1208
- return script->filename;
1209
- }
1210
-
1211
- JS_PUBLIC_API(uintN)
1212
- JS_GetScriptBaseLineNumber(JSContext *cx, JSScript *script)
1213
- {
1214
- return script->lineno;
1215
- }
1216
-
1217
- JS_PUBLIC_API(uintN)
1218
- JS_GetScriptLineExtent(JSContext *cx, JSScript *script)
1219
- {
1220
- return js_GetScriptLineExtent(script);
1221
- }
1222
-
1223
- JS_PUBLIC_API(JSVersion)
1224
- JS_GetScriptVersion(JSContext *cx, JSScript *script)
1225
- {
1226
- return (JSVersion) (script->version & JSVERSION_MASK);
1227
- }
1228
-
1229
- /***************************************************************************/
1230
-
1231
- JS_PUBLIC_API(void)
1232
- JS_SetNewScriptHook(JSRuntime *rt, JSNewScriptHook hook, void *callerdata)
1233
- {
1234
- rt->globalDebugHooks.newScriptHook = hook;
1235
- rt->globalDebugHooks.newScriptHookData = callerdata;
1236
- }
1237
-
1238
- JS_PUBLIC_API(void)
1239
- JS_SetDestroyScriptHook(JSRuntime *rt, JSDestroyScriptHook hook,
1240
- void *callerdata)
1241
- {
1242
- rt->globalDebugHooks.destroyScriptHook = hook;
1243
- rt->globalDebugHooks.destroyScriptHookData = callerdata;
1244
- }
1245
-
1246
- /***************************************************************************/
1247
-
1248
- JS_PUBLIC_API(JSBool)
1249
- JS_EvaluateUCInStackFrame(JSContext *cx, JSStackFrame *fp,
1250
- const jschar *chars, uintN length,
1251
- const char *filename, uintN lineno,
1252
- jsval *rval)
1253
- {
1254
- JSObject *scobj;
1255
- uint32 flags;
1256
- JSScript *script;
1257
- JSBool ok;
1258
-
1259
- scobj = JS_GetFrameScopeChain(cx, fp);
1260
- if (!scobj)
1261
- return JS_FALSE;
1262
-
1263
- /*
1264
- * XXX Hack around ancient compiler API to propagate the JSFRAME_SPECIAL
1265
- * flags to the code generator.
1266
- */
1267
- flags = fp->flags;
1268
- fp->flags |= JSFRAME_DEBUGGER | JSFRAME_EVAL;
1269
- script = js_CompileScript(cx, scobj, JS_StackFramePrincipals(cx, fp),
1270
- TCF_COMPILE_N_GO, chars, length, NULL,
1271
- filename, lineno);
1272
- fp->flags = flags;
1273
- if (!script)
1274
- return JS_FALSE;
1275
-
1276
- ok = js_Execute(cx, scobj, script, fp, JSFRAME_DEBUGGER | JSFRAME_EVAL,
1277
- rval);
1278
- js_DestroyScript(cx, script);
1279
- return ok;
1280
- }
1281
-
1282
- JS_PUBLIC_API(JSBool)
1283
- JS_EvaluateInStackFrame(JSContext *cx, JSStackFrame *fp,
1284
- const char *bytes, uintN length,
1285
- const char *filename, uintN lineno,
1286
- jsval *rval)
1287
- {
1288
- jschar *chars;
1289
- JSBool ok;
1290
- size_t len = length;
1291
-
1292
- chars = js_InflateString(cx, bytes, &len);
1293
- if (!chars)
1294
- return JS_FALSE;
1295
- length = (uintN) len;
1296
- ok = JS_EvaluateUCInStackFrame(cx, fp, chars, length, filename, lineno,
1297
- rval);
1298
- JS_free(cx, chars);
1299
-
1300
- return ok;
1301
- }
1302
-
1303
- /************************************************************************/
1304
-
1305
- /* XXXbe this all needs to be reworked to avoid requiring JSScope types. */
1306
-
1307
- JS_PUBLIC_API(JSScopeProperty *)
1308
- JS_PropertyIterator(JSObject *obj, JSScopeProperty **iteratorp)
1309
- {
1310
- JSScopeProperty *sprop;
1311
- JSScope *scope;
1312
-
1313
- sprop = *iteratorp;
1314
- scope = OBJ_SCOPE(obj);
1315
-
1316
- /* XXXbe minor(?) incompatibility: iterate in reverse definition order */
1317
- if (!sprop) {
1318
- sprop = SCOPE_LAST_PROP(scope);
1319
- } else {
1320
- while ((sprop = sprop->parent) != NULL) {
1321
- if (!SCOPE_HAD_MIDDLE_DELETE(scope))
1322
- break;
1323
- if (SCOPE_HAS_PROPERTY(scope, sprop))
1324
- break;
1325
- }
1326
- }
1327
- *iteratorp = sprop;
1328
- return sprop;
1329
- }
1330
-
1331
- JS_PUBLIC_API(JSBool)
1332
- JS_GetPropertyDesc(JSContext *cx, JSObject *obj, JSScopeProperty *sprop,
1333
- JSPropertyDesc *pd)
1334
- {
1335
- JSScope *scope;
1336
- JSScopeProperty *aprop;
1337
- jsval lastException;
1338
- JSBool wasThrowing;
1339
-
1340
- pd->id = ID_TO_VALUE(sprop->id);
1341
-
1342
- wasThrowing = cx->throwing;
1343
- if (wasThrowing) {
1344
- lastException = cx->exception;
1345
- if (JSVAL_IS_GCTHING(lastException) &&
1346
- !js_AddRoot(cx, &lastException, "lastException")) {
1347
- return JS_FALSE;
1348
- }
1349
- cx->throwing = JS_FALSE;
1350
- }
1351
-
1352
- if (!js_GetProperty(cx, obj, sprop->id, &pd->value)) {
1353
- if (!cx->throwing) {
1354
- pd->flags = JSPD_ERROR;
1355
- pd->value = JSVAL_VOID;
1356
- } else {
1357
- pd->flags = JSPD_EXCEPTION;
1358
- pd->value = cx->exception;
1359
- }
1360
- } else {
1361
- pd->flags = 0;
1362
- }
1363
-
1364
- cx->throwing = wasThrowing;
1365
- if (wasThrowing) {
1366
- cx->exception = lastException;
1367
- if (JSVAL_IS_GCTHING(lastException))
1368
- js_RemoveRoot(cx->runtime, &lastException);
1369
- }
1370
-
1371
- pd->flags |= ((sprop->attrs & JSPROP_ENUMERATE) ? JSPD_ENUMERATE : 0)
1372
- | ((sprop->attrs & JSPROP_READONLY) ? JSPD_READONLY : 0)
1373
- | ((sprop->attrs & JSPROP_PERMANENT) ? JSPD_PERMANENT : 0);
1374
- pd->spare = 0;
1375
- if (sprop->getter == js_GetCallArg) {
1376
- pd->slot = sprop->shortid;
1377
- pd->flags |= JSPD_ARGUMENT;
1378
- } else if (sprop->getter == js_GetCallVar) {
1379
- pd->slot = sprop->shortid;
1380
- pd->flags |= JSPD_VARIABLE;
1381
- } else {
1382
- pd->slot = 0;
1383
- }
1384
- pd->alias = JSVAL_VOID;
1385
- scope = OBJ_SCOPE(obj);
1386
- if (SPROP_HAS_VALID_SLOT(sprop, scope)) {
1387
- for (aprop = SCOPE_LAST_PROP(scope); aprop; aprop = aprop->parent) {
1388
- if (aprop != sprop && aprop->slot == sprop->slot) {
1389
- pd->alias = ID_TO_VALUE(aprop->id);
1390
- break;
1391
- }
1392
- }
1393
- }
1394
- return JS_TRUE;
1395
- }
1396
-
1397
- JS_PUBLIC_API(JSBool)
1398
- JS_GetPropertyDescArray(JSContext *cx, JSObject *obj, JSPropertyDescArray *pda)
1399
- {
1400
- JSClass *clasp;
1401
- JSScope *scope;
1402
- uint32 i, n;
1403
- JSPropertyDesc *pd;
1404
- JSScopeProperty *sprop;
1405
-
1406
- clasp = OBJ_GET_CLASS(cx, obj);
1407
- if (!OBJ_IS_NATIVE(obj) || (clasp->flags & JSCLASS_NEW_ENUMERATE)) {
1408
- JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
1409
- JSMSG_CANT_DESCRIBE_PROPS, clasp->name);
1410
- return JS_FALSE;
1411
- }
1412
- if (!clasp->enumerate(cx, obj))
1413
- return JS_FALSE;
1414
-
1415
- /* have no props, or object's scope has not mutated from that of proto */
1416
- scope = OBJ_SCOPE(obj);
1417
- if (scope->object != obj || scope->entryCount == 0) {
1418
- pda->length = 0;
1419
- pda->array = NULL;
1420
- return JS_TRUE;
1421
- }
1422
-
1423
- n = STOBJ_NSLOTS(obj);
1424
- if (n > scope->entryCount)
1425
- n = scope->entryCount;
1426
- pd = (JSPropertyDesc *) JS_malloc(cx, (size_t)n * sizeof(JSPropertyDesc));
1427
- if (!pd)
1428
- return JS_FALSE;
1429
- i = 0;
1430
- for (sprop = SCOPE_LAST_PROP(scope); sprop; sprop = sprop->parent) {
1431
- if (SCOPE_HAD_MIDDLE_DELETE(scope) && !SCOPE_HAS_PROPERTY(scope, sprop))
1432
- continue;
1433
- if (!js_AddRoot(cx, &pd[i].id, NULL))
1434
- goto bad;
1435
- if (!js_AddRoot(cx, &pd[i].value, NULL))
1436
- goto bad;
1437
- if (!JS_GetPropertyDesc(cx, obj, sprop, &pd[i]))
1438
- goto bad;
1439
- if ((pd[i].flags & JSPD_ALIAS) && !js_AddRoot(cx, &pd[i].alias, NULL))
1440
- goto bad;
1441
- if (++i == n)
1442
- break;
1443
- }
1444
- pda->length = i;
1445
- pda->array = pd;
1446
- return JS_TRUE;
1447
-
1448
- bad:
1449
- pda->length = i + 1;
1450
- pda->array = pd;
1451
- JS_PutPropertyDescArray(cx, pda);
1452
- return JS_FALSE;
1453
- }
1454
-
1455
- JS_PUBLIC_API(void)
1456
- JS_PutPropertyDescArray(JSContext *cx, JSPropertyDescArray *pda)
1457
- {
1458
- JSPropertyDesc *pd;
1459
- uint32 i;
1460
-
1461
- pd = pda->array;
1462
- for (i = 0; i < pda->length; i++) {
1463
- js_RemoveRoot(cx->runtime, &pd[i].id);
1464
- js_RemoveRoot(cx->runtime, &pd[i].value);
1465
- if (pd[i].flags & JSPD_ALIAS)
1466
- js_RemoveRoot(cx->runtime, &pd[i].alias);
1467
- }
1468
- JS_free(cx, pd);
1469
- }
1470
-
1471
- /************************************************************************/
1472
-
1473
- JS_PUBLIC_API(JSBool)
1474
- JS_SetDebuggerHandler(JSRuntime *rt, JSTrapHandler handler, void *closure)
1475
- {
1476
- rt->globalDebugHooks.debuggerHandler = handler;
1477
- rt->globalDebugHooks.debuggerHandlerData = closure;
1478
- return JS_TRUE;
1479
- }
1480
-
1481
- JS_PUBLIC_API(JSBool)
1482
- JS_SetSourceHandler(JSRuntime *rt, JSSourceHandler handler, void *closure)
1483
- {
1484
- rt->globalDebugHooks.sourceHandler = handler;
1485
- rt->globalDebugHooks.sourceHandlerData = closure;
1486
- return JS_TRUE;
1487
- }
1488
-
1489
- JS_PUBLIC_API(JSBool)
1490
- JS_SetExecuteHook(JSRuntime *rt, JSInterpreterHook hook, void *closure)
1491
- {
1492
- rt->globalDebugHooks.executeHook = hook;
1493
- rt->globalDebugHooks.executeHookData = closure;
1494
- return JS_TRUE;
1495
- }
1496
-
1497
- JS_PUBLIC_API(JSBool)
1498
- JS_SetCallHook(JSRuntime *rt, JSInterpreterHook hook, void *closure)
1499
- {
1500
- rt->globalDebugHooks.callHook = hook;
1501
- rt->globalDebugHooks.callHookData = closure;
1502
- return JS_TRUE;
1503
- }
1504
-
1505
- JS_PUBLIC_API(JSBool)
1506
- JS_SetObjectHook(JSRuntime *rt, JSObjectHook hook, void *closure)
1507
- {
1508
- rt->globalDebugHooks.objectHook = hook;
1509
- rt->globalDebugHooks.objectHookData = closure;
1510
- return JS_TRUE;
1511
- }
1512
-
1513
- JS_PUBLIC_API(JSBool)
1514
- JS_SetThrowHook(JSRuntime *rt, JSTrapHandler hook, void *closure)
1515
- {
1516
- rt->globalDebugHooks.throwHook = hook;
1517
- rt->globalDebugHooks.throwHookData = closure;
1518
- return JS_TRUE;
1519
- }
1520
-
1521
- JS_PUBLIC_API(JSBool)
1522
- JS_SetDebugErrorHook(JSRuntime *rt, JSDebugErrorHook hook, void *closure)
1523
- {
1524
- rt->globalDebugHooks.debugErrorHook = hook;
1525
- rt->globalDebugHooks.debugErrorHookData = closure;
1526
- return JS_TRUE;
1527
- }
1528
-
1529
- /************************************************************************/
1530
-
1531
- JS_PUBLIC_API(size_t)
1532
- JS_GetObjectTotalSize(JSContext *cx, JSObject *obj)
1533
- {
1534
- size_t nbytes;
1535
- JSScope *scope;
1536
-
1537
- nbytes = sizeof *obj;
1538
- if (obj->dslots) {
1539
- nbytes += ((uint32)obj->dslots[-1] - JS_INITIAL_NSLOTS + 1)
1540
- * sizeof obj->dslots[0];
1541
- }
1542
- if (OBJ_IS_NATIVE(obj)) {
1543
- scope = OBJ_SCOPE(obj);
1544
- if (scope->object == obj) {
1545
- nbytes += sizeof *scope;
1546
- nbytes += SCOPE_CAPACITY(scope) * sizeof(JSScopeProperty *);
1547
- }
1548
- }
1549
- return nbytes;
1550
- }
1551
-
1552
- static size_t
1553
- GetAtomTotalSize(JSContext *cx, JSAtom *atom)
1554
- {
1555
- size_t nbytes;
1556
-
1557
- nbytes = sizeof(JSAtom *) + sizeof(JSDHashEntryStub);
1558
- if (ATOM_IS_STRING(atom)) {
1559
- nbytes += sizeof(JSString);
1560
- nbytes += (JSFLATSTR_LENGTH(ATOM_TO_STRING(atom)) + 1) * sizeof(jschar);
1561
- } else if (ATOM_IS_DOUBLE(atom)) {
1562
- nbytes += sizeof(jsdouble);
1563
- }
1564
- return nbytes;
1565
- }
1566
-
1567
- JS_PUBLIC_API(size_t)
1568
- JS_GetFunctionTotalSize(JSContext *cx, JSFunction *fun)
1569
- {
1570
- size_t nbytes;
1571
-
1572
- nbytes = sizeof *fun;
1573
- nbytes += JS_GetObjectTotalSize(cx, FUN_OBJECT(fun));
1574
- if (FUN_INTERPRETED(fun))
1575
- nbytes += JS_GetScriptTotalSize(cx, fun->u.i.script);
1576
- if (fun->atom)
1577
- nbytes += GetAtomTotalSize(cx, fun->atom);
1578
- return nbytes;
1579
- }
1580
-
1581
- #include "jsemit.h"
1582
-
1583
- JS_PUBLIC_API(size_t)
1584
- JS_GetScriptTotalSize(JSContext *cx, JSScript *script)
1585
- {
1586
- size_t nbytes, pbytes;
1587
- jsatomid i;
1588
- jssrcnote *sn, *notes;
1589
- JSObjectArray *objarray;
1590
- JSPrincipals *principals;
1591
-
1592
- nbytes = sizeof *script;
1593
- if (script->object)
1594
- nbytes += JS_GetObjectTotalSize(cx, script->object);
1595
-
1596
- nbytes += script->length * sizeof script->code[0];
1597
- nbytes += script->atomMap.length * sizeof script->atomMap.vector[0];
1598
- for (i = 0; i < script->atomMap.length; i++)
1599
- nbytes += GetAtomTotalSize(cx, script->atomMap.vector[i]);
1600
-
1601
- if (script->filename)
1602
- nbytes += strlen(script->filename) + 1;
1603
-
1604
- notes = SCRIPT_NOTES(script);
1605
- for (sn = notes; !SN_IS_TERMINATOR(sn); sn = SN_NEXT(sn))
1606
- continue;
1607
- nbytes += (sn - notes + 1) * sizeof *sn;
1608
-
1609
- if (script->objectsOffset != 0) {
1610
- objarray = JS_SCRIPT_OBJECTS(script);
1611
- i = objarray->length;
1612
- nbytes += sizeof *objarray + i * sizeof objarray->vector[0];
1613
- do {
1614
- nbytes += JS_GetObjectTotalSize(cx, objarray->vector[--i]);
1615
- } while (i != 0);
1616
- }
1617
-
1618
- if (script->regexpsOffset != 0) {
1619
- objarray = JS_SCRIPT_REGEXPS(script);
1620
- i = objarray->length;
1621
- nbytes += sizeof *objarray + i * sizeof objarray->vector[0];
1622
- do {
1623
- nbytes += JS_GetObjectTotalSize(cx, objarray->vector[--i]);
1624
- } while (i != 0);
1625
- }
1626
-
1627
- if (script->trynotesOffset != 0) {
1628
- nbytes += sizeof(JSTryNoteArray) +
1629
- JS_SCRIPT_TRYNOTES(script)->length * sizeof(JSTryNote);
1630
- }
1631
-
1632
- principals = script->principals;
1633
- if (principals) {
1634
- JS_ASSERT(principals->refcount);
1635
- pbytes = sizeof *principals;
1636
- if (principals->refcount > 1)
1637
- pbytes = JS_HOWMANY(pbytes, principals->refcount);
1638
- nbytes += pbytes;
1639
- }
1640
-
1641
- return nbytes;
1642
- }
1643
-
1644
- JS_PUBLIC_API(uint32)
1645
- JS_GetTopScriptFilenameFlags(JSContext *cx, JSStackFrame *fp)
1646
- {
1647
- if (!fp)
1648
- fp = cx->fp;
1649
- while (fp) {
1650
- if (fp->script)
1651
- return JS_GetScriptFilenameFlags(fp->script);
1652
- fp = fp->down;
1653
- }
1654
- return 0;
1655
- }
1656
-
1657
- JS_PUBLIC_API(uint32)
1658
- JS_GetScriptFilenameFlags(JSScript *script)
1659
- {
1660
- JS_ASSERT(script);
1661
- if (!script->filename)
1662
- return JSFILENAME_NULL;
1663
- return js_GetScriptFilenameFlags(script->filename);
1664
- }
1665
-
1666
- JS_PUBLIC_API(JSBool)
1667
- JS_FlagScriptFilenamePrefix(JSRuntime *rt, const char *prefix, uint32 flags)
1668
- {
1669
- if (!js_SaveScriptFilenameRT(rt, prefix, flags))
1670
- return JS_FALSE;
1671
- return JS_TRUE;
1672
- }
1673
-
1674
- JS_PUBLIC_API(JSBool)
1675
- JS_IsSystemObject(JSContext *cx, JSObject *obj)
1676
- {
1677
- return STOBJ_IS_SYSTEM(obj);
1678
- }
1679
-
1680
- JS_PUBLIC_API(JSObject *)
1681
- JS_NewSystemObject(JSContext *cx, JSClass *clasp, JSObject *proto,
1682
- JSObject *parent, JSBool system)
1683
- {
1684
- JSObject *obj;
1685
-
1686
- obj = js_NewObject(cx, clasp, proto, parent, 0);
1687
- if (obj && system)
1688
- STOBJ_SET_SYSTEM(obj);
1689
- return obj;
1690
- }
1691
-
1692
- /************************************************************************/
1693
-
1694
- JS_PUBLIC_API(JSDebugHooks *)
1695
- JS_GetGlobalDebugHooks(JSRuntime *rt)
1696
- {
1697
- return &rt->globalDebugHooks;
1698
- }
1699
-
1700
- JS_PUBLIC_API(JSDebugHooks *)
1701
- JS_SetContextDebugHooks(JSContext *cx, JSDebugHooks *hooks)
1702
- {
1703
- JSDebugHooks *old;
1704
-
1705
- JS_ASSERT(hooks);
1706
- old = cx->debugHooks;
1707
- cx->debugHooks = hooks;
1708
- return old;
1709
- }
1710
-
1711
- #ifdef MOZ_SHARK
1712
-
1713
- #include <CHUD/CHUD.h>
1714
-
1715
- JS_PUBLIC_API(JSBool)
1716
- JS_StartChudRemote()
1717
- {
1718
- if (chudIsRemoteAccessAcquired() &&
1719
- (chudStartRemotePerfMonitor("Mozilla") == chudSuccess)) {
1720
- return JS_TRUE;
1721
- }
1722
-
1723
- return JS_FALSE;
1724
- }
1725
-
1726
- JS_PUBLIC_API(JSBool)
1727
- JS_StopChudRemote()
1728
- {
1729
- if (chudIsRemoteAccessAcquired() &&
1730
- (chudStopRemotePerfMonitor() == chudSuccess)) {
1731
- return JS_TRUE;
1732
- }
1733
-
1734
- return JS_FALSE;
1735
- }
1736
-
1737
- JS_PUBLIC_API(JSBool)
1738
- JS_ConnectShark()
1739
- {
1740
- if (!chudIsInitialized() && (chudInitialize() != chudSuccess))
1741
- return JS_FALSE;
1742
-
1743
- if (chudAcquireRemoteAccess() != chudSuccess)
1744
- return JS_FALSE;
1745
-
1746
- return JS_TRUE;
1747
- }
1748
-
1749
- JS_PUBLIC_API(JSBool)
1750
- JS_DisconnectShark()
1751
- {
1752
- if (chudIsRemoteAccessAcquired() && (chudReleaseRemoteAccess() != chudSuccess))
1753
- return JS_FALSE;
1754
-
1755
- return JS_TRUE;
1756
- }
1757
-
1758
- JS_FRIEND_API(JSBool)
1759
- js_StartShark(JSContext *cx, JSObject *obj,
1760
- uintN argc, jsval *argv, jsval *rval)
1761
- {
1762
- if (!JS_StartChudRemote()) {
1763
- JS_ReportError(cx, "Error starting CHUD.");
1764
- }
1765
-
1766
- return JS_TRUE;
1767
- }
1768
-
1769
- JS_FRIEND_API(JSBool)
1770
- js_StopShark(JSContext *cx, JSObject *obj,
1771
- uintN argc, jsval *argv, jsval *rval)
1772
- {
1773
- if (!JS_StopChudRemote()) {
1774
- JS_ReportError(cx, "Error stopping CHUD.");
1775
- }
1776
-
1777
- return JS_TRUE;
1778
- }
1779
-
1780
- JS_FRIEND_API(JSBool)
1781
- js_ConnectShark(JSContext *cx, JSObject *obj,
1782
- uintN argc, jsval *argv, jsval *rval)
1783
- {
1784
- if (!JS_ConnectShark()) {
1785
- JS_ReportError(cx, "Error connecting to Shark.");
1786
- }
1787
-
1788
- return JS_TRUE;
1789
- }
1790
-
1791
- JS_FRIEND_API(JSBool)
1792
- js_DisconnectShark(JSContext *cx, JSObject *obj,
1793
- uintN argc, jsval *argv, jsval *rval)
1794
- {
1795
- if (!JS_DisconnectShark()) {
1796
- JS_ReportError(cx, "Error disconnecting from Shark.");
1797
- }
1798
-
1799
- return JS_TRUE;
1800
- }
1801
-
1802
- #endif /* MOZ_SHARK */