johnson 1.2.0 → 2.0.0.pre0
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.
- data/CHANGELOG.rdoc +8 -0
- data/Manifest.txt +762 -48
- data/README.rdoc +2 -1
- data/Rakefile +90 -18
- data/ext/spidermonkey/conversions.c +9 -2
- data/ext/spidermonkey/ruby_land_proxy.c +1 -1
- data/ext/spidermonkey/runtime.h +1 -1
- data/ext/tracemonkey/context.cc +125 -0
- data/ext/tracemonkey/context.h +19 -0
- data/ext/tracemonkey/conversions.cc +365 -0
- data/ext/tracemonkey/conversions.h +32 -0
- data/ext/tracemonkey/debugger.cc +234 -0
- data/ext/tracemonkey/debugger.h +10 -0
- data/ext/tracemonkey/extconf.rb +37 -0
- data/ext/tracemonkey/extensions.cc +37 -0
- data/ext/tracemonkey/extensions.h +12 -0
- data/ext/tracemonkey/global.cc +40 -0
- data/ext/tracemonkey/global.h +11 -0
- data/ext/tracemonkey/idhash.cc +16 -0
- data/ext/tracemonkey/idhash.h +8 -0
- data/ext/tracemonkey/immutable_node.cc +1199 -0
- data/ext/tracemonkey/immutable_node.cc.erb +559 -0
- data/ext/tracemonkey/immutable_node.h +22 -0
- data/ext/tracemonkey/jroot.h +215 -0
- data/ext/tracemonkey/js_land_proxy.cc +620 -0
- data/ext/tracemonkey/js_land_proxy.h +20 -0
- data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
- data/ext/tracemonkey/ruby_land_proxy.h +38 -0
- data/ext/tracemonkey/runtime.cc +454 -0
- data/ext/tracemonkey/runtime.h +27 -0
- data/ext/tracemonkey/split_global.cc +392 -0
- data/ext/tracemonkey/split_global.h +11 -0
- data/ext/tracemonkey/tracemonkey.cc +23 -0
- data/ext/tracemonkey/tracemonkey.h +32 -0
- data/lib/johnson.rb +12 -4
- data/lib/johnson/error.rb +5 -0
- data/lib/johnson/js/prelude.js +16 -1
- data/lib/johnson/parser.rb +2 -1
- data/lib/johnson/runtime.rb +87 -26
- data/lib/johnson/spidermonkey/runtime.rb +7 -16
- data/lib/johnson/tracemonkey.rb +13 -0
- data/lib/johnson/tracemonkey/context.rb +10 -0
- data/lib/johnson/tracemonkey/debugger.rb +67 -0
- data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
- data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
- data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
- data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
- data/lib/johnson/tracemonkey/runtime.rb +80 -0
- data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
- data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
- data/test/helper.rb +23 -4
- data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
- data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
- data/test/johnson/generic/conversions/helper.rb +1 -0
- data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
- data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
- data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
- data/test/johnson/generic/default_test.rb +12 -0
- data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
- data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
- data/test/johnson/generic/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
- data/test/johnson/generic/nodes/export_test.rb +11 -0
- data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
- data/test/johnson/generic/nodes/helper.rb +1 -0
- data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
- data/test/johnson/generic/nodes/import_test.rb +15 -0
- data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
- data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
- data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
- data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
- data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
- data/test/johnson/generic/version_test.rb +13 -0
- data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
- data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
- data/test/johnson/generic/visitors/helper.rb +1 -0
- data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
- data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
- data/test/johnson/tracemonkey/context_test.rb +21 -0
- data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
- data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
- data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
- data/test/johnson/tracemonkey/runtime_test.rb +41 -0
- data/test/johnson/tracemonkey/split_global_test.rb +32 -0
- data/vendor/spidermonkey/js.pkg +2 -0
- data/vendor/tracemonkey/Makefile.in +668 -0
- data/vendor/tracemonkey/Makefile.ref +483 -0
- data/vendor/tracemonkey/README.html +54 -0
- data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
- data/vendor/tracemonkey/Y.js +19 -0
- data/vendor/tracemonkey/aclocal.m4 +9 -0
- data/vendor/tracemonkey/bench.sh +5 -0
- data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
- data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
- data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
- data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
- data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
- data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
- data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
- data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
- data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
- data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
- data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
- data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
- data/vendor/tracemonkey/build/hcc +111 -0
- data/vendor/tracemonkey/build/hcpp +155 -0
- data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
- data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
- data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
- data/vendor/tracemonkey/builtins.tbl +91 -0
- data/vendor/tracemonkey/call.js +13 -0
- data/vendor/tracemonkey/config.mk +206 -0
- data/vendor/tracemonkey/config/Makefile.in +106 -0
- data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
- data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
- data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
- data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
- data/vendor/tracemonkey/config/config.mk +881 -0
- data/vendor/tracemonkey/config/fastcwd.pl +66 -0
- data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
- data/vendor/tracemonkey/config/insure.mk +53 -0
- data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
- data/vendor/tracemonkey/config/milestone.pl +112 -0
- data/vendor/tracemonkey/config/milestone.txt +13 -0
- data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
- data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
- data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
- data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
- data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
- data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
- data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
- data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
- data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
- data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
- data/vendor/tracemonkey/config/nfspwd.pl +50 -0
- data/vendor/tracemonkey/config/nsinstall.c +481 -0
- data/vendor/tracemonkey/config/nsinstall.py +155 -0
- data/vendor/tracemonkey/config/pathsub.c +247 -0
- data/vendor/tracemonkey/config/pathsub.h +74 -0
- data/vendor/tracemonkey/config/preprocessor.pl +671 -0
- data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
- data/vendor/tracemonkey/config/revdepth.pl +51 -0
- data/vendor/tracemonkey/config/rules.mk +2310 -0
- data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
- data/vendor/tracemonkey/config/static-checking.js +92 -0
- data/vendor/tracemonkey/config/string-format.js +61 -0
- data/vendor/tracemonkey/config/system-headers +1035 -0
- data/vendor/tracemonkey/config/version.mk +85 -0
- data/vendor/tracemonkey/config/version_win.pl +442 -0
- data/vendor/tracemonkey/configure +14183 -0
- data/vendor/tracemonkey/configure.in +5363 -0
- data/vendor/tracemonkey/correct.sh +23 -0
- data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
- data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
- data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
- data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
- data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
- data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
- data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
- data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
- data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
- data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
- data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
- data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
- data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
- data/vendor/tracemonkey/correct/check-mont.js +119 -0
- data/vendor/tracemonkey/dtoa.c +3335 -0
- data/vendor/tracemonkey/editline/Makefile.in +55 -0
- data/vendor/tracemonkey/editline/Makefile.ref +143 -0
- data/vendor/tracemonkey/editline/README +83 -0
- data/vendor/tracemonkey/editline/editline.3 +175 -0
- data/vendor/tracemonkey/editline/editline.c +1371 -0
- data/vendor/tracemonkey/editline/editline.h +135 -0
- data/vendor/tracemonkey/editline/sysunix.c +182 -0
- data/vendor/tracemonkey/editline/unix.h +82 -0
- data/vendor/tracemonkey/if.js +13 -0
- data/vendor/tracemonkey/imacro_asm.js.in +396 -0
- data/vendor/tracemonkey/imacros.c.out +1034 -0
- data/vendor/tracemonkey/imacros.jsasm +770 -0
- data/vendor/tracemonkey/javascript-trace.d +73 -0
- data/vendor/tracemonkey/jitstats.tbl +55 -0
- data/vendor/tracemonkey/js-config.h.in +82 -0
- data/vendor/tracemonkey/js-config.in +111 -0
- data/vendor/tracemonkey/js.mdp +0 -0
- data/vendor/tracemonkey/js.msg +312 -0
- data/vendor/tracemonkey/js3240.rc +79 -0
- data/vendor/tracemonkey/jsOS240.def +654 -0
- data/vendor/tracemonkey/jsapi.cpp +6005 -0
- data/vendor/tracemonkey/jsapi.h +2727 -0
- data/vendor/tracemonkey/jsarena.cpp +450 -0
- data/vendor/tracemonkey/jsarena.h +318 -0
- data/vendor/tracemonkey/jsarray.cpp +3664 -0
- data/vendor/tracemonkey/jsarray.h +238 -0
- data/vendor/tracemonkey/jsatom.cpp +1244 -0
- data/vendor/tracemonkey/jsatom.h +493 -0
- data/vendor/tracemonkey/jsbit.h +249 -0
- data/vendor/tracemonkey/jsbool.cpp +184 -0
- data/vendor/tracemonkey/jsbool.h +88 -0
- data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
- data/vendor/tracemonkey/jsbuiltins.h +456 -0
- data/vendor/tracemonkey/jsclist.h +139 -0
- data/vendor/tracemonkey/jscntxt.cpp +1816 -0
- data/vendor/tracemonkey/jscntxt.h +1541 -0
- data/vendor/tracemonkey/jscompat.h +57 -0
- data/vendor/tracemonkey/jsconfig.mk +181 -0
- data/vendor/tracemonkey/jscpucfg.cpp +194 -0
- data/vendor/tracemonkey/jscpucfg.h +91 -0
- data/vendor/tracemonkey/jsdate.cpp +2465 -0
- data/vendor/tracemonkey/jsdate.h +129 -0
- data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
- data/vendor/tracemonkey/jsdbgapi.h +500 -0
- data/vendor/tracemonkey/jsdhash.cpp +876 -0
- data/vendor/tracemonkey/jsdhash.h +588 -0
- data/vendor/tracemonkey/jsdtoa.cpp +572 -0
- data/vendor/tracemonkey/jsdtoa.h +131 -0
- data/vendor/tracemonkey/jsdtracef.c +318 -0
- data/vendor/tracemonkey/jsdtracef.h +81 -0
- data/vendor/tracemonkey/jsemit.cpp +7292 -0
- data/vendor/tracemonkey/jsemit.h +802 -0
- data/vendor/tracemonkey/jsexn.cpp +1337 -0
- data/vendor/tracemonkey/jsexn.h +96 -0
- data/vendor/tracemonkey/jsfile.cpp +2747 -0
- data/vendor/tracemonkey/jsfile.h +56 -0
- data/vendor/tracemonkey/jsfile.msg +90 -0
- data/vendor/tracemonkey/jsfun.cpp +3089 -0
- data/vendor/tracemonkey/jsfun.h +366 -0
- data/vendor/tracemonkey/jsgc.cpp +3816 -0
- data/vendor/tracemonkey/jsgc.h +429 -0
- data/vendor/tracemonkey/jshash.cpp +477 -0
- data/vendor/tracemonkey/jshash.h +151 -0
- data/vendor/tracemonkey/jsify.pl +483 -0
- data/vendor/tracemonkey/jsinterp.cpp +7441 -0
- data/vendor/tracemonkey/jsinterp.h +666 -0
- data/vendor/tracemonkey/jsinvoke.cpp +42 -0
- data/vendor/tracemonkey/jsiter.cpp +1040 -0
- data/vendor/tracemonkey/jsiter.h +140 -0
- data/vendor/tracemonkey/jskeyword.tbl +124 -0
- data/vendor/tracemonkey/jskwgen.cpp +460 -0
- data/vendor/tracemonkey/jslibmath.h +69 -0
- data/vendor/tracemonkey/jslock.cpp +1512 -0
- data/vendor/tracemonkey/jslock.h +325 -0
- data/vendor/tracemonkey/jslocko.asm +60 -0
- data/vendor/tracemonkey/jslog2.cpp +111 -0
- data/vendor/tracemonkey/jslong.h +167 -0
- data/vendor/tracemonkey/jsmath.cpp +806 -0
- data/vendor/tracemonkey/jsmath.h +63 -0
- data/vendor/tracemonkey/jsnum.cpp +1374 -0
- data/vendor/tracemonkey/jsnum.h +280 -0
- data/vendor/tracemonkey/jsobj.cpp +6165 -0
- data/vendor/tracemonkey/jsobj.h +870 -0
- data/vendor/tracemonkey/json.cpp +1338 -0
- data/vendor/tracemonkey/json.h +108 -0
- data/vendor/tracemonkey/jsopcode.cpp +5484 -0
- data/vendor/tracemonkey/jsopcode.h +434 -0
- data/vendor/tracemonkey/jsopcode.tbl +591 -0
- data/vendor/tracemonkey/jsoplengen.cpp +121 -0
- data/vendor/tracemonkey/jsotypes.h +202 -0
- data/vendor/tracemonkey/jsparse.cpp +9257 -0
- data/vendor/tracemonkey/jsparse.h +900 -0
- data/vendor/tracemonkey/jsprf.cpp +1262 -0
- data/vendor/tracemonkey/jsprf.h +150 -0
- data/vendor/tracemonkey/jsproto.tbl +117 -0
- data/vendor/tracemonkey/jsprvtd.h +366 -0
- data/vendor/tracemonkey/jspubtd.h +585 -0
- data/vendor/tracemonkey/jsregexp.cpp +5051 -0
- data/vendor/tracemonkey/jsregexp.h +199 -0
- data/vendor/tracemonkey/jsreops.tbl +145 -0
- data/vendor/tracemonkey/jsscan.cpp +2040 -0
- data/vendor/tracemonkey/jsscan.h +467 -0
- data/vendor/tracemonkey/jsscope.cpp +1966 -0
- data/vendor/tracemonkey/jsscope.h +487 -0
- data/vendor/tracemonkey/jsscript.cpp +1932 -0
- data/vendor/tracemonkey/jsscript.h +345 -0
- data/vendor/tracemonkey/jsshell.msg +54 -0
- data/vendor/tracemonkey/jsstack.js +167 -0
- data/vendor/tracemonkey/jsstaticcheck.h +69 -0
- data/vendor/tracemonkey/jsstddef.h +87 -0
- data/vendor/tracemonkey/jsstdint.h +96 -0
- data/vendor/tracemonkey/jsstr.cpp +5277 -0
- data/vendor/tracemonkey/jsstr.h +702 -0
- data/vendor/tracemonkey/jstracer.cpp +10991 -0
- data/vendor/tracemonkey/jstracer.h +794 -0
- data/vendor/tracemonkey/jstypes.h +481 -0
- data/vendor/tracemonkey/jsutil.cpp +361 -0
- data/vendor/tracemonkey/jsutil.h +178 -0
- data/vendor/tracemonkey/jsversion.h +243 -0
- data/vendor/tracemonkey/jswince.asm +44 -0
- data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
- data/vendor/tracemonkey/jsxdrapi.h +220 -0
- data/vendor/tracemonkey/jsxml.cpp +8327 -0
- data/vendor/tracemonkey/jsxml.h +305 -0
- data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
- data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
- data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
- data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
- data/vendor/tracemonkey/liveconnect/README.html +712 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
- data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
- data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
- data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
- data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
- data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
- data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
- data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
- data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
- data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
- data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
- data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
- data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
- data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
- data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
- data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
- data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
- data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
- data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
- data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
- data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
- data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
- data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
- data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
- data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
- data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
- data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
- data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
- data/vendor/tracemonkey/lock_SunOS.s +119 -0
- data/vendor/tracemonkey/mandelbrot-results.js +3 -0
- data/vendor/tracemonkey/math-partial-sums.js +32 -0
- data/vendor/tracemonkey/math-trace-tests.js +507 -0
- data/vendor/tracemonkey/md5.js +289 -0
- data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
- data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
- data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
- data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
- data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
- data/vendor/tracemonkey/nanojit/LIR.h +879 -0
- data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
- data/vendor/tracemonkey/nanojit/Native.h +127 -0
- data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
- data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
- data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
- data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
- data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
- data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
- data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
- data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
- data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
- data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
- data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
- data/vendor/tracemonkey/perfect.js +39 -0
- data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
- data/vendor/tracemonkey/prmjtime.cpp +869 -0
- data/vendor/tracemonkey/prmjtime.h +103 -0
- data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
- data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
- data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
- data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
- data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
- data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
- data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
- data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
- data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
- data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
- data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
- data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
- data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
- data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
- data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
- data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
- data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
- data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
- data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
- data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
- data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
- data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
- data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
- data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
- data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
- data/vendor/tracemonkey/resource.h +15 -0
- data/vendor/tracemonkey/rules.mk +206 -0
- data/vendor/tracemonkey/shell/Makefile.in +72 -0
- data/vendor/tracemonkey/shell/js.cpp +4719 -0
- data/vendor/tracemonkey/t/3d-cube.js +337 -0
- data/vendor/tracemonkey/t/3d-morph.js +54 -0
- data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
- data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
- data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
- data/vendor/tracemonkey/t/access-nbody.js +169 -0
- data/vendor/tracemonkey/t/access-nsieve.js +38 -0
- data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
- data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
- data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
- data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
- data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
- data/vendor/tracemonkey/t/crypto-aes.js +422 -0
- data/vendor/tracemonkey/t/crypto-md5.js +286 -0
- data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
- data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
- data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
- data/vendor/tracemonkey/t/math-cordic.js +95 -0
- data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
- data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
- data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
- data/vendor/tracemonkey/t/string-base64.js +135 -0
- data/vendor/tracemonkey/t/string-fasta.js +85 -0
- data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
- data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
- data/vendor/tracemonkey/t/string-validate-input.js +89 -0
- data/vendor/tracemonkey/time.sh +13 -0
- data/vendor/tracemonkey/trace-test.js +5564 -0
- data/vendor/tracemonkey/v8/base.js +187 -0
- data/vendor/tracemonkey/v8/crypto.js +1689 -0
- data/vendor/tracemonkey/v8/deltablue.js +880 -0
- data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
- data/vendor/tracemonkey/v8/raytrace.js +3418 -0
- data/vendor/tracemonkey/v8/richards.js +539 -0
- data/vendor/tracemonkey/v8/run-crypto.js +44 -0
- data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
- data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
- data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
- data/vendor/tracemonkey/v8/run-richards.js +44 -0
- data/vendor/tracemonkey/v8/run.js +49 -0
- data/vendor/tracemonkey/vprof/readme.txt +93 -0
- data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
- data/vendor/tracemonkey/vprof/vprof.h +245 -0
- data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
- data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
- data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
- data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
- data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
- data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
- data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
- data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
- data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
- data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
- data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
- data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
- data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
- data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
- data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
- data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
- data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
- data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
- data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
- data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
- data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
- data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
- data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
- data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
- data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
- data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
- data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
- data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
- data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
- data/vendor/tracemonkey/xpconnect/sample/README +39 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
- data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
- data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
- data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
- data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
- data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
- data/vendor/tracemonkey/xpconnect/src/README +3 -0
- data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
- data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
- data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
- data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
- data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
- data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
- data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
- data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
- data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
- data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
- data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
- data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
- data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
- data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
- data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
- data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
- data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
- data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
- data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
- data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
- data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
- data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
- data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
- data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
- data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
- data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
- data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
- data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
- data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
- data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
- data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
- data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
- data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
- data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
- data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
- data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
- data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
- data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
- data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
- data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
- data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
- data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
- data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
- data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
- data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
- data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
- data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
- data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
- data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
- data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
- data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
- data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
- data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
- data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
- data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
- data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
- metadata +782 -107
- data/test/johnson/nodes/export_test.rb +0 -9
- data/test/johnson/nodes/import_test.rb +0 -13
- data/test/johnson/version_test.rb +0 -13
|
@@ -0,0 +1,2609 @@
|
|
|
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
|
+
* John Bandhauer <jband@netscape.com> (original author)
|
|
26
|
+
* Pierre Phaneuf <pp@ludusdesign.com>
|
|
27
|
+
* Nate Nielsen <nielsen@memberwebs.com>
|
|
28
|
+
*
|
|
29
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
30
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
31
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
32
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
33
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
34
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
35
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
36
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
37
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
38
|
+
* the provisions above, a recipient may use your version of this file under
|
|
39
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
40
|
+
*
|
|
41
|
+
* ***** END LICENSE BLOCK ***** */
|
|
42
|
+
|
|
43
|
+
/* High level class and public functions implementation. */
|
|
44
|
+
|
|
45
|
+
#include "xpcprivate.h"
|
|
46
|
+
#include "XPCNativeWrapper.h"
|
|
47
|
+
#include "XPCWrapper.h"
|
|
48
|
+
#include "nsBaseHashtable.h"
|
|
49
|
+
#include "nsHashKeys.h"
|
|
50
|
+
#include "jsatom.h"
|
|
51
|
+
#include "jsfun.h"
|
|
52
|
+
#include "jsscript.h"
|
|
53
|
+
#include "nsThreadUtilsInternal.h"
|
|
54
|
+
#include "dom_quickstubs.h"
|
|
55
|
+
|
|
56
|
+
NS_IMPL_THREADSAFE_ISUPPORTS6(nsXPConnect,
|
|
57
|
+
nsIXPConnect,
|
|
58
|
+
nsISupportsWeakReference,
|
|
59
|
+
nsIThreadObserver,
|
|
60
|
+
nsIJSRuntimeService,
|
|
61
|
+
nsIJSContextStack,
|
|
62
|
+
nsIThreadJSContextStack)
|
|
63
|
+
|
|
64
|
+
nsXPConnect* nsXPConnect::gSelf = nsnull;
|
|
65
|
+
JSBool nsXPConnect::gOnceAliveNowDead = JS_FALSE;
|
|
66
|
+
PRUint32 nsXPConnect::gReportAllJSExceptions = 0;
|
|
67
|
+
|
|
68
|
+
// Global cache of the default script security manager (QI'd to
|
|
69
|
+
// nsIScriptSecurityManager)
|
|
70
|
+
nsIScriptSecurityManager *gScriptSecurityManager = nsnull;
|
|
71
|
+
|
|
72
|
+
const char XPC_CONTEXT_STACK_CONTRACTID[] = "@mozilla.org/js/xpc/ContextStack;1";
|
|
73
|
+
const char XPC_RUNTIME_CONTRACTID[] = "@mozilla.org/js/xpc/RuntimeService;1";
|
|
74
|
+
const char XPC_EXCEPTION_CONTRACTID[] = "@mozilla.org/js/xpc/Exception;1";
|
|
75
|
+
const char XPC_CONSOLE_CONTRACTID[] = "@mozilla.org/consoleservice;1";
|
|
76
|
+
const char XPC_SCRIPT_ERROR_CONTRACTID[] = "@mozilla.org/scripterror;1";
|
|
77
|
+
const char XPC_ID_CONTRACTID[] = "@mozilla.org/js/xpc/ID;1";
|
|
78
|
+
const char XPC_XPCONNECT_CONTRACTID[] = "@mozilla.org/js/xpc/XPConnect;1";
|
|
79
|
+
|
|
80
|
+
/***************************************************************************/
|
|
81
|
+
|
|
82
|
+
nsXPConnect::nsXPConnect()
|
|
83
|
+
: mRuntime(nsnull),
|
|
84
|
+
mInterfaceInfoManager(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID)),
|
|
85
|
+
mDefaultSecurityManager(nsnull),
|
|
86
|
+
mDefaultSecurityManagerFlags(0),
|
|
87
|
+
mShuttingDown(JS_FALSE),
|
|
88
|
+
mCycleCollectionContext(nsnull),
|
|
89
|
+
mCycleCollecting(PR_FALSE)
|
|
90
|
+
{
|
|
91
|
+
mRuntime = XPCJSRuntime::newXPCJSRuntime(this);
|
|
92
|
+
|
|
93
|
+
nsCycleCollector_registerRuntime(nsIProgrammingLanguage::JAVASCRIPT, this);
|
|
94
|
+
#ifdef DEBUG_CC
|
|
95
|
+
mJSRoots.ops = nsnull;
|
|
96
|
+
#endif
|
|
97
|
+
|
|
98
|
+
#ifdef XPC_TOOLS_SUPPORT
|
|
99
|
+
{
|
|
100
|
+
char* filename = PR_GetEnv("MOZILLA_JS_PROFILER_OUTPUT");
|
|
101
|
+
if(filename && *filename)
|
|
102
|
+
{
|
|
103
|
+
mProfilerOutputFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID);
|
|
104
|
+
if(mProfilerOutputFile &&
|
|
105
|
+
NS_SUCCEEDED(mProfilerOutputFile->InitWithNativePath(nsDependentCString(filename))))
|
|
106
|
+
{
|
|
107
|
+
mProfiler = do_GetService(XPCTOOLS_PROFILER_CONTRACTID);
|
|
108
|
+
if(mProfiler)
|
|
109
|
+
{
|
|
110
|
+
if(NS_SUCCEEDED(mProfiler->Start()))
|
|
111
|
+
{
|
|
112
|
+
#ifdef DEBUG
|
|
113
|
+
printf("***** profiling JavaScript. Output to: %s\n",
|
|
114
|
+
filename);
|
|
115
|
+
#endif
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
#endif
|
|
122
|
+
char* reportableEnv = PR_GetEnv("MOZ_REPORT_ALL_JS_EXCEPTIONS");
|
|
123
|
+
if(reportableEnv && *reportableEnv)
|
|
124
|
+
gReportAllJSExceptions = 1;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
nsXPConnect::~nsXPConnect()
|
|
128
|
+
{
|
|
129
|
+
NS_ASSERTION(!mCycleCollectionContext,
|
|
130
|
+
"Didn't call FinishCycleCollection?");
|
|
131
|
+
nsCycleCollector_forgetRuntime(nsIProgrammingLanguage::JAVASCRIPT);
|
|
132
|
+
|
|
133
|
+
JSContext *cx = nsnull;
|
|
134
|
+
if (mRuntime) {
|
|
135
|
+
// Create our own JSContext rather than an XPCCallContext, since
|
|
136
|
+
// otherwise we will create a new safe JS context and attach a
|
|
137
|
+
// components object that won't get GCed.
|
|
138
|
+
// And do this before calling CleanupAllThreads, so that we
|
|
139
|
+
// don't create an extra xpcPerThreadData.
|
|
140
|
+
cx = JS_NewContext(mRuntime->GetJSRuntime(), 8192);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
XPCPerThreadData::CleanupAllThreads();
|
|
144
|
+
mShuttingDown = JS_TRUE;
|
|
145
|
+
if (cx) {
|
|
146
|
+
JS_BeginRequest(cx);
|
|
147
|
+
|
|
148
|
+
// XXX Call even if |mRuntime| null?
|
|
149
|
+
XPCWrappedNativeScope::SystemIsBeingShutDown(cx);
|
|
150
|
+
|
|
151
|
+
mRuntime->SystemIsBeingShutDown(cx);
|
|
152
|
+
|
|
153
|
+
JS_EndRequest(cx);
|
|
154
|
+
JS_DestroyContext(cx);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
NS_IF_RELEASE(mDefaultSecurityManager);
|
|
158
|
+
|
|
159
|
+
gScriptSecurityManager = nsnull;
|
|
160
|
+
|
|
161
|
+
// shutdown the logging system
|
|
162
|
+
XPC_LOG_FINISH();
|
|
163
|
+
|
|
164
|
+
delete mRuntime;
|
|
165
|
+
|
|
166
|
+
gSelf = nsnull;
|
|
167
|
+
gOnceAliveNowDead = JS_TRUE;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// static
|
|
171
|
+
nsXPConnect*
|
|
172
|
+
nsXPConnect::GetXPConnect()
|
|
173
|
+
{
|
|
174
|
+
if(!gSelf)
|
|
175
|
+
{
|
|
176
|
+
if(gOnceAliveNowDead)
|
|
177
|
+
return nsnull;
|
|
178
|
+
gSelf = new nsXPConnect();
|
|
179
|
+
if(!gSelf)
|
|
180
|
+
return nsnull;
|
|
181
|
+
|
|
182
|
+
if(!gSelf->mRuntime ||
|
|
183
|
+
!gSelf->mInterfaceInfoManager)
|
|
184
|
+
{
|
|
185
|
+
// ctor failed to create an acceptable instance
|
|
186
|
+
delete gSelf;
|
|
187
|
+
gSelf = nsnull;
|
|
188
|
+
}
|
|
189
|
+
else
|
|
190
|
+
{
|
|
191
|
+
// Initial extra ref to keep the singleton alive
|
|
192
|
+
// balanced by explicit call to ReleaseXPConnectSingleton()
|
|
193
|
+
NS_ADDREF(gSelf);
|
|
194
|
+
if (NS_FAILED(NS_SetGlobalThreadObserver(gSelf))) {
|
|
195
|
+
NS_RELEASE(gSelf);
|
|
196
|
+
// Fall through to returning null
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return gSelf;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// static
|
|
204
|
+
nsXPConnect*
|
|
205
|
+
nsXPConnect::GetSingleton()
|
|
206
|
+
{
|
|
207
|
+
nsXPConnect* xpc = nsXPConnect::GetXPConnect();
|
|
208
|
+
NS_IF_ADDREF(xpc);
|
|
209
|
+
return xpc;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// static
|
|
213
|
+
void
|
|
214
|
+
nsXPConnect::ReleaseXPConnectSingleton()
|
|
215
|
+
{
|
|
216
|
+
nsXPConnect* xpc = gSelf;
|
|
217
|
+
if(xpc)
|
|
218
|
+
{
|
|
219
|
+
NS_SetGlobalThreadObserver(nsnull);
|
|
220
|
+
|
|
221
|
+
#ifdef XPC_TOOLS_SUPPORT
|
|
222
|
+
if(xpc->mProfiler)
|
|
223
|
+
{
|
|
224
|
+
xpc->mProfiler->Stop();
|
|
225
|
+
xpc->mProfiler->WriteResults(xpc->mProfilerOutputFile);
|
|
226
|
+
}
|
|
227
|
+
#endif
|
|
228
|
+
|
|
229
|
+
#ifdef DEBUG
|
|
230
|
+
// force a dump of the JavaScript gc heap if JS is still alive
|
|
231
|
+
// if requested through XPC_SHUTDOWN_HEAP_DUMP environment variable
|
|
232
|
+
{
|
|
233
|
+
// autoscope
|
|
234
|
+
XPCCallContext ccx(NATIVE_CALLER);
|
|
235
|
+
if(ccx.IsValid())
|
|
236
|
+
{
|
|
237
|
+
const char* dumpName = getenv("XPC_SHUTDOWN_HEAP_DUMP");
|
|
238
|
+
if(dumpName)
|
|
239
|
+
{
|
|
240
|
+
FILE* dumpFile = (*dumpName == '\0' ||
|
|
241
|
+
strcmp(dumpName, "stdout") == 0)
|
|
242
|
+
? stdout
|
|
243
|
+
: fopen(dumpName, "w");
|
|
244
|
+
if(dumpFile)
|
|
245
|
+
{
|
|
246
|
+
JS_DumpHeap(ccx, dumpFile, nsnull, 0, nsnull,
|
|
247
|
+
static_cast<size_t>(-1), nsnull);
|
|
248
|
+
if(dumpFile != stdout)
|
|
249
|
+
fclose(dumpFile);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
#endif
|
|
255
|
+
#ifdef XPC_DUMP_AT_SHUTDOWN
|
|
256
|
+
// NOTE: to see really interesting stuff turn on the prlog stuff.
|
|
257
|
+
// See the comment at the top of xpclog.h to see how to do that.
|
|
258
|
+
xpc->DebugDump(7);
|
|
259
|
+
#endif
|
|
260
|
+
nsrefcnt cnt;
|
|
261
|
+
NS_RELEASE2(xpc, cnt);
|
|
262
|
+
#ifdef XPC_DUMP_AT_SHUTDOWN
|
|
263
|
+
if(0 != cnt)
|
|
264
|
+
printf("*** dangling reference to nsXPConnect: refcnt=%d\n", cnt);
|
|
265
|
+
else
|
|
266
|
+
printf("+++ XPConnect had no dangling references.\n");
|
|
267
|
+
#endif
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// static
|
|
272
|
+
nsresult
|
|
273
|
+
nsXPConnect::GetInterfaceInfoManager(nsIInterfaceInfoSuperManager** iim,
|
|
274
|
+
nsXPConnect* xpc /*= nsnull*/)
|
|
275
|
+
{
|
|
276
|
+
if(!xpc && !(xpc = GetXPConnect()))
|
|
277
|
+
return NS_ERROR_FAILURE;
|
|
278
|
+
|
|
279
|
+
*iim = xpc->mInterfaceInfoManager;
|
|
280
|
+
NS_IF_ADDREF(*iim);
|
|
281
|
+
return NS_OK;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// static
|
|
285
|
+
XPCJSRuntime*
|
|
286
|
+
nsXPConnect::GetRuntimeInstance()
|
|
287
|
+
{
|
|
288
|
+
nsXPConnect* xpc = GetXPConnect();
|
|
289
|
+
NS_ASSERTION(xpc, "Must not be called if XPC failed to initialize");
|
|
290
|
+
return xpc->GetRuntime();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// static
|
|
294
|
+
JSBool
|
|
295
|
+
nsXPConnect::IsISupportsDescendant(nsIInterfaceInfo* info)
|
|
296
|
+
{
|
|
297
|
+
PRBool found = PR_FALSE;
|
|
298
|
+
if(info)
|
|
299
|
+
info->HasAncestor(&NS_GET_IID(nsISupports), &found);
|
|
300
|
+
return found;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/***************************************************************************/
|
|
304
|
+
|
|
305
|
+
typedef PRBool (*InfoTester)(nsIInterfaceInfoManager* manager, const void* data,
|
|
306
|
+
nsIInterfaceInfo** info);
|
|
307
|
+
|
|
308
|
+
static PRBool IIDTester(nsIInterfaceInfoManager* manager, const void* data,
|
|
309
|
+
nsIInterfaceInfo** info)
|
|
310
|
+
{
|
|
311
|
+
return NS_SUCCEEDED(manager->GetInfoForIID((const nsIID *) data, info)) &&
|
|
312
|
+
*info;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
static PRBool NameTester(nsIInterfaceInfoManager* manager, const void* data,
|
|
316
|
+
nsIInterfaceInfo** info)
|
|
317
|
+
{
|
|
318
|
+
return NS_SUCCEEDED(manager->GetInfoForName((const char *) data, info)) &&
|
|
319
|
+
*info;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
static nsresult FindInfo(InfoTester tester, const void* data,
|
|
323
|
+
nsIInterfaceInfoSuperManager* iism,
|
|
324
|
+
nsIInterfaceInfo** info)
|
|
325
|
+
{
|
|
326
|
+
if(tester(iism, data, info))
|
|
327
|
+
return NS_OK;
|
|
328
|
+
|
|
329
|
+
// If not found, then let's ask additional managers.
|
|
330
|
+
|
|
331
|
+
PRBool yes;
|
|
332
|
+
nsCOMPtr<nsISimpleEnumerator> list;
|
|
333
|
+
|
|
334
|
+
if(NS_SUCCEEDED(iism->HasAdditionalManagers(&yes)) && yes &&
|
|
335
|
+
NS_SUCCEEDED(iism->EnumerateAdditionalManagers(getter_AddRefs(list))) &&
|
|
336
|
+
list)
|
|
337
|
+
{
|
|
338
|
+
PRBool more;
|
|
339
|
+
nsCOMPtr<nsIInterfaceInfoManager> current;
|
|
340
|
+
|
|
341
|
+
while(NS_SUCCEEDED(list->HasMoreElements(&more)) && more &&
|
|
342
|
+
NS_SUCCEEDED(list->GetNext(getter_AddRefs(current))) && current)
|
|
343
|
+
{
|
|
344
|
+
if(tester(current, data, info))
|
|
345
|
+
return NS_OK;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
return NS_ERROR_NO_INTERFACE;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
nsresult
|
|
353
|
+
nsXPConnect::GetInfoForIID(const nsIID * aIID, nsIInterfaceInfo** info)
|
|
354
|
+
{
|
|
355
|
+
return FindInfo(IIDTester, aIID, mInterfaceInfoManager, info);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
nsresult
|
|
359
|
+
nsXPConnect::GetInfoForName(const char * name, nsIInterfaceInfo** info)
|
|
360
|
+
{
|
|
361
|
+
return FindInfo(NameTester, name, mInterfaceInfoManager, info);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
static JSGCCallback gOldJSGCCallback;
|
|
365
|
+
// Whether cycle collection was run.
|
|
366
|
+
static PRBool gDidCollection;
|
|
367
|
+
// Whether starting cycle collection was successful.
|
|
368
|
+
static PRBool gInCollection;
|
|
369
|
+
// Whether cycle collection collected anything.
|
|
370
|
+
static PRBool gCollected;
|
|
371
|
+
|
|
372
|
+
static JSBool
|
|
373
|
+
XPCCycleCollectGCCallback(JSContext *cx, JSGCStatus status)
|
|
374
|
+
{
|
|
375
|
+
// Launch the cycle collector.
|
|
376
|
+
switch(status)
|
|
377
|
+
{
|
|
378
|
+
case JSGC_BEGIN:
|
|
379
|
+
nsXPConnect::GetRuntimeInstance()->UnrootContextGlobals();
|
|
380
|
+
break;
|
|
381
|
+
|
|
382
|
+
case JSGC_MARK_END:
|
|
383
|
+
// This is the hook between marking and sweeping in the JS GC. Do cycle
|
|
384
|
+
// collection.
|
|
385
|
+
if(!gDidCollection)
|
|
386
|
+
{
|
|
387
|
+
NS_ASSERTION(!gInCollection, "Recursing?");
|
|
388
|
+
|
|
389
|
+
gDidCollection = PR_TRUE;
|
|
390
|
+
gInCollection = nsCycleCollector_beginCollection();
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Mark JS objects that are held by XPCOM objects that are in cycles
|
|
394
|
+
// that will not be collected.
|
|
395
|
+
nsXPConnect::GetRuntimeInstance()->
|
|
396
|
+
TraceXPConnectRoots(cx->runtime->gcMarkingTracer, JS_TRUE);
|
|
397
|
+
break;
|
|
398
|
+
|
|
399
|
+
case JSGC_END:
|
|
400
|
+
if(gInCollection)
|
|
401
|
+
{
|
|
402
|
+
gInCollection = PR_FALSE;
|
|
403
|
+
gCollected = nsCycleCollector_finishCollection();
|
|
404
|
+
}
|
|
405
|
+
break;
|
|
406
|
+
|
|
407
|
+
default:
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return gOldJSGCCallback ? gOldJSGCCallback(cx, status) : JS_TRUE;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
PRBool
|
|
415
|
+
nsXPConnect::Collect()
|
|
416
|
+
{
|
|
417
|
+
// We're dividing JS objects into 2 categories:
|
|
418
|
+
//
|
|
419
|
+
// 1. "real" roots, held by the JS engine itself or rooted through the root
|
|
420
|
+
// and lock JS APIs. Roots from this category are considered black in the
|
|
421
|
+
// cycle collector, any cycle they participate in is uncollectable.
|
|
422
|
+
//
|
|
423
|
+
// 2. roots held by C++ objects that participate in cycle collection,
|
|
424
|
+
// held by XPConnect (see XPCJSRuntime::TraceXPConnectRoots). Roots from
|
|
425
|
+
// this category are considered grey in the cycle collector, their final
|
|
426
|
+
// color depends on the objects that hold them. It is thus very important
|
|
427
|
+
// to always traverse the objects that hold these objects during cycle
|
|
428
|
+
// collection (see XPCJSRuntime::AddXPConnectRoots).
|
|
429
|
+
//
|
|
430
|
+
// Note that if a root is in both categories it is the fact that it is in
|
|
431
|
+
// category 1 that takes precedence, so it will be considered black.
|
|
432
|
+
//
|
|
433
|
+
//
|
|
434
|
+
// We split up garbage collection into 3 phases (1, 3 and 4) and do cycle
|
|
435
|
+
// collection between the first 2 phases of garbage collection:
|
|
436
|
+
//
|
|
437
|
+
// 1. marking of the roots in category 1 by having the JS GC do its marking
|
|
438
|
+
// 2. cycle collection
|
|
439
|
+
// 3. marking of the roots in category 2 by
|
|
440
|
+
// XPCJSRuntime::TraceXPConnectRoots
|
|
441
|
+
// 4. sweeping of unmarked JS objects
|
|
442
|
+
//
|
|
443
|
+
// During cycle collection, marked JS objects (and the objects they hold)
|
|
444
|
+
// will be colored black. White objects holding roots from category 2 will
|
|
445
|
+
// be forgotten by XPConnect (in the unlink callback of the white objects).
|
|
446
|
+
// During phase 3 we'll only mark black objects holding JS objects (white
|
|
447
|
+
// objects were forgotten) and white JS objects will be swept during
|
|
448
|
+
// phase 4.
|
|
449
|
+
// Because splitting up the JS GC itself is hard, we're going to use a GC
|
|
450
|
+
// callback to do phase 2 and 3 after phase 1 has ended (see
|
|
451
|
+
// XPCCycleCollectGCCallback).
|
|
452
|
+
//
|
|
453
|
+
// If DEBUG_CC is not defined the cycle collector will not traverse roots
|
|
454
|
+
// from category 1 or any JS objects held by them. Any JS objects they hold
|
|
455
|
+
// will already be marked by the JS GC and will thus be colored black
|
|
456
|
+
// themselves. Any C++ objects they hold will have a missing (untraversed)
|
|
457
|
+
// edge from the JS object to the C++ object and so it will be marked black
|
|
458
|
+
// too. This decreases the number of objects that the cycle collector has to
|
|
459
|
+
// deal with.
|
|
460
|
+
// To improve debugging, if DEBUG_CC is defined all JS objects are
|
|
461
|
+
// traversed.
|
|
462
|
+
|
|
463
|
+
XPCCallContext cycleCollectionContext(NATIVE_CALLER);
|
|
464
|
+
if(!cycleCollectionContext.IsValid())
|
|
465
|
+
{
|
|
466
|
+
return PR_FALSE;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
mCycleCollecting = PR_TRUE;
|
|
470
|
+
mCycleCollectionContext = &cycleCollectionContext;
|
|
471
|
+
gDidCollection = PR_FALSE;
|
|
472
|
+
gInCollection = PR_FALSE;
|
|
473
|
+
gCollected = PR_FALSE;
|
|
474
|
+
|
|
475
|
+
JSContext *cx = mCycleCollectionContext->GetJSContext();
|
|
476
|
+
gOldJSGCCallback = JS_SetGCCallback(cx, XPCCycleCollectGCCallback);
|
|
477
|
+
JS_GC(cx);
|
|
478
|
+
JS_SetGCCallback(cx, gOldJSGCCallback);
|
|
479
|
+
gOldJSGCCallback = nsnull;
|
|
480
|
+
|
|
481
|
+
mCycleCollectionContext = nsnull;
|
|
482
|
+
mCycleCollecting = PR_FALSE;
|
|
483
|
+
|
|
484
|
+
return gCollected;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// JSTRACE_XML can recursively hold on to more JSTRACE_XML objects, adding it to
|
|
488
|
+
// the cycle collector avoids stack overflow.
|
|
489
|
+
#define ADD_TO_CC(_kind) ((_kind) == JSTRACE_OBJECT || (_kind) == JSTRACE_XML)
|
|
490
|
+
|
|
491
|
+
#ifdef DEBUG_CC
|
|
492
|
+
struct NoteJSRootTracer : public JSTracer
|
|
493
|
+
{
|
|
494
|
+
NoteJSRootTracer(PLDHashTable *aObjects,
|
|
495
|
+
nsCycleCollectionTraversalCallback& cb)
|
|
496
|
+
: mObjects(aObjects),
|
|
497
|
+
mCb(cb)
|
|
498
|
+
{
|
|
499
|
+
}
|
|
500
|
+
PLDHashTable* mObjects;
|
|
501
|
+
nsCycleCollectionTraversalCallback& mCb;
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
static void
|
|
505
|
+
NoteJSRoot(JSTracer *trc, void *thing, uint32 kind)
|
|
506
|
+
{
|
|
507
|
+
if(ADD_TO_CC(kind))
|
|
508
|
+
{
|
|
509
|
+
NoteJSRootTracer *tracer = static_cast<NoteJSRootTracer*>(trc);
|
|
510
|
+
PLDHashEntryHdr *entry = PL_DHashTableOperate(tracer->mObjects, thing,
|
|
511
|
+
PL_DHASH_ADD);
|
|
512
|
+
if(entry && !reinterpret_cast<PLDHashEntryStub*>(entry)->key)
|
|
513
|
+
{
|
|
514
|
+
reinterpret_cast<PLDHashEntryStub*>(entry)->key = thing;
|
|
515
|
+
tracer->mCb.NoteRoot(nsIProgrammingLanguage::JAVASCRIPT, thing,
|
|
516
|
+
nsXPConnect::GetXPConnect());
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
else if(kind != JSTRACE_DOUBLE && kind != JSTRACE_STRING)
|
|
520
|
+
{
|
|
521
|
+
JS_TraceChildren(trc, thing, kind);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
#endif
|
|
525
|
+
|
|
526
|
+
nsresult
|
|
527
|
+
nsXPConnect::BeginCycleCollection(nsCycleCollectionTraversalCallback &cb)
|
|
528
|
+
{
|
|
529
|
+
#ifdef DEBUG_CC
|
|
530
|
+
NS_ASSERTION(!mJSRoots.ops, "Didn't call FinishCollection?");
|
|
531
|
+
|
|
532
|
+
if(!mCycleCollectionContext)
|
|
533
|
+
{
|
|
534
|
+
// Being called from nsCycleCollector::ExplainLiveExpectedGarbage.
|
|
535
|
+
mExplainCycleCollectionContext = new XPCCallContext(NATIVE_CALLER);
|
|
536
|
+
if(!mExplainCycleCollectionContext ||
|
|
537
|
+
!mExplainCycleCollectionContext->IsValid())
|
|
538
|
+
{
|
|
539
|
+
mExplainCycleCollectionContext = nsnull;
|
|
540
|
+
return PR_FALSE;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
mCycleCollectionContext = mExplainCycleCollectionContext;
|
|
544
|
+
|
|
545
|
+
// Record all objects held by the JS runtime. This avoids doing a
|
|
546
|
+
// complete GC if we're just tracing to explain (from
|
|
547
|
+
// ExplainLiveExpectedGarbage), which makes the results of cycle
|
|
548
|
+
// collection identical for DEBUG_CC and non-DEBUG_CC builds.
|
|
549
|
+
if(!PL_DHashTableInit(&mJSRoots, PL_DHashGetStubOps(), nsnull,
|
|
550
|
+
sizeof(PLDHashEntryStub), PL_DHASH_MIN_SIZE)) {
|
|
551
|
+
mJSRoots.ops = nsnull;
|
|
552
|
+
|
|
553
|
+
return NS_ERROR_OUT_OF_MEMORY;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
GetRuntime()->UnrootContextGlobals();
|
|
557
|
+
|
|
558
|
+
PRBool alreadyCollecting = mCycleCollecting;
|
|
559
|
+
mCycleCollecting = PR_TRUE;
|
|
560
|
+
NoteJSRootTracer trc(&mJSRoots, cb);
|
|
561
|
+
JS_TRACER_INIT(&trc, mCycleCollectionContext->GetJSContext(),
|
|
562
|
+
NoteJSRoot);
|
|
563
|
+
JS_TraceRuntime(&trc);
|
|
564
|
+
mCycleCollecting = alreadyCollecting;
|
|
565
|
+
}
|
|
566
|
+
#else
|
|
567
|
+
NS_ASSERTION(mCycleCollectionContext,
|
|
568
|
+
"Didn't call nsXPConnect::Collect()?");
|
|
569
|
+
#endif
|
|
570
|
+
|
|
571
|
+
GetRuntime()->AddXPConnectRoots(mCycleCollectionContext->GetJSContext(),
|
|
572
|
+
cb);
|
|
573
|
+
|
|
574
|
+
#ifndef XPCONNECT_STANDALONE
|
|
575
|
+
if(!mScopes.IsInitialized())
|
|
576
|
+
{
|
|
577
|
+
mScopes.Init();
|
|
578
|
+
}
|
|
579
|
+
NS_ASSERTION(mScopes.Count() == 0, "Didn't clear mScopes?");
|
|
580
|
+
XPCWrappedNativeScope::TraverseScopes(*mCycleCollectionContext);
|
|
581
|
+
#endif
|
|
582
|
+
|
|
583
|
+
return NS_OK;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
#ifndef XPCONNECT_STANDALONE
|
|
587
|
+
void
|
|
588
|
+
nsXPConnect::RecordTraversal(void *p, nsISupports *s)
|
|
589
|
+
{
|
|
590
|
+
mScopes.Put(p, s);
|
|
591
|
+
}
|
|
592
|
+
#endif
|
|
593
|
+
|
|
594
|
+
nsresult
|
|
595
|
+
nsXPConnect::FinishCycleCollection()
|
|
596
|
+
{
|
|
597
|
+
#ifdef DEBUG_CC
|
|
598
|
+
if(mExplainCycleCollectionContext)
|
|
599
|
+
{
|
|
600
|
+
mCycleCollectionContext = nsnull;
|
|
601
|
+
mExplainCycleCollectionContext = nsnull;
|
|
602
|
+
|
|
603
|
+
GetRuntime()->RootContextGlobals();
|
|
604
|
+
}
|
|
605
|
+
#endif
|
|
606
|
+
|
|
607
|
+
#ifndef XPCONNECT_STANDALONE
|
|
608
|
+
mScopes.Clear();
|
|
609
|
+
#endif
|
|
610
|
+
|
|
611
|
+
#ifdef DEBUG_CC
|
|
612
|
+
if(mJSRoots.ops)
|
|
613
|
+
{
|
|
614
|
+
PL_DHashTableFinish(&mJSRoots);
|
|
615
|
+
mJSRoots.ops = nsnull;
|
|
616
|
+
}
|
|
617
|
+
#endif
|
|
618
|
+
|
|
619
|
+
return NS_OK;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
nsCycleCollectionParticipant *
|
|
623
|
+
nsXPConnect::ToParticipant(void *p)
|
|
624
|
+
{
|
|
625
|
+
return this;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
NS_IMETHODIMP
|
|
629
|
+
nsXPConnect::RootAndUnlinkJSObjects(void *p)
|
|
630
|
+
{
|
|
631
|
+
return NS_OK;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
#ifdef DEBUG_CC
|
|
635
|
+
void
|
|
636
|
+
nsXPConnect::PrintAllReferencesTo(void *p)
|
|
637
|
+
{
|
|
638
|
+
#ifdef DEBUG
|
|
639
|
+
if(!mCycleCollectionContext) {
|
|
640
|
+
NS_NOTREACHED("no context");
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
JS_DumpHeap(*mCycleCollectionContext, stdout, nsnull, 0, p,
|
|
644
|
+
0x7fffffff, nsnull);
|
|
645
|
+
#endif
|
|
646
|
+
}
|
|
647
|
+
#endif
|
|
648
|
+
|
|
649
|
+
NS_IMETHODIMP
|
|
650
|
+
nsXPConnect::Unlink(void *p)
|
|
651
|
+
{
|
|
652
|
+
return NS_OK;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
NS_IMETHODIMP
|
|
656
|
+
nsXPConnect::Unroot(void *p)
|
|
657
|
+
{
|
|
658
|
+
return NS_OK;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
struct TraversalTracer : public JSTracer
|
|
662
|
+
{
|
|
663
|
+
TraversalTracer(nsCycleCollectionTraversalCallback &aCb) : cb(aCb)
|
|
664
|
+
{
|
|
665
|
+
}
|
|
666
|
+
nsCycleCollectionTraversalCallback &cb;
|
|
667
|
+
};
|
|
668
|
+
|
|
669
|
+
static void
|
|
670
|
+
NoteJSChild(JSTracer *trc, void *thing, uint32 kind)
|
|
671
|
+
{
|
|
672
|
+
if(ADD_TO_CC(kind))
|
|
673
|
+
{
|
|
674
|
+
TraversalTracer *tracer = static_cast<TraversalTracer*>(trc);
|
|
675
|
+
#if defined(DEBUG) && defined(DEBUG_CC)
|
|
676
|
+
// based on DumpNotify in jsapi.c
|
|
677
|
+
if (tracer->debugPrinter) {
|
|
678
|
+
char buffer[200];
|
|
679
|
+
tracer->debugPrinter(trc, buffer, sizeof(buffer));
|
|
680
|
+
tracer->cb.NoteNextEdgeName(buffer);
|
|
681
|
+
} else if (tracer->debugPrintIndex != (size_t)-1) {
|
|
682
|
+
char buffer[200];
|
|
683
|
+
JS_snprintf(buffer, sizeof(buffer), "%s[%lu]",
|
|
684
|
+
static_cast<const char *>(tracer->debugPrintArg),
|
|
685
|
+
tracer->debugPrintIndex);
|
|
686
|
+
tracer->cb.NoteNextEdgeName(buffer);
|
|
687
|
+
} else {
|
|
688
|
+
tracer->cb.NoteNextEdgeName(
|
|
689
|
+
static_cast<const char*>(tracer->debugPrintArg));
|
|
690
|
+
}
|
|
691
|
+
#endif
|
|
692
|
+
tracer->cb.NoteScriptChild(nsIProgrammingLanguage::JAVASCRIPT, thing);
|
|
693
|
+
}
|
|
694
|
+
else if(kind != JSTRACE_DOUBLE && kind != JSTRACE_STRING)
|
|
695
|
+
{
|
|
696
|
+
JS_TraceChildren(trc, thing, kind);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
static JSBool
|
|
701
|
+
WrapperIsNotMainThreadOnly(XPCWrappedNative *wrapper)
|
|
702
|
+
{
|
|
703
|
+
XPCWrappedNativeProto *proto = wrapper->GetProto();
|
|
704
|
+
if(proto && proto->ClassIsMainThreadOnly())
|
|
705
|
+
return PR_FALSE;
|
|
706
|
+
|
|
707
|
+
// If the native participates in cycle collection then we know it can only
|
|
708
|
+
// be used on the main thread, in that case we assume the wrapped native
|
|
709
|
+
// can only be used on the main thread too.
|
|
710
|
+
nsXPCOMCycleCollectionParticipant* participant;
|
|
711
|
+
return NS_FAILED(CallQueryInterface(wrapper->Native(), &participant));
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
NS_IMETHODIMP
|
|
715
|
+
nsXPConnect::Traverse(void *p, nsCycleCollectionTraversalCallback &cb)
|
|
716
|
+
{
|
|
717
|
+
if(!mCycleCollectionContext)
|
|
718
|
+
return NS_ERROR_FAILURE;
|
|
719
|
+
|
|
720
|
+
JSContext *cx = mCycleCollectionContext->GetJSContext();
|
|
721
|
+
|
|
722
|
+
uint32 traceKind = js_GetGCThingTraceKind(p);
|
|
723
|
+
JSObject *obj;
|
|
724
|
+
JSClass *clazz;
|
|
725
|
+
|
|
726
|
+
// We do not want to add wrappers to the cycle collector if they're not
|
|
727
|
+
// explicitly marked as main thread only, because the cycle collector isn't
|
|
728
|
+
// able to deal with objects that might be used off of the main thread. We
|
|
729
|
+
// do want to explicitly mark them for cycle collection if the wrapper has
|
|
730
|
+
// an external reference, because the wrapper would mark the JS object if
|
|
731
|
+
// we did add the wrapper to the cycle collector.
|
|
732
|
+
JSBool dontTraverse = PR_FALSE;
|
|
733
|
+
JSBool markJSObject = PR_FALSE;
|
|
734
|
+
if(traceKind == JSTRACE_OBJECT)
|
|
735
|
+
{
|
|
736
|
+
obj = static_cast<JSObject*>(p);
|
|
737
|
+
clazz = OBJ_GET_CLASS(cx, obj);
|
|
738
|
+
|
|
739
|
+
if(clazz == &XPC_WN_Tearoff_JSClass)
|
|
740
|
+
{
|
|
741
|
+
XPCWrappedNative *wrapper =
|
|
742
|
+
(XPCWrappedNative*)xpc_GetJSPrivate(STOBJ_GET_PARENT(obj));
|
|
743
|
+
dontTraverse = WrapperIsNotMainThreadOnly(wrapper);
|
|
744
|
+
}
|
|
745
|
+
else if(IS_WRAPPER_CLASS(clazz))
|
|
746
|
+
{
|
|
747
|
+
XPCWrappedNative *wrapper = (XPCWrappedNative*)xpc_GetJSPrivate(obj);
|
|
748
|
+
dontTraverse = WrapperIsNotMainThreadOnly(wrapper);
|
|
749
|
+
markJSObject = dontTraverse && wrapper->HasExternalReference();
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
CCNodeType type;
|
|
754
|
+
|
|
755
|
+
#ifdef DEBUG_CC
|
|
756
|
+
{
|
|
757
|
+
// Note that the conditions under which we specify GCMarked vs.
|
|
758
|
+
// GCUnmarked are different between ExplainLiveExpectedGarbage and
|
|
759
|
+
// the normal case. In the normal case, we're saying that anything
|
|
760
|
+
// reachable from a JS runtime root is itself such a root. This
|
|
761
|
+
// doesn't actually break anything; it really just does some of the
|
|
762
|
+
// cycle collector's work for it. However, when debugging, we
|
|
763
|
+
// (1) actually need to know what the root is and (2) don't want to
|
|
764
|
+
// do an extra GC, so we use mJSRoots, built from JS_TraceRuntime,
|
|
765
|
+
// which produces a different result because we didn't call
|
|
766
|
+
// JS_TraceChildren to trace everything that was reachable.
|
|
767
|
+
if(mJSRoots.ops)
|
|
768
|
+
{
|
|
769
|
+
// ExplainLiveExpectedGarbage codepath
|
|
770
|
+
PLDHashEntryHdr* entry =
|
|
771
|
+
PL_DHashTableOperate(&mJSRoots, p, PL_DHASH_LOOKUP);
|
|
772
|
+
type = markJSObject || PL_DHASH_ENTRY_IS_BUSY(entry) ? GCMarked :
|
|
773
|
+
GCUnmarked;
|
|
774
|
+
}
|
|
775
|
+
else
|
|
776
|
+
{
|
|
777
|
+
// Normal codepath (matches non-DEBUG_CC codepath).
|
|
778
|
+
type = !markJSObject && JS_IsAboutToBeFinalized(cx, p) ? GCUnmarked :
|
|
779
|
+
GCMarked;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
char name[72];
|
|
783
|
+
if(traceKind == JSTRACE_OBJECT)
|
|
784
|
+
{
|
|
785
|
+
JSObject *obj = static_cast<JSObject*>(p);
|
|
786
|
+
JSClass *clazz = OBJ_GET_CLASS(cx, obj);
|
|
787
|
+
if(XPCNativeWrapper::IsNativeWrapperClass(clazz))
|
|
788
|
+
{
|
|
789
|
+
XPCWrappedNative* wn = XPCNativeWrapper::GetWrappedNative(obj);
|
|
790
|
+
if(wn)
|
|
791
|
+
{
|
|
792
|
+
XPCNativeScriptableInfo* si = wn->GetScriptableInfo();
|
|
793
|
+
if(si)
|
|
794
|
+
{
|
|
795
|
+
JS_snprintf(name, sizeof(name), "XPCNativeWrapper (%s)",
|
|
796
|
+
si->GetJSClass()->name);
|
|
797
|
+
}
|
|
798
|
+
else
|
|
799
|
+
{
|
|
800
|
+
nsIClassInfo* ci = wn->GetClassInfo();
|
|
801
|
+
char* className = nsnull;
|
|
802
|
+
if(ci)
|
|
803
|
+
ci->GetClassDescription(&className);
|
|
804
|
+
if(className)
|
|
805
|
+
{
|
|
806
|
+
JS_snprintf(name, sizeof(name), "XPCNativeWrapper (%s)",
|
|
807
|
+
className);
|
|
808
|
+
PR_Free(className);
|
|
809
|
+
}
|
|
810
|
+
else
|
|
811
|
+
{
|
|
812
|
+
XPCNativeSet* set = wn->GetSet();
|
|
813
|
+
XPCNativeInterface** array = set->GetInterfaceArray();
|
|
814
|
+
PRUint16 count = set->GetInterfaceCount();
|
|
815
|
+
|
|
816
|
+
if(count > 0)
|
|
817
|
+
JS_snprintf(name, sizeof(name),
|
|
818
|
+
"XPCNativeWrapper (%s)",
|
|
819
|
+
array[0]->GetNameString());
|
|
820
|
+
else
|
|
821
|
+
JS_snprintf(name, sizeof(name), "XPCNativeWrapper");
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
else
|
|
826
|
+
{
|
|
827
|
+
JS_snprintf(name, sizeof(name), "XPCNativeWrapper");
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
else
|
|
831
|
+
{
|
|
832
|
+
XPCNativeScriptableInfo* si = nsnull;
|
|
833
|
+
if(IS_PROTO_CLASS(clazz))
|
|
834
|
+
{
|
|
835
|
+
XPCWrappedNativeProto* p =
|
|
836
|
+
(XPCWrappedNativeProto*) xpc_GetJSPrivate(obj);
|
|
837
|
+
si = p->GetScriptableInfo();
|
|
838
|
+
}
|
|
839
|
+
if(si)
|
|
840
|
+
{
|
|
841
|
+
JS_snprintf(name, sizeof(name), "JS Object (%s - %s)",
|
|
842
|
+
clazz->name, si->GetJSClass()->name);
|
|
843
|
+
}
|
|
844
|
+
else if(clazz == &js_ScriptClass)
|
|
845
|
+
{
|
|
846
|
+
JSScript* script = (JSScript*) xpc_GetJSPrivate(obj);
|
|
847
|
+
if(script->filename)
|
|
848
|
+
{
|
|
849
|
+
JS_snprintf(name, sizeof(name), "JS Object (Script - %s)",
|
|
850
|
+
script->filename);
|
|
851
|
+
}
|
|
852
|
+
else
|
|
853
|
+
{
|
|
854
|
+
JS_snprintf(name, sizeof(name), "JS Object (Script)");
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
else if(clazz == &js_FunctionClass)
|
|
858
|
+
{
|
|
859
|
+
JSFunction* fun = (JSFunction*) xpc_GetJSPrivate(obj);
|
|
860
|
+
JSString* str = JS_GetFunctionId(fun);
|
|
861
|
+
if(str)
|
|
862
|
+
{
|
|
863
|
+
NS_ConvertUTF16toUTF8
|
|
864
|
+
fname(JS_GetStringChars(str));
|
|
865
|
+
JS_snprintf(name, sizeof(name), "JS Object (Function - %s)",
|
|
866
|
+
fname.get());
|
|
867
|
+
}
|
|
868
|
+
else
|
|
869
|
+
{
|
|
870
|
+
JS_snprintf(name, sizeof(name), "JS Object (Function)");
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
else
|
|
874
|
+
{
|
|
875
|
+
JS_snprintf(name, sizeof(name), "JS Object (%s)", clazz->name);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
else
|
|
880
|
+
{
|
|
881
|
+
static const char trace_types[JSTRACE_LIMIT][7] = {
|
|
882
|
+
"Object",
|
|
883
|
+
"Double",
|
|
884
|
+
"String",
|
|
885
|
+
"Xml"
|
|
886
|
+
};
|
|
887
|
+
JS_snprintf(name, sizeof(name), "JS %s", trace_types[traceKind]);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
if(traceKind == JSTRACE_OBJECT) {
|
|
891
|
+
JSObject *global = static_cast<JSObject*>(p), *parent;
|
|
892
|
+
while((parent = JS_GetParent(cx, global)))
|
|
893
|
+
global = parent;
|
|
894
|
+
char fullname[100];
|
|
895
|
+
JS_snprintf(fullname, sizeof(fullname), "%s (global=%p)", name, global);
|
|
896
|
+
cb.DescribeNode(type, 0, sizeof(JSObject), fullname);
|
|
897
|
+
} else {
|
|
898
|
+
cb.DescribeNode(type, 0, sizeof(JSObject), name);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
}
|
|
902
|
+
#else
|
|
903
|
+
type = !markJSObject && JS_IsAboutToBeFinalized(cx, p) ? GCUnmarked :
|
|
904
|
+
GCMarked;
|
|
905
|
+
cb.DescribeNode(type, 0);
|
|
906
|
+
#endif
|
|
907
|
+
|
|
908
|
+
if(!ADD_TO_CC(traceKind))
|
|
909
|
+
return NS_OK;
|
|
910
|
+
|
|
911
|
+
#ifndef DEBUG_CC
|
|
912
|
+
// There's no need to trace objects that have already been marked by the JS
|
|
913
|
+
// GC. Any JS objects hanging from them will already be marked. Only do this
|
|
914
|
+
// if DEBUG_CC is not defined, else we do want to know about all JS objects
|
|
915
|
+
// to get better graphs and explanations.
|
|
916
|
+
if(type == GCMarked)
|
|
917
|
+
return NS_OK;
|
|
918
|
+
#endif
|
|
919
|
+
|
|
920
|
+
TraversalTracer trc(cb);
|
|
921
|
+
|
|
922
|
+
JS_TRACER_INIT(&trc, cx, NoteJSChild);
|
|
923
|
+
JS_TraceChildren(&trc, p, traceKind);
|
|
924
|
+
|
|
925
|
+
if(traceKind != JSTRACE_OBJECT || dontTraverse)
|
|
926
|
+
return NS_OK;
|
|
927
|
+
|
|
928
|
+
if(clazz == &XPC_WN_Tearoff_JSClass)
|
|
929
|
+
{
|
|
930
|
+
// A tearoff holds a strong reference to its native object
|
|
931
|
+
// (see XPCWrappedNative::FlatJSObjectFinalized). Its XPCWrappedNative
|
|
932
|
+
// will be held alive through the parent of the JSObject of the tearoff.
|
|
933
|
+
XPCWrappedNativeTearOff *to =
|
|
934
|
+
(XPCWrappedNativeTearOff*) xpc_GetJSPrivate(obj);
|
|
935
|
+
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "xpc_GetJSPrivate(obj)->mNative");
|
|
936
|
+
cb.NoteXPCOMChild(to->GetNative());
|
|
937
|
+
}
|
|
938
|
+
// XXX XPCNativeWrapper seems to be the only class that doesn't hold a
|
|
939
|
+
// strong reference to its nsISupports private. This test does seem
|
|
940
|
+
// fragile though, we should probably whitelist classes that do hold
|
|
941
|
+
// a strong reference, but that might not be possible.
|
|
942
|
+
else if(clazz->flags & JSCLASS_HAS_PRIVATE &&
|
|
943
|
+
clazz->flags & JSCLASS_PRIVATE_IS_NSISUPPORTS &&
|
|
944
|
+
!XPCNativeWrapper::IsNativeWrapperClass(clazz))
|
|
945
|
+
{
|
|
946
|
+
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "xpc_GetJSPrivate(obj)");
|
|
947
|
+
cb.NoteXPCOMChild(static_cast<nsISupports*>(xpc_GetJSPrivate(obj)));
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
#ifndef XPCONNECT_STANDALONE
|
|
951
|
+
if(clazz->flags & JSCLASS_IS_GLOBAL)
|
|
952
|
+
{
|
|
953
|
+
nsISupports *principal = nsnull;
|
|
954
|
+
mScopes.Get(obj, &principal);
|
|
955
|
+
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "scope principal");
|
|
956
|
+
cb.NoteXPCOMChild(principal);
|
|
957
|
+
}
|
|
958
|
+
#endif
|
|
959
|
+
|
|
960
|
+
return NS_OK;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
PRInt32
|
|
964
|
+
nsXPConnect::GetRequestDepth(JSContext* cx)
|
|
965
|
+
{
|
|
966
|
+
PRInt32 requestDepth = cx->outstandingRequests;
|
|
967
|
+
XPCCallContext* context = GetCycleCollectionContext();
|
|
968
|
+
if(context && cx == context->GetJSContext())
|
|
969
|
+
// Ignore the request from the XPCCallContext we created for cycle
|
|
970
|
+
// collection.
|
|
971
|
+
--requestDepth;
|
|
972
|
+
return requestDepth;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
class JSContextParticipant : public nsCycleCollectionParticipant
|
|
976
|
+
{
|
|
977
|
+
public:
|
|
978
|
+
NS_IMETHOD RootAndUnlinkJSObjects(void *n)
|
|
979
|
+
{
|
|
980
|
+
return NS_OK;
|
|
981
|
+
}
|
|
982
|
+
NS_IMETHOD Unlink(void *n)
|
|
983
|
+
{
|
|
984
|
+
// We must not unlink a JSContext because Root/Unroot don't ensure that
|
|
985
|
+
// the pointer is still valid.
|
|
986
|
+
return NS_OK;
|
|
987
|
+
}
|
|
988
|
+
NS_IMETHOD Unroot(void *n)
|
|
989
|
+
{
|
|
990
|
+
return NS_OK;
|
|
991
|
+
}
|
|
992
|
+
NS_IMETHODIMP Traverse(void *n, nsCycleCollectionTraversalCallback &cb)
|
|
993
|
+
{
|
|
994
|
+
JSContext *cx = static_cast<JSContext*>(n);
|
|
995
|
+
|
|
996
|
+
// Add cx->requestDepth to the refcount, if there are outstanding
|
|
997
|
+
// requests the context needs to be kept alive and adding unknown
|
|
998
|
+
// edges will ensure that any cycles this context is in won't be
|
|
999
|
+
// collected.
|
|
1000
|
+
PRInt32 refCount = nsXPConnect::GetXPConnect()->GetRequestDepth(cx) + 1;
|
|
1001
|
+
|
|
1002
|
+
#ifdef DEBUG_CC
|
|
1003
|
+
cb.DescribeNode(RefCounted, refCount, sizeof(JSContext),
|
|
1004
|
+
"JSContext");
|
|
1005
|
+
cb.NoteNextEdgeName("[global object]");
|
|
1006
|
+
#else
|
|
1007
|
+
cb.DescribeNode(RefCounted, refCount);
|
|
1008
|
+
#endif
|
|
1009
|
+
cb.NoteScriptChild(nsIProgrammingLanguage::JAVASCRIPT,
|
|
1010
|
+
cx->globalObject);
|
|
1011
|
+
|
|
1012
|
+
return NS_OK;
|
|
1013
|
+
}
|
|
1014
|
+
};
|
|
1015
|
+
|
|
1016
|
+
static JSContextParticipant JSContext_cycleCollectorGlobal;
|
|
1017
|
+
|
|
1018
|
+
// static
|
|
1019
|
+
nsCycleCollectionParticipant*
|
|
1020
|
+
nsXPConnect::JSContextParticipant()
|
|
1021
|
+
{
|
|
1022
|
+
return &JSContext_cycleCollectorGlobal;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
NS_IMETHODIMP_(void)
|
|
1026
|
+
nsXPConnect::NoteJSContext(JSContext *aJSContext,
|
|
1027
|
+
nsCycleCollectionTraversalCallback &aCb)
|
|
1028
|
+
{
|
|
1029
|
+
aCb.NoteNativeChild(aJSContext, &JSContext_cycleCollectorGlobal);
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
|
|
1033
|
+
/***************************************************************************/
|
|
1034
|
+
/***************************************************************************/
|
|
1035
|
+
// nsIXPConnect interface methods...
|
|
1036
|
+
|
|
1037
|
+
inline nsresult UnexpectedFailure(nsresult rv)
|
|
1038
|
+
{
|
|
1039
|
+
NS_ERROR("This is not supposed to fail!");
|
|
1040
|
+
return rv;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
class SaveFrame
|
|
1044
|
+
{
|
|
1045
|
+
public:
|
|
1046
|
+
SaveFrame(JSContext *cx)
|
|
1047
|
+
: mJSContext(cx) {
|
|
1048
|
+
mFrame = JS_SaveFrameChain(mJSContext);
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
~SaveFrame() {
|
|
1052
|
+
JS_RestoreFrameChain(mJSContext, mFrame);
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
private:
|
|
1056
|
+
JSContext *mJSContext;
|
|
1057
|
+
JSStackFrame *mFrame;
|
|
1058
|
+
};
|
|
1059
|
+
|
|
1060
|
+
/* void initClasses (in JSContextPtr aJSContext, in JSObjectPtr aGlobalJSObj); */
|
|
1061
|
+
NS_IMETHODIMP
|
|
1062
|
+
nsXPConnect::InitClasses(JSContext * aJSContext, JSObject * aGlobalJSObj)
|
|
1063
|
+
{
|
|
1064
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1065
|
+
NS_ASSERTION(aGlobalJSObj, "bad param");
|
|
1066
|
+
|
|
1067
|
+
SaveFrame sf(aJSContext);
|
|
1068
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1069
|
+
if(!ccx.IsValid())
|
|
1070
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1071
|
+
|
|
1072
|
+
if(!xpc_InitJSxIDClassObjects())
|
|
1073
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1074
|
+
|
|
1075
|
+
if(!xpc_InitWrappedNativeJSOps())
|
|
1076
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1077
|
+
|
|
1078
|
+
XPCWrappedNativeScope* scope =
|
|
1079
|
+
XPCWrappedNativeScope::GetNewOrUsed(ccx, aGlobalJSObj);
|
|
1080
|
+
|
|
1081
|
+
if(!scope)
|
|
1082
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1083
|
+
|
|
1084
|
+
scope->RemoveWrappedNativeProtos();
|
|
1085
|
+
|
|
1086
|
+
if(!nsXPCComponents::AttachNewComponentsObject(ccx, scope, aGlobalJSObj))
|
|
1087
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1088
|
+
|
|
1089
|
+
#ifdef XPC_IDISPATCH_SUPPORT
|
|
1090
|
+
// Initialize any properties IDispatch needs on the global object
|
|
1091
|
+
XPCIDispatchExtension::Initialize(ccx, aGlobalJSObj);
|
|
1092
|
+
#endif
|
|
1093
|
+
|
|
1094
|
+
if (!XPCNativeWrapper::AttachNewConstructorObject(ccx, aGlobalJSObj))
|
|
1095
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1096
|
+
|
|
1097
|
+
if (!XPC_SJOW_AttachNewConstructorObject(ccx, aGlobalJSObj))
|
|
1098
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1099
|
+
|
|
1100
|
+
return NS_OK;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
static JSBool
|
|
1104
|
+
TempGlobalResolve(JSContext *aJSContext, JSObject *obj, jsval id)
|
|
1105
|
+
{
|
|
1106
|
+
JSBool resolved;
|
|
1107
|
+
return JS_ResolveStandardClass(aJSContext, obj, id, &resolved);
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
static JSClass xpcTempGlobalClass = {
|
|
1111
|
+
"xpcTempGlobalClass", JSCLASS_GLOBAL_FLAGS,
|
|
1112
|
+
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
|
|
1113
|
+
JS_EnumerateStub, TempGlobalResolve, JS_ConvertStub, JS_FinalizeStub,
|
|
1114
|
+
JSCLASS_NO_OPTIONAL_MEMBERS
|
|
1115
|
+
};
|
|
1116
|
+
|
|
1117
|
+
/* nsIXPConnectJSObjectHolder initClassesWithNewWrappedGlobal (in JSContextPtr aJSContext, in nsISupports aCOMObj, in nsIIDRef aIID, in PRUint32 aFlags); */
|
|
1118
|
+
NS_IMETHODIMP
|
|
1119
|
+
nsXPConnect::InitClassesWithNewWrappedGlobal(JSContext * aJSContext,
|
|
1120
|
+
nsISupports *aCOMObj,
|
|
1121
|
+
const nsIID & aIID,
|
|
1122
|
+
PRUint32 aFlags,
|
|
1123
|
+
nsIXPConnectJSObjectHolder **_retval)
|
|
1124
|
+
{
|
|
1125
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1126
|
+
NS_ASSERTION(aCOMObj, "bad param");
|
|
1127
|
+
NS_ASSERTION(_retval, "bad param");
|
|
1128
|
+
|
|
1129
|
+
// XXX This is not pretty. We make a temporary global object and
|
|
1130
|
+
// init it with all the Components object junk just so we have a
|
|
1131
|
+
// parent with an xpc scope to use when wrapping the object that will
|
|
1132
|
+
// become the 'real' global.
|
|
1133
|
+
|
|
1134
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1135
|
+
|
|
1136
|
+
PRBool system = (aFlags & nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT) != 0;
|
|
1137
|
+
JSObject* tempGlobal = JS_NewSystemObject(aJSContext, &xpcTempGlobalClass,
|
|
1138
|
+
nsnull, nsnull, system);
|
|
1139
|
+
|
|
1140
|
+
if(!tempGlobal ||
|
|
1141
|
+
!JS_SetParent(aJSContext, tempGlobal, nsnull) ||
|
|
1142
|
+
!JS_SetPrototype(aJSContext, tempGlobal, nsnull))
|
|
1143
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1144
|
+
|
|
1145
|
+
jsval v;
|
|
1146
|
+
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
|
1147
|
+
{
|
|
1148
|
+
// Scope for our auto-marker; it just needs to keep tempGlobal alive
|
|
1149
|
+
// long enough for InitClasses and WrapNative to do their work
|
|
1150
|
+
AUTO_MARK_JSVAL(ccx, OBJECT_TO_JSVAL(tempGlobal));
|
|
1151
|
+
|
|
1152
|
+
if(NS_FAILED(InitClasses(aJSContext, tempGlobal)))
|
|
1153
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1154
|
+
|
|
1155
|
+
nsresult rv;
|
|
1156
|
+
if(!XPCConvert::NativeInterface2JSObject(ccx, &v,
|
|
1157
|
+
getter_AddRefs(holder),
|
|
1158
|
+
aCOMObj, &aIID, nsnull,
|
|
1159
|
+
nsnull, tempGlobal,
|
|
1160
|
+
PR_FALSE, OBJ_IS_GLOBAL, &rv))
|
|
1161
|
+
return UnexpectedFailure(rv);
|
|
1162
|
+
|
|
1163
|
+
NS_ASSERTION(NS_SUCCEEDED(rv) && holder, "Didn't wrap properly");
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
JSObject* globalJSObj = JSVAL_TO_OBJECT(v);
|
|
1167
|
+
if(!globalJSObj)
|
|
1168
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1169
|
+
|
|
1170
|
+
if(aFlags & nsIXPConnect::FLAG_SYSTEM_GLOBAL_OBJECT)
|
|
1171
|
+
NS_ASSERTION(JS_IsSystemObject(aJSContext, globalJSObj), "huh?!");
|
|
1172
|
+
|
|
1173
|
+
// voodoo to fixup scoping and parenting...
|
|
1174
|
+
|
|
1175
|
+
JS_SetParent(aJSContext, globalJSObj, nsnull);
|
|
1176
|
+
|
|
1177
|
+
JSObject* oldGlobal = JS_GetGlobalObject(aJSContext);
|
|
1178
|
+
if(!oldGlobal || oldGlobal == tempGlobal)
|
|
1179
|
+
JS_SetGlobalObject(aJSContext, globalJSObj);
|
|
1180
|
+
|
|
1181
|
+
if((aFlags & nsIXPConnect::INIT_JS_STANDARD_CLASSES) &&
|
|
1182
|
+
!JS_InitStandardClasses(aJSContext, globalJSObj))
|
|
1183
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1184
|
+
|
|
1185
|
+
XPCWrappedNative* wrapper =
|
|
1186
|
+
reinterpret_cast<XPCWrappedNative*>(holder.get());
|
|
1187
|
+
XPCWrappedNativeScope* scope = wrapper->GetScope();
|
|
1188
|
+
|
|
1189
|
+
if(!scope)
|
|
1190
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1191
|
+
|
|
1192
|
+
NS_ASSERTION(scope->GetGlobalJSObject() == tempGlobal, "stealing scope!");
|
|
1193
|
+
|
|
1194
|
+
scope->SetGlobal(ccx, globalJSObj);
|
|
1195
|
+
|
|
1196
|
+
JSObject* protoJSObject = wrapper->HasProto() ?
|
|
1197
|
+
wrapper->GetProto()->GetJSProtoObject() :
|
|
1198
|
+
globalJSObj;
|
|
1199
|
+
if(protoJSObject)
|
|
1200
|
+
{
|
|
1201
|
+
if(protoJSObject != globalJSObj)
|
|
1202
|
+
JS_SetParent(aJSContext, protoJSObject, globalJSObj);
|
|
1203
|
+
JS_SetPrototype(aJSContext, protoJSObject, scope->GetPrototypeJSObject());
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
if(!(aFlags & nsIXPConnect::OMIT_COMPONENTS_OBJECT)) {
|
|
1207
|
+
SaveFrame sf(ccx);
|
|
1208
|
+
if(!nsXPCComponents::AttachNewComponentsObject(ccx, scope, globalJSObj))
|
|
1209
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1210
|
+
|
|
1211
|
+
if(!XPCNativeWrapper::AttachNewConstructorObject(ccx, globalJSObj))
|
|
1212
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1213
|
+
|
|
1214
|
+
if(!XPC_SJOW_AttachNewConstructorObject(ccx, globalJSObj))
|
|
1215
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
NS_ADDREF(*_retval = holder);
|
|
1219
|
+
|
|
1220
|
+
return NS_OK;
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
/* nsIXPConnectJSObjectHolder wrapNative (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsISupports aCOMObj, in nsIIDRef aIID); */
|
|
1224
|
+
NS_IMETHODIMP
|
|
1225
|
+
nsXPConnect::WrapNative(JSContext * aJSContext,
|
|
1226
|
+
JSObject * aScope,
|
|
1227
|
+
nsISupports *aCOMObj,
|
|
1228
|
+
const nsIID & aIID,
|
|
1229
|
+
nsIXPConnectJSObjectHolder **aHolder)
|
|
1230
|
+
{
|
|
1231
|
+
NS_ASSERTION(aHolder, "bad param");
|
|
1232
|
+
|
|
1233
|
+
jsval v;
|
|
1234
|
+
return WrapNativeToJSVal(aJSContext, aScope, aCOMObj, &aIID, &v, aHolder);
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
/* void wrapNativeToJSVal (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsISupports aCOMObj, in nsIIDPtr aIID, out JSVal aVal, out nsIXPConnectJSObjectHolder aHolder); */
|
|
1238
|
+
NS_IMETHODIMP
|
|
1239
|
+
nsXPConnect::WrapNativeToJSVal(JSContext * aJSContext,
|
|
1240
|
+
JSObject * aScope,
|
|
1241
|
+
nsISupports *aCOMObj,
|
|
1242
|
+
const nsIID * aIID,
|
|
1243
|
+
jsval *aVal,
|
|
1244
|
+
nsIXPConnectJSObjectHolder **aHolder)
|
|
1245
|
+
{
|
|
1246
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1247
|
+
NS_ASSERTION(aScope, "bad param");
|
|
1248
|
+
NS_ASSERTION(aCOMObj, "bad param");
|
|
1249
|
+
|
|
1250
|
+
if(aHolder)
|
|
1251
|
+
*aHolder = nsnull;
|
|
1252
|
+
|
|
1253
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1254
|
+
if(!ccx.IsValid())
|
|
1255
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1256
|
+
|
|
1257
|
+
nsresult rv;
|
|
1258
|
+
if(!XPCConvert::NativeInterface2JSObject(ccx, aVal, aHolder, aCOMObj, aIID,
|
|
1259
|
+
nsnull, nsnull, aScope, PR_FALSE,
|
|
1260
|
+
OBJ_IS_NOT_GLOBAL, &rv))
|
|
1261
|
+
return rv;
|
|
1262
|
+
|
|
1263
|
+
#ifdef DEBUG
|
|
1264
|
+
NS_ASSERTION(!XPCNativeWrapper::IsNativeWrapper(JSVAL_TO_OBJECT(*aVal)),
|
|
1265
|
+
"Shouldn't be returning a native wrapper here");
|
|
1266
|
+
#endif
|
|
1267
|
+
|
|
1268
|
+
return NS_OK;
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
/* void wrapJS (in JSContextPtr aJSContext, in JSObjectPtr aJSObj, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */
|
|
1272
|
+
NS_IMETHODIMP
|
|
1273
|
+
nsXPConnect::WrapJS(JSContext * aJSContext,
|
|
1274
|
+
JSObject * aJSObj,
|
|
1275
|
+
const nsIID & aIID,
|
|
1276
|
+
void * *result)
|
|
1277
|
+
{
|
|
1278
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1279
|
+
NS_ASSERTION(aJSObj, "bad param");
|
|
1280
|
+
NS_ASSERTION(result, "bad param");
|
|
1281
|
+
|
|
1282
|
+
*result = nsnull;
|
|
1283
|
+
|
|
1284
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1285
|
+
if(!ccx.IsValid())
|
|
1286
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1287
|
+
|
|
1288
|
+
nsresult rv;
|
|
1289
|
+
if(!XPCConvert::JSObject2NativeInterface(ccx, result, aJSObj,
|
|
1290
|
+
&aIID, nsnull, &rv))
|
|
1291
|
+
return rv;
|
|
1292
|
+
return NS_OK;
|
|
1293
|
+
}
|
|
1294
|
+
|
|
1295
|
+
/* void wrapJSAggregatedToNative (in nsISupports aOuter, in JSContextPtr aJSContext, in JSObjectPtr aJSObj, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */
|
|
1296
|
+
NS_IMETHODIMP
|
|
1297
|
+
nsXPConnect::WrapJSAggregatedToNative(nsISupports *aOuter,
|
|
1298
|
+
JSContext * aJSContext,
|
|
1299
|
+
JSObject * aJSObj,
|
|
1300
|
+
const nsIID & aIID,
|
|
1301
|
+
void * *result)
|
|
1302
|
+
{
|
|
1303
|
+
NS_ASSERTION(aOuter, "bad param");
|
|
1304
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1305
|
+
NS_ASSERTION(aJSObj, "bad param");
|
|
1306
|
+
NS_ASSERTION(result, "bad param");
|
|
1307
|
+
|
|
1308
|
+
*result = nsnull;
|
|
1309
|
+
|
|
1310
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1311
|
+
if(!ccx.IsValid())
|
|
1312
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1313
|
+
|
|
1314
|
+
nsresult rv;
|
|
1315
|
+
if(!XPCConvert::JSObject2NativeInterface(ccx, result, aJSObj,
|
|
1316
|
+
&aIID, aOuter, &rv))
|
|
1317
|
+
return rv;
|
|
1318
|
+
return NS_OK;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
/* nsIXPConnectWrappedNative getWrappedNativeOfJSObject (in JSContextPtr aJSContext, in JSObjectPtr aJSObj); */
|
|
1322
|
+
NS_IMETHODIMP
|
|
1323
|
+
nsXPConnect::GetWrappedNativeOfJSObject(JSContext * aJSContext,
|
|
1324
|
+
JSObject * aJSObj,
|
|
1325
|
+
nsIXPConnectWrappedNative **_retval)
|
|
1326
|
+
{
|
|
1327
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1328
|
+
NS_ASSERTION(aJSObj, "bad param");
|
|
1329
|
+
NS_ASSERTION(_retval, "bad param");
|
|
1330
|
+
|
|
1331
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1332
|
+
if(!ccx.IsValid())
|
|
1333
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1334
|
+
|
|
1335
|
+
nsIXPConnectWrappedNative* wrapper =
|
|
1336
|
+
XPCWrappedNative::GetWrappedNativeOfJSObject(aJSContext, aJSObj);
|
|
1337
|
+
if(wrapper)
|
|
1338
|
+
{
|
|
1339
|
+
NS_ADDREF(wrapper);
|
|
1340
|
+
*_retval = wrapper;
|
|
1341
|
+
return NS_OK;
|
|
1342
|
+
}
|
|
1343
|
+
// else...
|
|
1344
|
+
*_retval = nsnull;
|
|
1345
|
+
return NS_ERROR_FAILURE;
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
/* nsIXPConnectWrappedNative getWrappedNativeOfNativeObject (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsISupports aCOMObj, in nsIIDRef aIID); */
|
|
1349
|
+
NS_IMETHODIMP
|
|
1350
|
+
nsXPConnect::GetWrappedNativeOfNativeObject(JSContext * aJSContext,
|
|
1351
|
+
JSObject * aScope,
|
|
1352
|
+
nsISupports *aCOMObj,
|
|
1353
|
+
const nsIID & aIID,
|
|
1354
|
+
nsIXPConnectWrappedNative **_retval)
|
|
1355
|
+
{
|
|
1356
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1357
|
+
NS_ASSERTION(aScope, "bad param");
|
|
1358
|
+
NS_ASSERTION(aCOMObj, "bad param");
|
|
1359
|
+
NS_ASSERTION(_retval, "bad param");
|
|
1360
|
+
|
|
1361
|
+
*_retval = nsnull;
|
|
1362
|
+
|
|
1363
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1364
|
+
if(!ccx.IsValid())
|
|
1365
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1366
|
+
|
|
1367
|
+
XPCWrappedNativeScope* scope =
|
|
1368
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aScope);
|
|
1369
|
+
if(!scope)
|
|
1370
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1371
|
+
|
|
1372
|
+
AutoMarkingNativeInterfacePtr iface(ccx);
|
|
1373
|
+
iface = XPCNativeInterface::GetNewOrUsed(ccx, &aIID);
|
|
1374
|
+
if(!iface)
|
|
1375
|
+
return NS_ERROR_FAILURE;
|
|
1376
|
+
|
|
1377
|
+
XPCWrappedNative* wrapper;
|
|
1378
|
+
|
|
1379
|
+
nsresult rv = XPCWrappedNative::GetUsedOnly(ccx, aCOMObj, scope, iface,
|
|
1380
|
+
&wrapper);
|
|
1381
|
+
if(NS_FAILED(rv))
|
|
1382
|
+
return NS_ERROR_FAILURE;
|
|
1383
|
+
*_retval = static_cast<nsIXPConnectWrappedNative*>(wrapper);
|
|
1384
|
+
return NS_OK;
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
/* nsIXPConnectJSObjectHolder reparentWrappedNativeIfFound (in JSContextPtr aJSContext, in JSObjectPtr aScope, in JSObjectPtr aNewParent, in nsISupports aCOMObj); */
|
|
1388
|
+
NS_IMETHODIMP
|
|
1389
|
+
nsXPConnect::ReparentWrappedNativeIfFound(JSContext * aJSContext,
|
|
1390
|
+
JSObject * aScope,
|
|
1391
|
+
JSObject * aNewParent,
|
|
1392
|
+
nsISupports *aCOMObj,
|
|
1393
|
+
nsIXPConnectJSObjectHolder **_retval)
|
|
1394
|
+
{
|
|
1395
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1396
|
+
if(!ccx.IsValid())
|
|
1397
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1398
|
+
|
|
1399
|
+
XPCWrappedNativeScope* scope =
|
|
1400
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aScope);
|
|
1401
|
+
if(!scope)
|
|
1402
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1403
|
+
|
|
1404
|
+
XPCWrappedNativeScope* scope2 =
|
|
1405
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aNewParent);
|
|
1406
|
+
if(!scope2)
|
|
1407
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1408
|
+
|
|
1409
|
+
return XPCWrappedNative::
|
|
1410
|
+
ReparentWrapperIfFound(ccx, scope, scope2, aNewParent, aCOMObj,
|
|
1411
|
+
(XPCWrappedNative**) _retval);
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
static JSDHashOperator
|
|
1415
|
+
MoveableWrapperFinder(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
1416
|
+
uint32 number, void *arg)
|
|
1417
|
+
{
|
|
1418
|
+
// Every element counts.
|
|
1419
|
+
nsVoidArray *va = static_cast<nsVoidArray *>(arg);
|
|
1420
|
+
va->AppendElement(((Native2WrappedNativeMap::Entry*)hdr)->value);
|
|
1421
|
+
return JS_DHASH_NEXT;
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
/* void reparentScopeAwareWrappers(in JSContextPtr aJSContext, in JSObjectPtr aOldScope, in JSObjectPtr aNewScope); */
|
|
1425
|
+
NS_IMETHODIMP
|
|
1426
|
+
nsXPConnect::ReparentScopeAwareWrappers(JSContext *aJSContext,
|
|
1427
|
+
JSObject *aOldScope,
|
|
1428
|
+
JSObject *aNewScope)
|
|
1429
|
+
{
|
|
1430
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1431
|
+
if(!ccx.IsValid())
|
|
1432
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1433
|
+
|
|
1434
|
+
XPCWrappedNativeScope *oldScope =
|
|
1435
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aOldScope);
|
|
1436
|
+
if(!oldScope)
|
|
1437
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1438
|
+
|
|
1439
|
+
XPCWrappedNativeScope *newScope =
|
|
1440
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aNewScope);
|
|
1441
|
+
if(!newScope)
|
|
1442
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1443
|
+
|
|
1444
|
+
// First, look through the old scope and find all of the wrappers that
|
|
1445
|
+
// we're going to move.
|
|
1446
|
+
nsVoidArray wrappersToMove;
|
|
1447
|
+
|
|
1448
|
+
{ // scoped lock
|
|
1449
|
+
XPCAutoLock lock(GetRuntime()->GetMapLock());
|
|
1450
|
+
Native2WrappedNativeMap *map = oldScope->GetWrappedNativeMap();
|
|
1451
|
+
wrappersToMove.SizeTo(map->Count());
|
|
1452
|
+
map->Enumerate(MoveableWrapperFinder, &wrappersToMove);
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
// Now that we have the wrappers, reparent them to the new scope.
|
|
1456
|
+
for(PRInt32 i = 0, stop = wrappersToMove.Count(); i < stop; ++i)
|
|
1457
|
+
{
|
|
1458
|
+
// First, check to see if this wrapper really needs to be
|
|
1459
|
+
// reparented.
|
|
1460
|
+
|
|
1461
|
+
XPCWrappedNative *wrapper =
|
|
1462
|
+
static_cast<XPCWrappedNative *>(wrappersToMove[i]);
|
|
1463
|
+
nsISupports *identity = wrapper->GetIdentityObject();
|
|
1464
|
+
nsCOMPtr<nsIClassInfo> info(do_QueryInterface(identity));
|
|
1465
|
+
|
|
1466
|
+
// ClassInfo is implemented as singleton objects. If the identity
|
|
1467
|
+
// object here is the same object as returned by the QI, then it
|
|
1468
|
+
// is the singleton classinfo, so we don't need to reparent it.
|
|
1469
|
+
if(SameCOMIdentity(identity, info))
|
|
1470
|
+
info = nsnull;
|
|
1471
|
+
|
|
1472
|
+
if(!info)
|
|
1473
|
+
continue;
|
|
1474
|
+
|
|
1475
|
+
XPCNativeScriptableCreateInfo sciProto;
|
|
1476
|
+
XPCNativeScriptableCreateInfo sciWrapper;
|
|
1477
|
+
|
|
1478
|
+
nsresult rv =
|
|
1479
|
+
XPCWrappedNative::GatherScriptableCreateInfo(identity,
|
|
1480
|
+
info.get(),
|
|
1481
|
+
&sciProto,
|
|
1482
|
+
&sciWrapper);
|
|
1483
|
+
if(NS_FAILED(rv))
|
|
1484
|
+
return NS_ERROR_FAILURE;
|
|
1485
|
+
|
|
1486
|
+
// If the wrapper doesn't want precreate, then we don't need to
|
|
1487
|
+
// worry about reparenting it.
|
|
1488
|
+
if(!sciWrapper.GetFlags().WantPreCreate())
|
|
1489
|
+
continue;
|
|
1490
|
+
|
|
1491
|
+
JSObject *newParent = aOldScope;
|
|
1492
|
+
rv = sciWrapper.GetCallback()->PreCreate(identity, ccx, aOldScope,
|
|
1493
|
+
&newParent);
|
|
1494
|
+
if(NS_FAILED(rv))
|
|
1495
|
+
return rv;
|
|
1496
|
+
|
|
1497
|
+
if(newParent != aOldScope)
|
|
1498
|
+
{
|
|
1499
|
+
// The wrapper returned a new parent. If the new parent is in
|
|
1500
|
+
// a different scope, then we need to reparent it, otherwise,
|
|
1501
|
+
// the old scope is fine.
|
|
1502
|
+
|
|
1503
|
+
XPCWrappedNativeScope *betterScope =
|
|
1504
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, newParent);
|
|
1505
|
+
if(betterScope == oldScope)
|
|
1506
|
+
continue;
|
|
1507
|
+
|
|
1508
|
+
NS_ASSERTION(betterScope == newScope, "Weird scope returned");
|
|
1509
|
+
}
|
|
1510
|
+
else
|
|
1511
|
+
{
|
|
1512
|
+
// The old scope still works for this wrapper.
|
|
1513
|
+
continue;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
// Now, reparent the wrapper, since we know that it wants to be
|
|
1517
|
+
// reparented.
|
|
1518
|
+
|
|
1519
|
+
nsRefPtr<XPCWrappedNative> junk;
|
|
1520
|
+
rv = XPCWrappedNative::ReparentWrapperIfFound(ccx, oldScope,
|
|
1521
|
+
newScope, newParent,
|
|
1522
|
+
wrapper->GetIdentityObject(),
|
|
1523
|
+
getter_AddRefs(junk));
|
|
1524
|
+
NS_ENSURE_SUCCESS(rv, rv);
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
return NS_OK;
|
|
1528
|
+
}
|
|
1529
|
+
|
|
1530
|
+
/* void setSecurityManagerForJSContext (in JSContextPtr aJSContext, in nsIXPCSecurityManager aManager, in PRUint16 flags); */
|
|
1531
|
+
NS_IMETHODIMP
|
|
1532
|
+
nsXPConnect::SetSecurityManagerForJSContext(JSContext * aJSContext,
|
|
1533
|
+
nsIXPCSecurityManager *aManager,
|
|
1534
|
+
PRUint16 flags)
|
|
1535
|
+
{
|
|
1536
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1537
|
+
|
|
1538
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1539
|
+
if(!ccx.IsValid())
|
|
1540
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1541
|
+
|
|
1542
|
+
XPCContext* xpcc = ccx.GetXPCContext();
|
|
1543
|
+
|
|
1544
|
+
NS_IF_ADDREF(aManager);
|
|
1545
|
+
nsIXPCSecurityManager* oldManager = xpcc->GetSecurityManager();
|
|
1546
|
+
NS_IF_RELEASE(oldManager);
|
|
1547
|
+
|
|
1548
|
+
xpcc->SetSecurityManager(aManager);
|
|
1549
|
+
xpcc->SetSecurityManagerFlags(flags);
|
|
1550
|
+
return NS_OK;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
/* void getSecurityManagerForJSContext (in JSContextPtr aJSContext, out nsIXPCSecurityManager aManager, out PRUint16 flags); */
|
|
1554
|
+
NS_IMETHODIMP
|
|
1555
|
+
nsXPConnect::GetSecurityManagerForJSContext(JSContext * aJSContext,
|
|
1556
|
+
nsIXPCSecurityManager **aManager,
|
|
1557
|
+
PRUint16 *flags)
|
|
1558
|
+
{
|
|
1559
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
1560
|
+
NS_ASSERTION(aManager, "bad param");
|
|
1561
|
+
NS_ASSERTION(flags, "bad param");
|
|
1562
|
+
|
|
1563
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1564
|
+
if(!ccx.IsValid())
|
|
1565
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1566
|
+
|
|
1567
|
+
XPCContext* xpcc = ccx.GetXPCContext();
|
|
1568
|
+
|
|
1569
|
+
nsIXPCSecurityManager* manager = xpcc->GetSecurityManager();
|
|
1570
|
+
NS_IF_ADDREF(manager);
|
|
1571
|
+
*aManager = manager;
|
|
1572
|
+
*flags = xpcc->GetSecurityManagerFlags();
|
|
1573
|
+
return NS_OK;
|
|
1574
|
+
}
|
|
1575
|
+
|
|
1576
|
+
/* void setDefaultSecurityManager (in nsIXPCSecurityManager aManager, in PRUint16 flags); */
|
|
1577
|
+
NS_IMETHODIMP
|
|
1578
|
+
nsXPConnect::SetDefaultSecurityManager(nsIXPCSecurityManager *aManager,
|
|
1579
|
+
PRUint16 flags)
|
|
1580
|
+
{
|
|
1581
|
+
NS_IF_ADDREF(aManager);
|
|
1582
|
+
NS_IF_RELEASE(mDefaultSecurityManager);
|
|
1583
|
+
mDefaultSecurityManager = aManager;
|
|
1584
|
+
mDefaultSecurityManagerFlags = flags;
|
|
1585
|
+
|
|
1586
|
+
nsCOMPtr<nsIScriptSecurityManager> ssm =
|
|
1587
|
+
do_QueryInterface(mDefaultSecurityManager);
|
|
1588
|
+
|
|
1589
|
+
// Remember the result of the above QI for fast access to the
|
|
1590
|
+
// script securityt manager.
|
|
1591
|
+
gScriptSecurityManager = ssm;
|
|
1592
|
+
|
|
1593
|
+
return NS_OK;
|
|
1594
|
+
}
|
|
1595
|
+
|
|
1596
|
+
/* void getDefaultSecurityManager (out nsIXPCSecurityManager aManager, out PRUint16 flags); */
|
|
1597
|
+
NS_IMETHODIMP
|
|
1598
|
+
nsXPConnect::GetDefaultSecurityManager(nsIXPCSecurityManager **aManager,
|
|
1599
|
+
PRUint16 *flags)
|
|
1600
|
+
{
|
|
1601
|
+
NS_ASSERTION(aManager, "bad param");
|
|
1602
|
+
NS_ASSERTION(flags, "bad param");
|
|
1603
|
+
|
|
1604
|
+
NS_IF_ADDREF(mDefaultSecurityManager);
|
|
1605
|
+
*aManager = mDefaultSecurityManager;
|
|
1606
|
+
*flags = mDefaultSecurityManagerFlags;
|
|
1607
|
+
return NS_OK;
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
/* nsIStackFrame createStackFrameLocation (in PRUint32 aLanguage, in string aFilename, in string aFunctionName, in PRInt32 aLineNumber, in nsIStackFrame aCaller); */
|
|
1611
|
+
NS_IMETHODIMP
|
|
1612
|
+
nsXPConnect::CreateStackFrameLocation(PRUint32 aLanguage,
|
|
1613
|
+
const char *aFilename,
|
|
1614
|
+
const char *aFunctionName,
|
|
1615
|
+
PRInt32 aLineNumber,
|
|
1616
|
+
nsIStackFrame *aCaller,
|
|
1617
|
+
nsIStackFrame **_retval)
|
|
1618
|
+
{
|
|
1619
|
+
NS_ASSERTION(_retval, "bad param");
|
|
1620
|
+
|
|
1621
|
+
return XPCJSStack::CreateStackFrameLocation(aLanguage,
|
|
1622
|
+
aFilename,
|
|
1623
|
+
aFunctionName,
|
|
1624
|
+
aLineNumber,
|
|
1625
|
+
aCaller,
|
|
1626
|
+
_retval);
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
/* readonly attribute nsIStackFrame CurrentJSStack; */
|
|
1630
|
+
NS_IMETHODIMP
|
|
1631
|
+
nsXPConnect::GetCurrentJSStack(nsIStackFrame * *aCurrentJSStack)
|
|
1632
|
+
{
|
|
1633
|
+
NS_ASSERTION(aCurrentJSStack, "bad param");
|
|
1634
|
+
*aCurrentJSStack = nsnull;
|
|
1635
|
+
|
|
1636
|
+
JSContext* cx;
|
|
1637
|
+
// is there a current context available?
|
|
1638
|
+
if(NS_SUCCEEDED(Peek(&cx)) && cx)
|
|
1639
|
+
{
|
|
1640
|
+
nsCOMPtr<nsIStackFrame> stack;
|
|
1641
|
+
XPCJSStack::CreateStack(cx, getter_AddRefs(stack));
|
|
1642
|
+
if(stack)
|
|
1643
|
+
{
|
|
1644
|
+
// peel off native frames...
|
|
1645
|
+
PRUint32 language;
|
|
1646
|
+
nsCOMPtr<nsIStackFrame> caller;
|
|
1647
|
+
while(stack &&
|
|
1648
|
+
NS_SUCCEEDED(stack->GetLanguage(&language)) &&
|
|
1649
|
+
language != nsIProgrammingLanguage::JAVASCRIPT &&
|
|
1650
|
+
NS_SUCCEEDED(stack->GetCaller(getter_AddRefs(caller))) &&
|
|
1651
|
+
caller)
|
|
1652
|
+
{
|
|
1653
|
+
stack = caller;
|
|
1654
|
+
}
|
|
1655
|
+
NS_IF_ADDREF(*aCurrentJSStack = stack);
|
|
1656
|
+
}
|
|
1657
|
+
}
|
|
1658
|
+
return NS_OK;
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
/* readonly attribute nsIXPCNativeCallContext CurrentNativeCallContext; */
|
|
1662
|
+
NS_IMETHODIMP
|
|
1663
|
+
nsXPConnect::GetCurrentNativeCallContext(nsAXPCNativeCallContext * *aCurrentNativeCallContext)
|
|
1664
|
+
{
|
|
1665
|
+
NS_ASSERTION(aCurrentNativeCallContext, "bad param");
|
|
1666
|
+
|
|
1667
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
1668
|
+
if(data)
|
|
1669
|
+
{
|
|
1670
|
+
*aCurrentNativeCallContext = data->GetCallContext();
|
|
1671
|
+
return NS_OK;
|
|
1672
|
+
}
|
|
1673
|
+
//else...
|
|
1674
|
+
*aCurrentNativeCallContext = nsnull;
|
|
1675
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
/* attribute nsIException PendingException; */
|
|
1679
|
+
NS_IMETHODIMP
|
|
1680
|
+
nsXPConnect::GetPendingException(nsIException * *aPendingException)
|
|
1681
|
+
{
|
|
1682
|
+
NS_ASSERTION(aPendingException, "bad param");
|
|
1683
|
+
|
|
1684
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
1685
|
+
if(!data)
|
|
1686
|
+
{
|
|
1687
|
+
*aPendingException = nsnull;
|
|
1688
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
return data->GetException(aPendingException);
|
|
1692
|
+
}
|
|
1693
|
+
|
|
1694
|
+
NS_IMETHODIMP
|
|
1695
|
+
nsXPConnect::SetPendingException(nsIException * aPendingException)
|
|
1696
|
+
{
|
|
1697
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
1698
|
+
if(!data)
|
|
1699
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1700
|
+
|
|
1701
|
+
data->SetException(aPendingException);
|
|
1702
|
+
return NS_OK;
|
|
1703
|
+
}
|
|
1704
|
+
|
|
1705
|
+
NS_IMETHODIMP
|
|
1706
|
+
nsXPConnect::SyncJSContexts(void)
|
|
1707
|
+
{
|
|
1708
|
+
// Do-nothing compatibility function
|
|
1709
|
+
return NS_OK;
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1712
|
+
/* nsIXPCFunctionThisTranslator setFunctionThisTranslator (in nsIIDRef aIID, in nsIXPCFunctionThisTranslator aTranslator); */
|
|
1713
|
+
NS_IMETHODIMP
|
|
1714
|
+
nsXPConnect::SetFunctionThisTranslator(const nsIID & aIID,
|
|
1715
|
+
nsIXPCFunctionThisTranslator *aTranslator,
|
|
1716
|
+
nsIXPCFunctionThisTranslator **_retval)
|
|
1717
|
+
{
|
|
1718
|
+
XPCJSRuntime* rt = GetRuntime();
|
|
1719
|
+
nsIXPCFunctionThisTranslator* old;
|
|
1720
|
+
IID2ThisTranslatorMap* map = rt->GetThisTranslatorMap();
|
|
1721
|
+
|
|
1722
|
+
{
|
|
1723
|
+
XPCAutoLock lock(rt->GetMapLock()); // scoped lock
|
|
1724
|
+
if(_retval)
|
|
1725
|
+
{
|
|
1726
|
+
old = map->Find(aIID);
|
|
1727
|
+
NS_IF_ADDREF(old);
|
|
1728
|
+
*_retval = old;
|
|
1729
|
+
}
|
|
1730
|
+
map->Add(aIID, aTranslator);
|
|
1731
|
+
}
|
|
1732
|
+
return NS_OK;
|
|
1733
|
+
}
|
|
1734
|
+
|
|
1735
|
+
/* nsIXPCFunctionThisTranslator getFunctionThisTranslator (in nsIIDRef aIID); */
|
|
1736
|
+
NS_IMETHODIMP
|
|
1737
|
+
nsXPConnect::GetFunctionThisTranslator(const nsIID & aIID,
|
|
1738
|
+
nsIXPCFunctionThisTranslator **_retval)
|
|
1739
|
+
{
|
|
1740
|
+
XPCJSRuntime* rt = GetRuntime();
|
|
1741
|
+
nsIXPCFunctionThisTranslator* old;
|
|
1742
|
+
IID2ThisTranslatorMap* map = rt->GetThisTranslatorMap();
|
|
1743
|
+
|
|
1744
|
+
{
|
|
1745
|
+
XPCAutoLock lock(rt->GetMapLock()); // scoped lock
|
|
1746
|
+
old = map->Find(aIID);
|
|
1747
|
+
NS_IF_ADDREF(old);
|
|
1748
|
+
*_retval = old;
|
|
1749
|
+
}
|
|
1750
|
+
return NS_OK;
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
/* void setSafeJSContextForCurrentThread (in JSContextPtr cx); */
|
|
1754
|
+
NS_IMETHODIMP
|
|
1755
|
+
nsXPConnect::SetSafeJSContextForCurrentThread(JSContext * cx)
|
|
1756
|
+
{
|
|
1757
|
+
XPCCallContext ccx(NATIVE_CALLER);
|
|
1758
|
+
if(!ccx.IsValid())
|
|
1759
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1760
|
+
return ccx.GetThreadData()->GetJSContextStack()->SetSafeJSContext(cx);
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
/* void clearAllWrappedNativeSecurityPolicies (); */
|
|
1764
|
+
NS_IMETHODIMP
|
|
1765
|
+
nsXPConnect::ClearAllWrappedNativeSecurityPolicies()
|
|
1766
|
+
{
|
|
1767
|
+
XPCCallContext ccx(NATIVE_CALLER);
|
|
1768
|
+
if(!ccx.IsValid())
|
|
1769
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1770
|
+
|
|
1771
|
+
return XPCWrappedNativeScope::ClearAllWrappedNativeSecurityPolicies(ccx);
|
|
1772
|
+
}
|
|
1773
|
+
|
|
1774
|
+
/* void restoreWrappedNativePrototype (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsIClassInfo aClassInfo, in nsIXPConnectJSObjectHolder aPrototype); */
|
|
1775
|
+
NS_IMETHODIMP
|
|
1776
|
+
nsXPConnect::RestoreWrappedNativePrototype(JSContext * aJSContext,
|
|
1777
|
+
JSObject * aScope,
|
|
1778
|
+
nsIClassInfo * aClassInfo,
|
|
1779
|
+
nsIXPConnectJSObjectHolder * aPrototype)
|
|
1780
|
+
{
|
|
1781
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1782
|
+
if(!ccx.IsValid())
|
|
1783
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1784
|
+
|
|
1785
|
+
if(!aClassInfo || !aPrototype)
|
|
1786
|
+
return UnexpectedFailure(NS_ERROR_INVALID_ARG);
|
|
1787
|
+
|
|
1788
|
+
JSObject *protoJSObject;
|
|
1789
|
+
nsresult rv = aPrototype->GetJSObject(&protoJSObject);
|
|
1790
|
+
if(NS_FAILED(rv))
|
|
1791
|
+
return UnexpectedFailure(rv);
|
|
1792
|
+
|
|
1793
|
+
if(!IS_PROTO_CLASS(STOBJ_GET_CLASS(protoJSObject)))
|
|
1794
|
+
return UnexpectedFailure(NS_ERROR_INVALID_ARG);
|
|
1795
|
+
|
|
1796
|
+
XPCWrappedNativeScope* scope =
|
|
1797
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aScope);
|
|
1798
|
+
if(!scope)
|
|
1799
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1800
|
+
|
|
1801
|
+
XPCWrappedNativeProto *proto =
|
|
1802
|
+
(XPCWrappedNativeProto*)xpc_GetJSPrivate(protoJSObject);
|
|
1803
|
+
if(!proto)
|
|
1804
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1805
|
+
|
|
1806
|
+
if(scope != proto->GetScope())
|
|
1807
|
+
{
|
|
1808
|
+
NS_ERROR("Attempt to reset prototype to a prototype from a"
|
|
1809
|
+
"different scope!");
|
|
1810
|
+
|
|
1811
|
+
return UnexpectedFailure(NS_ERROR_INVALID_ARG);
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
XPCNativeScriptableInfo *si = proto->GetScriptableInfo();
|
|
1815
|
+
|
|
1816
|
+
if(si && si->GetFlags().DontSharePrototype())
|
|
1817
|
+
return UnexpectedFailure(NS_ERROR_INVALID_ARG);
|
|
1818
|
+
|
|
1819
|
+
ClassInfo2WrappedNativeProtoMap* map = scope->GetWrappedNativeProtoMap();
|
|
1820
|
+
XPCLock* lock = GetRuntime()->GetMapLock();
|
|
1821
|
+
|
|
1822
|
+
{ // scoped lock
|
|
1823
|
+
XPCAutoLock al(lock);
|
|
1824
|
+
|
|
1825
|
+
XPCWrappedNativeProtoMap* detachedMap =
|
|
1826
|
+
GetRuntime()->GetDetachedWrappedNativeProtoMap();
|
|
1827
|
+
|
|
1828
|
+
// If we're replacing an old proto, make sure to put it on the
|
|
1829
|
+
// map of detached wrapped native protos so that the old proto
|
|
1830
|
+
// gets properly cleaned up, especially during shutdown.
|
|
1831
|
+
XPCWrappedNativeProto *oldProto = map->Find(aClassInfo);
|
|
1832
|
+
if(oldProto)
|
|
1833
|
+
{
|
|
1834
|
+
detachedMap->Add(oldProto);
|
|
1835
|
+
|
|
1836
|
+
// ClassInfo2WrappedNativeProtoMap doesn't ever replace
|
|
1837
|
+
// entries in the map, so now since we know there's an
|
|
1838
|
+
// entry for aClassInfo in the map we have to remove it to
|
|
1839
|
+
// be able to add the new one.
|
|
1840
|
+
map->Remove(aClassInfo);
|
|
1841
|
+
|
|
1842
|
+
// This code should do the right thing even if we're
|
|
1843
|
+
// restoring the current proto, but warn in that case
|
|
1844
|
+
// since doing that is pointless.
|
|
1845
|
+
NS_ASSERTION(proto != oldProto,
|
|
1846
|
+
"Restoring current prototype, fix caller!");
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
map->Add(aClassInfo, proto);
|
|
1850
|
+
|
|
1851
|
+
// Remove the prototype from the map of detached wrapped
|
|
1852
|
+
// native prototypes now that the prototype is part of a scope
|
|
1853
|
+
// again.
|
|
1854
|
+
detachedMap->Remove(proto);
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1857
|
+
// The global in this scope didn't change, but a prototype did
|
|
1858
|
+
// (most likely the global object's prototype), which means the
|
|
1859
|
+
// scope needs to get a chance to update its cached
|
|
1860
|
+
// Object.prototype pointers etc.
|
|
1861
|
+
scope->SetGlobal(ccx, aScope);
|
|
1862
|
+
|
|
1863
|
+
return NS_OK;
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
NS_IMETHODIMP
|
|
1867
|
+
nsXPConnect::CreateSandbox(JSContext *cx, nsIPrincipal *principal,
|
|
1868
|
+
nsIXPConnectJSObjectHolder **_retval)
|
|
1869
|
+
{
|
|
1870
|
+
#ifdef XPCONNECT_STANDALONE
|
|
1871
|
+
return NS_ERROR_NOT_AVAILABLE;
|
|
1872
|
+
#else /* XPCONNECT_STANDALONE */
|
|
1873
|
+
XPCCallContext ccx(NATIVE_CALLER, cx);
|
|
1874
|
+
if(!ccx.IsValid())
|
|
1875
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1876
|
+
|
|
1877
|
+
*_retval = nsnull;
|
|
1878
|
+
|
|
1879
|
+
jsval rval = JSVAL_VOID;
|
|
1880
|
+
AUTO_MARK_JSVAL(ccx, &rval);
|
|
1881
|
+
|
|
1882
|
+
nsresult rv = xpc_CreateSandboxObject(cx, &rval, principal);
|
|
1883
|
+
NS_ASSERTION(NS_FAILED(rv) || !JSVAL_IS_PRIMITIVE(rval),
|
|
1884
|
+
"Bad return value from xpc_CreateSandboxObject()!");
|
|
1885
|
+
|
|
1886
|
+
if (NS_SUCCEEDED(rv) && !JSVAL_IS_PRIMITIVE(rval)) {
|
|
1887
|
+
*_retval = XPCJSObjectHolder::newHolder(ccx, JSVAL_TO_OBJECT(rval));
|
|
1888
|
+
NS_ENSURE_TRUE(*_retval, NS_ERROR_OUT_OF_MEMORY);
|
|
1889
|
+
|
|
1890
|
+
NS_ADDREF(*_retval);
|
|
1891
|
+
}
|
|
1892
|
+
|
|
1893
|
+
return rv;
|
|
1894
|
+
#endif /* XPCONNECT_STANDALONE */
|
|
1895
|
+
}
|
|
1896
|
+
|
|
1897
|
+
NS_IMETHODIMP
|
|
1898
|
+
nsXPConnect::EvalInSandboxObject(const nsAString& source, JSContext *cx,
|
|
1899
|
+
nsIXPConnectJSObjectHolder *sandbox,
|
|
1900
|
+
PRBool returnStringOnly, jsval *rval)
|
|
1901
|
+
{
|
|
1902
|
+
#ifdef XPCONNECT_STANDALONE
|
|
1903
|
+
return NS_ERROR_NOT_AVAILABLE;
|
|
1904
|
+
#else /* XPCONNECT_STANDALONE */
|
|
1905
|
+
if (!sandbox)
|
|
1906
|
+
return NS_ERROR_INVALID_ARG;
|
|
1907
|
+
|
|
1908
|
+
JSObject *obj;
|
|
1909
|
+
nsresult rv = sandbox->GetJSObject(&obj);
|
|
1910
|
+
NS_ENSURE_SUCCESS(rv, rv);
|
|
1911
|
+
|
|
1912
|
+
return xpc_EvalInSandbox(cx, obj, source,
|
|
1913
|
+
NS_ConvertUTF16toUTF8(source).get(), 1,
|
|
1914
|
+
JSVERSION_DEFAULT, returnStringOnly, rval);
|
|
1915
|
+
#endif /* XPCONNECT_STANDALONE */
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
/* void GetXPCWrappedNativeJSClassInfo(out JSClassConstPtr clazz, out JSObjectOpsConstPtr ops1, out JSObjectOpsConstPtr ops2); */
|
|
1919
|
+
NS_IMETHODIMP
|
|
1920
|
+
nsXPConnect::GetXPCWrappedNativeJSClassInfo(const JSClass **clazz,
|
|
1921
|
+
JSGetObjectOps *ops1,
|
|
1922
|
+
JSGetObjectOps *ops2)
|
|
1923
|
+
{
|
|
1924
|
+
// Expose the JSClass and JSGetObjectOps pointers used by
|
|
1925
|
+
// IS_WRAPPER_CLASS(). If that macro ever changes, this function
|
|
1926
|
+
// needs to stay in sync.
|
|
1927
|
+
|
|
1928
|
+
*clazz = &XPC_WN_NoHelper_JSClass.base;
|
|
1929
|
+
*ops1 = XPC_WN_GetObjectOpsNoCall;
|
|
1930
|
+
*ops2 = XPC_WN_GetObjectOpsWithCall;
|
|
1931
|
+
|
|
1932
|
+
return NS_OK;
|
|
1933
|
+
}
|
|
1934
|
+
|
|
1935
|
+
/* nsIXPConnectJSObjectHolder getWrappedNativePrototype (in JSContextPtr aJSContext, in JSObjectPtr aScope, in nsIClassInfo aClassInfo); */
|
|
1936
|
+
NS_IMETHODIMP
|
|
1937
|
+
nsXPConnect::GetWrappedNativePrototype(JSContext * aJSContext,
|
|
1938
|
+
JSObject * aScope,
|
|
1939
|
+
nsIClassInfo *aClassInfo,
|
|
1940
|
+
nsIXPConnectJSObjectHolder **_retval)
|
|
1941
|
+
{
|
|
1942
|
+
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
|
|
1943
|
+
if(!ccx.IsValid())
|
|
1944
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1945
|
+
|
|
1946
|
+
XPCWrappedNativeScope* scope =
|
|
1947
|
+
XPCWrappedNativeScope::FindInJSObjectScope(ccx, aScope);
|
|
1948
|
+
if(!scope)
|
|
1949
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1950
|
+
|
|
1951
|
+
XPCNativeScriptableCreateInfo sciProto;
|
|
1952
|
+
XPCWrappedNative::GatherProtoScriptableCreateInfo(aClassInfo, &sciProto);
|
|
1953
|
+
|
|
1954
|
+
AutoMarkingWrappedNativeProtoPtr proto(ccx);
|
|
1955
|
+
proto = XPCWrappedNativeProto::GetNewOrUsed(ccx, scope, aClassInfo,
|
|
1956
|
+
&sciProto, JS_FALSE,
|
|
1957
|
+
OBJ_IS_NOT_GLOBAL);
|
|
1958
|
+
if(!proto)
|
|
1959
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1960
|
+
|
|
1961
|
+
nsIXPConnectJSObjectHolder* holder;
|
|
1962
|
+
*_retval = holder = XPCJSObjectHolder::newHolder(ccx,
|
|
1963
|
+
proto->GetJSProtoObject());
|
|
1964
|
+
if(!holder)
|
|
1965
|
+
return UnexpectedFailure(NS_ERROR_FAILURE);
|
|
1966
|
+
|
|
1967
|
+
NS_ADDREF(holder);
|
|
1968
|
+
return NS_OK;
|
|
1969
|
+
}
|
|
1970
|
+
|
|
1971
|
+
/* [noscript] JSVal GetCrossOriginWrapperForValue(in JSContextPtr aJSContext, in JSVal aCurrentVal); */
|
|
1972
|
+
NS_IMETHODIMP
|
|
1973
|
+
nsXPConnect::GetXOWForObject(JSContext * aJSContext,
|
|
1974
|
+
JSObject * aParent,
|
|
1975
|
+
JSObject * aWrappedObj,
|
|
1976
|
+
jsval * rval)
|
|
1977
|
+
{
|
|
1978
|
+
*rval = OBJECT_TO_JSVAL(aWrappedObj);
|
|
1979
|
+
return XPC_XOW_WrapObject(aJSContext, aParent, rval)
|
|
1980
|
+
? NS_OK : NS_ERROR_FAILURE;
|
|
1981
|
+
}
|
|
1982
|
+
|
|
1983
|
+
static inline PRBool
|
|
1984
|
+
PerformOp(JSContext *cx, PRUint32 aWay, JSObject *obj)
|
|
1985
|
+
{
|
|
1986
|
+
NS_ASSERTION(aWay == nsIXPConnect::XPC_XOW_CLEARSCOPE,
|
|
1987
|
+
"Nothing else is implemented yet");
|
|
1988
|
+
|
|
1989
|
+
JS_ClearScope(cx, obj);
|
|
1990
|
+
return PR_TRUE;
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
/* [noscript] void updateXOWs (in JSContextPtr aJSContext,
|
|
1994
|
+
* in nsIXPConnectJSObjectHolder aObject,
|
|
1995
|
+
* in PRUint32 aWay); */
|
|
1996
|
+
NS_IMETHODIMP
|
|
1997
|
+
nsXPConnect::UpdateXOWs(JSContext* aJSContext,
|
|
1998
|
+
nsIXPConnectWrappedNative* aObject,
|
|
1999
|
+
PRUint32 aWay)
|
|
2000
|
+
{
|
|
2001
|
+
typedef WrappedNative2WrapperMap::Link Link;
|
|
2002
|
+
XPCWrappedNative* wn = static_cast<XPCWrappedNative *>(aObject);
|
|
2003
|
+
XPCWrappedNativeScope* scope = wn->GetScope();
|
|
2004
|
+
WrappedNative2WrapperMap* map = scope->GetWrapperMap();
|
|
2005
|
+
Link* list;
|
|
2006
|
+
|
|
2007
|
+
{
|
|
2008
|
+
XPCAutoLock al(GetRuntime()->GetMapLock());
|
|
2009
|
+
|
|
2010
|
+
list = map->FindLink(wn->GetFlatJSObject());
|
|
2011
|
+
}
|
|
2012
|
+
|
|
2013
|
+
if(!list)
|
|
2014
|
+
return NS_OK; // No wrappers to update.
|
|
2015
|
+
|
|
2016
|
+
AutoJSRequestWithNoCallContext req(aJSContext);
|
|
2017
|
+
|
|
2018
|
+
Link* cur = list;
|
|
2019
|
+
if(cur->obj && !PerformOp(aJSContext, aWay, cur->obj))
|
|
2020
|
+
return NS_ERROR_FAILURE;
|
|
2021
|
+
|
|
2022
|
+
for(cur = (Link *)PR_NEXT_LINK(list); cur != list;
|
|
2023
|
+
cur = (Link *)PR_NEXT_LINK(cur))
|
|
2024
|
+
{
|
|
2025
|
+
if(!PerformOp(aJSContext, aWay, cur->obj))
|
|
2026
|
+
return NS_ERROR_FAILURE;
|
|
2027
|
+
}
|
|
2028
|
+
|
|
2029
|
+
return NS_OK;
|
|
2030
|
+
}
|
|
2031
|
+
|
|
2032
|
+
/* void releaseJSContext (in JSContextPtr aJSContext, in PRBool noGC); */
|
|
2033
|
+
NS_IMETHODIMP
|
|
2034
|
+
nsXPConnect::ReleaseJSContext(JSContext * aJSContext, PRBool noGC)
|
|
2035
|
+
{
|
|
2036
|
+
NS_ASSERTION(aJSContext, "bad param");
|
|
2037
|
+
XPCPerThreadData* tls = XPCPerThreadData::GetData(aJSContext);
|
|
2038
|
+
if(tls)
|
|
2039
|
+
{
|
|
2040
|
+
XPCCallContext* ccx = nsnull;
|
|
2041
|
+
for(XPCCallContext* cur = tls->GetCallContext();
|
|
2042
|
+
cur;
|
|
2043
|
+
cur = cur->GetPrevCallContext())
|
|
2044
|
+
{
|
|
2045
|
+
if(cur->GetJSContext() == aJSContext)
|
|
2046
|
+
{
|
|
2047
|
+
ccx = cur;
|
|
2048
|
+
// Keep looping to find the deepest matching call context.
|
|
2049
|
+
}
|
|
2050
|
+
}
|
|
2051
|
+
|
|
2052
|
+
if(ccx)
|
|
2053
|
+
{
|
|
2054
|
+
#ifdef DEBUG_xpc_hacker
|
|
2055
|
+
printf("!xpc - deferring destruction of JSContext @ %p\n",
|
|
2056
|
+
(void *)aJSContext);
|
|
2057
|
+
#endif
|
|
2058
|
+
ccx->SetDestroyJSContextInDestructor(JS_TRUE);
|
|
2059
|
+
JS_ClearNewbornRoots(aJSContext);
|
|
2060
|
+
return NS_OK;
|
|
2061
|
+
}
|
|
2062
|
+
// else continue on and synchronously destroy the JSContext ...
|
|
2063
|
+
|
|
2064
|
+
NS_ASSERTION(!tls->GetJSContextStack() ||
|
|
2065
|
+
!tls->GetJSContextStack()->
|
|
2066
|
+
DEBUG_StackHasJSContext(aJSContext),
|
|
2067
|
+
"JSContext still in threadjscontextstack!");
|
|
2068
|
+
}
|
|
2069
|
+
|
|
2070
|
+
if(noGC)
|
|
2071
|
+
JS_DestroyContextNoGC(aJSContext);
|
|
2072
|
+
else
|
|
2073
|
+
JS_DestroyContext(aJSContext);
|
|
2074
|
+
return NS_OK;
|
|
2075
|
+
}
|
|
2076
|
+
|
|
2077
|
+
/* void debugDump (in short depth); */
|
|
2078
|
+
NS_IMETHODIMP
|
|
2079
|
+
nsXPConnect::DebugDump(PRInt16 depth)
|
|
2080
|
+
{
|
|
2081
|
+
#ifdef DEBUG
|
|
2082
|
+
depth-- ;
|
|
2083
|
+
XPC_LOG_ALWAYS(("nsXPConnect @ %x with mRefCnt = %d", this, mRefCnt.get()));
|
|
2084
|
+
XPC_LOG_INDENT();
|
|
2085
|
+
XPC_LOG_ALWAYS(("gSelf @ %x", gSelf));
|
|
2086
|
+
XPC_LOG_ALWAYS(("gOnceAliveNowDead is %d", (int)gOnceAliveNowDead));
|
|
2087
|
+
XPC_LOG_ALWAYS(("mDefaultSecurityManager @ %x", mDefaultSecurityManager));
|
|
2088
|
+
XPC_LOG_ALWAYS(("mDefaultSecurityManagerFlags of %x", mDefaultSecurityManagerFlags));
|
|
2089
|
+
XPC_LOG_ALWAYS(("mInterfaceInfoManager @ %x", mInterfaceInfoManager.get()));
|
|
2090
|
+
if(mRuntime)
|
|
2091
|
+
{
|
|
2092
|
+
if(depth)
|
|
2093
|
+
mRuntime->DebugDump(depth);
|
|
2094
|
+
else
|
|
2095
|
+
XPC_LOG_ALWAYS(("XPCJSRuntime @ %x", mRuntime));
|
|
2096
|
+
}
|
|
2097
|
+
else
|
|
2098
|
+
XPC_LOG_ALWAYS(("mRuntime is null"));
|
|
2099
|
+
XPCWrappedNativeScope::DebugDumpAllScopes(depth);
|
|
2100
|
+
XPC_LOG_OUTDENT();
|
|
2101
|
+
#endif
|
|
2102
|
+
return NS_OK;
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
/* void debugDumpObject (in nsISupports aCOMObj, in short depth); */
|
|
2106
|
+
NS_IMETHODIMP
|
|
2107
|
+
nsXPConnect::DebugDumpObject(nsISupports *p, PRInt16 depth)
|
|
2108
|
+
{
|
|
2109
|
+
#ifdef DEBUG
|
|
2110
|
+
if(!depth)
|
|
2111
|
+
return NS_OK;
|
|
2112
|
+
if(!p)
|
|
2113
|
+
{
|
|
2114
|
+
XPC_LOG_ALWAYS(("*** Cound not dump object with NULL address"));
|
|
2115
|
+
return NS_OK;
|
|
2116
|
+
}
|
|
2117
|
+
|
|
2118
|
+
nsIXPConnect* xpc;
|
|
2119
|
+
nsIXPCWrappedJSClass* wjsc;
|
|
2120
|
+
nsIXPConnectWrappedNative* wn;
|
|
2121
|
+
nsIXPConnectWrappedJS* wjs;
|
|
2122
|
+
|
|
2123
|
+
if(NS_SUCCEEDED(p->QueryInterface(NS_GET_IID(nsIXPConnect),
|
|
2124
|
+
(void**)&xpc)))
|
|
2125
|
+
{
|
|
2126
|
+
XPC_LOG_ALWAYS(("Dumping a nsIXPConnect..."));
|
|
2127
|
+
xpc->DebugDump(depth);
|
|
2128
|
+
NS_RELEASE(xpc);
|
|
2129
|
+
}
|
|
2130
|
+
else if(NS_SUCCEEDED(p->QueryInterface(NS_GET_IID(nsIXPCWrappedJSClass),
|
|
2131
|
+
(void**)&wjsc)))
|
|
2132
|
+
{
|
|
2133
|
+
XPC_LOG_ALWAYS(("Dumping a nsIXPCWrappedJSClass..."));
|
|
2134
|
+
wjsc->DebugDump(depth);
|
|
2135
|
+
NS_RELEASE(wjsc);
|
|
2136
|
+
}
|
|
2137
|
+
else if(NS_SUCCEEDED(p->QueryInterface(NS_GET_IID(nsIXPConnectWrappedNative),
|
|
2138
|
+
(void**)&wn)))
|
|
2139
|
+
{
|
|
2140
|
+
XPC_LOG_ALWAYS(("Dumping a nsIXPConnectWrappedNative..."));
|
|
2141
|
+
wn->DebugDump(depth);
|
|
2142
|
+
NS_RELEASE(wn);
|
|
2143
|
+
}
|
|
2144
|
+
else if(NS_SUCCEEDED(p->QueryInterface(NS_GET_IID(nsIXPConnectWrappedJS),
|
|
2145
|
+
(void**)&wjs)))
|
|
2146
|
+
{
|
|
2147
|
+
XPC_LOG_ALWAYS(("Dumping a nsIXPConnectWrappedJS..."));
|
|
2148
|
+
wjs->DebugDump(depth);
|
|
2149
|
+
NS_RELEASE(wjs);
|
|
2150
|
+
}
|
|
2151
|
+
else
|
|
2152
|
+
XPC_LOG_ALWAYS(("*** Could not dump the nsISupports @ %x", p));
|
|
2153
|
+
#endif
|
|
2154
|
+
return NS_OK;
|
|
2155
|
+
}
|
|
2156
|
+
|
|
2157
|
+
/* void debugDumpJSStack (in PRBool showArgs, in PRBool showLocals, in PRBool showThisProps); */
|
|
2158
|
+
NS_IMETHODIMP
|
|
2159
|
+
nsXPConnect::DebugDumpJSStack(PRBool showArgs,
|
|
2160
|
+
PRBool showLocals,
|
|
2161
|
+
PRBool showThisProps)
|
|
2162
|
+
{
|
|
2163
|
+
JSContext* cx;
|
|
2164
|
+
if(NS_FAILED(Peek(&cx)))
|
|
2165
|
+
printf("failed to peek into nsIThreadJSContextStack service!\n");
|
|
2166
|
+
else if(!cx)
|
|
2167
|
+
printf("there is no JSContext on the nsIThreadJSContextStack!\n");
|
|
2168
|
+
else
|
|
2169
|
+
xpc_DumpJSStack(cx, showArgs, showLocals, showThisProps);
|
|
2170
|
+
|
|
2171
|
+
return NS_OK;
|
|
2172
|
+
}
|
|
2173
|
+
|
|
2174
|
+
/* void debugDumpEvalInJSStackFrame (in PRUint32 aFrameNumber, in string aSourceText); */
|
|
2175
|
+
NS_IMETHODIMP
|
|
2176
|
+
nsXPConnect::DebugDumpEvalInJSStackFrame(PRUint32 aFrameNumber, const char *aSourceText)
|
|
2177
|
+
{
|
|
2178
|
+
JSContext* cx;
|
|
2179
|
+
if(NS_FAILED(Peek(&cx)))
|
|
2180
|
+
printf("failed to peek into nsIThreadJSContextStack service!\n");
|
|
2181
|
+
else if(!cx)
|
|
2182
|
+
printf("there is no JSContext on the nsIThreadJSContextStack!\n");
|
|
2183
|
+
else
|
|
2184
|
+
xpc_DumpEvalInJSStackFrame(cx, aFrameNumber, aSourceText);
|
|
2185
|
+
|
|
2186
|
+
return NS_OK;
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
/* JSVal variantToJS (in JSContextPtr ctx, in JSObjectPtr scope, in nsIVariant value); */
|
|
2190
|
+
NS_IMETHODIMP
|
|
2191
|
+
nsXPConnect::VariantToJS(JSContext* ctx, JSObject* scope, nsIVariant* value, jsval* _retval)
|
|
2192
|
+
{
|
|
2193
|
+
NS_PRECONDITION(ctx, "bad param");
|
|
2194
|
+
NS_PRECONDITION(scope, "bad param");
|
|
2195
|
+
NS_PRECONDITION(value, "bad param");
|
|
2196
|
+
NS_PRECONDITION(_retval, "bad param");
|
|
2197
|
+
|
|
2198
|
+
XPCCallContext ccx(NATIVE_CALLER, ctx);
|
|
2199
|
+
if(!ccx.IsValid())
|
|
2200
|
+
return NS_ERROR_FAILURE;
|
|
2201
|
+
|
|
2202
|
+
nsresult rv = NS_OK;
|
|
2203
|
+
if(!XPCVariant::VariantDataToJS(ccx, value, scope, &rv, _retval))
|
|
2204
|
+
{
|
|
2205
|
+
if(NS_FAILED(rv))
|
|
2206
|
+
return rv;
|
|
2207
|
+
|
|
2208
|
+
return NS_ERROR_FAILURE;
|
|
2209
|
+
}
|
|
2210
|
+
|
|
2211
|
+
return NS_OK;
|
|
2212
|
+
}
|
|
2213
|
+
|
|
2214
|
+
/* nsIVariant JSToVariant (in JSContextPtr ctx, in JSVal value); */
|
|
2215
|
+
NS_IMETHODIMP
|
|
2216
|
+
nsXPConnect::JSToVariant(JSContext* ctx, jsval value, nsIVariant** _retval)
|
|
2217
|
+
{
|
|
2218
|
+
NS_PRECONDITION(ctx, "bad param");
|
|
2219
|
+
NS_PRECONDITION(value, "bad param");
|
|
2220
|
+
NS_PRECONDITION(_retval, "bad param");
|
|
2221
|
+
|
|
2222
|
+
XPCCallContext ccx(NATIVE_CALLER, ctx);
|
|
2223
|
+
if(!ccx.IsValid())
|
|
2224
|
+
return NS_ERROR_FAILURE;
|
|
2225
|
+
|
|
2226
|
+
*_retval = XPCVariant::newVariant(ccx, value);
|
|
2227
|
+
if(!(*_retval))
|
|
2228
|
+
return NS_ERROR_FAILURE;
|
|
2229
|
+
|
|
2230
|
+
return NS_OK;
|
|
2231
|
+
}
|
|
2232
|
+
|
|
2233
|
+
/* void flagSystemFilenamePrefix (in string filenamePrefix,
|
|
2234
|
+
* in PRBool aWantNativeWrappers); */
|
|
2235
|
+
NS_IMETHODIMP
|
|
2236
|
+
nsXPConnect::FlagSystemFilenamePrefix(const char *aFilenamePrefix,
|
|
2237
|
+
PRBool aWantNativeWrappers)
|
|
2238
|
+
{
|
|
2239
|
+
NS_PRECONDITION(aFilenamePrefix, "bad param");
|
|
2240
|
+
|
|
2241
|
+
JSRuntime* rt = GetRuntime()->GetJSRuntime();;
|
|
2242
|
+
uint32 flags = JSFILENAME_SYSTEM;
|
|
2243
|
+
if(aWantNativeWrappers)
|
|
2244
|
+
flags |= JSFILENAME_PROTECTED;
|
|
2245
|
+
if(!JS_FlagScriptFilenamePrefix(rt, aFilenamePrefix, flags))
|
|
2246
|
+
return NS_ERROR_OUT_OF_MEMORY;
|
|
2247
|
+
return NS_OK;
|
|
2248
|
+
}
|
|
2249
|
+
|
|
2250
|
+
NS_IMETHODIMP
|
|
2251
|
+
nsXPConnect::OnProcessNextEvent(nsIThreadInternal *aThread, PRBool aMayWait,
|
|
2252
|
+
PRUint32 aRecursionDepth)
|
|
2253
|
+
{
|
|
2254
|
+
// Push a null JSContext so that we don't see any script during
|
|
2255
|
+
// event processing.
|
|
2256
|
+
return Push(nsnull);
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2259
|
+
NS_IMETHODIMP
|
|
2260
|
+
nsXPConnect::AfterProcessNextEvent(nsIThreadInternal *aThread,
|
|
2261
|
+
PRUint32 aRecursionDepth)
|
|
2262
|
+
{
|
|
2263
|
+
return Pop(nsnull);
|
|
2264
|
+
}
|
|
2265
|
+
|
|
2266
|
+
NS_IMETHODIMP
|
|
2267
|
+
nsXPConnect::OnDispatchedEvent(nsIThreadInternal* aThread)
|
|
2268
|
+
{
|
|
2269
|
+
NS_NOTREACHED("Why tell us?");
|
|
2270
|
+
return NS_ERROR_UNEXPECTED;
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2273
|
+
NS_IMETHODIMP
|
|
2274
|
+
nsXPConnect::AddJSHolder(void* aHolder, nsScriptObjectTracer* aTracer)
|
|
2275
|
+
{
|
|
2276
|
+
return mRuntime->AddJSHolder(aHolder, aTracer);
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
NS_IMETHODIMP
|
|
2280
|
+
nsXPConnect::RemoveJSHolder(void* aHolder)
|
|
2281
|
+
{
|
|
2282
|
+
return mRuntime->RemoveJSHolder(aHolder);
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2285
|
+
NS_IMETHODIMP
|
|
2286
|
+
nsXPConnect::SetReportAllJSExceptions(PRBool newval)
|
|
2287
|
+
{
|
|
2288
|
+
// Ignore if the environment variable was set.
|
|
2289
|
+
if (gReportAllJSExceptions != 1)
|
|
2290
|
+
gReportAllJSExceptions = newval ? 2 : 0;
|
|
2291
|
+
|
|
2292
|
+
return NS_OK;
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2295
|
+
/* [noscript, notxpcom] PRBool defineDOMQuickStubs (in JSContextPtr cx, in JSObjectPtr proto, in PRUint32 flags, in PRUint32 interfaceCount, [array, size_is (interfaceCount)] in nsIIDPtr interfaceArray); */
|
|
2296
|
+
NS_IMETHODIMP_(PRBool)
|
|
2297
|
+
nsXPConnect::DefineDOMQuickStubs(JSContext * cx,
|
|
2298
|
+
JSObject * proto,
|
|
2299
|
+
PRUint32 flags,
|
|
2300
|
+
PRUint32 interfaceCount,
|
|
2301
|
+
const nsIID * *interfaceArray)
|
|
2302
|
+
{
|
|
2303
|
+
return DOM_DefineQuickStubs(cx, proto, flags,
|
|
2304
|
+
interfaceCount, interfaceArray);
|
|
2305
|
+
}
|
|
2306
|
+
|
|
2307
|
+
NS_IMETHODIMP
|
|
2308
|
+
nsXPConnect::GetWrapperForObject(JSContext* aJSContext,
|
|
2309
|
+
JSObject* aObject,
|
|
2310
|
+
JSObject* aScope,
|
|
2311
|
+
nsIPrincipal* aPrincipal,
|
|
2312
|
+
PRUint32 aFilenameFlags,
|
|
2313
|
+
jsval* _retval)
|
|
2314
|
+
{
|
|
2315
|
+
NS_ASSERTION(aFilenameFlags != JSFILENAME_NULL, "Null filename!");
|
|
2316
|
+
NS_ASSERTION(XPCPerThreadData::IsMainThread(aJSContext),
|
|
2317
|
+
"Must only be called from the main thread as these wrappers "
|
|
2318
|
+
"are not threadsafe!");
|
|
2319
|
+
|
|
2320
|
+
JSAutoRequest ar(aJSContext);
|
|
2321
|
+
|
|
2322
|
+
XPCWrappedNative *wrapper =
|
|
2323
|
+
XPCWrappedNative::GetWrappedNativeOfJSObject(aJSContext, aObject);
|
|
2324
|
+
if(!wrapper)
|
|
2325
|
+
{
|
|
2326
|
+
// Couldn't get the wrapped native (maybe a prototype?) so just return
|
|
2327
|
+
// the original object.
|
|
2328
|
+
*_retval = OBJECT_TO_JSVAL(aObject);
|
|
2329
|
+
return NS_OK;
|
|
2330
|
+
}
|
|
2331
|
+
|
|
2332
|
+
XPCWrappedNativeScope *xpcscope =
|
|
2333
|
+
XPCWrappedNativeScope::FindInJSObjectScope(aJSContext, aScope);
|
|
2334
|
+
if(!xpcscope)
|
|
2335
|
+
return NS_ERROR_FAILURE;
|
|
2336
|
+
|
|
2337
|
+
#ifdef DEBUG_mrbkap
|
|
2338
|
+
{
|
|
2339
|
+
JSObject *scopeobj = xpcscope->GetGlobalJSObject();
|
|
2340
|
+
JSObject *toInnerize = scopeobj;
|
|
2341
|
+
OBJ_TO_INNER_OBJECT(aJSContext, toInnerize);
|
|
2342
|
+
NS_ASSERTION(toInnerize == scopeobj, "Scope chain ending in outer object?");
|
|
2343
|
+
}
|
|
2344
|
+
#endif
|
|
2345
|
+
|
|
2346
|
+
XPCWrappedNativeScope *objectscope = wrapper->GetScope();
|
|
2347
|
+
{
|
|
2348
|
+
JSObject *possibleOuter = objectscope->GetGlobalJSObject();
|
|
2349
|
+
OBJ_TO_INNER_OBJECT(aJSContext, possibleOuter);
|
|
2350
|
+
if(!possibleOuter)
|
|
2351
|
+
return NS_ERROR_FAILURE;
|
|
2352
|
+
|
|
2353
|
+
if(objectscope->GetGlobalJSObject() != possibleOuter)
|
|
2354
|
+
{
|
|
2355
|
+
objectscope =
|
|
2356
|
+
XPCWrappedNativeScope::FindInJSObjectScope(aJSContext,
|
|
2357
|
+
possibleOuter);
|
|
2358
|
+
NS_ASSERTION(objectscope, "Unable to find a scope from an object");
|
|
2359
|
+
}
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
*_retval = OBJECT_TO_JSVAL(aObject);
|
|
2363
|
+
|
|
2364
|
+
JSBool sameOrigin;
|
|
2365
|
+
JSBool sameScope = xpc_SameScope(objectscope, xpcscope, &sameOrigin);
|
|
2366
|
+
JSBool forceXOW = XPC_XOW_ClassNeedsXOW(STOBJ_GET_CLASS(aObject)->name);
|
|
2367
|
+
|
|
2368
|
+
// We can do nothing if:
|
|
2369
|
+
// - We're wrapping a system object
|
|
2370
|
+
// or
|
|
2371
|
+
// - We're from the same *scope* AND
|
|
2372
|
+
// - We're not about to force a XOW (e.g. for "window") OR
|
|
2373
|
+
// - We're not actually going to create a XOW (we're wrapping for
|
|
2374
|
+
// chrome).
|
|
2375
|
+
if(STOBJ_IS_SYSTEM(aObject) ||
|
|
2376
|
+
(sameScope &&
|
|
2377
|
+
(!forceXOW || (aFilenameFlags & JSFILENAME_SYSTEM))))
|
|
2378
|
+
return NS_OK;
|
|
2379
|
+
|
|
2380
|
+
JSObject* wrappedObj = nsnull;
|
|
2381
|
+
|
|
2382
|
+
if(aFilenameFlags & JSFILENAME_PROTECTED)
|
|
2383
|
+
{
|
|
2384
|
+
wrappedObj = XPCNativeWrapper::GetNewOrUsed(aJSContext, wrapper,
|
|
2385
|
+
aPrincipal);
|
|
2386
|
+
}
|
|
2387
|
+
else if(aFilenameFlags & JSFILENAME_SYSTEM)
|
|
2388
|
+
{
|
|
2389
|
+
jsval val = OBJECT_TO_JSVAL(aObject);
|
|
2390
|
+
if(XPC_SJOW_Construct(aJSContext, nsnull, 1, &val, &val))
|
|
2391
|
+
wrappedObj = JSVAL_TO_OBJECT(val);
|
|
2392
|
+
}
|
|
2393
|
+
else
|
|
2394
|
+
{
|
|
2395
|
+
// We don't wrap anything same origin unless the class name requires
|
|
2396
|
+
// it.
|
|
2397
|
+
if(sameOrigin && !forceXOW)
|
|
2398
|
+
return NS_OK;
|
|
2399
|
+
|
|
2400
|
+
jsval val = OBJECT_TO_JSVAL(aObject);
|
|
2401
|
+
if(XPC_XOW_WrapObject(aJSContext, aScope, &val, wrapper))
|
|
2402
|
+
wrappedObj = JSVAL_TO_OBJECT(val);
|
|
2403
|
+
}
|
|
2404
|
+
|
|
2405
|
+
if(!wrappedObj)
|
|
2406
|
+
return NS_ERROR_FAILURE;
|
|
2407
|
+
|
|
2408
|
+
*_retval = OBJECT_TO_JSVAL(wrappedObj);
|
|
2409
|
+
if(wrapper->NeedsChromeWrapper() &&
|
|
2410
|
+
!XPC_SOW_WrapObject(aJSContext, aScope, *_retval, _retval))
|
|
2411
|
+
return NS_ERROR_FAILURE;
|
|
2412
|
+
return NS_OK;
|
|
2413
|
+
}
|
|
2414
|
+
|
|
2415
|
+
/* attribute JSRuntime runtime; */
|
|
2416
|
+
NS_IMETHODIMP
|
|
2417
|
+
nsXPConnect::GetRuntime(JSRuntime **runtime)
|
|
2418
|
+
{
|
|
2419
|
+
if(!runtime)
|
|
2420
|
+
return NS_ERROR_NULL_POINTER;
|
|
2421
|
+
|
|
2422
|
+
*runtime = GetRuntime()->GetJSRuntime();
|
|
2423
|
+
return NS_OK;
|
|
2424
|
+
}
|
|
2425
|
+
|
|
2426
|
+
/* attribute nsIXPCScriptable backstagePass; */
|
|
2427
|
+
NS_IMETHODIMP
|
|
2428
|
+
nsXPConnect::GetBackstagePass(nsIXPCScriptable **bsp)
|
|
2429
|
+
{
|
|
2430
|
+
if(!mBackstagePass) {
|
|
2431
|
+
#ifndef XPCONNECT_STANDALONE
|
|
2432
|
+
nsCOMPtr<nsIPrincipal> sysprin;
|
|
2433
|
+
nsCOMPtr<nsIScriptSecurityManager> secman =
|
|
2434
|
+
do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID);
|
|
2435
|
+
if(!secman)
|
|
2436
|
+
return NS_ERROR_NOT_AVAILABLE;
|
|
2437
|
+
if(NS_FAILED(secman->GetSystemPrincipal(getter_AddRefs(sysprin))))
|
|
2438
|
+
return NS_ERROR_NOT_AVAILABLE;
|
|
2439
|
+
|
|
2440
|
+
mBackstagePass = new BackstagePass(sysprin);
|
|
2441
|
+
#else
|
|
2442
|
+
mBackstagePass = new BackstagePass();
|
|
2443
|
+
#endif
|
|
2444
|
+
if(!mBackstagePass)
|
|
2445
|
+
return NS_ERROR_OUT_OF_MEMORY;
|
|
2446
|
+
}
|
|
2447
|
+
NS_ADDREF(*bsp = mBackstagePass);
|
|
2448
|
+
return NS_OK;
|
|
2449
|
+
}
|
|
2450
|
+
|
|
2451
|
+
// nsIJSContextStack and nsIThreadJSContextStack implementations
|
|
2452
|
+
|
|
2453
|
+
/* readonly attribute PRInt32 Count; */
|
|
2454
|
+
NS_IMETHODIMP
|
|
2455
|
+
nsXPConnect::GetCount(PRInt32 *aCount)
|
|
2456
|
+
{
|
|
2457
|
+
if(!aCount)
|
|
2458
|
+
return NS_ERROR_NULL_POINTER;
|
|
2459
|
+
|
|
2460
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
2461
|
+
|
|
2462
|
+
if(!data)
|
|
2463
|
+
{
|
|
2464
|
+
*aCount = 0;
|
|
2465
|
+
return NS_ERROR_FAILURE;
|
|
2466
|
+
}
|
|
2467
|
+
|
|
2468
|
+
return data->GetJSContextStack()->GetCount(aCount);
|
|
2469
|
+
}
|
|
2470
|
+
|
|
2471
|
+
/* JSContext Peek (); */
|
|
2472
|
+
NS_IMETHODIMP
|
|
2473
|
+
nsXPConnect::Peek(JSContext * *_retval)
|
|
2474
|
+
{
|
|
2475
|
+
if(!_retval)
|
|
2476
|
+
return NS_ERROR_NULL_POINTER;
|
|
2477
|
+
|
|
2478
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
2479
|
+
|
|
2480
|
+
if(!data)
|
|
2481
|
+
{
|
|
2482
|
+
*_retval = nsnull;
|
|
2483
|
+
return NS_ERROR_FAILURE;
|
|
2484
|
+
}
|
|
2485
|
+
|
|
2486
|
+
return data->GetJSContextStack()->Peek(_retval);
|
|
2487
|
+
}
|
|
2488
|
+
|
|
2489
|
+
/* JSContext Pop (); */
|
|
2490
|
+
NS_IMETHODIMP
|
|
2491
|
+
nsXPConnect::Pop(JSContext * *_retval)
|
|
2492
|
+
{
|
|
2493
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
2494
|
+
|
|
2495
|
+
if(!data)
|
|
2496
|
+
{
|
|
2497
|
+
if(_retval)
|
|
2498
|
+
*_retval = nsnull;
|
|
2499
|
+
return NS_ERROR_FAILURE;
|
|
2500
|
+
}
|
|
2501
|
+
|
|
2502
|
+
return data->GetJSContextStack()->Pop(_retval);
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2505
|
+
/* void Push (in JSContext cx); */
|
|
2506
|
+
NS_IMETHODIMP
|
|
2507
|
+
nsXPConnect::Push(JSContext * cx)
|
|
2508
|
+
{
|
|
2509
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(cx);
|
|
2510
|
+
|
|
2511
|
+
if(!data)
|
|
2512
|
+
return NS_ERROR_FAILURE;
|
|
2513
|
+
|
|
2514
|
+
return data->GetJSContextStack()->Push(cx);
|
|
2515
|
+
}
|
|
2516
|
+
|
|
2517
|
+
/* attribute JSContext SafeJSContext; */
|
|
2518
|
+
NS_IMETHODIMP
|
|
2519
|
+
nsXPConnect::GetSafeJSContext(JSContext * *aSafeJSContext)
|
|
2520
|
+
{
|
|
2521
|
+
NS_ASSERTION(aSafeJSContext, "loser!");
|
|
2522
|
+
|
|
2523
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(nsnull);
|
|
2524
|
+
|
|
2525
|
+
if(!data)
|
|
2526
|
+
{
|
|
2527
|
+
*aSafeJSContext = nsnull;
|
|
2528
|
+
return NS_ERROR_FAILURE;
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
return data->GetJSContextStack()->GetSafeJSContext(aSafeJSContext);
|
|
2532
|
+
}
|
|
2533
|
+
|
|
2534
|
+
/* attribute JSContext SafeJSContext; */
|
|
2535
|
+
NS_IMETHODIMP
|
|
2536
|
+
nsXPConnect::SetSafeJSContext(JSContext * aSafeJSContext)
|
|
2537
|
+
{
|
|
2538
|
+
XPCPerThreadData* data = XPCPerThreadData::GetData(aSafeJSContext);
|
|
2539
|
+
|
|
2540
|
+
if(!data)
|
|
2541
|
+
return NS_ERROR_FAILURE;
|
|
2542
|
+
|
|
2543
|
+
return data->GetJSContextStack()->SetSafeJSContext(aSafeJSContext);
|
|
2544
|
+
}
|
|
2545
|
+
|
|
2546
|
+
/* These are here to be callable from a debugger */
|
|
2547
|
+
JS_BEGIN_EXTERN_C
|
|
2548
|
+
JS_EXPORT_API(void) DumpJSStack()
|
|
2549
|
+
{
|
|
2550
|
+
nsresult rv;
|
|
2551
|
+
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
|
|
2552
|
+
if(NS_SUCCEEDED(rv) && xpc)
|
|
2553
|
+
xpc->DebugDumpJSStack(PR_TRUE, PR_TRUE, PR_FALSE);
|
|
2554
|
+
else
|
|
2555
|
+
printf("failed to get XPConnect service!\n");
|
|
2556
|
+
}
|
|
2557
|
+
|
|
2558
|
+
JS_EXPORT_API(void) DumpJSEval(PRUint32 frameno, const char* text)
|
|
2559
|
+
{
|
|
2560
|
+
nsresult rv;
|
|
2561
|
+
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
|
|
2562
|
+
if(NS_SUCCEEDED(rv) && xpc)
|
|
2563
|
+
xpc->DebugDumpEvalInJSStackFrame(frameno, text);
|
|
2564
|
+
else
|
|
2565
|
+
printf("failed to get XPConnect service!\n");
|
|
2566
|
+
}
|
|
2567
|
+
|
|
2568
|
+
JS_EXPORT_API(void) DumpJSObject(JSObject* obj)
|
|
2569
|
+
{
|
|
2570
|
+
xpc_DumpJSObject(obj);
|
|
2571
|
+
}
|
|
2572
|
+
|
|
2573
|
+
JS_EXPORT_API(void) DumpJSValue(jsval val)
|
|
2574
|
+
{
|
|
2575
|
+
printf("Dumping 0x%p. Value tag is %u.\n", (void *) val, (PRUint32) JSVAL_TAG(val));
|
|
2576
|
+
if(JSVAL_IS_NULL(val)) {
|
|
2577
|
+
printf("Value is null\n");
|
|
2578
|
+
}
|
|
2579
|
+
else if(JSVAL_IS_OBJECT(val)) {
|
|
2580
|
+
printf("Value is an object\n");
|
|
2581
|
+
JSObject* obj = JSVAL_TO_OBJECT(val);
|
|
2582
|
+
DumpJSObject(obj);
|
|
2583
|
+
}
|
|
2584
|
+
else if(JSVAL_IS_NUMBER(val)) {
|
|
2585
|
+
printf("Value is a number: ");
|
|
2586
|
+
if(JSVAL_IS_INT(val))
|
|
2587
|
+
printf("Integer %i\n", JSVAL_TO_INT(val));
|
|
2588
|
+
else if(JSVAL_IS_DOUBLE(val))
|
|
2589
|
+
printf("Floating-point value %f\n", *JSVAL_TO_DOUBLE(val));
|
|
2590
|
+
}
|
|
2591
|
+
else if(JSVAL_IS_STRING(val)) {
|
|
2592
|
+
printf("Value is a string: ");
|
|
2593
|
+
JSString* string = JSVAL_TO_STRING(val);
|
|
2594
|
+
char* bytes = JS_GetStringBytes(string);
|
|
2595
|
+
printf("<%s>\n", bytes);
|
|
2596
|
+
}
|
|
2597
|
+
else if(JSVAL_IS_BOOLEAN(val)) {
|
|
2598
|
+
printf("Value is boolean: ");
|
|
2599
|
+
printf(JSVAL_TO_BOOLEAN(val) ? "true" : "false");
|
|
2600
|
+
}
|
|
2601
|
+
else if(JSVAL_IS_VOID(val)) {
|
|
2602
|
+
printf("Value is undefined\n");
|
|
2603
|
+
}
|
|
2604
|
+
else {
|
|
2605
|
+
printf("No idea what this value is.\n");
|
|
2606
|
+
}
|
|
2607
|
+
}
|
|
2608
|
+
JS_END_EXTERN_C
|
|
2609
|
+
|