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,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 */